問題タブ [cil]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 仮想マシンの最適化
Java でおもちゃのインタープリターをいじっています。Java 仮想マシン用のバイトコードを生成できる単純なコンパイラーを作成しようと考えていました。JVM や CLI などの仮想マシンを対象とするコンパイラは、どの程度の最適化を行う必要があるのでしょうか。
ジャスト イン タイム (JIT) コンパイラは、定数の折りたたみ、ピープホールの最適化などを行いますか?
.net - CILの学習
コマンドなどの詳細な説明を使用してCILをプログラムする方法を学ぶための優れたリソースを知っている人はいますか?私は周りを見回しましたが、特に良いものは見つかりませんでした。
.net - (主に) 静的言語のコンパイルに DLR を使用する
私は .NET をターゲットとするコンパイラを構築しており、以前に CIL を直接生成したことがありますが、DLR ツリーを生成することで、作業がかなり楽になります。私はいくつかの動的機能、つまりランタイム関数の作成とダックタイピングをサポートしていますが、コードの大部分は完全に静的です。
以上の説明がありましたので、以下の質問をさせていただきます。
- MSDN ブログの小さな例以外で、DLR は静的コンパイルに使用されていますか?
- もしそうなら、どのようなパフォーマンスが達成されましたか?
- そうでない場合、これを根本的に妨げているものはありますか?
- DLR を使用するか、IL を直接発行するよりも優れたコード生成メカニズムはありますか?
これについての洞察、またはブログ/コード/トークへの参照は大歓迎です。
cil - スタックに値型を間接的にロードすることは可能ですか?
Microsoft IL では、値の型でメソッドを呼び出すには、間接参照が必要です。「il」という名前の ILGenerator があり、現在、スタックの一番上に Nullable があるとします。値があるかどうかを確認したい場合は、次を出力できます。
ただし、それをローカル変数として保存することをスキップして、次のように、既にスタックにある変数のアドレスでメソッドを呼び出すだけでよいでしょう。
命令の ldind ファミリ (特に ldind_ref) は有望に見えますが、これが値のボックス化を引き起こすかどうかを知るための十分なドキュメントが見つかりません。
私は C# コンパイラの出力を見てきましたが、ローカル変数を使用してこれを実現しているため、最初の方法が唯一の方法である可能性があります。誰にも良いアイデアはありますか?
**** 編集: 追記 ****
次のプログラムの行をコメントアウトした場合のように、メソッドを直接呼び出そうとしても機能しません (「操作によりランタイムが不安定になる可能性があります」というエラーが表示されます)。行のコメントを外すと、期待どおりに機能し、「True」が返されることがわかります。
したがって、値型であるため、スタック上の値を使用してメソッドを単純に呼び出すことはできません (ただし、参照型の場合は可能です)。
私が達成したい (またはそれが可能かどうかを知りたい) のは、コメントアウトされている 3 行を置き換えることですが、一時的なローカルを使用せずにプログラムを動作させ続けることです。
.net - C++コードをMicrosoft.NetCIL(バイトコード)にコンパイルする方法はありますか?
つまり、WebブラウザクライアントはC++で記述されます!!!
java - MSILとJavaバイトコードの違いは?
私は.Netを初めて使用し、最初に基本を理解しようとしています。MSILとJavaバイトコードの違いは何ですか?
.net - VB.NET のオプション パラメータは内部でどのように機能しますか? それらは CLS に準拠していますか?
次のメソッド宣言があるとします。
VB.NET は、CLR の範囲内でオプションのパラメーターをどのように機能させますか? オプションのパラメーターは CLS に準拠していますか?
.net - 既存の .NET アセンブリの変更
サードパーティのツールに頼らずに、既存の .NET アセンブリを変更する方法はありますか? PostSharpがこれを可能にしていることは知っていますが、PostSharp の開発者System.Reflection
が既存のアセンブリを変更可能にするために基本的に名前空間全体の機能を書き直さなければならなかったのは非常に無駄だと思います。
System.Reflection.Emit
新しい動的アセンブリの作成のみを許可します。ただし、ここで使用されるすべてのビルダー クラスは、基本的なリフレクション クラスから継承されます (たとえばTypeBuilder
、から継承されSystem.Type
ます)。残念ながら、既存の動的に読み込まれた型を型ビルダーに強制する方法はないようです。少なくとも、公式にサポートされている方法はありません。
では、サポートされていない場合はどうでしょうか。既存のアセンブリまたは型をそのようなビルダー クラスにロードできるバックドアを知っている人はいますか?
注意してください、私は現在のアセンブリを変更する方法を探しているのではなく(これは不合理な要求かもしれません)、ディスクからロードされた既存のアセンブリを変更するだけです。そのようなことはないと思いますが、とにかくお聞きしたいです。
最悪の場合、ildasm.exe
コードを逆アセンブルしてからilasm.exe
再アセンブルする必要がありますが、IL データを操作するためのツールチェーン (読み: IL リーダー) が .NET に含まれていません (またはありますか?)。
/編集:
特定のユースケースはありません。既存のアセンブリにパッチを適用することは非常に一般的なタスクであるため、汎用ソリューションに興味があります。たとえば、難読化ツール、プロファイラー、または AOP ライブラリを考えてみましょう (そうです、後者は別の方法で実装できます)。すでに述べたように、既存のインフラストラクチャの大部分をSystem.Reflection
.
@ウェッジ:
あなたが正しい。ただし、ここでは特定の使用例はありません。これを反映するように元の質問を変更しました。Lutz Roeder の Reflector が (VB または C#) ソース コードをリエンジニアリングするのを防ぐために、質問者がどのように命令pop
を挿入し、すべてのメソッドの最後に挿入できるかを知りたがっていたという別の質問によって、私の興味がかき立てられました。ret
現在、このシナリオは、前述の PostSharp や、 Cecilライブラリを使用する Reflector 用のReflexilプラグインなど、多くのツールで実現できます。
全体として、私は .NET フレームワークに満足していません。
@ジョエル:
はい、私はこの制限を認識しています。重要なことなので、とにかく指摘してくれてありがとう。
@マルキシダード:
これが唯一の実行可能なアプローチのようです。ただし、これは、ビルダー クラスを使用して完全なアセンブリを再作成する必要があることを意味しますよね? つまり、アセンブリ全体を手動で調べる必要があります。
うーん、調べてみます。
.net - CLR 上で動作する CLR はありますか?
CLI (共通言語インフラストラクチャ) を使用して (たとえば、.NET 自体を使用して) 実装された .NET 互換の CLR があるかどうか、または少なくともそれを構築するのに役立つリソースがあるかどうか疑問に思っていました。
基本的には、アセンブリを MemoryStreams として読み込み、バイトコードを解析し、型を構築し、命令を実行する .NET プログラムのようなものです。オプションで、Reflection.Emit を使用して標準 IL に JIT コンパイルすることもできます。
元の CLR で実行される .NET 言語をコンパイルしたくありません。.NET 言語(通常のアンマネージ C++ や C ではない)で記述され、 CILを実行する CLR が必要です。正しく行われれば、それ自体を実行できるはずです。
この種のものに Mono.Cecil を使用することについて何か考えはありますか?
c# - CIL (MSIL) の学習に最適なリソースは何ですか?
私は C# 3 / .NET 3.5 のエキスパートで、System.Reflection.Emit.DynamicMethod を使用してランタイム コード生成を開始しようとしています。IL に親しむことで、次のレベルに進みたいと思っています。
ポインタはありますか(しゃれが意図されています)?