多くの異なるアルゴリズムがあります。
代替案 1: AST をより線形な中間表現にコンパイルできます。コードは次のようにコンパイルできます。
a <- 3 * 2
b <- 5 / 2
c <- a - b
d <- 2 * 4
e <- c + d
return e
これは単なる一連の命令であるため、評価は簡単です。ほとんどの命令は同じ形式:X <- Y OP Z
であるため、エバリュエーターは非常に単純になります。
代替案 2:代替案 #1 をマシン コードまたはバイト コードにコンパイルできます。
li r3, 3
muli r3, 2
li r4, 5
divi r4, r5, 2
subf r3, r3, r4
li r4, 2
muli r4, r4, 4
add r3, r3, r4
blr
代替案 3:代替案 #1 を SSA と呼ばれる特別な形式、または #1 に似ている「単一の静的割り当て」にコンパイルできますが、すべての割り当ての LHS は一意であり、特別な「ファイ」ノードを使用して値を結合します。異なる枝。その後、SSA をマシン コードまたはバイト コードにコンパイルできます。
代替案 4:再帰降下によって AST を評価できます。これは、Scheme / Lisp に関するほとんどの本で徹底的にカバーされています。
代替案 5:再帰降下を使用してコードをスタック マシン コードに変換し、それを評価することができます。何かのようなもの:
push 3
push 2
mul
push 5
push 2
div
sub
push 2
push 4
mul
add
ret
代替∞:他にもたくさんのテクニックがあります。この主題について書かれた本は分厚い。