5Computação com Máquinas de Registro

Meu objetivo é mostrar que a máquina celestial não é uma espécie de ser divino e vivo, mas uma espécie de mecanismo de relógio (e quem acredita que um relógio tem alma atribui a glória do criador à obra), na medida em que quase todos os múltiplos movimentos são causados por uma força muito simples e material, assim como todos os movimentos do relógio são causados por um único peso.

—Johannes Kepler (carta para Herwart von Hohenburg, 1605)

Começamos este livro estudando processos e descrevendo processos em termos de procedimentos escritos em Lisp. Para explicar os significados desses procedimentos, usamos uma sucessão de modelos de avaliação: o modelo de substituição do Capítulo 1, o modelo de ambiente do Capítulo 3 e o avaliador metacircular do Capítulo 4. Nosso exame do avaliador metacircular, em particular, dissipou muito do mistério de como linguagens semelhantes ao Lisp são interpretadas. Mas mesmo o avaliador metacircular deixa questões importantes sem resposta, porque não esclarece os mecanismos de controle em um sistema Lisp. Por exemplo, o avaliador não explica como a avaliação de uma subexpressão consegue retornar um valor para a expressão que usa esse valor, nem explica como alguns procedimentos recursivos geram processos iterativos (ou seja, são avaliados usando espaço constante), enquanto outros procedimentos recursivos geram processos recursivos. Essas questões permanecem sem resposta porque o avaliador metacircular é ele mesmo um programa Lisp e, portanto, herda a estrutura de controle do sistema Lisp subjacente. Para fornecer uma descrição mais completa da estrutura de controle do avaliador Lisp, devemos trabalhar em um nível mais primitivo do que o próprio Lisp.

Neste capítulo, descreveremos processos em termos da operação passo a passo de um computador tradicional. Tal computador, ou máquina de registro, executa sequencialmente instruções que manipulam o conteúdo de um conjunto fixo de elementos de armazenamento chamados registros. Uma instrução típica de máquina de registro aplica uma operação primitiva ao conteúdo de alguns registros e atribui o resultado a outro registro. Nossas descrições de processos executados por máquinas de registro se parecerão muito com programas de “linguagem de máquina” para computadores tradicionais. No entanto, em vez de nos concentrarmos na linguagem de máquina de qualquer computador específico, examinaremos vários procedimentos Lisp e projetaremos uma máquina de registro específica para executar cada procedimento. Assim, abordaremos nossa tarefa a partir da perspectiva de um arquiteto de hardware, em vez da perspectiva de um programador de linguagem de máquina. Ao projetar máquinas de registro, desenvolveremos mecanismos para implementar construções importantes de programação, como recursão. Também apresentaremos uma linguagem para descrever projetos de máquinas de registro. Em 5.2, implementaremos um programa Lisp que usa essas descrições para simular as máquinas que projetamos.

A maioria das operações primitivas de nossas máquinas de registro é muito simples. Por exemplo, uma operação pode adicionar os números obtidos de dois registros, produzindo um resultado a ser armazenado em um terceiro registro. Tal operação pode ser realizada por hardware facilmente descrito. No entanto, para lidar com a estrutura de listas, também usaremos as operações de memória car, cdr e cons, que exigem um mecanismo elaborado de alocação de armazenamento. Em 5.3, estudaremos sua implementação em termos de operações mais elementares.

Em 5.4, depois de acumular experiência na formulação de procedimentos simples como máquinas de registro, projetaremos uma máquina que executa o algoritmo descrito pelo avaliador metacircular de 4.1. Isso preencherá a lacuna em nossa compreensão de como as expressões Scheme são interpretadas, fornecendo um modelo explícito para os mecanismos de controle no avaliador. Em 5.5, estudaremos um compilador simples que traduz programas Scheme em sequências de instruções que podem ser executadas diretamente com os registros e operações da máquina de registro do avaliador.