o que é exactamente uma "máquina registadora"?
de http://code.google.com/p/unladen-swallow/wiki/ProjectPlan passo a citar:
" usando um JIT também nos permitirá mover Python de uma máquina baseada em pilha para uma máquina registadora, que tem sido mostrado para melhorar o desempenho em outras linguagens semelhantes (Ierusalimschy et al, 2005; Shi et al, 2005)."
Na faculdade construí um compilador simples para uma linguagem com procedimentos recursivos-que mantinham quadros de pilha para cada procedimento chamado - para que pudessem ser chamados recursivamente e de modo que parâmetros e valores de retorno funcionariam....2 coisas:
Estou certo em pensar que o que implementei seria considerado uma "máquina baseada em pilha" dada a terminologia usada na citação acima?
Se a minha suposição no ponto 1 estava certa, como funciona uma "máquina registadora"? ou seja, como é diferente de uma máquina baseada em pilha? Obrigado!6 answers
Uma máquina registadora é uma unidade de hardware ou software que, ao trabalhar com dados, a retira da memória, a coloca num local onde pode trabalhar com ela rapidamente, e depois devolve o resultado.
Por exemplo, uma CPU normal é uma máquina registadora. Uma vez que a ALU (a unidade que trabalha com números em uma CPU) só pode trabalhar com números em um registro.
Uma máquina baseada em pilha adiciona os dados a uma pilha e então ou estoura ou empurra as coisas para ela.
Por exemplo, adicionando dois os números seriamPush 2 // Push 2 onto the stack
Push 3 // Push 3 onto the stack
Add // Add the top two things on the stack.
Quando numa máquina registadora seria algo assim.
Load x, r0 // Load x onto register 0
Load y, r1 // Load y onto register 1
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2
Mas uma máquina de pilha raramente tem registos arquitectonicamente visíveis, ou pode ter apenas um ou dois.
Uma máquina registadora pode ter algumas operações de pilha e pode até ter um modo de endereçamento de pilha.
A diferença é de orientação. A máquina registadora terá principalmente instruções que operam em registros, e terá um punhado de ops para o carregamento e armazenamento entre os registros e a pilha ou memoria.
Uma máquina de pilhas .. e estes são muito raros como dispositivos de hardware .. irá operar diretamente na pilha com suas instruções e terá uma mão cheia de ops para carregar e armazenar entre a pilha e memória. Agora, as razões pelas quais as máquinas de registro de hardware são mais rápidas do que as máquinas de pilha de hardware são possivelmente independentes das razões pelas quais o software "registrar" VM é mais rápido, de acordo com o Citado papel, do que as máquinas de "pilha" de software.Para a software VM's, aparentemente é o caso que menos instruções precisam ser executadas. Este foi determinado empiricamente de acordo com declarações no documento citado, mas eu imagino que é porque muito menos sobrecarga instruções de como push, pop e exchange precisa ser feito no cadastro de máquina, e porque o registo da máquina pode reutilizar operandos facilmente se eles ainda estão por aí no registo do arquivo, sem a necessidade de carregar ou empurrar ops. É claro, é tudo apenas memória realmente; eles são virtuais registar.
Uma máquina de Registo utiliza um número fixo de registos ou baldes para armazenar valores intermédios para o cálculo. Por exemplo, a instrução" adicionar " poderia adicionar os valores em dois registradores específicos e armazenar o resultado em outro registrador.
Uma máquina baseada em pilhas usa uma pilha para armazenar valores intermédios durante o cálculo. Por exemplo, para adicionar dois números as instruções "adicionar" aparecem de dois valores da pilha, adiciona-os, e empurra o resultado de volta para a pilha.
Tenho razão em pensar que o que a implementação seria considerada uma "stack-based machine" dado o terminologia utilizada na citação acima?Na verdade, não. Uma pilha de algum tipo é praticamente a única maneira de implementar chamadas de funções recursivas. Mas uma "máquina baseada em pilha" vai muito mais longe ao fazer Tudo através da pilha. Não apenas chamadas de funções, mas também operações aritméticas. De certa forma, comportam-se como se todas as instruções da máquina fossem chamada de função tratada através da pilha. Ele faz com que um design de máquina muito simples, mas bastante difícil de escrever montagem/código de máquina.
2) Se a minha suposição no ponto 1 foi certo, como é que uma "máquina registadora" trabalho? ou seja, como é diferente de um máquina baseada em pilha?
Uma máquina de Registo tem um armazenamento interno rápido (registos) e realiza a maior parte das suas operações com dados nestes registos. Existem instruções adicionais para a cópia de dados entre registos e memória principal.
Existem dois tipos de máquinas de pilha:
- As máquinas acumuladoras têm um "acumulador", que é basicamente um único registrador que detém o resultado dos cálculos (e também pode fornecer um operando), com a maioria das instruções da máquina operando no Acumulador.
- máquinas de pilha" puras " colocam o resultado dos cálculos em cima da pilha depois de consumir os operandos.
Uma máquina registadora é uma máquina abstrata cujos opcodes são definidos por referência à sua operação em um conjunto de registradores nomeados, em vez de pela sua operação na parte superior de uma pilha.
Numa máquina de Registo: Adicionar pode ser definido para tomar três nomes de registo como operandos, adicionar o conteúdo dos dois primeiros, e colocar o resultado no terceiro. (Mais comum é o projeto onde apenas um ou dois são nomeados e o resultado sempre vai em um registro especial acumulador, mas a questão não é essa.)
Em uma máquina de pilha: Adicionar pode ser definido para estourar dois operandos da pilha, adicioná-los, e empurrar o resultado para a pilha.
As máquinas de pilha armazenam todos os valores numa pilha, enquanto as máquinas de registo têm um número fixo de slots de armazenamento cujos "endereços" não mudam (ao contrário das máquinas de pilha).