Qual é a definição exata de um intérprete metacircular?
-
18-09-2019 - |
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?
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)