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.

Duas programadoras operando o painel de controle do ENIAC, na Moore School da Universidade da Pensilvânia, por volta de 1946.
Duas programadoras operando o painel de controle do ENIAC, na Moore School da Universidade da Pensilvânia, por volta de 1946.Exército dos Estados Unidos · Wikimedia Commons · domínio público

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”.

A folha de rosto do *First Draft of a Report on the EDVAC* (“Primeiro rascunho de um relatório sobre o EDVAC”), de 30 de junho de 1945.
A folha de rosto do First Draft of a Report on the EDVAC (“Primeiro rascunho de um relatório sobre o EDVAC”), de 30 de junho de 1945.John von Neumann · Wikimedia Commons · domínio público

As partes de um computador

O Primeiro rascunho de um relatório sobre o EDVAC descreve um computador com:

  1. uma unidade aritmética, que faz as contas;
  2. uma unidade de controle, que lê as instruções uma por uma e manda executá-las;
  3. 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;
  4. 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.

Diagrama da arquitetura de von Neumann. Memory é a memória; Control Unit, a unidade de controle; Arithmetic Logic Unit, a unidade aritmética e lógica; Input e Output, a entrada e a saída. Dados e instruções compartilham a memória.
Diagrama da arquitetura de von Neumann. Memory é a memória; Control Unit, a unidade de controle; Arithmetic Logic Unit, a unidade aritmética e lógica; Input e Output, a entrada e a saída. Dados e instruções compartilham a memória.Chris-martin, Aeroid · Wikimedia Commons · CC BY-SA 3.0

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.

O EDVAC instalado no Laboratório de Pesquisa Balística do exército americano, em Aberdeen, onde começou a funcionar em 1951.
O EDVAC instalado no Laboratório de Pesquisa Balística do exército americano, em Aberdeen, onde começou a funcionar em 1951.Exército dos Estados Unidos · Wikimedia Commons · domínio público

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.

J. Robert Oppenheimer e John von Neumann diante da máquina do Instituto de Estudos Avançados, em 10 de junho de 1952, quando o computador foi apresentado ao público.
J. Robert Oppenheimer e John von Neumann diante da máquina do Instituto de Estudos Avançados, em 10 de junho de 1952, quando o computador foi apresentado ao público.Jeremy Norman Collection of Images · Wikimedia Commons · CC BY 4.0
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 →

Créditos das imagens.