19

Cで書かれたCコンパイラまたはPHPメタサーキュラーで書かれたPHPインタプリタを呼び出すことは合法ですか?この定義は、Lispなどの特定のタイプの言語にのみ有効ですか?要するに、通訳者がメタサーキュラーと呼ばれるために満たすべき条件は何ですか?

4

4 に答える 4

27

メタサーキュラーインタープリターは、同じ言語の(おそらくより基本的な)実装で書かれたインタープリターです。これは通常、言語に新しい機能を追加したり、別の方言を作成したりするために行われます。

このプロセスがLispに関連している理由は、Schemeに基づいたいくつかのメタサーキュラーインタプリタを示している非常に明快な論文「TheArtoftheInterpreter」のためです。(この論文は、本SICPの核心であり、その第4章は、遅延評価されたスキームなどを作成する他の章を通して機能します。)

これは、Lisp、Prolog、Forthなどの「同像性」言語(実行時にコードをデータとして操作できる言語)でも非常に簡単に実行できます。

あなたの直接の質問に関しては、Cコンパイラはまったく通訳者ではないでしょう。独自の言語で記述されたコンパイラは「セルフホスティング」です。これは同様のプロパティですが、ブートストラップに関連しています。PHPのPHPインタープリターは、プロセスで重要な量の言語を再実装する可能性があるため、おそらくカウントされません。従来のメタサーキュラーインタープリターの主な利点は、そうする必要がないことです。既存のパーサー、ガベージコレクション(存在する場合)などをプラグインして、異なるセマンティクスを持つトップレベルのエバリュエーターを作成するだけです。スキームまたはプロローグでは、多くの場合、コードの1ページ未満です。

于 2009-09-26T12:40:11.267 に答える
7

メタサーキュラーのウィキペディアページからの定義は次のとおりです。

メタサーキュラーエバリュエーターは、追加の実装を必要とせずに、親インタープリターの既存の機能が解釈されるソースコードに直接適用される自己インタープリターの特殊なケースです。

したがって、どちらの場合も答えはノーです。

  • ACコンパイラはインタプリタ(評価者)ではありません。プログラムを実行せずに、ある形式から別の形式に変換します。
  • PHPで記述された(架空の)PHPインタープリターは自己インタープリターですが、必ずしもメタサーキュラーである必要はありません。
于 2009-09-26T11:58:10.867 に答える
4

上記の回答を補足するには:http ://www.c2.com/cgi/wiki?MetaCircularEvaluator

Lispで書かれたLispは、「eval」を呼び出すことによって「eval」を実装します。しかし、他の多くの言語には「eval」がないため(存在する場合はセマンティクスが異なります)、代わりに完全に新しい言語システムを作成する必要があります。これにより、「eval」の詳細なアルゴリズムが提供されます。メタサーキュラーの場合は必要ありません。そして、それがMetaCircularEvaluatorsの魔法です。それらは、可能な言語の根底にある魔法を反映しています。

于 2009-09-26T13:20:55.913 に答える
-1

私が理解しているように、メタサーキュラーインタプリタはそれ自体を解釈できるインタプリタです。

コンパイラはコードを変換するだけで、実行しません。

チューリング完全言語は数学的に論理計算をエミュレートできるので、 Pythonを使用した例を次に示します。CPythonを使用してこのコードをCPU命令に変換して実行する代わりに、PyPyを使用することもできます。後者はブートストラップされているため、一部の人々がメタサーキュラーインタープリターを定義するために使用する任意の基準を満たしています。

"""
Metacircular Python interpreter with macro feature.
By Cees Timmerman, 14aug13.
"""

import re

def meta_python_exec(code):
    # Optional meta feature.
    re_macros = re.compile("^#define (\S+) ([^\r\n]+)", re.MULTILINE)
    macros = re_macros.findall(code)
    code = re_macros.sub("", code)
    for m in macros:
        code = code.replace(m[0], m[1])

    # Run the code.
    exec(code)

if __name__ == "__main__":
    #code = open("metacircular_overflow.py", "r").read()  # Causes a stack overflow in Python 3.2.3, but simply raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" in Python 2.7.3.
    code = "#define 1 2\r\nprint(1 + 1)"
    meta_python_exec(code)

Cで記述されたACコンパイラは、MetaCircularEvaluatorではありません。これは、コンパイラがすべての構成に対して非常に詳細で正確なセマンティクスを指定する必要があるためです。コンパイラがターゲット言語で書かれているという事実は、まったく役に立ちません。同じアルゴリズムをPascal、Java、Ada、Cobolに変換することもできますが、それでも完全に優れたCコンパイラーです。

対照的に、Lisp用のMetaCircularInterpreterは非Lisp言語に翻訳することはできません。そうです 、少なくとも、単純な1対1の方法ではあり得ません。Lispで書かれたLispは、「eval」を呼び出すことによって「eval」を実装します。しかし、他の多くの言語には「eval」がないため(存在する場合はセマンティクスが異なります)、代わりに完全に新しい言語システムを作成する必要があります。これにより、「eval」の詳細なアルゴリズムが提供されます。メタサーキュラーの場合は必要ありません。

そして、それがMetaCircularEvaluatorsの魔法です。それらは、可能な言語の根底にある魔法を反映しています。

于 2013-08-14T18:26:40.807 に答える