Script#、JSIL、SharpKitをC#をJavascriptにコンパイルするために使用するツールとして見ているので、Visual StudioでC#を使用してAJAXのクライアント側関数をプログラムできます。
各JSIL、Script#、SharpKitの長所と短所は何ですか?
私のプロジェクトは、必要に応じて、かみそりエンジンとC#を使用したMVC4プロジェクトです。
Script#、JSIL、SharpKitをC#をJavascriptにコンパイルするために使用するツールとして見ているので、Visual StudioでC#を使用してAJAXのクライアント側関数をプログラムできます。
各JSIL、Script#、SharpKitの長所と短所は何ですか?
私のプロジェクトは、必要に応じて、かみそりエンジンとC#を使用したMVC4プロジェクトです。
MVCプロジェクトと直接統合することを検討している場合は、Script#やSharpKitなどがおそらく最善の策です。Script#にはそのような統合を容易にするものが組み込まれていることを知っているので、そこから始めましょう。
JSILを試してみたい場合は、おそらく必要なコア機能がありますが、Visual Studioの統合、自動展開など、必要なものはありません。現在、これは主にアプリケーションのクロスコンパイルを対象としているため、それはうまく機能しますが、他のユースケースほどうまく機能しません。
他の選択肢よりもJSILを検討する理由の概要を説明します。これらの選択肢を使用したことがないため、これらの選択肢の長所と短所について詳しくコメントすることはできません。
JSILは、C#4で利用可能な機能を非常に幅広くサポートしています。注目すべき機能(他のツールがそれらをサポートしていないか、複雑であるため)には次のものがあります。
dynamic、 yield、 Structs、 ref / out、 Delegates、 Generics、 Nullables、 Interfaces、およびEnums。
もちろん、上記のいくつかは完全なサポートを持っていません-絶対に機能するもののアイデアを得るために、テストケースを見ることができます-それぞれは、確認するためにテストされる小さな自己完結型の.csファイルですJSILとネイティブC#は同じ出力を生成します。
この広範なサポートの理由は、JSILが、完全に変更されていないC#アプリケーションを動作中のJSに変換できるようにすることを目標としているためです。JSILサイトにあるすべてのデモについて、これは真実です。私は、これも真実である、より大きな実際のゲームのほぼ完成したポートをいくつか持っています。
もう1つの理由は、JSILを使用すると、C#とJavaScriptが比較的簡単に会話できるようになることです。
すべてのC#タイプとメソッドは、可能な限りJavaScriptに適したインターフェイスを介して公開されます。JSバージョンには基本的な過負荷解決とディスパッチがあるため、ほとんどの場合、ネイティブC#インターフェイスはネイティブJSであるかのようにスクリプトコードから呼び出すことができます。JSに公開したいメソッドに具体的にタグを付けたり、特別な名前を付けたりする必要はありません。
C#からJSに呼び出したい場合は、いくつかの方法で行うことができます。
JSILは、提供されたメタデータとともに型情報を積極的に使用して、生成されたJavaScriptを安全に最適化しようとします。場合によっては、これにより、手動で記述した場合よりも優れた同等のJavaScriptを生成できます。現在これが当てはまる主な領域は、構造体を使用するコードですが、他の場合にも適用できます。
たとえば、このコードスニペットでは、JSILは、コードによって暗示される構造体コピーの数にかかわらず、コードが正しく動作するために実際にはどのコピーも必要ないことを静的に判断できます。結果として得られるJavaScriptには不要なコピーがないため、元のC#のセマンティクスを単純に変換した場合よりもはるかに高速に実行されます。これは、単純な構造体ベースのもの(どこでもVector2s!)を書くことと、名前付きの戻り値の最適化を手作業で完全に理解することの間の良い中間点です。これは、過去に説明したように、かなりエラーが発生しやすいです。
さて、今、いくつかの欠点があります。このリストを網羅的とは見なさないでください。
この情報がお役に立てば幸いです。ご関心をお寄せいただきありがとうございます。
Script#の長所:
Script#短所:
SharpKitの長所:
SharpKitの短所:
JSILの長所:
JSILの短所:
フィードバックへの回答:
Kevin:JSILの出力は悪くありません。これは、SharpKitのCLRモードのように、完全な.NET動作を実現するために生成されたものです。一方、SharpKitはネイティブコード生成をサポートしています。ネイティブJavaScriptコードは、手作業で記述した場合とまったく同じように、C#から生成できます。
SharpKitのクリーンに生成されたJavaScriptコードのサンプル: http ://sharpkit.net/Wiki/Using_SharpKit.wiki
開発者は、より複雑なコード生成を作成し、コンパイル時のメソッドのオーバーロードのサポートなど、より多くの機能を取得することを選択できます。指定すると、SharpKitはオーバーロードされたメソッドのメソッドサフィックスを生成します。
Script#を実行するには.NET 4が必要ですが、Generics、refおよびoutパラメーター、名前空間エイリアスなどの完全なC#4.0構文をサポートしていません。
別の選択肢はWootzJsです。完全開示、私はその作者です。
WootzJsはオープンソースであり、すべての主要なC#言語機能を可能にするかなり軽量のクロスコンパイラーになるよう努めています。
サポートされている注目すべき言語機能:
yield
ステートメント(効率的なステートマシンとして生成)async/await
メソッド(C#コンパイラのようなステートマシンとして生成されます)ref
およびout
パラメータthis
)T
とキャスト例外がスローされます)これはRoslynを使用して実装されます。つまり、将来の言語の改善を利用するのは、Roslyn自体を介して実装されるため、最初になります。のカスタムバージョンを提供するmscorlib
ため、スクリプトで実際に使用できるライブラリ機能を正確に把握できます。
その欠点は何ですか?
System.String
ネイティブJavascriptString
タイプに追加されます。他のクロスコンパイラとの比較:
Script#は非常に安定しており、サードパーティのJavascriptライブラリと広範囲に統合されています。さらに、優れたVisual Studio統合があり、のカスタム実装を提供しますmscorlib
。これは、ツールレベルで実際に実装されている機能を正確に把握していることを意味します。たとえば、Console.Write()
実装されていない場合、そのメソッドはエディターで使用できません。
ただし、カスタムパーサーが原因で、C#2.0でスタックしています(そのバージョンのC#で見つかったジェネリックもありません)。これは、現代のC#開発者が、私たちのほとんどが予約なしで依存している膨大な言語機能のセットを放棄していることを意味します。特に、ラムダとLINQに加えて前述のジェネリックです。これにより、Script#は本質的に多くの開発者にとって初心者ではありません。
JSILは、ILをJavascriptにクロスコンパイルする非常に印象的な作品です。非常に堅牢なので、大規模な3Dビデオゲームのクロスコンパイルを簡単に処理できます。欠点は、その完全性のために、結果のJavascriptファイルが巨大になることです。mscorlib.dllとSystem.dllだけが必要な場合は、約50MBのダウンロードです。さらに、このプロジェクトは実際にはWebアプリケーションのコンテキストで使用するようには設計されておらず、開始するために必要な労力は少し困難です。
このツールキットもカスタムmscorlib
を実装しているため、利用可能な機能を知ることができます。ただし、Visual Studioとの統合が不十分であるため、コンパイラーを呼び出して出力を目的の場所にコピーするために必要なすべてのカスタムビルドステップを作成する必要があります。
SharpKit:この商用製品は、ほとんどのC#4.0言語機能のサポートを提供するよう努めています。それは一般的に成功し、この製品があなたのニーズを満たすかなりの可能性があります。軽量(小さな.JSファイル)で、最新のC#言語機能(ジェネリック、LINQなど)をサポートし、通常は信頼性があります。また、サードパーティのJavascriptライブラリ用の多数のバインディングもあります。ただし、サポートされていない、常に遭遇する驚くべき数のエッジケースがあります。
たとえば、型システムは浅く、ジェネリックスまたは配列(つまりtypeof(Foo[]) == typeof(Bar[])
、typeof(List<string>) == typeof(List<int>)
)の表現をサポートしていません。リフレクションのサポートは制限されており、さまざまなメンバータイプで属性をサポートできません。式ツリーのサポートは存在せず、yieldの実装は非効率的です(ステートマシンがありません)。また、カスタムmscorlib
は使用できず、スクリプトC#ファイルと通常のC#ファイルがプロジェクトに混在している[JsType]
ため、通常コンパイルされているクラスと区別するために、すべてのスクリプトファイルを属性で装飾する必要があります。
SharpKitは2年間使用されており、コードの記述方法がアップグレードされたと言わざるを得ません。私が見ているプロ:
短所:
これが役に立てば幸いです!
ScriptSharpの場合、このstackoverflowリンクが役立つ可能性があります。
ScriptSharpは私のツールキットにどのような利点をもたらすことができますか?
SVNツールをお持ちの場合は、https://github.com/kevingadd/JSILからサンプルをダウンロードしてください。これは実用的なソースコードであり、何マイルも進むのに役立ちます。