1

私は C# で独自のスクリプト言語を作成しており、いくつかの機能を気に入っています。MSIL を出力のバイトコードとして使用することにしました (Reflection.Emit は非常に便利で、別のバイトコードを考える必要はありません)。それは機能し、実行可能ファイルを発行します。これは実行可能で (Reflector で逆コンパイルすることもできます:))、非常に高速です。

しかし - 1 つのプロセス + 1 つのスレッドで複数の「プロセス」を実行し、割り当てられた CPU 時間を手動で制御したい (.NET フレームワークによって提供されるより堅牢な IPC も実装する) JIT を完全に無効にして独自のプロセスを作成する方法はありますかVM、.NET フレームワーク (およびメモリ使用量の制御など) を使用した命令ごとのステップ実行、自分で何かを記述する必要なし、またはこれを達成するには、MSIL 解釈全体を記述する必要がありますか?

編集 1): IL の解釈は、宇宙で最速のものではないことを知っています :)

編集2):明確にするために-VMをある種の「オペレーティングシステム」にしたい-CPU時間を取得し、プロセス間で分割し、それらのメモリ割り当てを制御します。高速である必要も効果的である必要もありませんが、私の実験の概念実証にすぎません。すべての命令を処理するレベルでそれを実装する必要はありません。これを .NET で実行する必要がある場合は、気にしません。言いたいのは、1 つの命令をステップ実行し、次のステップを指示するまで待つことです。

編集 3): 私は、ICorDebug がおそらく私のニーズを達成できることに気付きました。今、Mono のランタイムの実装を調べています。

4

4 に答える 4

5

Monoを使用できます。これにより、IL を JIT する代わりに解釈するオプションが可能になると思います。オープン ソースであるということは、必要に応じて変更できる必要があることを意味します (ライセンスの対象となります)。

確かに、Mono には .NET のすべての機能が備わっているわけではありませんが、必要な機能はすべて備えている可能性があります。

于 2009-03-06T13:54:08.047 に答える
1

Microsoft の共通言語ランタイムの実装には、JIT という 1 つの実行システムしかありません。一方、Mono には、JIT とインタープリターの両方が付属しています。

ただし、あなたが自分でやりたいことと、Microsoft の実装に任せたいことを完全には理解していません。

JIT を完全に無効にして独自の VM を作成する方法はありますか?

...自分で何かを書く必要がない、またはこれを達成するには、MSIL 解釈全体を書かなければなりませんか?

なんか矛盾してます。

マイクロソフトの JIT よりも優れた実行システムを作成できると考える場合は、ゼロから作成する必要があります。ただし、microsofts と monos JIT はどちらも高度に最適化されたコンパイラであることに注意してください。(プログラミング言語の銃撃戦)

オペレーティング システム プロセスの CPU 時間を正確にスケジュールすることは、ユーザー モードでは不可能です。それがオペレーティング システムのタスクです。

グリーン スレッドの実装はアイデアかもしれませんが、それは間違いなくアンマネージ コードのトピックです。それが必要な場合は、CLR ホスティング API をご覧ください。

言語を CIL で実装することをお勧めします。結局、生の x86 にコンパイルされます。検証可能性を気にしない場合は、必要に応じてポインターを使用できます。

于 2009-03-06T14:35:58.010 に答える
1

考えられることの 1 つは、ステート マシン スタイルでコードを生成することです。これが何を意味するのか説明させてください。

C# で生成メソッドを yield リターンで記述すると、メソッドはステート マシンを実装する内部 IEnumerator クラスにコンパイルされます。メソッドのコードは、yield return または yield break ステートメントで終了する論理ブロックにコンパイルされ、各ブロックは番号付きの状態に対応します。各 yield リターンは値を提供する必要があるため、各ブロックはローカル フィールドに値を格納することで終了します。列挙子オブジェクトは、次の値を生成するために、現在のブロックを実行するために現在の状態番号に対する巨大な switch ステートメントで構成されるメソッドを呼び出し、状態を進めてローカル フィールドの値を返します。

スクリプト言語は、同様のスタイルでメソッドを生成できます。この場合、メソッドはステート マシン オブジェクトに対応し、VM は割り当てられた時間中にステート マシンを進めることで時間を割り当てます。このメソッドにはいくつか注意が必要な部分があります。メソッド呼び出しや try/finally ブロックなどの実装は、単純な MSIL を生成するよりも困難です。

于 2012-05-14T20:34:17.920 に答える
1

MSIL は JIT コンパイラによって解析されるように設計されていることに注意してください。通訳にはあまり向いていません。良い例はおそらく ADD 命令です。byte、short、int32、int64、ushort、uint32、uint64 など、さまざまな値型の値を追加するために使用されます。コンパイラは必要な追加の種類を認識していますが、MSIL を生成するときにその型情報が失われます。

ここで、実行時にそれを見つける必要があり、評価スタックの値の型を確認する必要があります。非常に遅い。

簡単に解釈できる IL には、ADD8、ADD16 などの専用の ADD 命令があります。

于 2009-03-06T14:16:27.887 に答える