Pergunta

É legal chamar um compilador C escrito em C ou um intérprete PHP escrito no Metacircular PHP? Esta definição é válida apenas para idiomas de um tipo específico, como o LISP? Em suma, quais são as condições que um intérprete deve satisfazer por ser chamado de metacircular?

Foi útil?

Solução

Um intérprete metacircular é um intérprete escrito em uma implementação (possivelmente mais básica) do mesmo idioma. Isso geralmente é feito para experimentar adicionar novos recursos a um idioma ou criar um dialeto diferente.

A razão pela qual esse processo está associado ao LISP é por causa do papel altamente lúcido "A arte do intérprete", que mostra vários intaceradores metacirculares baseados no esquema. (O artigo é o kernel do livro SICP, e seu quarto capítulo funciona através de outros que criam por exemplo, um esquema preguiçoso.)

Isto é também muito Mais fácil de fazer em uma linguagem "homoicônica" (um idioma cujo código pode ser manipulado como dados em tempo de execução), como Lisp, Prolog e FORTH.

Quanto à sua pergunta direta - o compilador C não seria um intérprete. Um compilador escrito em seu próprio idioma é "auto-hospedagem", que é uma propriedade semelhante, mas mais relacionada ao bootstrapping. Um intérprete PHP no PHP provavelmente não contaria, pois você provavelmente estaria reimplementando uma quantidade não trivial do idioma no processo. O principal benefício de um intérprete metacircular convencional é que Fazer isso não é necessário - Você pode conectar o analisador existente, a coleção de lixo (se houver), etc., e apenas escrever um avaliador de nível superior com semântica diferente. No esquema ou Prolog, geralmente é menos de uma página de código.

Outras dicas

Aqui está uma definição da página da Wikipedia para metacircular:

Um avaliador meta-circular é um caso especial de um autocompreperador no qual as instalações existentes do intérprete pai são aplicadas diretamente ao código-fonte que está sendo interpretado, sem a necessidade de implementação adicional.

Portanto, a resposta é não nos dois casos:

  • O compilador CA não é um intérprete (avaliador). Ele traduz um programa de um formulário para outro sem executá -lo.
  • Um intérprete (hipotético) PHP escrito no PHP seria um intérprete autônomo, mas não necessariamente metacircular.

Para complementar as respostas acima: http://www.c2.com/cgi/wiki?metacircularevaluator

Como eu entendo, Um intérprete metacircular é um intérprete que pode se interpretar.

Um compilador traduz apenas código e não o executa.

Algum Linguagem de Turing-complete é matematicamente capaz de emular qualquer cálculo lógico, então aqui está um exemplo usando Pitão. Em vez de usar o cpython para traduzir este código para instruções da CPU e executá -lo, você também pode usar Pypy. O último é inicializado, atende tanto a algum critério arbitrário que algumas pessoas usam para definir um Intacircular intérprete.

"""
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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top