"Python é interpretada ou compilada?"
Certa vez chegando nos EUA o agente de fronteira perguntou qual era o propósito da minha viagem. Falei que ia palestrar em um evento sobre Python e ele disparou:
— Python é interpretada ou compilada?
Pensei dois segundos e respondi “Interpretada” só para não alongar o papo naquele purgatório. Imagino que ele tenha sido adestrado a fazer perguntinhas para desestabilizar pessoas que podem estar mentindo.
Ele me deixou entrar, mas a resposta certa é:
— Sim!
O código-fonte Python que escrevemos é compilado para um bytecode que então é executado por um interpretador. Como no Java.1
Desde 2011 o projeto Pypy oferece também um compilador JIT. Como no Java.2
O Pypy roda até código Python 3.11, e é quase 3x mais rápido que o CPython (segundo benchmarks). Mas é menos popular porque é incompatível com as inúmeras extensões (bibliotecas binárias) escritas em C, C++, Fortran, e Rust, que são a razão do sucesso da linguagem Python.
Mas desde o Natal de 2023 há um JIT crescendo dentro do CPython, descrito na PEP 744 – JIT Compilation. Por enquanto, esse JIT é experimental. Nos binários de Python 3.14 para Windows ou MacOS o JIT pode ser habilitado setando uma variável de ambiente. Para outras plataformas, é preciso compilar os fontes do CPython passando uma opção de configuração.
No Python 3.14, o desempenho do JIT experimental é descrito como “desde 10% mais lento até 20% mais rápido, dependendo do que está sendo processado.”
Então, se o clima na imigração fosse mais relax, hoje eu responderia:
— Python é compilada para um bytecode que é interpretado em tempo de execução, mas usando o Pypy ou o CPython 3.13 ou 3.14 você pode ter um compilador JIT para acelerar a execução. Então podemos dizer que Python é compilada, interpretada e compilada!
O programa
javac
é o compilador que transforma código-fonte.java
em bytecodes salvos em arquivos.jar
ou.class
. Para executar, usa-se outro programa:java
. No Python não há essa separação: o compilador de.py
para bytecode e o interpretador de bytecode estão no mesmo programa,python3
oupypy3
, por exemplo. Os arquivos.pyc
contém bytecode Python, mas raramente precisamos lidar com eles. ↩︎JIT é “Just In Time”, ou “na hora H” numa tradução livre. Enquanto o interpretador executa o bytecode, o compilador JIT analisa os bytecodes rodando, identifica trechos “quentes” (laços com muitas voltas, por exemplo), daí compila código de máquina equivalente, e desvia a execução dos bytecodes para o código de máquina, tudo no runtime, na hora H. ↩︎