As linguagens dinâmicas são sempre interpretadas?


18

Observando a maioria das linguagens dinâmicas (se não todas) (por exemplo, Python, PHP, Perl e Ruby), todas elas são interpretadas. Corrija-me se eu estiver errado. Existe algum exemplo de linguagem dinâmica que passa pela fase de compilação? A linguagem dinâmica é idêntica à linguagem interpretada?


4
Definir linguagem dinâmica, é digitada dinamicamente?
benjaminb

3
O Objective-C exibe muitas propriedades "dinâmicas".
Edward Strange

4
@Job, alguém poderia fazer isso com o Lisp por décadas. E é compilado e digitado dinamicamente. Portanto, nunca houve uma fronteira exata entre compilação e interpretação.
SK-logic1

2
@ Darien Você também pode compilar isso em tempo de execução e executar o código posteriormente. Estritamente falando, não é interpretação.
XMM0

3
@Darien Nada impede que um compilador armazene informações da tabela de símbolos no binário compilado e gere código para acessá-las em tempo de execução. É verdade que algumas linguagens se prestam mais à interpretação do que à compilação, mas o ponto principal é que é possível ter um compilador para essa linguagem. Outra coisa importante a ser observada é que algumas pessoas assumem que um compilador precisa gerar algum tipo de código de máquina. Na prática, existem compiladores que simplesmente executam uma transformação no nível da fonte em dois idiomas (ou mesmo no mesmo idioma, como alguns minificadores de Javascript).
XMM0

Respostas:


33

Analisando a maioria das linguagens dinâmicas (se não todas) [ie Python, PHP, Perl e Ruby], elas são todas interpretadas.

Não é verdade. Você pode compilar a fonte Python. Essa é uma prova existencial.

Existem intérpretes para idiomas de tipo estaticamente e compiladores para idiomas de tipo dinâmico. Os dois conceitos são ortogonais.

Nota lateral: em geral, uma linguagem é apenas isso: uma linguagem, com um conjunto de construções sintáticas para expressar semântica. Se você escrever Python em um quadro branco, ainda será chamado Python! É a implementação que pode ser um intérprete ou um compilador. Ser digitado estaticamente ou dinamicamente (do tipo híbrido de ambos) é uma propriedade da linguagem, enquanto a execução de um programa pela interpretação ou compilação é uma propriedade da implementação.


19
Em que precisão os recuos devem corresponder em um quadro branco para que o Python seja sintaticamente válido? ;)
edA-qa mort-ora-y

1
Você não pode compilar Python. O PYC acelera apenas a carga de um módulo. E py2exe simplesmente incorpora o intérprete ao exe com o arquivo de origem.
benjaminb

8
@ Ubiquité: os .pycarquivos são bytecode. O código fonte do Python foi analisado, otimizado e compilado para criá-los. As instruções do bytecode são de nível relativamente alto e a implementação mais popular é um intérprete simples (por outro lado, observe o PyPy que JIT compila o bytecode com um código de máquina muito inteligente em tempo de execução), mas o Python não é menos compilado que o Java ou C #. O Python só "não é compilado" se a "compilação" foi restrita à compilação antecipada nativa , mas ninguém disse nada sobre isso e geralmente pode se referir a qualquer transformação de linguagem para linguagem.

4
@ Ubiquité: Sim, isso está correto, mas isso não tem relação com a sua afirmação de que "Você não pode compilar o Python" ou se é possível compilar o Python. Em primeiro lugar, você está misturando Pythone CPython, enquanto o último é uma implementação do primeiro, o mesmo ocorre PyPy.
Phant0m

2
@ClemC TODAS as propriedades de um idioma são construídas em um compilador ou intérprete, caso contrário, o intérprete ou compilador é algo para outro idioma.
Pieter B

15

Lisp comum é digitado dinamicamente (e fortemente) e geralmente compilado .

Como essa dinâmica é alcançada no tempo de execução, existem algumas diretivas que você pode usar no código-fonte para garantir ao compilador que um símbolo mantenha apenas um certo tipo de valor, para que o compilador possa otimizar o código gerado e aumentar o desempenho.


12

O C # 4.0 oferece suporte a tipos dinâmicos (ligação tardia) e é compilado.


4

O node.js é baseado no mecanismo javascript V8 do Google. V8 faz compilação em tempo de execução. V8 é incrivelmente rápido, dado esse fato. Basta verificar http://shootout.alioth.debian.org e comparar V8 vs. qualquer um dos idiomas interpretados acima.


3

Não - certamente é possível compilar linguagens dinâmicas.

Existem até algumas linguagens dinâmicas que são sempre compiladas pelo design (por exemplo, Clojure).

No entanto, a pergunta aborda um ponto relacionado importante: embora as linguagens dinâmicas possam ser compiladas, geralmente é possível que linguagens dinâmicas não possam ser compiladas em códigos que sejam tão eficientes quanto uma linguagem de tipo estaticamente . Isso ocorre porque existem alguns recursos inerentes às linguagens dinâmicas que requerem verificações em tempo de execução que seriam desnecessárias em um idioma compilado estaticamente.

Um exemplo disso: linguagens que permitem a correção de objetos em tempo de execução (por exemplo, Ruby) geralmente exigem que o objeto seja inspecionado (com uma pesquisa de hashtable ou semelhante) sempre que você invocar um método no objeto. Mesmo que isso seja compilado, o compilador precisará gerar código para fazer a pesquisa do método em tempo de execução. Até certo ponto, essa pesquisa de método não é diferente do que um intérprete teria que fazer.

Isso adiciona uma sobrecarga significativa quando comparado a uma chamada de método em uma linguagem como Java, onde o método correto pode ser determinado estaticamente pelo compilador a partir da definição de classe e reduzido a uma simples chamada de função no código nativo.

Acredito que é esse efeito, mais do que qualquer outra coisa, que resulta em linguagens dinâmicas com desempenho mais lento, em média, do que suas contrapartes estaticamente compiladas. Como você pode ver nos benchmarks falhos , são as linguagens estaticamente tipadas (C, Java, Fortran etc.) que tendem a ser mais rápidas com as linguagens dinâmicas (Perl, Python, Ruby, PHP etc.) na parte inferior do ranking.


2

Era uma vez, BASIC foi interpretado. E algumas variantes do BASIC tinham digitação dinâmica. E você também pode obter compiladores para eles.

(Isso acontecia nos dias de 100 mil unidades de disquete, quando os dinossauros ainda vagavam pela Terra e comiam desenvolvedores s / w desavisados ​​no café da manhã.)


... mas somente quando eles usaram GOTOs. (.! O que era, é claro, bastante comum se eles estavam se desenvolvendo em BASIC AHA Isso explica tudo!)
Mason Wheeler

O BASIC na época do design era uma linguagem compilada.
AProgrammer

2

Diferentes implementações do Smalltalk lidam com isso de maneira diferente, mas várias delas são compiladas em bytecodes que são executados em uma VM de alto desempenho.


2

De fato, a maioria das linguagens "interpretadas" passam / permitem uma compilação just-in-time para torná-la mais rápida. E alguns deles precisam ser compilados para código de bytes antes que você possa executá-los.

De fato, dinâmico e interpretado são totalmente duas idéias diferentes, embora exista uma correlação. O motivo é que quem sente a digitação dinâmica torna seu trabalho mais fácil e rápido, eles não se importariam com o código ser um pouco mais lento, mas portátil.


1

Chrome, IE9 e Firefox 3.1+ compilam JavaScript em binários nativos, e o JavaScript é digitado dinamicamente.

Penso que a razão pela qual as linguagens dinâmicas historicamente tendem a ser interpretadas é porque a digitação e interpretação dinâmica (ou mais especificamente, a falta de compilação) tendem a ser recursos úteis para linguagens de script e tarefas de script em geral.

O desempenho também não é (não era) uma grande preocupação com os tipos de programas que foram escritos nessas linguagens; portanto, a sobrecarga da digitação e interpretação dinâmicas não era um problema tão grande quanto seria em linguagens. esse valor desempenho.


1

Python é, tipicamente, compilado. É certo que compilado para código de bytes que é interpretado.

Perl trabalha de maneira semelhante.

Normalmente, o Lisp comum será compilado em um código nativo ou de byte. Isso difere entre implementações (e, até certo ponto, dentro de uma implementação, dependendo de várias configurações de otimização).


-5

Sim. Todas as linguagens dinâmicas são linguagem interpretada (mas uma linguagem interpretada pode não ser dinâmica).

O motivo é simples: se é dinâmico, ele precisa de um intérprete para executar o dinamismo no nível da compilação binária.

ex. : quando colocamos dados em uma variável PHP, depois mais tarde em outro tipo, nosso programa não pôde compilar em código binário, pois cada tipo tem seu próprio formato de representação binária; o intérprete gerencia os turnos no nível binário de maneira dinâmica


2
Errado. Linguagens dinâmicas podem ser compilados (e às vezes de forma muito eficiente, por exemplo, usando JIT e técnicas de compilação adaptativas)
Basile Starynkevitch

"Aproximadamente, a compilação JIT combina a velocidade do código compilado com a flexibilidade da interpretação, com a sobrecarga de um intérprete ..." pt.wikipedia.org/wiki/Just-in-time_compilation que seu programa não compila: é compilado por o intérprete para você
ClearMind 29/08

Leia artigos relacionados a SELF
Basile Starynkevitch

Certo. Seu link menciona: "Um recurso do Self é que ele se baseia no mesmo tipo de sistema de máquina virtual usado pelos sistemas Smalltalk anteriores. Ou seja, os programas não são entidades autônomas em idiomas como C, mas precisam deles. ambiente de memória inteiro para executar ". não stand-alone = não binário compilado a máquina virtual é necessário para realizar a compilação binária
ClearMind

1
Sua definição de compilador é muito restritiva. Nem todo compilador produz um arquivo executável binário. Para um contra-exemplo recente, estude a implementação do SBCL . Leia as últimas Dragon Book e Lisp In Small Pieces
Basile Starynkevitch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.