問題タブ [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.
jvm - 学習リソース-スタックマシン、特にJVM
スタックマシン全般、特にJVMについて学ぶための本当に良いチュートリアル/記事/本を誰かが持っているかどうか知りたいです。私はこれらのものを知っています:
http://www.artima.com/insidejvm/applets/EternalMath.html
http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/
http://www.theserverside.com/tt/articles/article.tss?l=GuideJavaBytecode
BillWinnersによるJVM内の本とJVMのプログラミングは、古くても優れているようです。
雨の秋の週末のために、これらはすべて私の「読む」リストにあります。
他に何か提案はありますか?
compiler-construction - スタック マシン コードの SSA
私はスタック マシン (具体的にはCIL ) のコンパイラに取り組んでおり、コードを基本ブロックのグラフに解析しました。ここからメソッドにSSAを適用しようとしていますが、なかなかうまくいきません。私の最初の試み (グラフではなくフラットなリストで作業している間) は、コードを反復処理し、SSA ID のスタック (つまり、割り当てターゲット用) を保持し、割り当てを生成するときにそれらをプッシュし、割り当て時にそれらをポップすることでした。それらは使用されています。これは、単一の基本ブロックに対しては問題なく機能しますが、Φ 関数の生成を処理する方法がわかりません。
私が思いついたアイデアは、SSA ID にスタック位置をアタッチし、コード パスが収束したときにまだスタック上にあるものを調べることですが、これは物事を行う正しい方法 (TM) とは思えません。
複数のコード パスにわたるスタック操作を追跡し、それらが収束したときに衝突を判断するための単純なアルゴリズムはありますか?
cpu-architecture - レジスタ マシンとスタック マシンの違いは何ですか?
レジスタ マシンとスタック マシンの違いは何ですか?
jvm - スタックベースのマシンの命令セットを考案するには?
CLR や JVM などのスタック ベースの仮想マシンには、さまざまな命令セットがあります。仮想マシンを作成する際に命令セットを考案する背後にある理論はありますか? たとえば、0 ~ 5 の定数をスタックにロードするための JVM 命令セットがあります。
一方、CLRには、次のように0から8までの番号をスタックにロードする命令セットがあります
なぜ上記のオペコードが必要なのですかldc.i4.9
?ldc.i4 <int32 (num)>
そして、このようなものは他にもあります。
異なる VM のオペコード間のこの違いの背後にある理由は何ですか? これらのオペコードを考案するための特定の理論はありますか、それとも VM 自体の特性によって完全に駆動されるのか、高水準言語構造に依存するのでしょうか?
compiler-construction - 手書きコンパイラでバイトコードを生成する際のスコープの扱い方
単純なスタック マシン用の小さなコンパイラを作成しました。いくつかの仮想マシンのハックのみで、スコープ/機能を組み立てて処理できます。つまり、スコープを定義し、スコープ変数定義をバイトコード自体に定義します。
スコープをどのように処理する必要があるかについて、いくつかの指針を得ることができますか。
私が直面している問題は主に、外側の変数を内側の変数で上書きするときと上書きしないときをどのように知らせるかなどです。バイトコードは変更可能であり、変更したいと考えています。
その他の問題には、戻った後に変数を外部に保持する方法が含まれます。そのため、変数にはまだその値があります。スタックにプッシュできますが、多くの変数を持つことができます。
これらのことをチェックするためにコンパイラーの作業が行われていると思いますが、それを行うために何をする必要があるかはわかりません。
compiler-construction - スタックマシンでgcルートを見つける方法は?
私はかなり標準的なスタック マシン用のコンパイラを書いています。ここで、ガベージ コレクターを追加します。各アクティベーション レコードでどの変数が gc ルートであるかを知るために、ある種の「スタック マップ」を生成できることがわかります。ただし、実行中にスタックにプッシュされた中間値を処理する方法がわかりません。私がコンパイルしている言語は Pascal に似ているので、タグを使用して他のデータ型からのポインターを識別する必要はありません。
方法に関するヒント/ポインタをいただければ幸いです
- 任意の時点でスタック内の gc ルートを見つけます (つまり、スタックにプッシュされた中間値のどれが gc ルートであるかを識別する方法)。
- この情報をエンコードする通常の形式 (つまり、「スタック マップ」を生成してエンコードする方法)
どうもありがとうございました!ニコラス
c++ - C++ コードでのスタック マシンの使用はどのくらい一般的ですか?
いくつかの C++ コードを見ていますが、スクリプト用のスタック マシンが含まれています。私は何年も前に C++ を学びましたが、私の日常の仕事でそれを使用したことはありません。
architecture - スタックとヒープを分離した仮想マシン設計
仮想マシンとプログラミング言語全般について、本にあるものをいくつか実装することで、もう少し学ぼうとしています。私が現在読んでいる本では、スタックとヒープを 1 つのメモリ領域に保持しています。スタックは上向きに成長し、ヒープは下向きに成長します。2つの異なるメモリ領域を区別する必要がないため、ロード/ストア操作のより単純な戦略以外に、これの利点が何であるかを知りたいです。
私が尋ねる理由は、本の計画から逸脱し、スタックとヒープに 2 つの異なるメモリ領域を持たせることを考えているからです。それは私にとってより理にかなっているように思え、スタックとヒープのレジスタが互いに衝突することを心配する必要はありません。
compiler-construction - インタプリタ、部分評価器、およびコンパイラの理論
そこで、スタック マシン、インタープリター、コンパイラー、およびプログラミング言語とその一般理論に関連するいくつかの事柄について学んできました。私が本やオンラインで見つけたもののほとんどは非常に専門的で、特定のトピック、たとえばインタプリタについて述べており、それが他のトピック、たとえば部分評価者とどのように関連しているかについては言及されていません。インタープリター、コンパイラー、部分評価器の間の相互接続を調べるための初心者向けの優れたリソースはありますか? 優れたリソースとは、具体的な実装とともに理論を説明するものを意味します。このことについて学べば学ぶほど、日々の仕事でそれらすべてを適用できる場所が増えますが、初心者向けのリソースがないことは少し残念です.