MOONGIFT: » 必見!GUIアプリケーションもこれでWeb化?「Jsc」:オープンソースを毎日紹介
http://www.moongift.jp/2008/04/jsc/
元サイトはこちら。
http://jsc.sourceforge.net/
» What is jsc?
jsc is a decompiler or a cross compiler if you will. It is not a source-code parser nor an IDE. It is a command line utility like any other compiler. jsc was originally an anagram for csharp to javascript.
» How does it work?
The compiler extracts CIL from a .net assembly (latest javascript screencast, old screencast). It filters out the classes which are marked with the ScriptAttribute. It selects the target language and emits the source.
Each assembly defines which namespaces will be filtered in. Each class in these namespaces must define ScriptAttribute, to be opt-in for jsc compilation. Therefore, previously built assamblies will not be processed.
適当に約すと、
» jscとは何ですか?
jscはデコンパイラ又はクロスコンパイラとでもいうようなものです。ソースコードのパーサでもIDEでもありません。他のコンパイラと同じく、コマンドラインのユーティリティです。jscは「csharp to javascript」のアナグラムを元にしています。
» どうやって動くのですか?
このコンパイラは.netアセンブリからCILを抽出します(最新のjavascript screencast, old screencast)。Script属性がつけられたクラスを取り出します。対象言語を選択し、ソースを出力します。
それぞれのアセンブリはネームスペースが取り出されるかどうかを定義します。ネームスペース中のそれぞれのクラスは、jscコンパイルする為にScript属性を定義しなければなりません。この為、既存のアセンブリは処理されません。
どうやらソースコードをコンパイルするのではなく、dllやexe中のMSIL(MS中間言語。CILとも呼ばれる。.NETでのマシン語データみたいなもの)を抽出し、それを解析してJavaScriptに変換する模様。
なので、C#でなくとも.NETアセンブリが作れる他の言語でも大丈夫のようです。Visual Studio.NETで使う場合、プロジェクトのプロパティから「ビルドイベント」タブの「ビルド後に実行するコマンドライン」のところに、このコマンドラインコンパイラを指定して使うようです。詳しくはscreencastを。
但し、ソースコード上で[Script]という属性を付けておかないといけない為、既存のDLLがそのまま変換できるというわけではなさそう。
というか、見る限りでは、C#の記法を使ってWebプログラミングが出来るだけで、Windowsプログラミングのやり方で(例えばWinFormsを使って)ウェブアプリが作れるというほどのインパクトでもないみたいです。いや、それでも充分凄いんですけど。専用のクラスライブラリを使うようです。
こちらのbutterflyのサンプルとソースコードが参考になるかも。
http://jsc.sourceforge.net/examples/web/Butterfly/fx.DemoControl.htm
http://jsc.svn.sourceforge.net/viewvc/jsc/javascript/Examples/ButterFly/source/js/Butterfly.cs?view=markup
IHTMLDivとかのインスタンスを作ってappendChildしたりしてますね。JavaScriptのDOMプログラミングに近いですね。マウスイベントを取って何か実行したりと、この辺はC#プログラマにも分かりやすいんじゃないでしょうか。ていうか、C#って匿名メソッドでクロージャも使えるし、こうやって書くとjQueryとかでプログラミングしてるのと変わらないと言えば変わらないんですが。
アプリケーションのエントリポイント(実行kを開始する起点となるクラス)には、[Script, ScriptApplicationEntryPoint]とつけるようです。
こちらの開発者ブログを見ると、Linqなども使えるようです。MSILを解析しているわけなので、シンタックスシュガーにすぎないLinqが使えるのも当然と言えば当然なんですが、楽しすぎます。
現在の制約はこちらの通り。
# operator ?? is not supported.
# lock is not supported.
# yield is not supported.
# switch is not supported.
# goto is not supported.
# return within try catch finally is not supported.
# try handler filter is not supported.
# ref out is not supported.
switchやyield、try-catchの中からのreturnなど、いくつかの構文に未対応のようですが、それらに気をつけていれば、C#を使ってAjaxアプリケーションが手軽に作れるようになっているようです。
ちょっと試してみたいのですが、ライブラリのリファレンスは一体どこに・・・?
サンプル見ろということなのかもしれませんが、多くのサンプルのソースが404エラーになって見れません。(^^;
試行錯誤しながら試していくだけの時間がちょっと取れない・・・誰か試してみて〜。
【追記】
結局、この後すぐ、自分で試しましたw
http://chikura.fprog.com/index.php?UID=1207325484









Recent Comments