主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPF: C# VS. IronPython VS. Boo

                
WPFアプリケーションを作りたい場合において、.NET Frameworkでの開発の恩恵として、いくらかの言語を選べる。そのなかでC#,IronPython,Booの三つでやってみたところでわかった差異をまとめておく。

C#
WPFプロジェクトのビルド時、XAMLファイルのビルドアクションとしてPageを選べる。これを使うと、C#コードとXAMLファイルに同一の名前空間を適用できるため、C#とXAMLの間でオブジェクトを手書きで結びつける必要がない。XAMLでオブジェクトに命名すれば、C#コードではその名前でそのままオブジェクトにアクセスできる。XAMLでオブジェクトのイベントに任意の名前でメソッドを指定すれば、C#コードでその名前でメソッドを作るだけでイベントがオブジェクトに設定される。
<Button Name="button1" Click="Clicked" />

button1.Width = 50
button1.Height = 50

private void Clicked(object sender, EventArgs e)
{
Console.WriteLine("Clicked");
}

XAMLとC#コードがシームレスにつながる。ただ一般的にC#コードはIronPythonやBooのスクリプトほどに簡潔なわけではない。
***

IronPython
wpfというモジュールを備えている。これを使うことで、XAMLで定義したWindowオブジェクトを容易にPythonスクリプトに落とし込める。ただしC#のようにXAMLでオブジェクトに名前をつけても、IronPythonスクリプトでその名前でそのままオブジェクトにアクセスできるわけではない。FindNameメソッドを使って、IronPythonスクリプト上で結びつける必要がある。ただイベントに関しては、メソッド名を指定しておけばあとはIronPythonスクリプトで名前でメソッドを記述するだけ。
なんといってもIronPythonはスクリプトが見やすい。FindNameメソッドを使ったXAMLとIronPythonスクリプト間でのオブジェクト結びつけが面倒でなければ、個人的には最良の選択肢。パフォーマンスが必要なところだけC#でDLLを用意するという手もある。
<Button Name="button1" Click="Clicked" />

class Window1(Window):
def __init__(self):
wpf.LoadComponent(self, 'Window1.xaml')
self.button1 = self.FindName('button1')
self.button1.Width = 50
self.button1.Height = 50

def Clicked(sender, e):
print("Clicked")

***

Boo
個人的にいま一番気になっている言語。Pythonそっくりのインデントによる制御構造を持ちながら、C#のような静的型付け言語。単純な小数計算反復の実行時間をC#,IronPython,Booで計測したら、Booが最速だった(この辺は別記事で検証してみる)。
XamlReaderクラスを使うことで、XAMLで定義したオブジェクトを読み込むことができる。だけど名前によるBooスクリプトとの結びつけはない。XAMLでイベントになにか入れようとすればコンパイルエラー。コントロールオブジェクトもイベントも自分で結びつけ。不便。唯一のおもしろい点は、関数の宣言方法としてPythonとは違ったものも備えているので、クロージャをも簡単に作れる点。
<Button Name="button1" />
class Window1:
public window as Window
def constructor():
streamReader = StreamReader("Window1.xaml")
xmlreader = XmlReader.Create(streamReader)
window = XamlReader.Load(xmlreader)
button1 = LogicalTreeHelper.FindLogicalNode(window, "button") as Button
button1.Click += {print "Clicked";}

// button1.Click += {x as string| x += ',';
// return {y = x + ' with love'; print y};
// }('From Russia')

// button1.Click += def(o as object, e as RoutedEventArgs):
// print 'From Paris, with love'



WPFをやる場合に関してはBooで開発するメリットが見受けられなかった。C#ではXAMLとC#コードを密に結びつける仕組みがあって、両者間でのオブジェクトの取り回しが楽。IronPythonはそれに劣るが、wpfというオリジナルモジュールのおかげでXAMLとIronPythonスクリプトの結びつけはそこそこ楽。Boo……、できないことはないけどIronPythonのほうが楽なんじゃないか。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。