質問

独自のコード (文字列リテラルとして渡される) を実行できるプログラミング言語を何と呼びますか?私の頭の中にある設定は次のようなものです (コードや結果などの入力をしばらく忘れます)。

string eight = "5+3"
int result = run(eight)

どこ run がキーワードです。それはリフレクティブプログラミング言語ですか?

役に立ちましたか?

解決

について話していると思います メタ循環評価者. 。あなたの run コマンドは 評価 の中に 評価-適用サイクル, 、「コンピュータ プログラムの構造と実装」で説明されています。

他のヒント

あなたが思いつくことができる最善のことは、まさにあなたが求めているものは「eval関数がある」ということです(あなたの質問へのコメントでJavierが述べたように)。

セルフホスティングは必須ではありませんし、必ずしも必要な機能を実行できるわけでもありません。2 つの例は次のとおりです。C は、文字列で指定された独自のコードを実行できないセルフホスト言語ですが、Tcl は、文字列で指定された独自のコードを実行できるセルフホスト言語ではありません。

  • 余談ですが、C が実行される時間の半分は、外部プロセスを実行する API がない環境で実行されます。したがって、一部の環境では、C が独自のコンパイラを実行して独自のコードを実行できるようにシステムを構成できますが、一般的に、それは実際に求めているものではありません。

  • サイドサイドメモ。これを行うために「外部コンパイラの実行」ルートを不正使用して実行できる場合、必要なことを実行するために言語が自己ホストである必要はありません。独自のコンパイラ (多くの場合 C で記述されます) を呼び出すための exec 関数が必要なだけです。

リフレクション/イントロスペクションと同様に、自分自身をイントロスペクトする機能があっても、文字列内のコードを実行できることを意味するわけではありません。Reflection はあるが eval が組み込まれていない言語の 2 つの例は、C# と Java です。

  • 余談ですが、eval 関数を作成すると、たとえ不器用な方法であっても、通常はリフレクション/イントロスペクションを行うことができます。

自己解釈型には、自己ホスティングとの定義と同じ問題があります。Tcl は、eval 関数がそれ自体で記述されていない言語です。C で実装された Tcl コード エバリュエーターを公開しているだけです。

一見すると、メタ循環エバリュエーターは必要なもののように見えます。これは、eval 関数が言語自体に実装されるのではなく組み込まれている自己解釈型として定義されています。しかし、さらに詳しく見てみると、機能自体ではなく、その機能を実現するために使用されるメカニズムによって定義されていることがわかります。Tcl もまた例外であり、メタ循環エバリュエーターの定義をすべて満たしているわけではありませんが、それでも eval 関数を備えています (適用せず、必要ありません)。したがって、メタ循環エバリュエーターは、「評価関数がある」機能の特定の実装であるように私には見えます。

したがって、「eval 関数を持つ」言語ならどれでも、あなたが求めていることを実行できると簡単に言いたいと思います。

あなたが尋ねる言語のクラスは、「セルフホスティングする」に相当します言語。セルフホスティング言語が同じ言語で、コンパイラやインタプリタの実装が存在しているため1、である。

ここに証拠があります。

各セルフホスティング言語は、独自のプログラムを実行することが可能です。あなたがCプログラムに、例えば、Cコードを渡すと、そのプログラムは、コンパイルとすると、コードが実行されることを(Cで書かれた)コンパイラを含めることができます。このようにCプログラムは、任意のCコードを実行します。

今、あなたはコードが文字列として渡され、その言語で任意のコードを実行することができるように、A特性を持つ言語Xを持っていると仮定します。次に、あなただけの入力として文字列を取り、その中にコードを実行するプログラムを作成することができます。これはXに実装さXの言語の通訳となり、これはセルフホスティング言語の定義です。

ここでは、このインタプリタは次のようになります。

execute ARGV[0]

そこで、我々は、所望の特性を持つ各言語はセルフホスティングであり、各セルフホスティング言語は、このプロパティを持っていることを証明してきました。このあなたは要求されたクラスは、セルフホスティング言語のクラスと同じであることを意味します。

おそらくのセルフホスティング。私は、Lispは、このようなA型言語である知っている、とウィキペディアはセルフホスティングコンパイラとしてそれに言及ます。

Homoiconicity に関連した概念であるが、私はそれがまさにあなた」だとは思いませんいずれかを探して再度ます。

  コンピュータプログラミングの

、のhomoiconicity のは、プログラムの主な表現は HOMOから、言語自体のプリミティブ型でも、データ構造である、いくつかのプログラミング言語の特性ですの表現の意味をのと同じアイコンの意味。これは、このプロパティのない言語でより簡単にメタプログラミングになります。

はい、私はいつもこれはリフレクションに包含されると思いました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top