コンパイラ + 静的型 = 効率的なマシン コード
コンパイラ + 動的型 = 非効率的なマシン コード
次の擬似コードを検討してください。
function foo(a, b) {
return a+b
}
静的言語は、a と b が整数であることを (宣言または推論によって) 知ることができ、以下にコンパイルされます。
%reg = addi a,b
とにかく、似たようなもの。
動的言語のコンパイラはコードを出力する必要があり
ます 1. a と b の型をチェックします
2. 各ケースまたはケースの組み合わせを処理します
%reg1 = typeof a
beq %reg1, int, a_int_case
beq %reg1, float, a_float_case
beq %reg1, string, a_string_case
label a_int_case
%reg1 = typeof b
beq %reg1, int, a_int_b_int_case
beq %reg1, float, a_int_b_float_case
beq %reg1, string, a_int_b_string_case
label a_int_b_int_case
%out = addi a,b
goto done
label a_int_b_float_case
%tmp = mkfloat a
%out = addf %tmp,b
goto done
... Etc. I can't finish
それよりもスマートなマシン コードを生成することはできますが、大量のコードを生成せずにはいられないでしょう。つまり、コンパイルは動的言語にとって大きなメリットではありません。
インタプリタは書くのがはるかに簡単で、コンパイルはあまり役に立たないので、インタプリタを書いてみませんか?
(ジャストインタイム コンパイラは実際には型情報を持っており、単一のステートメントに至るまでコンパイルできます。実際には、静的型システムよりも多くの情報を持ち、理論的にはさらに優れたパフォーマンスを発揮します。すべてのアセンブラーはシミュレートされます。実際のマシンで実行できる可能性があるのは、まったくの偶然です。)