0%
Pular para o conteúdo principal
0%

5.2

5.2 Um Simulador de Máquina de Registradores

Para obter uma boa compreensão do design de máquinas de registradores, devemos testar as máquinas que projetamos para ver se elas funcionam como esperado. Uma maneira de testar um design é simular manualmente a operação do controlador, como no exercício 5.4. Mas isso é extremamente tedioso para todas as máquinas, exceto as mais simples. Nesta seção, construímos um simulador para máquinas descritas na linguagem de máquina de registradores. O simulador é um programa JavaScript com quatro funções de interface. A primeira usa uma descrição de uma máquina de registradores para construir um modelo da máquina (uma estrutura de dados cujas partes correspondem às partes da máquina a ser simulada), e as outras três nos permitem simular a máquina manipulando o modelo:

  • make_machine(register-names, operations, controller) constrói e retorna um modelo da máquina com os registradores, operações e controlador fornecidos.

  • set_register_contents(machine-model, register-name, value) armazena um valor em um registrador simulado na máquina fornecida.

  • get_register_contents(machine-model, register-name) retorna o conteúdo de um registrador simulado na máquina fornecida.

  • start(machine-model) simula a execução da máquina fornecida, começando do início da sequência do controlador e parando quando atinge o final da sequência.

Como exemplo de como essas funções são usadas, podemos definir gcd_machine como um modelo da máquina GCD da seção 5.1 da seguinte forma:

const gcd_machine =
make_machine(
list("a", "b", "t"),
list(list("rem", (a, b) => a % b),
list("=", (a, b) => a === b)),
list(
"test_b",
test(list(op("="), reg("b"), constant(0))),
branch(label("gcd_done")),
assign("t", list(op("rem"), reg("a"), reg("b"))),
assign("a", reg("b")),
assign("b", reg("t")),
go_to(label("test_b")),
"gcd_done"));

O primeiro argumento para make_machine é uma lista de nomes de registradores. O próximo argumento é uma tabela (uma lista de listas de dois elementos) que associa cada nome de operação com uma função JavaScript que implementa a operação (ou seja, produz o mesmo valor de saída dados os mesmos valores de entrada). O último argumento especifica o controlador como uma lista de rótulos e instruções de máquina, como na seção 5.1.

Para calcular MDCs com esta máquina, definimos os registradores de entrada, iniciamos a máquina e examinamos o resultado quando a simulação termina:

set_register_contents(gcd_machine, "a", 206);
"done"
set_register_contents(gcd_machine, "b", 40);
"done"
start(gcd_machine);
"done"
get_register_contents(gcd_machine, "a");
2

Esta computação será executada muito mais lentamente do que uma função gcd escrita em JavaScript, porque simularemos instruções de máquina de baixo nível, como assign, por operações muito mais complexas.

Exercício 5.7: Use o simulador para testar as máquinas que você projetou no exercício 5.4.