問題タブ [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.
cil - MSILプロパティセッター-値フィールドへのアクセス
次のsetterメソッドがありますが、入力したオブジェクトがvalue
呼び出されたメソッドに渡されません。
のように関数を呼び出しL_000c
たいSet(0x6c, ldfld MemoryAddress, value)
。最初の2つのフィールドは、関数に正しくポストされます。どんな手掛かり?同様のことをしてReflectorの定義を見ると、非常によく見えます。
.net - let_property メソッドの好奇心
すべての .net 開発者は、プロパティの概念について知っています。大体 99.99% で、getter と setter という 2 つのメソッドをつなぎ合わせた単なるメタデータです。
add、remove、invoke メソッドを使用するイベントについても、通常は同じことが言えます。
ECMA-335 は、プロパティまたはイベントのいずれかに適用される «Other» 種類のメソッド セマンティックを記述します。概念的には、プロパティまたはイベントは複数の «other» メソッドを持つことができます。
«other» メソッドを持つプロパティを見つけたのは今日が初めてです。そしてもちろん、それは COM に関連している必要がありました。EnvDTE アセンブリ (Visual Studio へのアドインの書き込みに使用) のインターフェイス EnvDTE.Property には、次のように定義されたプロパティが含まれています。
let_Value は次のように定義されています。
どうやら、VBScript および VB.NET より前のバージョンの VB では、Let キーワードを使用してプロパティを定義できます。Let は Set と同じ署名を持っています。ここに関係があると感じます。
しかし、EnvDTE が記述された言語でこのプロパティがどのように宣言されているかを知っている人はいますか? 同じパターンでアセンブリを作成するにはどうすればよいですか (ilasm を使用しないと簡単すぎます)。そして、誰かが同様の財産に直面したことがありますか?
そして、おそらくこれとはセマンティックが異なる、他の «other» プロパティを見た人はいますか? はいの場合、彼らは何に慣れていますか?
.net - .NETバイトコードを操作する-JIT再生?
実行時に(署名された).NETプログラムのバイトコードを操作することは可能ですか?たとえば、JITにILを再評価させることによって?
linq - コンパクト フレームワークの ILASM?
Compact Framework で Linq 式ツリー (db4o/Mainsoft/Mono ポートから) を使用しています。System.Reflection.Emit が存在しないため、LambdaExpressions をデリゲートにコンパイルできません。これは、パフォーマンス上の理由から実行したいと考えています。
式ツリーを IL に変換し、不足している Emit 機能を基本的に提供できるのではないかと考えましたが、その上で WinCE ベースの ILASM を実行するか、独自の PE ヘッダーとアセンブリ メタデータを記述する必要があることに気付きました。
私は ILASM を利用できるようにしたいと思っています。それは...ですか?
.net - .NET コードが MSIL にコンパイルされるのはなぜですか?
最初に .NET コードが MSIL にコンパイルされ、次に JIT によってそれがマシン依存コードに変換されます。2ステップのコンパイルにより、すべての利点が得られることを誰か教えてもらえますか.Thank
c# - 特定の C#/CIL に対して theJITter によって生成されたネイティブ コードを表示する方法はありますか?
この回答に対するコメント(パフォーマンスのために、整数の乗算/除算よりもビット シフト演算子を使用することを提案しています) で、これが実際に高速になるかどうかを質問しました。私の頭の片隅には、あるレベルでは、何かがそれを解決するのに十分賢く、同じ操作であるという考えが>> 1
あります. / 2
しかし、これが本当なのか、もし本当ならどのレベルで起こるのか、今疑問に思っています。
optimize
テスト プログラムは、引数をそれぞれ除算およびシフトする 2 つのメソッドに対して、次の比較 CIL ( on を使用) を生成します。
対
そのため、C# コンパイラは巧妙でなくてもdiv
or命令を発行しています。shr
JITter が生成する実際の x86 アセンブラを見たいのですが、これを行う方法がわかりません。それは可能ですか?
編集して追加
所見
そのデバッガーオプションに関する重要な情報が含まれていたため、nobugzからのものを受け入れました。最終的に私のために働いたのは:
- リリース構成に切り替える
- で
Tools | Options | Debugger
、「モジュールのロード時に JIT 最適化を抑制する」をオフにします (つまり、JIT 最適化を許可します) 。 - 同じ場所で、'Enable Just My Code' をオフにします (つまり、すべてのコードをデバッグします) 。
Debugger.Break()
ステートメントをどこかに置く- アセンブリを構築する
- .exe を実行し、壊れたら既存の VS インスタンスを使用してデバッグする
- 逆アセンブリ ウィンドウに、実行される実際の x86 が表示されます。
結果は控えめに言っても啓発的でした - JITter は実際に算術演算を実行できることがわかりました! [逆アセンブル] ウィンドウから編集したサンプルを次に示します。を使用して 2 のべき乗で除算するさまざまな-Shifter
方法があり>>
ます。を使用して整数で除算するさまざまな-Divider
方法/
静的に 2 で割る両方のメソッドはインライン化されているだけでなく、実際の計算は JITter によって行われています。
statically-divide-by-3 と同じです。
そして静的に4で割る。
最高の:
インライン化され、これらすべての静的除算が計算されます!
しかし、結果が静的でない場合はどうなるでしょうか? コンソールから整数を読み取るコードを追加しました。これは、その分割に対して生成されるものです。
したがって、CIL が異なっていても、JITter は 2 で割ると右に 1 シフトすることを認識しています。
00000283 idiv eax,ecx
そして、3 で割るには割る必要があることを認識しています。
そして、4 で割ると 2 で右シフトすることを知っています。
最後に(また最高!)
メソッドをインライン化し、静的に利用可能な引数に基づいて、物事を行うための最良の方法を考え出しました。良い。
そうです、C# と x86 の間のスタックのどこかに、それを解決するのに十分なほど賢い何かが>> 1
あり、/ 2
それらは同じです。そして、これらすべてのことから、C# コンパイラ、JITter、および CLR を組み合わせることで、謙虚なアプリケーション プログラマとして試すことができるどんな小さなトリックよりもはるかに賢いものになるという私の意見がさらに重要視されています :)
c# - フィールドが読み取られるか書き込まれるかをCIL命令からどのように見分けるのですか?
現在、Mono Cecilを使用してC#プロジェクトからデータを抽出しています。次に、各メソッドでフィールドが読み取られるか書き込まれるかを確認する必要があります。
フィールドが読み取られているか書き込まれていることをCIL命令からどのように知ることができますか?
EclipseのJDTのAssignmentに似た、左側と右側を抽出できるライブラリがMonoCecilにあるとは思えないためです。ある場合は、そこから作業できます。
.net - What would you use to build a new compiler for .NET?
I'm working on a new toy language that will be statically compiled to .NET's IL code.
Off hand I can think of the following to actually generate the IL, but I'm open to alternatives:
- Cecil
- ILASM
antlr - CIL ANTLR 文法?
.NET CIL (別名 MSIL) ANTLR 文法はありますか?