Python é interpretado, compilado ou ambos?

190

Pelo meu entendimento:

Uma linguagem interpretada é uma linguagem de alto nível executada e executada por um intérprete (um programa que converte a linguagem de alto nível em código de máquina e depois executa) em movimento; processa o programa um pouco de cada vez.

Uma linguagem compilada é uma linguagem de alto nível cujo código é primeiro convertido em código de máquina por um compilador (um programa que converte a linguagem de alto nível em código de máquina) e depois executado por um executor (outro programa para executar o código).

Corrija-me se minhas definições estiverem erradas.

Agora voltando ao Python, estou um pouco confuso sobre isso. Em todo lugar, você aprende que o Python é uma linguagem interpretada, mas é interpretada em algum código intermediário (como código de bytes ou IL) e não no código da máquina. Então, qual programa executa o código IM? Por favor, ajude-me a entender como um script Python é tratado e executado.

Pankaj Upadhyay
fonte
2
O Python cria arquivos .pyc (chamado byecode) sempre que uma biblioteca é importada. AFAIK, o bytecode, pode acelerar apenas os tempos de carregamento, não os tempos de execução.
Jesvin Jose 31/07
2
@aitchnyu: O armazenamento em cache do bytecode em arquivos .pyc apenas acelera o carregamento, mas apenas porque o código Python é compilado no bytecode antes da execução. Embora eu não ache que tenha sido tentado especificamente com o Python, outras implementações de linguagem mostram que o bytecode é realmente mais fácil de interpretar com eficiência do que um código-fonte simples AST ou, ainda pior, não analisado. As versões mais antigas do Ruby interpretavam da AST, por exemplo, e o AFAIK superou bastante as versões mais recentes que são compiladas no bytecode.
Não quero parecer rude, mas não é isso que eu quis dizer (mas não tão informado quanto você)?
Jesvin Jose 31/07
1
@itchieu: Eu não sei o que você quis dizer. Só sei que o seu comentário não estava incorreto, mas forneceu uma boa opoturnidade para algumas informações de segundo plano, porque ele só acelera o tempo de carregamento, por isso decidi adicionar essas informações. Nenhuma ofensa foi intencional ou tomada :) #

Respostas:

231

Primeiro, interpretado / compilado não é uma propriedade da linguagem, mas uma propriedade da implementação. Para a maioria dos idiomas, a maioria, se não todas, as implementações se enquadram em uma categoria, portanto, pode-se salvar algumas palavras dizendo que o idioma também é interpretado / compilado, mas ainda é uma distinção importante, tanto porque ajuda a entender quanto porque há muitos idiomas com implementações utilizáveis ​​de ambos os tipos (principalmente no domínio das linguagens funcionais, consulte Haskell e ML). Além disso, existem intérpretes e projetos em C que tentam compilar um subconjunto de código Python em C ou C ++ (e posteriormente em código de máquina).

Segundo, a compilação não se restringe à compilação antecipada do código de máquina nativo. Um compilador é, geralmente, um programa que converte um programa em uma linguagem de programação em um programa em outra linguagem de programação (sem dúvida, você pode até ter um compilador com a mesma linguagem de entrada e saída, se forem aplicadas transformações significativas). E os compiladores JIT compilam com código de máquina nativo em tempo de execução , o que pode fornecer velocidade muito próxima ou até melhor do que a compilação antecipada (dependendo do benchmark e da qualidade das implementações comparadas).

Mas para parar de procurar e responder à pergunta que você queria fazer: Praticamente (leia-se: usando uma implementação um tanto popular e madura), o Python é compilado . Não compilado no código da máquina antes do tempo (ou seja, "compilado" pela definição restrita e incorreta, mas também comum), "apenas" compilado no bytecode , mas ainda é compilado com pelo menos alguns dos benefícios. Por exemplo, a instrução a = b.c()é compilada em um fluxo de bytes que, quando "desmontado", parece um pouco load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a). Isso é uma simplificação, na verdade é menos legível e um pouco mais de baixo nível - você pode experimentar o dismódulo de biblioteca padrão e ver como é o negócio real.

Esse bytecode é interpretado (observe que há uma diferença, tanto na teoria quanto no desempenho prático, entre interpretar diretamente e primeiro compilar para alguma representação intermediária e interpretar isso), como na implementação de referência (CPython), ou interpretar e compilar para código de máquina otimizado em tempo de execução, como no PyPy .

jsmedmar
fonte
2
Tudo bem, isso significa que um script python é primeiro compilado para bytecode e, em seguida, que é implementada através de um intérprete como CPython, Jython ou IronPython etc.
Pankaj Upadhyay
19
Não, ele é compilado no bytecode e, em seguida, o bytecode é executado pela respectiva VM. O CPython é o compilador e a VM, mas Jython e IronPython são apenas o compilador.
Ignacio Vazquez-Abrams
1
@Igacio: Não tenho muita experiência com o IronPython / Jython, mas pelo menos o Jython não fornece uma camada semelhante a intérprete? Não acredito que seja viável tentar transformar Python no bytecode da JVM de tipo estatístico. Ainda assim, um bom argumento sobre compilador e intérprete fazer parte do mesmo pacote.
2
+1 "... uma propriedade da implementação". Eu mesmo teria dito "que permite a um shell interativo"
Jesvin Jose
2
@delnan: Bem, o Jython age como uma espécie de intermediário entre a linguagem Python e a Java VM, mas é compilado no bytecode Java.
Ignacio Vazquez-Abrams
34

A CPU pode entender apenas o código da máquina. Para programas interpretados, o objetivo final de um intérprete é "interpretar" o código do programa em código de máquina. No entanto, geralmente uma linguagem interpretada moderna não interpreta o código humano diretamente porque é muito ineficiente.

O intérprete Python primeiro lê o código humano e o otimiza para algum código intermediário antes de interpretá-lo no código da máquina. É por isso que você sempre precisa de outro programa para executar um script Python, diferente do C ++, onde você pode executar diretamente o executável compilado do seu código. Por exemplo, c:\Python27\python.exeou /usr/bin/python.

Jeremy
fonte
11
Eu gosto do argumento de "precisar de outro programa para executá-lo". Isso ajudou a esclarecer alguns dos meus pensamentos.
Matt
então python.exe primeiro otimiza o código e depois o interpreta?
precisa
@KorayTugay, quando o python.exe recebe código fonte de texto legível por humanos, ele primeiro produz código de bytes otimizado e depois interpreta isso (como você diz); no entanto, quando já existe um arquivo de código de bytes (pré-compilado), ele não precisa executar a primeira etapa, o que economiza algum tempo.
GordonBGood
31

A resposta depende de qual implementação do python está sendo usada. Se você estiver usando, digamos CPython (a implementação padrão do python) ou Jython (direcionado para integração com a linguagem de programação java), ele será primeiro traduzido para bytecode e, dependendo da implementação do python que você estiver usando, esse código será direcionado para o correspondente máquina virtual para interpretação . PVM (Python Virtual Machine) para CPython e JVM (Java Virtual Machine) para Jython.

Mas digamos que você esteja usando o PyPy, que é outra implementação padrão do CPython. Usaria um compilador Just-In-Time .

teste de qualidade
fonte
Durante a tradução para o bytecode, é necessário um compilador.
RICKY
Pypy é uma implementação Python , não uma implementação "CPython". De fato, o Pypy é uma alternativa ao CPython ( pypy.org/features.html ).
Giorgio
13

Segundo o site oficial do Python, é uma linguagem interpretada.

https://www.python.org/doc/essays/blurb/

Python é uma linguagem de programação interpretada, orientada a objetos e de alto nível ...

...

Como não há etapa de compilação ...

...

O interpretador Python e a extensa biblioteca padrão estão disponíveis ...

...

Em vez disso, quando o intérprete descobre um erro, gera uma exceção. Quando o programa não captura a exceção, o intérprete imprime um rastreamento de pilha.

John S.
fonte
7

Sim, é uma linguagem compilada e interpretada. Então, por que geralmente a chamamos de linguagem interpretada?

vê como é compilado e interpretado?

Antes de tudo, quero dizer que você gostará mais da minha resposta se você é do mundo Java.

No Java, o código-fonte é convertido primeiro no código de bytes através do compilador javac e depois direcionado à JVM (responsável por gerar o código nativo para fins de execução). Agora, quero mostrar a você que chamamos o Java de linguagem compilada, porque podemos ver que ele realmente compila o código-fonte e fornece o arquivo .class (nada além do bytecode) através de:

javac Hello.java -------> produz o arquivo Hello.class

java Hello --------> Direcionando bytecode para JVM para fins de execução

O mesmo acontece com o python, ou seja, primeiro o código-fonte é convertido no bytecode através do compilador e depois direcionado ao PVM (responsável por gerar o código nativo para fins de execução). Agora, quero mostrar a você que normalmente chamamos o Python como uma linguagem interpretada porque a compilação acontece nos bastidores e quando executamos o código python através de:

python Hello.py -------> extrai diretamente o código e podemos ver a saída desde que o código esteja sintaticamente correto

@ python Hello.py parece que ele é executado diretamente, mas na verdade ele primeiro gera o bytecode que é interpretado pelo intérprete para produzir o código nativo para fins de execução.

CPython - assume a responsabilidade de compilação e interpretação.

Observe as linhas abaixo se precisar de mais detalhes :

Como mencionei que o CPython compila o código-fonte, mas a compilação real acontece com a ajuda do cython , a interpretação acontece com a ajuda do CPython

Agora vamos falar um pouco sobre o papel do compilador Just-In-Time em Java e Python

Na JVM, existe o Java Interpreter que interpreta o bytecode linha por linha para obter o código da máquina nativo para fins de execução, mas quando o bytecode Java é executado por um intérprete, a execução sempre será mais lenta. Então qual é a solução? a solução é o compilador Just-In-Time, que produz o código nativo que pode ser executado muito mais rapidamente do que poderia ser interpretado. Alguns fornecedores de JVM usam o Java Interpreter e outros usam o compilador Just-In-Time . Referência: clique aqui

No python, para contornar o intérprete e obter uma execução rápida, use outra implementação python ( PyPy ) em vez do CPython . clique aqui para outra implementação de python, incluindo PyPy .

chirag soni
fonte
6

Se (você conhece Java) {o

código Python é convertido em bytecode, como o java.
Esse bytecode é executado novamente toda vez que você tenta acessá-lo.

} else {o

código Python é inicialmente traduzido para algo chamado bytecode
que é bastante próximo da linguagem de máquina, mas não o código de máquina real,
portanto, toda vez que o acessamos ou executamos, esse bytecode é executado novamente

}

Nabil Qadir
fonte
2

Quase, podemos dizer que Python é uma linguagem interpretada. Mas estamos usando parte do processo de compilação único em python para converter o código-fonte completo em código de bytes, como a linguagem java.

Hemant
fonte
1

Para iniciantes

O Python compila automaticamente seu script no código compilado, chamado código de bytes, antes de executá-lo.

A execução de um script não é considerada uma importação e nenhum .pyc será criado.

Por exemplo, se você possui um arquivo de script abc.py que importa outro módulo xyz.py, quando você executa o abc.py, o xyz.pyc será criado desde que o xyz foi importado, mas nenhum arquivo abc.pyc será criado desde o abc. py não está sendo importado.

navaneeth kt
fonte
0

O código python que você escreve é ​​compilado no bytecode python, que cria um arquivo com a extensão .pyc. Se compila, novamente a pergunta é: por que não a linguagem compilada.

Observe que isso não é compilação no sentido tradicional da palavra. Normalmente, diríamos que a compilação está usando uma linguagem de alto nível e convertendo-a em código de máquina. Mas é uma espécie de compilação. Compilado no código intermediário, e não no código da máquina (espero que você tenha agora)

De volta ao processo de execução, seu bytecode, presente no arquivo pyc, criado na etapa de compilação, é então executado por máquinas virtuais apropriadas, no nosso caso, a CPython VM. O carimbo de data / hora (chamado como número mágico) é usado para validar se. O arquivo py foi alterado ou não, dependendo do novo arquivo pyc criado. Se pyc é do código atual, simplesmente pula a etapa de compilação.

y durga prasad
fonte
0

Python (o intérprete) é compilado .

Prova: nem compilará seu código se contiver erro de sintaxe .

Exemplo 1:

print("This should print") 
a = 9/0 

Resultado:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

O código é compilado com sucesso. A primeira linha é executada ( print) a segunda linha é lançada ZeroDivisionError(erro em tempo de execução).

Exemplo 2:

print("This should not print")
/0         

Resultado:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

Conclusão : Se o seu arquivo de código contiver SyntaxErrornada, ele será executado porque a compilação falha.

Barba Negra
fonte