O Python é interpretado ou compilado?

69

Esta é apenas uma pergunta que eu tive enquanto lia sobre linguagens interpretadas e compiladas.

Ruby é sem dúvida uma linguagem interpretada, já que o código-fonte é processado por um intérprete no ponto de execução.
Pelo contrário, C é uma linguagem compilada, pois é necessário compilar primeiro o código fonte de acordo com a máquina e depois executá-lo. Isso resulta em uma execução muito mais rápida.

Agora chegando ao Python :

  • Um código python ( somefile.py ) quando importado cria um arquivo ( somefile.pyc ) no mesmo diretório. Vamos dizer que a importação é feita em um shell python ou módulo django. Após a importação, eu mudo o código um pouco e executo as funções importadas novamente para descobrir que ele ainda está executando o código antigo. Isso sugere que os arquivos * .pyc são arquivos python compilados, semelhantes aos executáveis criados após a compilação de um arquivo C, embora eu não possa executar o arquivo * .pyc diretamente.
  • Quando o arquivo python (somefile.py) é executado diretamente (./somefile.py ou python somefile.py), nenhum arquivo .pyc é criado e o código é executado como está indicando um comportamento interpretado.

Estes sugerem que um código python é compilado toda vez que é importado em um novo processo para criar um .pyc enquanto é interpretado quando executado diretamente.

Então, que tipo de linguagem devo considerar como? Interpretado ou compilado? E como a sua eficiência se compara às linguagens interpretadas e compiladas?

De acordo com a página da wiki Interpreted Languages , ela está listada como um idioma compilado no Virtual Machine Code, o que é quis dizer com isso?

    
por crodjer 08.12.2010 / 08:28
fonte

5 respostas

71

Vale a pena notar que idiomas não são interpretados ou compilados, mas sim implementações de linguagem interpretam ou compilam código. Você observou que o Ruby é uma "linguagem interpretada", mas você pode compilar o Ruby à la MacRuby , então não é sempre uma linguagem interpretada.

Praticamente todas as implementações do Python consistem em um interpretador (ao invés de um compilador). Os arquivos .pyc que você vê são códigos de bytes para a máquina virtual Python (semelhante aos arquivos .class do Java). Eles não são o mesmo que o código de máquina gerado por um compilador C para uma arquitetura de máquina nativa. Algumas implementações do Python, no entanto, consistem em um compilador just-in-time que compilará o código de byte do Python no código de máquina nativo.

(Eu digo "praticamente tudo" porque eu não sei de nenhum compilador nativo de máquina para Python, mas eu não quero afirmar que nenhum existe em lugar nenhum).

    
por 08.12.2010 / 15:39
fonte
31

O Python se enquadra no código de bytes interpretado. O código-fonte .py é compilado primeiro no código de byte como .pyc . Este código de byte pode ser interpretado (CPython oficial) ou JIT compilado (PyPy). O código fonte do Python ( .py ) pode ser compilado para diferentes códigos de bytes, como IronPython (.Net) ou Jython (JVM). Existem várias implementações da linguagem Python. O oficial é um código de byte interpretado. Existem também implementações JIT compiladas em código de byte.

Para comparações de velocidade de várias implementações de idiomas, você pode tentar aqui .

    
por 08.12.2010 / 08:52
fonte
10

Compilado vs. interpretado pode ser útil em alguns contextos, mas quando aplicado em um sentido técnico, é uma dicotomia falsa.

Um compilador (no sentido mais amplo) é um tradutor . Ele traduz o programa A para o programa B e para execução futura usando uma máquina M.

Um intérprete (no sentido mais amplo) é um executor . É uma máquina M que executa o programa A. Embora geralmente excluamos dessas definições máquinas físicas (ou máquinas não físicas que agem exatamente como as físicas). Mas, do ponto de vista teórico, essa distinção é algo arbitrária.

Por exemplo, use re.compile . Ele "compila" um regex para uma forma intermediária, e essa forma intermediária é interpretada / avaliada / executada.

No final, depende de qual nível de abstração você está falando e do que você se importa. As pessoas dizem "compiladas" ou "interpretadas" como descrições amplas das partes mais interessantes do processo, mas na verdade a maioria dos programas é compilada (traduzida) e interpretada (executada) de uma forma ou de outra.

CPython (a implementação mais popular da linguagem Python) é mais interessante para a execução de código. Portanto, o CPython normalmente seria descrito como interpretado. Embora este seja um rótulo solto.

    
por 23.10.2015 / 07:33
fonte
6

O Virtual Machine Code é uma versão mais compacta do código-fonte original (código de bytes). Ainda precisa ser interpretado por uma máquina virtual, já que não é um código de máquina. É mais fácil e mais rápido analisar o código original escrito por um ser humano, no entanto.

Algumas máquinas virtuais geram código de máquina enquanto interpretam o código da máquina virtual pela primeira vez (just in time compilation - JIT). As invocações a seguir usarão esse código de máquina diretamente, o que leva a uma execução mais rápida.

Até onde eu sei, o Ruby > = 1.9 também usa uma máquina virtual como o Python.

    
por 08.12.2010 / 08:48
fonte
5

O tempo de execução do Python executa código de objeto personalizado (código de byte) em uma máquina virtual.

O processo de compilação converte código fonte em código objeto.

Para acelerar, o código objeto (ou código de byte, se você preferir) é armazenado em disco, para que possa ser reutilizado na próxima vez que o programa for executado.

    
por 08.12.2010 / 08:55
fonte