プログラムの実行中に文字列を「構築」し、それをプログラムの一部として実行できる言語は何なのか、興味があります。
eval
、またはより一般的にはランタイム メタプログラミングをサポートする言語を探します。eval
ほぼすべての言語が(Haskell のような強く静的に型付けされた言語でさえも) をサポートしています。主にバイトコード解釈によって実装される言語 (Lisp に似た言語、Erlang、Java など) 用に構築された多くのランタイムは、実行時に新しい (バイト) コードを挿入する機能をサポートしています。新しいコードを動的に挿入できるようになったらeval
、「モンキー パッチ」を記述または実行できます。
完全なメタプログラミングや動的リンクの特定のサポートがない言語実装でも、リフレクション メカニズムまたはコード生成サポート ライブラリ (LLVM など) を介して、プログラマの制御下でコードを動的に生成する方法がよくあります。
単純な 1 段階だけでなく、より一般的には、多段階eval
計算をサポートする言語では、ある段階から次の段階まで、任意の数の段階でプログラムを生成できるため、安全に任意のネストを行うことができます。evals
マルチステージ プログラミングモデルに関する論文であるTaha の言葉を引用すると、理論の多くが紹介されています。
プログラム生成は、ソフトウェア開発のための強力で普及した技術です。コードの再利用、製品の信頼性と保守性、パフォーマンスとリソースの使用率、および開発者の生産性を向上させるために使用されています。
探している言語は通常、何らかの形で 3 つのプリミティブを提供します。
計算を 1 段階遅延させ (たとえば、フラグメントを文字列としてクォートする)、それを実行中のプログラムにスプライシングし、そのフラグメントを実行します (Lisp、バッククォート、カンマ、および eval で)。
Lisp と評価
- McCarthy、John、LISP の歴史、SIGPLAN ではありません。1978. -- 導入
eval
eval をマルチステージ プログラミングに一般化する
マルチステージプログラミングについて:
- Taha, Multi-Stage Programming: その理論と応用
- Nielson, Flemming and Nielson, Hanne Riis, Two-level function languages, -- 導入された 2 レベル言語。
- Taha、Walid および Sheard、Tim、明示的な注釈を使用したマルチステージ プログラミング -- すべてのランタイム メタプログラミング手法をサポートする単純な演算子。
多段階プログラミングに型を与える
多段階計算の正式な記述は非常に難しく、モーダル ロジックのような (プログラミング言語では) 特殊な手法が必要です。
メタプログラムに型を与える:
- Wickline、Philip と Lee、Peter と Pfenning、Frank と Davies、Rowan、ランタイム コード生成のステージング仕様としての Modal 型。
セキュリティ上の問題
マルチステージ プログラミングのセマンティクスを形式化することの難しさは、なぜそれらが動作するシステムをしばしば混乱させるのか、そしてなぜeval
非常に多くのセキュリティ上の懸念を引き起こす可能性があるのか を説明しています。コード。ある段階から次の段階に名前を取得するのは難しく、コード インジェクション攻撃につながります。このような複雑さは、セキュリティには役立ちません。