前回の記事では、機能については少なく、一般的なスクリプトから分離するのに役立つ可能性のあるものについて、より多くの記事を書いて、記事が自己宣伝のようにならないようにしました。 文字通り、最初のコメントから、私はこれが間違いであることに気づきました。
スピード彼は速いです。 とても速い。 過去1か月にわたって、多くのコードがシャベルにかけられ、多くの特別なケースが整理され、結論が出されました。 たとえば、関数の記述方法と使用される言語ツールに応じて、インラインに相当するものから、各変数と引数のメモリの公平な割り当て、コンテキストの完全な初期化まで、10を超えるシナリオのいずれかで呼び出すことができます。
簡単な統合プラットフォームの種類へのアクセスを提供するすべての重い「キッチン」は、1つの控えめな機能の背後に隠されています
JSObject TypeProxy.Proxy(object)
ほとんどすべてのオブジェクトを指定し、結果を変数に割り当てるだけです
var script = new Script(" megaObject.alert('Hello from javascript') "); script.Context.DefineVariable("megaObject") .Assign(TypeProxy.Proxy(new { alert = new Action<string>(x => MessageBox.Show(x)) }); script.Invoke();
IListインターフェイスを実装する型には、そのようなオブジェクトをネイティブjs配列として偽装する特別なラッパー
NiL.JS.Core.TypeProxing.NativeListがあります。
タイプコンストラクターを登録し、スクリプトの実行中に既にオブジェクトを作成できます。 タイプ名の変数が追加されます。
script.Context.AttachModule(typeof(System.Windows.Forms.Form));
型を1つずつ追加するのが面倒な場合は、名前空間全体を追加できます
Context.GlobalContext.DefineVariable ("forms") // , . .Assign(new NamespaceProvider ("System.Windows.Forms")); // , .
ただやっていない各構文ツリーノードには、アセンブリの外部からアクセスできます。 仮想マシン、別の言語へのトランスレーター、静的アナライザー(十分な統合がない場合)、または想像力のある他の何かを実装できます。 すべての変数を使用するたびに、対応する記述子へのリンクが保存され、記述子に関する情報が得られます。 たとえば、最適化後に「生き残った」すべての使用場所を表示します。 そして数週間前、いわゆるVisitorが実装され、上記のすべてをさらに簡単に行うことができました。