Pergunta

Ok pessoal, pensei que tomar minhas notas velhas CS e olhar através da teoria do compilador um pouco mais. Eu tenho que dizer que eu não posso para a vida de me lembrar de como tudo funciona essas coisas, mas eu tenho um aplicativo de amostra agradável de meus tempos de faculdade que me ajuda a entender algumas coisas.

Este exemplo de aplicativo leva a linguagem composta e compila-lo para um código de montagem intermediária como a linguagem. Há então uma implementação simples VM que leva essa linguagem intermediária e executa os comandos.

A coisa que eu não posso começar minha cabeça em torno é, se eu fosse um intérprete se em linha reta e não um compilador ainda seria construir estes comandos intermeditary na memória para ser executado no final. Ou será que um intérprete realmente "executar" seções descreet dos pedaços de código de cada vez?

Foi útil?

Solução

Analisadores não compilar. Há realmente muito poucos passos envolvidos na tradução de um programa (de dizer uma linguagem de alto nível como C ++ para código de máquina). Depende do projeto se ele é executado de uma só vez ou depois de várias passagens sobre a entrada. você pode fazer a sua pergunta um pouco mais específico? Enquanto isso, por mais que você odiá-lo, dê uma olhada aqui - seções especialmente o frontend e backend .

Outras dicas

Depende do idioma. A maioria das linguagens interpretadas modernos (Perl, Python e Ruby, para citar alguns) pré-compilar o código fonte em algum tipo intermediário para ser executado no final ( citação ).

Eu escrevi ou trabalhou com intérpretes que atuam diretamente sobre a análise de fichas na entrada, que agem diretamente sobre uma árvore abstrata-sintaxe (AST), construído pelo analisador, e que traduzem a AST a uma forma projetada para execução eficiente. Portanto, a resposta é, isso depende .

  • Se a sua máquina de destino tem 8K de memória RAM, um intérprete de direct-análise seria uma escolha sensata (pense por diante).
  • Se você estiver usando intérpretes para ensinar ou aprender sobre a estrutura e semântica de linguagens de programação, construção e interpretação de um AST é uma boa escolha.
  • Se você estiver usando um intérprete para a portabilidade e você quer rápida execução, compilando para uma máquina virtual baseada em registro é uma boa escolha. (David Gregg e outros mostraram há sobrecarga menos interpretativa em uma VM baseada em registro como a Lua VM do que em uma máquina virtual baseada em pilha como o Java VM).

A maioria dos intérpretes modernos programa de análise de código intermediário que depois é interpretada. Alguns armazenar esse código intermediário explicitamente (.pyc ex. Do Python). Há exceções, por exemplo, shell scripts são interpretados diretamente, em vez analisado para formato intermediário.

Alguns "intérpretes" mais avançados realmente não interpretam, mas fazê-JIT (just-in-time) a compilação (eg. Java ou .NET).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top