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.
fonte
Respostas:
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 poucoload 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 odis
mó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 .
fonte
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.exe
ou/usr/bin/python
.fonte
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 .
fonte
Segundo o site oficial do Python, é uma linguagem interpretada.
https://www.python.org/doc/essays/blurb/
...
...
...
fonte
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 .
fonte
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
}
fonte
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.
fonte
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.
fonte
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.
fonte
Python (o intérprete) é compilado .
Prova: nem compilará seu código se contiver erro de sintaxe .
Exemplo 1:
Resultado:
Exemplo 2:
Resultado:
fonte