1

これは一言で言うと難しい質問であり、それの適切な用語が何であるかはわかりません(もしあれば)。プログラムの実行中に文字列を「構築」し、それをプログラムの一部として実行できる言語について知りたいです。私が知っている唯一の言語でこれを実行できるのはSnobolです。

Tclのウィキペディアのエントリを読んでいますが、これもできるように思えますか?

あまり使われなくても、これは気の利いた機能だといつも思っていました。ありがとう。

PS:これにSnobol、Spitbolのタグを付けますが、新しいタグを作成するという評判はありません。

4

3 に答える 3

6

プログラムの実行中に文字列を「構築」し、それをプログラムの一部として実行できる言語は何なのか、興味があります。

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非常に多くのセキュリティ上の懸念を引き起こす可能性があるのか​​ を説明しています。コード。ある段階から次の段階に名前を取得するのは難しく、コード インジェクション攻撃につながります。このような複雑さは、セキュリティには役立ちません。

于 2011-04-11T17:54:20.807 に答える
3

これは、この機能が という名前evalで生まれたすべての Lisp 方言、および Prolog ( call/1) や他の多くの言語で実行できます。ほとんどが名前evalを保持し、ほとんどが動的言語です。

そうは言っても、これは気の利いた機能ではありません。この機能を悪用するのがいかに簡単かを考えると、これは重大なセキュリティ問題と言えます。動的なコード実行が必要な場合は、制限付きの独自のマイクロ インタープリターを作成する (または Lua などを使用する) ことをお勧めします。

于 2011-04-11T17:51:03.363 に答える
3

多くの解釈されたスクリプト言語で間違いなく実行できます。一部の言語は、このために特別に設計されています。私の知る限り、次の方法で実行できます。

  • パール
  • PHP
  • Lisp (および CL、Clojure、Scheme などの方言)
  • JavaScript
于 2011-04-11T17:48:14.730 に答える