Muitas perguntas são feitas aqui sobre implementos de linguagem interpretada versus compilada. Gostaria de saber se a distinção realmente faz algum sentido. (Na verdade, as perguntas são geralmente sobre idiomas, mas eles realmente estão pensando nas implementações mais populares desses idiomas).
Hoje quase nenhuma implementação é estritamente interpretada. ou seja, praticamente ninguém analisa e executa o código uma linha por vez. Além disso, a implementação compilada no código da máquina também está se tornando menos comum. Cada vez mais, os compiladores têm como alvo algum tipo de máquina virtual.
De fato, a maioria das implementações está convergindo para a mesma estratégia básica. O compilador produz bytecode que é interpretado ou compilado no código nativo via um JIT. É realmente uma mistura das idéias tradicionais de compilação e interpretação.
Assim, pergunto: Existe uma distinção útil entre implementações interpretadas e implementação compilada atualmente?
fonte
P-code
foi introduzido em 1966 primeiro. O IBM Aix existe desde 1986.Respostas:
É importante lembrar que a interpretação e a compilação não são apenas alternativas uma da outra. No final, qualquer programa que você escreve (incluindo um compilado para o código da máquina) é interpretado. Interpretar código significa simplesmente pegar um conjunto de instruções e retornar uma resposta.
Compilar, por outro lado, significa converter um programa em um idioma para outro idioma. Geralmente, supõe-se que, quando a compilação ocorre, o código é compilado para uma linguagem de "nível inferior" (por exemplo, código de máquina, algum tipo de código de byte da VM, etc.). Esse código compilado ainda é interpretado posteriormente.
Com relação à sua pergunta sobre se existe uma distinção útil entre linguagens interpretadas e compiladas, minha opinião pessoal é que todos devem ter um entendimento básico do que está acontecendo com o código que escrevem durante a interpretação. Portanto, se seu código estiver sendo compilado por JIT, ou armazenado em cache por código de código etc., o programador deve ter pelo menos um entendimento básico do que isso significa.
fonte
A distinção é profundamente significativa porque as linguagens compiladas restringem a semântica de maneiras que as linguagens interpretadas não necessariamente. Algumas técnicas interpretativas são muito difíceis (praticamente impossíveis) de compilar.
O código interpretado pode fazer coisas como gerar código em tempo de execução e dar visibilidade a esse código nas ligações lexicais de um escopo existente. Esse é um exemplo. Outra é que os intérpretes podem ser estendidos com código interpretado, que pode controlar como o código é avaliado. Essa é a base dos antigos "fexprs" do Lisp: funções que são chamadas com argumentos não avaliados e decidem o que fazer com elas (tendo acesso total ao ambiente necessário para percorrer o código e avaliar variáveis, etc). Em linguagens compiladas, você não pode realmente usar essa técnica; você usa macros: funções chamadas em tempo de compilação com argumentos não avaliados e converte o código em vez de interpretar.
Algumas implementações de linguagem são construídas em torno dessas técnicas; seus autores rejeitam a compilação como um objetivo importante e adotam esse tipo de flexibilidade.
A interpretação sempre será útil como uma técnica para inicializar um compilador. Para um exemplo concreto, veja o CLISP (uma implementação popular do Common Lisp). O CLISP possui um compilador que é escrito por si só. Quando você cria o CLISP, esse compilador está sendo interpretado durante as etapas iniciais da construção. Ele é usado para se compilar e, depois de compilado, a compilação é feita usando o compilador compilado.
Sem um kernel de intérprete, você precisaria inicializar com algum Lisp existente, como o SBCL.
Com a interpretação, você pode desenvolver uma linguagem do zero absoluto, começando pela linguagem assembly. Desenvolva as rotinas básicas de E / S e núcleo e, em seguida, escreva uma linguagem de máquina ainda avaliada. Depois de avaliar, escreva na linguagem de alto nível; o kernel do código da máquina faz a avaliação. Use esse recurso para estender a biblioteca com muito mais rotinas e escreva um compilador também. Use o compilador para compilar essas rotinas e o próprio compilador.
Interpretação: um importante trampolim no caminho que leva à compilação!
fonte
Na verdade, muitas implementações de linguagens ainda são estritamente interpretadas; você pode simplesmente não estar ciente delas. Para citar alguns: as linguagens de shell do UNIX, o cmd do Windows e os shells do PowerScript, Perl, awk, sed, MATLAB, Mathematica e assim por diante.
fonte
Eu penso: Absolutamente sim .
Realmente, o C ++ tem como objetivo portar para o domínio do compilador algum conceito de alto nível que geralmente é entregue aos intérpretes, mas permanece no lado minoritário ...
fonte
Distinção útil: programas interpretados podem se modificar adicionando ou alterando funções em tempo de execução.
fonte