문제

C로 작성된 C 컴파일러를 호출하는 것이 합법적입니까? 이 정의는 LISP와 같은 특정 유형의 언어에만 유효합니까? 요컨대, 통역사가 metacircular라고 불러야하는 조건은 무엇입니까?

도움이 되었습니까?

해결책

Metacircular 통역사는 동일한 언어의 (아마도 더 기본적인) 구현으로 작성된 통역사입니다. 이것은 일반적으로 언어에 새로운 기능을 추가하거나 다른 방언을 만드는 것을 실험하기 위해 수행됩니다.

이 과정이 LISP와 관련된 이유는 매우 명쾌한 종이 때문입니다. "통역사의 예술", 구성표를 기반으로 여러 중량체 통역사를 보여줍니다. (이 논문은 책 SICP의 커널이며, 네 번째 장은 게으른 언급 체계를 만들어내는 다른 장을 통해 작용합니다.)

이것은 또한입니다 크게 LISP, Prolog 및 Forth와 같은 "Homoiconic"언어 (런타임에 데이터로 코드를 조작 할 수있는 언어)에서 수행하기가 더 쉽습니다.

직접 질문에 관해서는 C 컴파일러가 통역사가 전혀 없습니다. 자체 언어로 작성된 컴파일러는 '자조 호스팅'이며, 이는 비슷한 속성이지만 부트 스트랩과 관련이 있습니다. PHP의 PHP 통역사는 아마도 계산되지 않을 것입니다. 왜냐하면 프로세스에서 사소한 양의 언어를 다시 구현할 수 있기 때문입니다. 기존의 중량체 통역사의 주요 이점은 그렇게하는 것은 필요하지 않습니다 - 기존 파서, 가비지 컬렉션 (있는 경우)을 연결하고 시맨틱이 다른 최상위 평가자 만 쓸 수 있습니다. 체계 나 프롤로그에서는 종종 코드 페이지보다 적습니다.

다른 팁

다음은 Wikipedia 페이지의 정의입니다 중량체:

메타 원숭이 평가자는 부모 통역사의 기존 시설이 추가 구현이 필요없이 해석되는 소스 코드에 직접 적용되는 자체 간 프리 터의 특별한 경우입니다.

따라서 두 경우 모두 대답이 아닙니다.

  • AC 컴파일러는 통역사가 아닙니다 (평가자). 프로그램을 한 양식에서 다른 양식으로 실행하지 않고 다른 양식으로 번역합니다.
  • PHP에 작성된 A (가상) PHP 통역사는 자체 통역사이지만 반드시 메타 회의는 아닙니다.

위의 답변을 보완하기 위해 : http://www.c2.com/cgi/wiki?metaccularevaluator

내가 이해하면서 중량체 통역사는 스스로 해석 할 수있는 통역사입니다.

컴파일러는 코드 만 변환하고 실행하지 않습니다.

어느 튜링-완성 언어 수학적으로 논리적 계산을 모방 할 수 있으므로 다음은 사용하는 예입니다. 파이썬. 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top