問題タブ [intermediate-language]
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.
python - シンプルな Compile-to-C 言語のセマンティック分析
そこで私は、Python に似た構文を持つ単純なコンパイルから C への言語の作成に取り組んでいます。サンプル ソース コードを次に示します。
Python と同様に、この言語はインデント ポリシーによって読みやすさを重視しています。また、非常に緩い型宣言システムも備えています。タイプはコンテキストによって決定されます。
上記のサンプル ソース コードは、次のように内部的に表されます。
すべての関数は、それぞれのローカル変数とその型 (関数に対して宣言されている行のインデックスも) とともに、この表現にパックされます。
この中間表現を実際の C コードに変換しようとしています (実際には NXC コードなので、C とは少し異なります)。
私の質問は、変数の型 (特に、関数の引数で宣言された変数) をどのように理解できるかということです。これを行う唯一の方法は、関数が呼び出されたコンテキストに基づいて推測することです。
言うまでもなく、中間表現を直線的に作成しています。関数が定義されていても、後で呼び出されるまで呼び出されない場合はどうなりますか? 必要な型情報をすべて取得するまで、この中間表現を変更して何度か実行する必要がありますか?
scala - scalacで使用される中間言語?
GCC コンパイラー には、RTL、GENERIC、GIMPLE などの「中間言語」がいくつかあります。
この回答は、 の中間表現のアイデアを示唆していscalac
ます。
私の質問は: Scala にコンパイラの「中間表現」はありますか? これに関するドキュメントはありますか?
仮定:
- JVM バイト コードのことではありません。それより上の抽象化のレベルを意味します。
language-agnostic - バックパッチはマーカーでどのように機能しますか?
インターネット全体を検索しましたが、バックパッチがどのように機能するかについての適切な説明が見つかりませんでしたか?
バックパッチの仕組みを教えてください。マーカーはどのように機能しますか?
私はそれが2つの主要なタイプのマーカーを持っていることを知っています:
- その中に次のクワッドがある
- その中に次のリストがある
入力ファイルを取得し、RISKI 言語でファイルを作成しているこのコードを見つけました。
最初のロールでは、次のものがあります。
N と M がマーカーであることがわかります (これらは空のロールです)。
c - Fortran コンパイラの中間コード生成: DAG または quadruples
Flex と Bison を使用してミニ Fortran コンパイラを作成しています。ここまでで、字句解析と構文解析が完了しました。私は型チェックのセマンティック分析を行っており、IR を選択する必要があります。私のターゲット マシンは MIPS です。したがって、MIPS IAS に基づく最終的なコード生成が必要です。したがって、良い IR は 4 倍だと思います。しかし、いくつかの最適化を紹介したいと思います。そのため、(ハッシュ テーブルを使用して) DAG 構造を構築しました。IR には 2 つのパスがあります。4 倍または DAG と 4 倍です。
DAG を IR として使用する場合、ステートメントにバックパッチ メソッドを使用するにはどうすればよいですか? 4倍なら簡単です。一方、DAG はより抽象的です。強制的に4倍に変換する必要があります。そんなこと知ってる。私の恐れはバックパッチです。
cil - ldloc var と ldloc.n
CILldloc var
命令とldloc.n
.
メソッド スコープでこのローカル var テーブルを考慮すると、次のようになります。
それらの指示は次のとおりです。
より良い、最悪、または等しい:
c# - Reflection.Emit オペコードを使用したフィールド ゲッター - IL ローカル変数の使用
私はILを学んでおり、あらゆるオブジェクトのフィールド値にアクセスするための一種の高性能ハックを書くことを考えました(リフレクションのようですが、より高速です)。
だから私はテストのためにこのクラスを作りました:
それから私はそのようなプログラムを持っています(読みやすさを向上させるためにすべてのIL命令の後にコメントを追加しました。また、いくつかの論理部分に分割されました。すべての部分の後に、現在スタック上にあると思われるものが書かれています):
このコードはクラッシュします (Invoke 時、および Emit 内からの Exception はいつものように役に立ちます)。以下のように PART 2. と 3. を置き換えることができます。
そしてそれはうまくいきます。今回はローカル変数を使用しておらず、メソッドの外部からの変数であることに注意してf
くださいt
。ただし、このアプローチでは、使用されていた型とフィールドの数と同じ数のメソッドを生成する必要があります。したがって、それはかなり満足のいく解決策ではありません。
どうやらローカル変数で何か間違っているようですが、それが何であるかを正確に把握できませんでした。私は何が欠けていますか?
編集:
大幅に簡略化した後のコードを次に示します。CrashTestDummy に文字列プロパティが追加されたので、int のボックス化を取り除くことができました。
そして、メインコードは次のとおりです。
java - 静的分析で変数の値を推定する方法は?
Soot のビルトイン Reaching-Definition 分析に基づいて、これを行うプログラムを書きたいと思います。今、私はこれが正しいアプローチなのだろうかと思っていますか?私が検索したところ、誰もこの方向に興味を持っていないようです.
助言がありますか?