A arquitetura de von Neumann é um dos modelos fundamentais da informática moderna. Formalizada em meados da década de 1940, no contexto dos primeiros computadores eletrónicos, assenta numa ideia hoje quase evidente: as instruções de um programa podem ser armazenadas na memória, tal como os dados que manipulam.
Este princípio do programa armazenado transformou profundamente a conceção dos computadores. A mesma máquina podia realizar tarefas muito diferentes simplesmente carregando um novo programa, sem ser necessário alterar fisicamente a cablagem.
Mais de oitenta anos depois dos primeiros trabalhos sobre o EDVAC, os processadores tornaram-se incomparavelmente mais complexos. Ainda assim, memória, cálculo, controlo e entrada/saída continuam no centro do seu funcionamento.
Antes do programa armazenado
As primeiras máquinas automáticas de cálculo não eram necessariamente programadas como os computadores atuais. Em algumas, mudar o cálculo exigia alterar ligações, deslocar cabos, configurar interruptores ou preparar novos suportes físicos. O ENIAC, desenvolvido nos Estados Unidos durante a Segunda Guerra Mundial, é um exemplo célebre.
Surgiu então uma pergunta essencial: e se as instruções que dizem à máquina o que fazer fossem elas próprias guardadas na memória? O programa deixaria de ser apenas uma configuração física e passaria a ser informação que o computador pode carregar e ler.
O projeto EDVAC e o relatório de 1945
Em 1945, os projetistas do ENIAC já trabalhavam no sucessor, o EDVAC (Electronic Discrete Variable Automatic Computer). John von Neumann participou nas discussões e escreveu o célebre First Draft of a Report on the EDVAC.
O relatório descrevia uma máquina eletrónica organizada em torno de cálculo, controlo, memória e comunicação com o exterior. Sobretudo, apresentava o princípio de que as instruções podiam ser representadas numericamente e armazenadas na memória. A ampla circulação do documento ajudou decisivamente a difundir esta forma de conceber um computador.
Uma invenção coletiva
Apresentar John von Neumann como único inventor desta arquitetura seria enganador. J. Presper Eckert, John Mauchly e outros investigadores e engenheiros contribuíram diretamente para os projetos ENIAC e EDVAC.
Von Neumann teve, contudo, um papel decisivo na formalização e sobretudo na divulgação destas ideias. Por isso, a designação histórica “arquitetura de von Neumann” permaneceu.
As cinco grandes funções
Numa representação simplificada, uma máquina do tipo von Neumann inclui:
uma unidade aritmética e lógica (ALU);
uma unidade de controlo;
memória;
dispositivos de entrada;
dispositivos de saída.
Nos computadores modernos, a ALU e a unidade de controlo fazem parte do processador. A memória conserva tanto os dados como as instruções do programa. Entrada e saída permitem comunicar com o exterior através de teclado, ecrã, armazenamento, rede, sensores e muitos outros periféricos.
A ideia decisiva: instruções e dados na memória
Numa arquitetura de von Neumann clássica, dados e instruções podem partilhar a mesma memória. Num programa simples de adição, a memória pode conter os dois números, a instrução de adição, a indicação de onde guardar o resultado e depois o próprio resultado.
Uma instrução é, portanto, também informação numérica. Para alterar o comportamento da máquina basta carregar novas instruções. O mesmo hardware pode realizar contabilidade, cálculos científicos, executar um jogo ou editar texto.
Fetch, decode, execute
A execução de um programa pode ser representada pelo ciclo fetch-decode-execute. Um registo chamado program counter contém o endereço da próxima instrução. O processador vai buscá-la à memória, a unidade de controlo descodifica-a, a operação é executada e o resultado pode ser colocado num registo, escrito na memória ou enviado a outro componente.
Os processadores modernos realizam milhares de milhões destes ciclos por segundo.
Registos: memória junto do cálculo
O processador possui pequenas áreas de armazenamento extremamente rápidas chamadas registos. Podem conter valores usados num cálculo, endereços de memória, resultados intermédios, a instrução atual ou o endereço da próxima instrução.
A sua capacidade é mínima comparada com a memória principal, mas a proximidade das unidades de cálculo torna-os muito mais rápidos. Esta diferença ilustra um problema persistente: o cálculo pode tornar-se mais rápido do que o acesso aos dados necessários.
O estrangulamento de von Neumann
No modelo clássico, instruções e dados partilham a memória e os caminhos de comunicação com o processador. Mesmo um processador extremamente rápido pode ser limitado pela velocidade com que a informação circula entre a memória e as unidades de cálculo.
Este fenómeno é conhecido como estrangulamento de von Neumann. A expressão foi popularizada por John Backus na década de 1970. A diferença de desempenho entre processadores e memória continua a ser um desafio central da arquitetura de computadores.
As caches aproximam os dados do processador
Uma resposta consiste em acrescentar vários níveis de memória cache. Uma cache é muito menor do que a memória principal, mas também muito mais rápida, e tenta manter perto do processador os dados e instruções que provavelmente serão utilizados em breve.
Os processadores modernos têm normalmente caches L1, L2 e L3, com diferentes capacidades e velocidades. O objetivo é evitar tanto quanto possível a espera pela memória principal.
Arquitetura von Neumann e Harvard
Numa arquitetura Harvard estrita, instruções e dados utilizam memórias separadas e podem dispor de caminhos de comunicação distintos. Isto pode permitir obter simultaneamente uma instrução e um dado.
De forma simples: von Neumann = espaço de memória partilhado; Harvard = memórias separadas. Na prática, muitos processadores modernos combinam os dois modelos: apresentam ao software um espaço unificado, mas usam internamente caches distintas para instruções e dados. É a chamada arquitetura Harvard modificada.
Os processadores modernos são muito mais complexos
O ciclo fetch-decode-execute é um excelente modelo pedagógico, mas um processador moderno não trabalha rigidamente instrução após instrução. O pipelining sobrepõe etapas, várias unidades de execução podem trabalhar em paralelo, algumas instruções são reorganizadas internamente e a execução especulativa antecipa cálculos antes de se saber se serão necessários.
Os processadores atuais possuem também vários núcleos e unidades especializadas. Ao nível do software, porém, mantém-se a ideia fundamental: instruções armazenadas dirigem uma máquina de uso geral que manipula dados.
Um programa pode tornar-se dados
Como um programa é representado numericamente na memória, um programa pode manipular outro programa. Um compilador lê código-fonte e produz um executável. Um sistema operativo carrega programas na memória. Um editor modifica ficheiros de código. Um programa pode até gerar novas instruções.
A fronteira entre “programa” e “dados” depende assim também da interpretação da informação. Esta propriedade foi essencial para sistemas operativos, compiladores, linguagens de programação e para a indústria do software.
Do hardware especializado à máquina universal
O programa armazenado contribuiu para a passagem de uma máquina diferente para cada problema para uma máquina de uso geral, cujo comportamento é alterado através do software.
Existe uma forte ligação conceptual com Alan Turing. A máquina de Turing é um modelo matemático, enquanto a arquitetura de von Neumann descreve a organização prática de computadores eletrónicos. Ainda assim, ambos pertencem à mesma revolução: o comportamento de uma máquina pode ser determinado pela informação que recebe.
Porque é que a arquitetura de von Neumann continua importante
Os computadores atuais incluem GPUs, vários núcleos, hierarquias complexas de cache, controladores e aceleradores especializados. Chamá-los simplesmente “máquinas de von Neumann” seria demasiado redutor.
O modelo continua, porém, extremamente útil histórica e pedagogicamente. Ajuda a explicar porque um computador tem memória e processador, como um programa é executado, porque os dados circulam entre componentes e porque a velocidade da memória afeta o desempenho.
O princípio do programa armazenado ajudou a transformar o computador numa máquina versátil definida tanto pelo software como pelo hardware.
Perguntas frequentes
John von Neumann inventou esta arquitetura sozinho?
Não. Von Neumann desempenhou um papel importante na formalização e divulgação, em particular através do First Draft of a Report on the EDVAC de 1945. As ideias resultaram, porém, de trabalho coletivo que envolveu, entre outros, J. Presper Eckert e John Mauchly.
Qual é a principal ideia da arquitetura de von Neumann?
O programa armazenado: as instruções podem ser representadas numericamente e guardadas na memória, permitindo que a mesma máquina execute programas diferentes.
Qual é a diferença entre as arquiteturas von Neumann e Harvard?
No modelo clássico de von Neumann, instruções e dados partilham a memória. Numa arquitetura Harvard, utilizam memórias ou caminhos separados. Muitos processadores modernos usam organizações híbridas.
O que é o estrangulamento de von Neumann?
É a limitação de desempenho provocada pela comunicação entre processador e memória. Um processador muito rápido pode ter de esperar pelas instruções ou pelos dados de que necessita.
Os computadores modernos ainda usam a arquitetura de von Neumann?
Não na sua forma histórica simples. Caches, vários núcleos, execução paralela e unidades especializadas ampliam muito o modelo, mas o princípio do programa armazenado continua fundamental.
Compreenda a máquina de Turing, a sua fita, estados, cabeça de leitura e escrita e o seu papel na definição dos algoritmos e dos limites da computação.