A arquitetura de von Neumann: o relatório do EDVAC
O ENIAC, terminado em 1945 na Universidade da Pensilvânia, era o computador eletrônico mais rápido do mundo: fazia cinco mil somas por segundo com quase dezoito mil válvulas. Mas para mudar de cálculo era preciso religar fios e chaves num painel, um trabalho de dias feito por uma equipe de programadoras.
Os engenheiros do ENIAC, J. Presper Eckert e John Mauchly, já planejavam a máquina seguinte, o EDVAC, em que o programa ficaria guardado na memória. Von Neumann passou a frequentar as reuniões e, em junho de 1945, escreveu um texto que organizava as ideias do grupo numa linguagem abstrata, quase biológica, falando em “órgãos” e “neurônios”.
As partes de um computador
O Primeiro rascunho de um relatório sobre o EDVAC descreve um computador com:
- uma unidade aritmética, que faz as contas;
- uma unidade de controle, que lê as instruções uma por uma e manda executá-las;
- uma memória, que guarda ao mesmo tempo os números e as instruções, todos escritos como sequências de dígitos binários;
- dispositivos de entrada e saída.
A novidade decisiva é o item 3. Como o programa é guardado na mesma memória que os dados, trocar de cálculo é trocar números na memória, não fios. E o programa pode até calcular e modificar as próprias instruções. É a ideia da máquina universal de Turing, de 1936, posta em válvulas e linhas de atraso de mercúrio.
Um programa em quatro linhas
Imagine uma memória de oito posições, numeradas de 0 a 7, e um registrador chamado acumulador:
| posição | conteúdo | significado |
|---|---|---|
| 0 | CARREGA 5 |
põe no acumulador o número da posição 5 |
| 1 | SOMA 6 |
soma ao acumulador o número da posição 6 |
| 2 | GUARDA 7 |
guarda o acumulador na posição 7 |
| 3 | PARA |
fim |
| 5 | 40 |
dado |
| 6 | 2 |
dado |
| 7 | 0 |
resultado |
A unidade de controle começa na posição 0, executa e passa para a seguinte. Depois de três passos, a posição 7 contém $42$. Instruções e dados moram lado a lado: nada impede que uma instrução GUARDA 1 escreva por cima da segunda instrução, e é isso que permite a um programa gerar outro.
Quem inventou?
O relatório deveria circular só entre os participantes, mas Herman Goldstine o distribuiu amplamente, com apenas o nome de von Neumann na capa. Eckert e Mauchly, que tinham discutido a memória com programa armazenado antes da chegada de von Neumann, se sentiram roubados; e, como o texto foi considerado publicado, eles perderam a chance de patentear a ideia. A briga envenenou o grupo, que se separou em 1946. Os historiadores concordam hoje que a ideia foi coletiva e que o mérito de von Neumann foi descrevê-la de forma clara e geral, o que a espalhou pelo mundo.
Exercício: siga o programa
Troque o conteúdo das posições 5 e 6 por $17$ e $25$ e a instrução da posição 1 por SUBTRAI 6. O que fica na posição 7?
O acumulador recebe $17$, depois $17 - 25 = -8$, que é guardado na posição 7. O mesmo circuito fez outra conta só porque mudaram números na memória, sem mexer em nenhum fio.
Exercício: um programa que se modifica
Acrescente, antes do PARA, uma instrução que faça o programa somar também a posição 7 a si mesma na próxima execução. Por que isso só é possível com programa armazenado?
Por exemplo, GUARDA 1 com o acumulador contendo o código de SOMA 7 reescreveria a segunda instrução. Na próxima vez que o programa rodar, a posição 1 dirá SOMA 7. Isso só funciona porque as instruções são números guardados na mesma memória que os dados; no ENIAC, o programa estava nos fios e não podia ser escrito por ele mesmo.
Fontes: John von Neumann, First Draft of a Report on the EDVAC (1945) · Herman Goldstine, The Computer from Pascal to von Neumann (1972) · George Dyson, Turing’s Cathedral (2012) · John Backus, “Can programming be liberated from the von Neumann style?”, Communications of the ACM (1978).
Todos os tópicos de John von Neumann · ← A mecânica quântica num espaço de Hilbert · O merge sort: ordenar juntando →