Pergunta

O que são exatamente as vantagens e desvantagens de usar uma máquina virtual baseada em registo em vez de utilizar uma máquina virtual baseada em pilha?

Para mim, parece como se uma máquina de registo baseado seria mais simples e direta para o programa e mais eficiente. Então porque é que a JVM, o CLR, eo Python VM são todos à base de pilha?

Foi útil?

Solução

Esta já foi respondida, a um certo nível, no FAQ do o Parrot VM e documentos associados: Um papagaio Overview O texto em questão desse doc é esta:

O Papagaio VM terá uma arquitetura de registo, ao invés de uma arquitetura de pilha. Ele também terá extremamente operações de baixo nível, mais semelhantes a Java do que os ops de nível médio de Perl e Python e similares.

O raciocínio para esta decisão é principalmente que, lembrando o hardware subjacente, até certo ponto, é possível compilar para baixo Parrot bytecode para eficiente linguagem de máquina nativa.

Além disso, muitos programas em linguagens de alto nível composto de função e chamadas de método aninhadas, às vezes com variáveis ??lexicais para manter os resultados intermediários. Em Configurações de não-JIT, uma VM baseada em pilha será popping e, em seguida, empurrando os mesmos operandos muitas vezes, enquanto uma VM baseada em registro simplesmente alocar a quantidade certa de registros e operar sobre eles, o que pode reduzir significativamente a quantidade de operações e tempo de CPU.

Você também pode querer ler este: Registradores vs pilhas para o projeto intérprete Citando um pouco:

Não há dúvida real, é mais fácil para gerar código para uma máquina de pilha. A maioria dos estudantes do compilador calouro pode fazer isso. Gerando código para uma máquina de registo é um pouco mais difícil, a menos que você está tratando-o como uma máquina de pilha com um acumulador. (Que é factível, embora um pouco menos do que o ideal de um desempenho ponto de vista) Simplicidade de direcionamento não é esse negócio um grande, pelo menos não para mim, em parte porque poucas pessoas estão realmente indo diretamente alvejá-lo - quer dizer, vamos lá, quantas pessoas você conhece que realmente tentar escrever um compilador para algo que ninguém jamais se preocupam? Os números são pequenos. O outro problema lá é que muitas das pessoas com conhecimento do compilador já estão confortáveis ??máquinas segmentação de registro, como é o que todas as CPUs de hardware de uso comum são.

Outras dicas

implementado em hardware, uma máquina à base de registo vai ser mais eficiente, simplesmente porque há menos acessos à RAM mais lenta. Em software, no entanto, até mesmo uma base de registo arquitetura provavelmente terá os "registros" na RAM. Uma máquina baseada em pilha vai ser tão eficiente nesse caso.

Além disso, uma VM baseada em pilha está indo para torná-lo muito mais fácil de compiladores gravação. Você não tem que lidar com estratégias de alocação de registo. Você tem, essencialmente, um número ilimitado de registros para trabalhar.

Update: eu escrevi esta resposta assumindo uma interpretado VM. Pode não ser verdade para um JIT compilou VM. Eu corri em toda este papel que parece indicar que uma JIT compilou VM pode ser mais eficiente usando uma arquitetura de registo.

arquiteturas baseadas em pilha Tradicionalmente, implementadores de máquinas virtuais têm favorecido sobre registar-base devido a 'simplicidade de implementação VM' facilidade de escrever um back-end do compilador - mais VMs são originalmente concebido para acolher uma única língua e densidade de código e executáveis para a arquitetura da pilha são invariavelmente menor que executáveis ??para arquiteturas de registro. A simplicidade ea densidade do código são um custo de desempenho.

Estudos têm demonstrado que uma arquitetura baseada em registado exige uma média de 47% menos executado instruções VM do que a arquitetura baseada em pilha, e o código de registo é 25% maior do que o código de pilha correspondente, mas este aumento de custo de buscar mais instruções VM devido ao tamanho de código maior envolve apenas 1,07% extra cargas reais da máquina por instrução VM que é insignificante. O desempenho geral da VM baseada em registro é que leva, em média, 32,3% menos tempo para executar benchmarks padrão.

Uma das razões para a construção de VMs com base em pilha é que que os opcodes reais VM pode ser menor e mais simples (sem necessidade de operandos envio / recepção). Isso faz com que o código gerado menor, e também torna o código VM mais simples.

Quantos registros você precisa?

Eu provavelmente vou precisar de pelo menos um mais do que isso.

Não é óbvio para mim que um "baseado em registrar" máquina virtual seria "mais simples e direta para o programa" ou "mais eficiente". Talvez você esteja pensando que os registos virtuais proporcionaria um atalho durante a fase de compilação JIT? Isso certamente não seria o caso, já que o processador real pode ter mais ou menos registros do que o VM, e esses registros podem ser usados ??de diferentes maneiras. (Exemplo: valores que vão ser diminuído estão em melhor posição no registo ECX em x86 processadores.) Se a máquina real tem mais registos do que a VM, então você é o desperdício de recursos, menos e você ganhou nada usando "registo baseado" de programação.

de

Stack baseada VM são mais simples e o código é muito mais compacto. Como um exemplo do mundo real, um amigo construída (cerca de 30 anos atrás) um sistema de registro de dados com um Forth homebrew VM em um Cosmac. Adiante a VM foi de 30 bytes do código em uma máquina com 2k de ROM e 256 bytes de memória RAM.

VMs com base Stack são mais fáceis de gerar código para.

VMs com base Register são mais fáceis de criar implementações rápidas para, e mais fácil de gerar código altamente otimizado para.

Para sua primeira tentativa, eu recomendo começar com uma pilha com base VM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top