単純なバイトコード インタープリターを実装する必要があるとします。このタスクを実装するにはどのようなアプローチを選択すればよいでしょうか?
データ構造 スタックは、単純なバイトコード マシンを実装する機能を提供します。スタック マシンの機能と実装については、欧米および国内のインターネット上の多くの記事で説明されています。Java 仮想マシンはスタック マシンの一例であることだけを述べておきます。
マシンの動作原理は単純で、データと操作コード (オペコード) を含むプログラムが入力に供給され、必要な操作はスタックによる操作を使用して実装されます。私のスタック マシンのバイトコード プログラムの例を見てみましょう。
пMVkcatS olleHП
出力では、文字列「Hello StackVM」を受け取ります。スタック マシンはプログラムを左から右に読み取り、オペコードがシンボル – に現れるとデータを 1 文字ずつスタックにロードします。スタックを使用してコマンドを実装します。
nodejs でのスタック マシンの実装例:
逆ポーランド記法 (RPN)
スタック マシンは、逆ポーランド記法 (後置記法) を使用するため、計算機の実装にも簡単に使用できます。
通常の中置記法の例:
2*2+3*4
RPN に変換します:
22*34*+
接尾辞レコードをカウントするには、スタック マシンを使用します。
2–スタックの先頭(スタック: 2)へ
2–スタックの先頭(スタック: 2,2)
*–スタックの先頭を2回取得し、その結果を乗算してスタックの先頭(スタック: 4)に送信します
3–スタックの先頭(スタック: 4、3)へ
4–スタックの一番上(スタック: 4、3、4)へ
*–スタックの先頭を 2 回取得し、その結果を乗算してスタックの先頭 (スタック: 4、12) に送信します。
+–スタックの先頭を 2 回取得し、結果を追加して、スタックの先頭 (スタック: 16) に送信します。
ご覧のとおり –操作 16 の結果はスタックに残ります。たとえば、スタック印刷オペコードを実装することで印刷できます。
p22*34*+P
P–スタック印刷開始オペコード、p –スタックの印刷を終了し、レンダリングのために最終行を送信するためのオペコード。
算術演算を中置演算から後置演算に変換するには、「Sorting Yard」と呼ばれるエドガー ダイクストラのアルゴリズムが使用されます。実装の例は上記、または以下の Nodejs マシン スタック プロジェクトのリポジトリで見ることができます。
ソース
https:/ /tech.badoo.com/ru/article/579/interpretatory-bajt-kodov-svoimi-rukami/
https://ru.wikipedia.org/wiki/Обратная_польская_запись
ソースコード
https://gitlab.com/demensdeum/stackvm/< /p>