O Python é interpretado ou compilado?


76

Esta é apenas uma pergunta que eu tive ao ler sobre linguagens interpretadas e compiladas.

Ruby é sem dúvida uma linguagem interpretada, pois 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 o código-fonte primeiro de acordo com a máquina e depois executar. 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. Digamos que a importação é feita em um shell python ou módulo django. Após a importação, altero um pouco o código 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 indica um comportamento interpretado.

Isso sugere 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 idioma devo considerar? Interpretado ou compilado? E como sua eficiência se compara às linguagens interpretadas e compiladas?

De acordo com a página Idiomas Interpretados do wiki , ela é listada como um idioma compilado no Código de Máquina Virtual, o que se entende por isso?


1
Quando há dúvida sobre se Ruby é uma linguagem interpretada? Quando é compilado. :) macruby.org
mipadi

8
Vale a pena notar que nenhuma linguagem moderna é interpretada no sentido estrito. Praticamente todos eles são compilados no bytecode.
Winston Ewert

@Winston Ewert: bravo! O Applesoft Basic (nos anos 80) foi compilado com código de bytes. "moderno", neste caso, significa toda linguagem interpretada na memória viva, com a única exceção possível sendo algumas implementações rudimentares do Dartmouth Basic.
S.Lott

6
>> Pelo contrário, C é uma linguagem compilada << root.cern.ch/drupal/content/cint
igouy

3
@ S.Lott: Chamar o processo de tokenização que os intérpretes do BASIC da Applesoft e dos anos 80 fizeram na "compilação de códigos de código" é mais do que um pouco falso. Sim, o código do programa inserido pelo usuário foi armazenado na memória em formato compactado, um byte por palavra reservada, mas nada foi feito além disso até você digitar RUN. Era como se você tivesse um compilador que executasse a etapa lexing e, em seguida, emitisse um fluxo de tokens que precisariam ser reparados novamente toda vez que o programa fosse executado. Não é como a compilação moderna de javaccódigos de bytes, como feita por, digamos , que abrange lexing, análise e otimização.
Dodgethesteamroller

Respostas:


80

Vale a pena notar que as linguagens não são interpretadas ou compiladas, mas as implementações de linguagem interpretam ou compilam código. Você notou que o Ruby é uma "linguagem interpretada", mas é possível compilar o Ruby à la MacRuby , portanto nem sempre é uma linguagem interpretada.

Praticamente todas as implementações do Python consistem em um intérprete (em vez de um compilador). Os .pycarquivos que você vê são códigos de bytes para a máquina virtual Python (semelhante aos .classarquivos do Java ). Eles não são iguais ao 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 compila o código de bytes do Python no código da máquina nativa.

(Digo "quase todo" porque não conheço nenhum compilador de máquina nativo para Python, mas não quero afirmar que não exista nenhum lugar).


Dependendo da sua definição, existem compiladores de máquinas nativas para Python. Alguns compilam apenas um subconjunto de python. Outros implementar todos python, mas usar a API do Python para realmente executar as operações que não podem ser executadas em C.
Winston Ewert

Eu acho que você está realmente descrevendo que Python é o que eu chamaria de 'semi-compilado' ou pode ser compilado completamente. Por semi-compilado, quero dizer que, como geralmente é compilado no arquivo .pyc da 'linguagem intermediária' usado pela Máquina Virtual Python, ele geralmente está sendo executado a partir desse formulário 'semi-compilado', que geralmente torna o código mais rápido do que interpretação simples em tempo de execução do código interpretado. Curiosamente, o código semi-compilado às vezes pode ser mais rápido que o código compilado nativamente (por exemplo, o C # geralmente é mais rápido que o C ++).
usar o seguinte

5
O Cython compila o código Python em C para que ele possa ser compilado como um objeto compartilhado.
greyfade

Distinguir código de bytes e código de máquina dessa maneira é bastante arbitrário. Java é compilado: o compilador javac produz arquivos de classe contendo instruções de baixo nível que podem ser executadas em uma máquina virtual (por exemplo, ponto de acesso) ou diretamente por hardware (por exemplo, em processadores ARM com a extensão Jazelle). Até onde eu sei, não há razão técnica para que uma arquitetura de processador semelhante não possa ser projetada para executar diretamente instruções python vm.
Jules

@Jules Por coincidência, o código Jython é realmente compilado em arquivos .class que acredito serem reutilizados até você modificar a fonte py.
precisa saber é o seguinte

35

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

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


De acordo com os benchmarks, o desempenho do python está muito abaixo!
Crdjer

1
O link que eu dei muito claramente afirma que esses são benchmarks falhos de implementações de linguagem . O Python não deve ser sua escolha de idioma se você se preocupar demais com o desempenho da execução. Se você ainda deseja comparar, compare idiomas semelhantes. O CPython oficial interpretado pelo código de bytes é comparável ou mais rápido que o Ruby compilado pelo JIT.
aufather

1
@ jase21 - "Meus planos para 2006 são portar as técnicas implementadas no Psyco para o PyPy. O PyPy nos permitirá criar um especialista JIT mais flexível, mais fácil de experimentar e sem a sobrecarga de ter que estar sincronizado com as evoluções de a linguagem Python ". psyco.sourceforge.net/introduction.html
igouy

1
@ jase21 - "faz com que os códigos python sejam executados mais rapidamente do que as partes do contador C" - Devemos apenas aceitar sua palavra por isso?
Igouy

3
O link na resposta está quebrado.
Basilevs 02/01

11

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

Um compilador (no sentido mais amplo) é um tradutor . Ele converte o programa A no 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 normalmente 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 é um tanto arbitrária.


Por exemplo, pegue re.compile. Ele "compila" um regex para um formulário intermediário, e esse formulário intermediário é interpretado / avaliado / executado.


No final, depende de qual nível de abstração você está falando e com o que você se importa. As pessoas dizem "compilado" ou "interpretado" como descrições amplas das partes mais interessantes do processo, mas, na verdade, quase todos os programas são compilados (traduzidos) e interpretados (executados) de uma maneira ou de outra.

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


7

Código de máquina virtual é uma versão mais compacta do código-fonte original (código de bytes). Ele ainda precisa ser interpretado por uma máquina virtual, pois não é um código de máquina. É mais fácil e rápido analisar o código original escrito por um ser humano.

Algumas máquinas virtuais geram código de máquina enquanto interpretam o código da máquina virtual pela primeira vez (compilação just in time - 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.

Tanto quanto eu sei, Ruby> = 1.9 também usa uma máquina virtual como Python.


5

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

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

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

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.