Island Life

< YouOS。 | ハワイは雨続き。2月下旬からほぼ1月半、... >

2006/03/19

enbug diary : スクリプト言語はコンパイラ言語より遅いのか?!。 向こうにもコメントを書いたのだけれど、少し詳しく。 もちろんうるさいことを言えばスクリプト言語とコンパイラ言語を対比するのは 変なのだろうけど、ここでは文脈から「スクリプト言語」は実行形式をソースの まま持っておいて実行時にインタプリト、もしくはVMコードくらいにコンパイル して実行するもの、「コンパイラ言語」はバッチコンパイルしてバイナリの実行 形式を作っておくもの、くらいの意味だろう。

で、Lispは昔から実行時解釈も実行時コンパイルもバッチコンパイルも可能だった わけで、他の言語、特に新しい言語が同じことを出来ない理由は無いし、既に そういう流れになっていると思う。

ところで、同じソースファイルを、インタプリトした場合と コンパイルした場合に、全く同じ動作を保証するのは見かけほど自明な話 ではない。特にプログラムの意味に影響を与えるメタレベルの操作が実行時に 許されている場合、実行してみないとプログラムの意味が決定できない→ コンパイルできない、ということがしばしば起こる。Lisp界隈ではこれに ついて20年前くらいにさんざん議論されて、一応の落としどころは 見えている (もっともその中にはeval-whenみたいなアドホックな解決もある。 Scheme界ではそういうのを嫌って、本当に「正しい」セマンティクスを 追求しているせいで、未だにポータブルなモジュールシステムや低レベルマクロが 無いのだが)。まあ、少なくともCLやSchemeの言語仕様の設計時には、 その仕様がインタプリタでもバッチコンパイラでも矛盾のない自然な動作に なるかどうか、かならず検討されている。

さて、新興言語はLispの歴史に学ぶだろうか。それとも処理系をコンパイラ向けに チューンしてゆく過程で、Lispがひっかかった罠に再びはまり、同じ歴史を 繰り返すだろうか。

Tags: Programming, Lisp