メタサイカルインタープリターの正確な定義は何ですか?
-
18-09-2019 - |
質問
Cで書かれたCコンパイラまたはPHPメタサイカルで書かれたPHPインタープリターを呼び出すことは合法ですか?この定義は、LISPのような特定のタイプの言語に対してのみ有効ですか?要するに、通訳者が中骨と呼ばれることで満たすべき条件は何ですか?
解決
メタサイロンインタープリターは、同じ言語の(おそらくより基本的な)実装で書かれた通訳です。これは通常、言語に新しい機能を追加したり、別の方言を作成したりするために行われます。
このプロセスがLISPに関連付けられている理由は、非常に明快な紙によるものです 「通訳の芸術」, 、スキームに基づいていくつかのメタサイカの通訳を示しています。 (この論文は本SICPのカーネルであり、その4番目の章は、怠laziallyの評価されたスキームを作成する他の章を通じて機能します。)
これもまた 非常に LISP、PROLOG、およびFORTEなど、「ホモコニック」言語(実行時にデータとしてコードを操作できる言語)で簡単に実行できます。
あなたの直接の質問に関しては、Cコンパイラは通訳者ではありません。独自の言語で書かれたコンパイラは「自己ホスティング」であり、これは同様のプロパティですが、ブートストラップに関連しています。 PHPのPHPインタープリターは、おそらくカウントされないでしょう。なぜなら、プロセス内の言語ではない言語を再実装している可能性が高いからです。従来の中間循環通訳者の主な利点は、 そうする必要はありません - 既存のパーサー、ガベージコレクション(ある場合)などを接続し、さまざまなセマンティクスを持つトップレベルの評価者を書くことができます。スキームまたはプロログでは、多くの場合、コードのページよりも少なくなります。
他のヒント
Wikipediaページの定義は次のとおりです 中鎖:
メタサーカル評価者は、追加の実装を必要とせずに、親インタープリターの既存の施設が解釈対象のソースコードに直接適用される自己インタープレーターの特別なケースです。
どちらの場合も答えはノーです。
- ACコンパイラは通訳者ではありません(評価者)。プログラムを実行せずに、プログラムを別のフォームに翻訳します。
- PHPで書かれた(仮説的)PHPインタープリターは自己インタープリターですが、必ずしも中間回路ではありません。
上記の回答を補完するには: http://www.c2.com/cgi/wiki?metacularevaluator
私が理解しているように、 メタサイロンインタープリターは、それ自体を解釈できる通訳です。
コンパイラはコードのみを翻訳し、実行しません。
どれでも チューリング完了言語 数学的に論理的な計算をエミュレートできるので、以下を使用した例を示します Python. 。 cpythonを使用してこのコードをCPU命令に翻訳して実行する代わりに、使用することもできます パイキー. 。後者はです ブートストラップ, 、したがって、一部の人々が定義するために使用するいくつかのarbitrary意的な基準を満たします 中鎖通訳.
"""
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)