Linguagem Java "Virtual Machine" vs. Python "Interpreter"?

Parece raro ler-se uma "máquina virtual" em Python, enquanto que em Java a "máquina virtual" é usada o tempo todo.

Ambos interpretam códigos de bytes; porquê chamar uma máquina virtual e a outra intérprete?

Author: Matthias Braun, 2009-01-14

9 answers

Uma máquina virtual é um ambiente de computação virtual com um conjunto específico de instruções atômicas bem definidas que são suportadas independentemente de qualquer linguagem específica e é geralmente pensado como uma caixa de areia para si mesma. O VM é análogo a um conjunto de instruções de uma CPU específica e tende a trabalhar em um nível mais fundamental com blocos de construção muito básicos de tais instruções (ou códigos byte) que são independentes do próximo. Uma instrução executa deterministicamente baseada apenas em o estado atual da máquina virtual e não depende da informação em outro lugar no fluxo de instrução naquele momento.

Um intérprete, por outro lado, é mais sofisticado na medida em que é adaptado para processar um fluxo de alguma sintaxe que é de uma linguagem específica e de um gramático específico que deve ser descodificado no contexto dos tokens circundantes. Você não pode olhar para cada byte ou até mesmo cada linha em isolamento e saber exatamente o que fazer a seguir. Os símbolos na língua não podem ser tomadas isoladamente como podem em relação às instruções (códigos de byte) de uma VM.

Um compilador Java converte linguagem Java em um fluxo de código byte não diferente de um compilador C converte programas de linguagem C em código assembly. Um intérprete, por outro lado, realmente não converte o programa em qualquer forma intermediária bem definida, ele apenas toma as ações do programa como uma questão do processo de interpretação da fonte.

Outro teste da diferença entre um VM e um intérprete é se você pensa nisso como sendo independente da linguagem. O que conhecemos como VM Java não é muito específico do Java. Você pode fazer um compilador de outras línguas que resultam em códigos de byte que podem ser executados no JVM. Por outro lado, eu não acho que nós realmente pensaríamos em "Compilar" alguma outra linguagem além do Python em Python para interpretação pelo interpretador Python.

Por causa da sofisticação do processo de interpretação, isto pode ser processo relativamente lento....especificamente analisar e identificar os tokens de linguagem, etc. e compreender o contexto da fonte para poder realizar o processo de execução dentro do intérprete. Para ajudar a acelerar tais linguagens interpretadas, é aqui que podemos definir formas intermediárias de código fonte pré-processado, pré-tokenizado que é mais prontamente interpretado diretamente. Este tipo de forma binária ainda é interpretada no tempo de execução, está apenas começando a partir de um muito menos legível para o ser humano forma para melhorar o desempenho. No entanto, a lógica de executar essa forma não é uma máquina virtual, porque esses códigos ainda não podem ser tomados isoladamente - o contexto dos tokens circundantes ainda importam, eles estão agora em uma forma diferente mais eficiente do computador.
 113
Author: Tall Jeff, 2009-01-14 17:16:25

Neste post, "máquina virtual" refere-se a máquinas virtuais de processo, não a máquinas virtuais do sistema como Qemu ou Virtualbox. Uma máquina virtual de Processo é simplesmente um programa que fornece um ambiente de programação geral -- um programa que pode ser programado.

Java tem um interpretador, bem como uma máquina virtual, e Python tem um virtual máquina e intérprete. A razão pela qual "máquina virtual" é mais termo comum em Java e interpretador é um termo mais comum em Python tem muito para fazer com a grande diferença entre as duas línguas: datilografia estática (Java) vs dynamic typing (Python). Neste contexto, "tipo" refere-se a tipos primitivos de dados -- tipos que sugerem o tamanho do armazenamento na memória de referência. A máquina virtual Java tem isso fácil. Exige que o programador especifique o tipo de dados primitivos de cada variável. Isto proporciona suficiente informação para bytecode Java não só a ser interpretada e executada pelo Java virtual máquina, mas mesmo a ser compilado em instruções da máquina . A máquina virtual Python é mais complexa no sentido em que assume o tarefa adicional de pausar antes da execução de cada operação para determinar os tipos de dados primitivos para cada variável ou estrutura de dados envolvidos na operacao. Python liberta o programador de pensar em termos de dados primitivos tipos e permite que as operações sejam expressas a um nível mais elevado. O preço de esta liberdade é o desempenho. "Interpretador" é o termo preferido para Python porque tem que pausar para inspecionar tipos de dados, e também porque o a sintaxe relativamente concisa das línguas dinamicamente tipadas é um bom ajuste para interfaces interactivas. Não há barreira técnica para construir um interactivo Interface Java, mas tentando escrever qualquer código de tipo estático interativamente seria entediante, por isso não se faz assim.

No mundo Java, a máquina virtual rouba o programa porque executa programas. escrito em uma linguagem que pode realmente ser compilado em instruções de máquina, e o resultado é rapidez e eficiência de recursos. O bytecode Java pode ser executado pela máquina virtual Java com desempenho próximo do compilado programas, relativamente falando. Isto é devido à presença de dados primitivos escreva a informação no bytecode. A máquina virtual Java coloca Java em um categoria própria:

Língua Portável interpretada estaticamente

O próximo mais próximo a coisa é LLVM, mas LLVM opera a um nível diferente:

Linguagem de montagem portátil interpretada

O termo "bytecode" é usado tanto em Java como em Python, mas nem todos os bytecode são igual. bytecode é apenas o termo genérico para linguagens intermediárias utilizado por compiladores/intérpretes. Mesmo compiladores C como o gcc usam um intermediário língua (ou vários) para fazer o trabalho. Bytecode Java contém informações sobre tipos de dados primitivos, enquanto Python bytecode não. Em este respeito, o Python (e Bash,Perl, Ruby, etc.) máquina virtual realmente é fundamentalmente mais lento do que a máquina virtual Java, ou melhor, simplesmente tem mais trabalho para fazer. É útil considerar quais as informações contidas em diferentes formatos de bytecode:

  • llvm: registos da cpu
  • Java: tipos primitivos de Dados
  • Python: tipos definidos pelo utilizador

Para desenhar uma analogia no mundo real: trabalhos LLVM com átomos, a máquina virtual Java funciona com moléculas, e a máquina virtual Python funciona com materiais. Desde que tudo deve eventualmente se decompor em partículas subatômicas (real operações de máquina), a máquina virtual Python tem a tarefa mais complexa.

Intepretadores/compiladores de linguagens de tipo estático não têm o mesmo bagagem que os intérpretes/compiladores de línguas dinamicamente tipadas têm. Os programadores de línguas de tipo estático têm de assumir a responsabilidade, pois que o pagamento é o desempenho. No entanto, tal como todas as funções não determinísticas são secretamente deterministas, assim como todas as línguas dinamicamente digitadas secretamente estaticamente dactilografado. Diferenças de desempenho entre as duas famílias de línguas deve, portanto, nivelar-se por volta da hora em que o Python muda o seu nome para HAL 9000.

As máquinas virtuais de linguagens dinâmicas como o Python implementam algumas idealizadas máquina lógica, e não necessariamente corresponder muito perto de qualquer real hardware. A máquina virtual Java, em contraste, é mais semelhante em funcionalidade para um compilador C clássico, excepto que em vez de emitir instruções da máquina, executa rotinas incorporadas. Em Python, um inteiro é um objeto Python com um monte de atributos e métodos ligados a ele. Em Java, um int é um número designado de bits, geralmente 32. Não é bem um comparação justa. Os inteiros Python devem ser comparados com o Java Classe inteira. O tipo de dados primitivo "int" de Java não pode ser comparado com qualquer coisa em a linguagem Python, porque a linguagem Python simplesmente não tem esta camada de primitivos, assim como bytecode Python.

Uma vez que as variáveis de Java são explicitamente digitadas, é razoável esperar algo como Jython para estar no mesmo estádio que cPython . Por outro lado, uma máquina virtual Java implementada em Python é quase garantido ser mais lento que a lama. E não espere Ruby, Perl, etc., para me sair melhor. Não eram. projetado para fazer isso. Foram concebidos para "scripting", que é o que a programação em uma linguagem dinâmica é chamada.

Todas as operações que ocorrem numa máquina virtual acabam por atingir hardware real. Máquinas virtuais contêm rotinas pré-compiladas que são gerais o suficiente para executar qualquer combinação de operações lógicas. Uma máquina virtual pode não estar emitindo instruções novas da máquina, mas certamente está executando suas próprias rotinas sobre e sobre no arbirtrarily complexo sequência. A máquina virtual Java, a máquina virtual Python, e todas as outras máquinas virtuais de propósito geral lá fora são iguais no sentido de que eles podem ser coaxados a realizar qualquer lógica que você possa imaginar, mas eles são diferentes em termos de quais tarefas eles assumem, e que tarefas eles deixam para o programador.

O Psyco para o Python não é uma máquina virtual Python completa, mas uma máquina just-in-time compilador que seqüestra a máquina virtual Python regular em pontos que ele pensa que poder compile algumas linhas de código -- principalmente loops onde ele pensa que o primitivo o tipo de alguma variável permanecerá constante mesmo que o valor esteja a mudar com cada iteração. Nesse caso, pode renunciar a algum do tipo incessante determinação da máquina virtual regular. Tens de ter um pouco de cuidado., no entanto, para não tirares o tipo debaixo dos pés do Psyco. Pysco, no entanto, normalmente sabe apenas voltar para a máquina virtual regular, se não é completamente confiante que o tipo não alterar.

A moral da história é Que informação primitiva do tipo de dados é realmente útil para um compilador / máquina virtual.

Finalmente, para colocar tudo em perspectiva, considere isto: um programa Python executado por um interpretador Python / máquina virtual implementada em Java executando em um Java interpretador / máquina virtual implementada no LLVM a correr num qemu virtual máquina a funcionar num iPhone.

Permalink

 128
Author: pooryorick, 2009-11-14 04:55:15

Provavelmente uma razão para a terminologia diferente é que normalmente se pensa em alimentar o interpretador python com um código fonte acessível ao ser humano e não se preocupar com o bytecode e tudo isso.

Em Java, você tem que compilar explicitamente para bytecode e então executar apenas o bytecode, não o código fonte no VM.

Mesmo que o Python use uma máquina virtual sob as capas, do ponto de vista do utilizador, pode-se ignorar este detalhe a maior parte do tempo.

 54
Author: Mr Fooz, 2009-01-14 03:56:21

Interpretador , traduz o código fonte em alguma representação intermediária eficiente (código) e imediatamente executa isto.

Máquina Virtual , executa explicitamente o código pré-compilado armazenado construído por um compilador que faz parte do sistema interpretador.

Uma característica muito importante de uma máquina virtual é que o software que está rodando dentro, está limitado aos recursos fornecidos pela máquina virtual. Precisamente, não pode sair do seu virtual mundo. Pense na execução segura de código remoto, Applets Java.

No caso do python, se estamos mantendo arquivos pyc, Como mencionado no comentário deste post, então o mecanismo se tornaria mais como um VM, e este bytecode executa mais rápido -- ele ainda seria interpretado, mas de uma forma muito mais amigável do computador. Se olharmos para isto como um todo, PVM é um último passo do interpretador Python.

A linha de fundo é, quando referimos o interpretador Python, significa que estamos a referi-lo como um todo, e quando dizemos PVM, isso significa que estamos apenas falando de uma parte do interpretador Python, um ambiente de execução. Semelhante ao de Java, referimos diferentes partes diferentyl, JRE, JVM, JDK, etc.

Para mais, a entrada na Wikipédia: intérprete, e Máquina Virtual . Mais um aqui. Aqui você pode encontrar a comparação das máquinas virtuais de Aplicação . Ajuda a compreender a diferença entre, compiladores, intérpretes e VMs.

 14
Author: Adeel Ansari, 2015-05-29 11:15:40

O termo intérprete é um termo legado que remonta a linguagens anteriores de script shell. Como as "linguagens de scripting" evoluíram para linguagens completas caracterizadas e suas plataformas correspondentes tornaram-se mais sofisticadas e "sandboxed", a distinção entre uma máquina virtual e um interpretador (no sentido Python), é muito pequena ou inexistente.

O interpretador de Python ainda funciona da mesma forma que um script shell, no sentido de que ele pode ser executado sem um passo de compilação separado. Além disso, as diferenças entre o interpretador do Python (ou Perl ou Ruby) e a máquina virtual do Java são principalmente detalhes de implementação. (Pode-se argumentar que Java é mais totalmente sandboxado do que Python, mas ambos finalmente fornecem acesso à arquitetura subjacente através de uma interface C nativa.)

 12
Author: Daniel Naab, 2009-01-14 04:27:47
Não há diferença entre eles, as pessoas seguem as convenções que os criadores escolheram.
 8
Author: Cody Brocious, 2009-01-14 03:41:23

Não se esqueça que Python tem compiladores JIT disponíveis para x86, confundindo ainda mais a questão. (Ver psyco).

Uma interpretação mais rigorosa de uma 'linguagem interpretada' só se torna útil quando se discute questões de desempenho da VM, por exemplo, em comparação com Python, Ruby was (is?) considerado mais lento porque é uma linguagem interpretada, ao contrário do Python - em outras palavras, o contexto é tudo.

 3
Author: Arafangion, 2009-01-14 04:36:21
Em primeiro lugar, você deve entender que programação ou ciência da computação em geral não é matemática e nós não temos definições rigorosas para a maioria dos Termos que usamos frequentemente. Passo à sua pergunta:

O Que é um intérprete (Em Ciência da computação)

Traduz o código fonte por uma unidade executável mais pequena e depois executa essa unidade.

O que é uma máquina virtual

No caso da JVM, a máquina virtual é um software que contém um interpretador, Carregadores de classe, coletor de lixo , scheduler thread, compilador JIT e muitas outras coisas.

Como você pode ver interpretador é uma parte ou JVM e JVM inteiro não pode ser chamado de interpretador porque contém muitos outros componentes.

Por que usar a palavra "interpretador" ao falar sobre python

Com java, a parte de compilação é explícita. python por outro lado não é explícito como java sobre seu processo de compilação e interpretação, a partir do final a interpretação de perspectiva do utilizador é o único mecanismo usado para executar programas python

 0
Author: mightyWOZ, 2016-10-01 09:06:40
Não, ambos não interpretam o código byte.

O Python só interpreta o bytecode se estiver a correr com o pypy. Caso contrário, é compilado em C e interpretado a esse nível.

Java compila para bytecode.

 0
Author: Michael Tamillow, 2018-03-12 17:46:44