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?
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 dejavac
códigos de bytes, como feita por, digamos , que abrange lexing, análise e otimização.Respostas:
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
.pyc
arquivos que você vê são códigos de bytes para a máquina virtual Python (semelhante aos.class
arquivos 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).
fonte
Python se enquadra no código de bytes interpretado.
.py
O 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 .
fonte
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.
fonte
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.
fonte
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.
fonte