問題タブ [stack-machine]
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.
variables - スタック マシンのローカル変数のコンパイル
私は C のような言語からスタック マシンまでおもちゃのコンパイラを構築していますが、関数をどう処理し、ローカル変数をブロックするかを理解する必要があるところまで来ています。抽象的に考えると、スペクトルの両端に 2 つのオプションがあるように見えます。1) 各変数のスタック領域を前処理して事前に割り当てる、2) VM に特別な命令を追加してスタックをウォークします。
各変数のスタック領域を前処理して事前に割り当てる
これには、事前に変数のすべてのアドレスが提供されるという利点があるため、非常に賢くする必要も、スタックをウォークするために VM に追加の命令を追加する必要もありません。欠点は、決して実行されずに一連の変数全体を宣言する条件付きコードが多くの不要なスペースを占有するため、非常に無駄になる可能性があることです。例えば、
上記のコードでは、test
が常に false であっても、条件分岐内のすべての変数にスペースを割り当てます。
VM に特別な命令を追加して、スタックをウォークする
私が思いついたもう 1 つのアプローチは、変数宣言ごとにコードを生成し、実行時にそれらの変数のアドレスを把握するための特別な VM 命令を追加することでした。これにより、無駄なスタック スペースの問題は解決されますが、計算オーバーヘッドが追加されます。これは、いくつかのキャッシュ方法で解決できる可能性があります。
では、正しいアプローチは何ですか?私が考えていなかった別のアプローチの方が優れていますか?
stack - マシンコードをスタックするための MIPS
MIPSのようなコードブロックがあり、このコードをスタックマシンコードに変換したい。私はその正しさについてためらいました。値を「a」から「r1」に移動する方法がわかりません。本当ですか?ありがとうございました。
- lw r1,a
- lw r2,b
- r3、r1、r2を追加
sw r3,c
スタック マシン コード
- 左辺値 r3
- プッシュ
- bを押す
- +
- :=
cpu-registers - プロセッサは複数のスタックを使用して、コール スタックを式/レジスタ スタックから分離していますか?
プロセッサによるメモリ操作に関するいくつかの基本的な記事を読んでいましたが、プロセッサが次に来るものをどのように処理するかについて混乱していました。
コール スタックの概念は明確ですが、式スタック/レジスタ スタック (計算を行うために使用される) が同じスタックなのか、それともサブルーチン (関数) のローカル変数のスタックがprogram は同じコール スタックです。
スタックに関してプロセッサがどのように動作するかを誰かが説明できれば、それは私を大いに助けてくれます。
compiler-construction - SSA をスタック マシンに変換する
コードを SSA 表現からレジスタ マシンに変換する方法はよく知られています。(基本的には、グラフの色分けレジスタ割り当てが変換の核となります。)
しかし、SSA からスタック マシンに変換する一般的な方法は何ですか? (私が見ている場合はCILバイトコードです。)レジスタ割り当ての必要がないことを考えると、もっと簡単になると思いますか?