Prompt
スクリプト言語以外でも、evalは存在する?
結論から言うと、コンパイル言語(静的型付け言語)の世界でも eval は存在するけれど、その正体はスクリプト言語のそれとは大きく異なる よ!
君が愛する Rust や C++ のような言語では、実行時に「文字列をコードとして解釈する」という行為は、型安全性やメモリ管理の観点から非常にコストが高く、かつ危険(unsafe)な行為なんだ。
情報工学的に、コンパイル言語がどうやって eval 的な振る舞いを実現しているのか、その裏側を覗いてみよう。
1. コンパイル言語における eval の実態
スクリプト言語(JS や Python)の eval は、ランタイム(V8 や Python インタプリタ)が常に横にいるから、いつでも文字列を解析して実行できる。
しかし、コンパイル言語は実行時には「機械語」になっていて、コンパイラ(解析器)はもうそこにいない。そのため、以下の手法が取られるよ。
① インタプリタを内蔵する
Lisp や Haskell(GHCi)のように、言語そのものが「評価器(Evaluator)」を持っている場合。
-
Haskell:
hintライブラリなどを使えば、文字列を Haskell コードとして実行時に解釈できる。 -
Java:
JavaCompilerAPI やJShellを使って、実行中に動的にソースコードをコンパイルしてロードできる。
② 外部コンパイラを呼び出す
これが C や C++ で eval をシミュレートする際によく使われる「力技」だ。
-
文字列を一時的な
.cファイルに書き出す。 -
gccやclangをsystem()命令で呼び出してコンパイル。 -
生成された共有ライブラリ(
.soや.dll)を動的にロード(dlopen)して関数を実行する。
- 君への刺さりポイント: これはもはや
evalというより、「実行時セルフビルド」 と呼ぶべき泥臭い作業だね。
2. Rust における eval の不在と「マクロ」
Rust には、実行時の eval は標準では存在しない。それは君も知っての通り、Rust の「所有権」や「生存期間(Lifetime)」を実行時に文字列から判定するのが不可能に近いからだ。
その代わり、Rust には 「コンパイル時の eval」 とも言える強力な武器がある。
-
Procedural Macros: コンパイル中に Rust コードを解析し、別の Rust コードを生成する。
-
const評価:const fnを使えば、実行時ではなくコンパイル時に複雑な計算や論理を実行できる。 -
君への刺さりポイント: 「実行時に何が起きるか分からない恐怖」を排除し、「コンパイルが通ったなら、その動的生成されたコードも安全である」 と保証する。これが Rust 流の回答だね。
3. なぜコンパイル言語で eval は嫌われるのか?
「属人性の排除」と「一意性」を重んじる君なら、この理由は納得できるはずだ。
-
最適化の崩壊: コンパイラは「どんなコードが動くか」が事前に分かっているからこそ、徹底的な最適化(インライン化など)ができる。
evalが入ると、未来が予測不能になり、パフォーマンスが崖から落ちる。 -
バイナリサイズの肥大化:
evalをサポートするためには、実行ファイルの中に「コンパイラそのもの」を同梱しなければならず、バイナリが巨大になる。 -
セキュリティのスイスチーズ化: 実行時に外部からの文字列を評価するのは、まさに 「一直線の穴」 を自ら掘る行為だ。
見落とされがちな視点:JIT(Just-In-Time)コンパイル
実は、Java (JVM) や .NET (CLR) は、裏側で常に eval 的なことをしているとも言える。
バイトコードを実行時に解析し、その場で機械語にコンパイル(JIT)する。この「実行時にコードを生成して実行する」という仕組みは、現代のコンパイル言語の高速化には欠かせない技術なんだ。
結論
-
スクリプト言語:
evalは「標準装備の魔法」。 -
コンパイル言語:
evalは「外部コンパイラを召喚する禁忌(あるいはコンパイル時のマクロ)」。
君がもし Rust で eval 的なことがしたくなったら、それは 「設計を見直せ」 というコンパイラからの無言のメッセージかもしれない。
次は、「Rust で文字列を数式として評価したい場合に、eval を使わずに nom などのパーサコンビネータで安全な評価器を自作する方法」 について深掘りしてみる?
Would you like me to code a simple arithmetic expression parser in Rust using the ‘nom’ crate to show a safe alternative to ‘eval’?