Saiba como a ideia de programa armazenado — frequentemente associada a John von Neumann — viabilizou software reutilizável, computadores de uso geral e a programação moderna.

No cerne da computação moderna está uma pergunta simples: o que tornou possível uma máquina executar muitas tarefas diferentes sem ser reconstruída a cada vez? Os primeiros computadores eletrônicos podiam calcular rapidamente, mas “mudar a tarefa” muitas vezes significava alterar fisicamente a configuração da máquina. A ideia de programa armazenado é o ponto de virada que tornou os computadores verdadeiramente programáveis.
Um computador de programa armazenado guarda as instruções de uma tarefa (o programa) no mesmo tipo de memória interna que os dados sobre os quais o programa opera. Em vez de reconfigurar hardware ou ajustar painéis manualmente, você pode carregar um novo conjunto de instruções na memória e executar um trabalho diferente.
Isso parece óbvio hoje, mas é uma mudança profunda:
Isto não é apenas uma curiosidade histórica. O conceito de programa armazenado explica por que “software” existe como algo separado do “hardware”, e por que atualizar um dispositivo hoje pode desbloquear novos recursos sem trocar os chips internos.
Nas seções a seguir, caminharemos pelo problema que os primeiros computadores enfrentavam, o que a abordagem de programa armazenado mudou, as pessoas e documentos que clarificaram a ideia (incluindo o famoso relatório EDVAC) e como o termo “arquitetura von Neumann” passou a representar um projeto amplamente usado.
Embora o nome de John von Neumann esteja fortemente associado ao programa armazenado, o crédito é compartilhado por uma equipe e uma época mais amplas. Muitos pesquisadores convergiam para ideias semelhantes enquanto construíam os primeiros computadores eletrônicos. Este artigo mantém esse contexto em vista, porque entender o esforço coletivo ajuda a explicar como a ideia se espalhou tão rapidamente e se tornou o modelo padrão para a maioria dos computadores subsequentes.
Antes da ideia de programa armazenado, muitos primeiros computadores não “rodavam software” do jeito que entendemos hoje. Eles podiam calcular em velocidades impressionantes, mas dizer a eles o que fazer frequentemente implicava mudar fisicamente a máquina.
Uma abordagem comum usava quadros de conexão (plugboards), cabos de emenda e painéis de chaveamento. Operadores conectavam fios entre tomadas, ajustavam fileiras de chaves e às vezes calibravam unidades de temporização para que os sinais chegassem na ordem correta. O “programa” não era um arquivo que você carregava — era um diagrama temporário de fiação.
Esse arranjo funcionava, mas tinha um custo oculto: cada nova tarefa era um mini projeto de engenharia. Se você queria mudar a ordem das operações (somar, multiplicar, comparar, repetir), podia ter que mover dezenas ou centenas de conexões. Um único cabo deslocado podia criar erros sutis difíceis de diagnosticar, porque a lógica estava distribuída por conexões físicas em vez de estar escrita como passos legíveis.
Reconfigurar podia levar horas ou dias, especialmente se a máquina precisasse ser desligada com cuidado, reconfigurada e testada. Isso significava flexibilidade limitada: essas máquinas muitas vezes ficavam programadas para um tipo de cálculo por longos períodos porque trocar de tarefa era tão disruptivo.
Imagine uma máquina configurada para calcular tabelas balísticas — cálculos longos e repetitivos com uma fórmula fixa. Se pesquisadores quisessem que a mesma máquina resolvesse outro problema, como tabular resultados estatísticos de um censo, não era um rápido “editar o programa e executar de novo.” A ordem das operações, os passos de armazenamento intermediário e as verificações condicionais podiam ser bem diferentes, exigindo um redesenho completo do quadro de conexões e uma nova rodada de verificação.
Este é o mundo que o computador de programa armazenado veio escapar.
Um computador de programa armazenado é uma máquina onde as instruções (o programa) vivem na mesma memória de trabalho que os dados usados pelo programa. Em outras palavras, o computador não trata “o que fazer” como algo separado de “com o que trabalhar” — ambos são armazenados como padrões de bits na memória.
Quando os pioneiros do computador falavam em memória, referiam-se ao armazenamento interno rápido e diretamente utilizável — o que hoje associaríamos mais de perto com a RAM. É o lugar de onde o processador pode ler e para onde pode escrever rapidamente enquanto está em execução.
Isso é diferente do armazenamento permanente, como um disco rígido ou SSD. Um disco é ótimo para manter arquivos quando a energia está desligada, mas não é o bloco de notas imediato que o processador usa constantemente para buscar a próxima instrução e atualizar resultados intermediários.
Uma vez que as instruções são guardadas na memória, trocar de tarefa fica dramaticamente mais simples: você pode carregar um novo programa na memória e executá‑lo, sem reconstruir, religar ou reconfigurar o hardware. A mesma máquina de uso geral pode fazer folha de pagamento de manhã e cálculos balísticos à tarde — porque o “como” do trabalho é apenas outro conjunto de bits que você pode substituir.
Imagine uma cozinha onde a receita e os ingredientes ficam juntos na mesma despensa. O cozinheiro (o processador) vai repetidamente à despensa (memória) para ler o próximo passo da receita (instrução) e pegar ou atualizar ingredientes (dados).
Quer fazer um prato diferente? Você não reforma a cozinha. Basta trocar a receita — usando as mesmas bancadas, forno e utensílios.
John von Neumann não “inventou o computador” e não criou sozinho a ideia de programa armazenado. O que ele fez — de forma brilhante — foi ajudar a transformar um conceito promissor em um projeto claramente expresso e amplamente compartilhável que outros engenheiros e laboratórios podiam implementar.
Von Neumann esteve profundamente envolvido em projetos de computação durante e após a guerra, aconselhando equipes e refinando a estrutura lógica dos primeiros designs. Ele tinha um dom para explicar escolhas técnicas complexas em termos claros e organizados, e isso importou muito porque a computação eletrônica avançava rápido, com vários grupos resolvendo problemas semelhantes ao mesmo tempo.
Igualmente importante, ele escreveu e circulou descrições influentes de como um computador poderia armazenar instruções de programa na mesma memória usada para dados. Esse enquadramento claro facilitou que outros discutissem, ensinassem e replicassem a abordagem.
Nomes muitas vezes ficam ligados não à primeira pessoa com uma ideia, mas à pessoa cuja descrição vira ponto de referência. Os escritos de von Neumann foram amplamente lidos, copiados e citados — então leitores posteriores naturalmente associaram a organização de “programa armazenado” a ele.
Esse atalho também simplifica a história: é mais fácil dizer “arquitetura von Neumann” do que listar todos os contribuintes e relatórios. Mas a abreviação pode borrar o que realmente aconteceu.
A computação eletrônica inicial foi um esforço colaborativo e interinstitucional envolvendo matemáticos, engenheiros e programadores. O conceito de programa armazenado amadureceu por meio de discussões, rascunhos, protótipos e revisões entre equipes. O papel duradouro de von Neumann foi ajudar a cristalizar e divulgar a ideia — acelerando sua adoção — mais do que inventá‑la sozinho.
O EDVAC (Electronic Discrete Variable Automatic Computer) foi um dos primeiros projetos pós‑guerra que buscavam ir além das máquinas “únicas”. Tão importante quanto o esforço de hardware foi a decisão de registrar as ideias de projeto de forma clara e compartilhável. Na época, construir computadores ainda era engenharia experimental — o conhecimento vivia em cadernos de laboratório, reuniões e na cabeça de alguns especialistas. Um relatório podia transformar esses insights dispersos em algo que outras equipes pudessem discutir, criticar e reutilizar.
O First Draft of a Report on the EDVAC (muitas vezes chamado de “relatório EDVAC”) expunha, em termos conceituais, a ideia de programa armazenado: um computador deveria manter instruções de programa no mesmo tipo de memória interna que os dados. Essa memória não é apenas um lugar para segurar números enquanto um cálculo roda — ela também guarda os passos que dizem à máquina o que fazer a seguir.
Esse enquadramento faz o computador parecer menos um dispositivo de finalidade fixa e mais uma máquina geral que pode ser “reprogramada” mudando o conteúdo da memória. Você não reconfigura o sistema para alternar entre tarefas; você carrega uma sequência diferente de instruções.
Além do conceito em si, o relatório ajudou a padronizar como as pessoas falavam sobre computadores: memória, controle, aritmética e entrada/saída como partes funcionais distintas trabalhando juntas. Ter um vocabulário compartilhado e uma descrição amplamente lida não só explicou o EDVAC — deu ao campo inteiro um modelo mental comum para construir, comparar e aprimorar computadores de programa armazenado.
É tentador perguntar “quem inventou o computador de programa armazenado?” e esperar um único nome. Mas ciência e engenharia raramente funcionam assim. Ideias geralmente se desenvolvem em paralelo, são refinadas por discussão e só se tornam convincentes quando demonstradas em hardware funcional.
John von Neumann está fortemente associado ao conceito, mas o trabalho inicial envolveu muitas pessoas e grupos:
Um computador de programa armazenado não é uma única descoberta. Ele combina (1) o salto conceitual de que instruções podem viver na memória como dados, (2) a engenharia necessária para construir memória confiável e unidades de controle, e (3) as práticas de programação que tornam o design utilizável. Pessoas diferentes contribuíram para peças diferentes.
Outra razão para o crédito compartilhado: propor uma ideia não é o mesmo que construir uma máquina que funcione dia após dia. Relatórios e discussões iniciais esclareceram o conceito; protótipos e sistemas de produção provaram que era viável. Uma história cuidadosa respeita ambos os tipos de contribuição — sem forçar um veredito simplista de “primeiro inventor”.
Quando as pessoas dizem “arquitetura von Neumann”, geralmente apontam para um modelo simples e amplamente ensinado de como um computador de programa armazenado é organizado. Não é uma marca ou uma única máquina histórica — é um rótulo conveniente para um plano básico que aparece, de uma forma ou outra, em muitos computadores.
No nível conceitual, o quadro é assim:
A ideia-chave é que a CPU não tem um lugar físico separado para “o programa” em comparação com “os números”. Ela retira tudo que precisa da memória.
A CPU executa um programa repetindo um laço muitas vezes descrito como buscar–decodificar–executar:
Essa descrição é simplificada, mas captura o essencial: o programa é uma sequência de instruções na memória, e a CPU percorre essas instruções.
Colocar instruções e dados na mesma memória torna um computador de uso geral de forma prática:
Portanto, “arquitetura von Neumann” deve ser entendida como um atalho para o modelo de programa armazenado com CPU, memória compartilhada contendo instruções e dados, e I/O — uma ideia fortemente associada às explicações claras de von Neumann, embora a história inicial envolva múltiplos contribuintes.
Fala‑se frequentemente de “von Neumann” e “Harvard” como se fossem filosofias rivais. São, na verdade, duas formas práticas de arranjar instruções de programa e dados para que o computador possa buscar o que precisa.
Em um design ao modo von Neumann, instruções e dados vivem na mesma memória e tipicamente seguem o mesmo caminho principal até a CPU.
Isso é conceitualmente simples: um programa são apenas bytes na memória, lado a lado com números, texto e imagens que ele manipula. Também facilita a computação de propósito geral — o software pode ser carregado, alterado e armazenado usando os mesmos mecanismos que os dados.
A troca: quando instruções e dados compartilham a mesma “estrada”, eles podem competir por largura de banda. (Às vezes isso é chamado de “gargalo”, mas a ideia-chave é o compartilhamento.)
Uma abordagem Harvard mantém a memória de instruções separada da memória de dados, muitas vezes com rotas separadas para buscar cada uma.
Essa separação pode facilitar buscar a próxima instrução enquanto se lê/escreve dados — útil em sistemas pequenos e previsíveis. Um exemplo simples são muitos microcontroladores, onde o código do programa pode residir em memória flash enquanto as variáveis ficam na RAM.
CPUs modernas frequentemente parecem “von Neumann” para o software (um espaço de endereços, um modelo de programa), enquanto internamente adotam ideias parecidas com Harvard. Um exemplo comum é caches separados para instruções e dados (I-cache e D-cache). Para o seu programa, continua parecendo uma memória única, mas o hardware busca código e dados de forma mais eficiente.
O que lembrar: não existe um vencedor universal. Von Neumann enfatiza simplicidade e flexibilidade; Harvard enfatiza separação e vazão. Muitas máquinas combinam ambos para equilibrar programabilidade, custo, consumo e velocidade.
Um computador de programa armazenado não apenas executa cálculos — ele pode carregar um conjunto de instruções da memória, executá‑lo e depois carregar outro conjunto. Essa mudança tornou o software reutilizável e compartilhável: um programa podia ser escrito uma vez, salvo, copiado, melhorado e distribuído sem tocar no hardware.
Quando o programa vive na memória, a mesma máquina física pode fazer muitas tarefas diferentes apenas trocando as instruções que lê. É isso que “de propósito geral” realmente significa: uma máquina, muitos programas. O computador deixa de ser definido por um fluxo de trabalho único; torna‑se uma plataforma.
Um exemplo moderno e palpável é seu laptop rodando email, jogos e planilhas. Por baixo, é a mesma ideia: o hardware permanece e diferentes programas armazenados são carregados e executados conforme você alterna apps.
Quando as instruções são tratadas como dados na memória, torna‑se prático construir camadas de software que ajudam a escrever software:
Essas ferramentas dependem da suposição de que programas podem ser armazenados, movidos e manipulados como qualquer outra informação. Isso transformou o software em um ecossistema, em vez de um artefato único ligado a uma fiação específica.
Uma forma útil de ver o arco longo: programas armazenados possibilitaram compiladores e SOs, que possibilitaram ferramentas modernas de desenvolvimento — e hoje vemos outra camada de abstração na qual você pode descrever uma aplicação em linguagem natural e ter ferramentas que geram código funcional. Por exemplo, Koder.ai é uma plataforma de “vibe-coding” onde se constroem apps web, backend ou mobile por meio de uma interface de chat, apoiando‑se em modelos de linguagem e fluxos de trabalho baseados em agentes para acelerar o caminho de “o que deve fazer?” até instruções executáveis (código‑fonte que você pode exportar, implantar e reverter via snapshots).
O resultado segue o mesmo ciclo virtuoso: programas armazenados tornaram possíveis ferramentas melhores, e ferramentas melhores tornaram possíveis programas mais ambiciosos — transformando computadores em máquinas flexíveis de propósito geral.
A ideia de programa armazenado tornou os computadores flexíveis, mas também evidenciou uma limitação prática que os engenheiros ainda discutem: o “gargalo von Neumann”. Em termos cotidianos, é como um engarrafamento na estrada entre a CPU (o trabalhador) e a memória (o armazém).
Num projeto típico de programa armazenado, tanto instruções quanto dados vivem na memória. A CPU busca uma instrução, depois busca os dados que precisa, depois escreve resultados — frequentemente tudo pela mesma conexão. Se essa conexão não transferir informação rápido o suficiente, a CPU fica esperando mesmo podendo computar muito mais rápido.
Dois fatores relacionados moldam esse gargalo:
Uma CPU pode realizar bilhões de operações por segundo, mas se a memória não fornecer um fluxo contínuo de instruções e dados, o desempenho fica limitado pelo passo mais lento: obter bytes para dentro e fora.
Isso é uma consideração de engenharia amplamente discutida, e computadores modernos usam várias técnicas para reduzir o impacto:
Essas abordagens não eliminam a “estrada” subjacente, mas ajudam a mantê‑la menos congestionada — para que a CPU passe mais tempo trabalhando e menos tempo esperando.
O conceito de programa armazenado não é peça de museu — é como a computação cotidiana se mantém flexível. Seus dispositivos não precisam ser “religados” para fazer algo novo; eles simplesmente carregam instruções diferentes na memória e as executam.
Num telefone, tocar num ícone de app faz o sistema operacional carregar o código desse app (instruções) do armazenamento para a memória, então a CPU executa. Num laptop, o mesmo acontece quando você abre um navegador, edita um documento ou roda um jogo. Em servidores, isso é ainda mais visível: a máquina pode executar milhares de cargas de trabalho variáveis — requisições web, consultas de banco de dados, jobs em segundo plano — sem trocar o hardware.
Até recursos que parecem “hardware” são frequentemente definidos por software. Roteamento de rede, caminhos de decodificação de vídeo, realce de fotos e políticas de gerenciamento de energia são frequentemente atualizados via firmware e software de sistema — novas instruções, mesmo dispositivo.
Linguagens como Python e JavaScript normalmente rodam por meio de um interpretador ou de uma máquina virtual. Em vez da CPU executar seu código fonte diretamente, seu programa é traduzido em uma forma estruturada (bytecode ou instruções internas) que é armazenada na memória e executada passo a passo. A JVM do Java, o .NET, runtimes WebAssembly e motores de JavaScript dos navegadores dependem disso: instruções tornam‑se estruturas de dados que a máquina carrega, move e executa.
Como instruções são “apenas” informação, ataques tentam frequentemente contrabandear código malicioso através de dados — injeção de código clássica. Defesas como proteção de memória, assinatura de código e regiões de memória não executáveis existem para impedir que dados não confiáveis sejam tratados como instruções executáveis.
Tudo isso retorna à promessa central dos programas armazenados: flexibilidade via software — novo comportamento no mesmo hardware.
Ao analisar um computador (ou uma especificação), estas perguntas ajudam a identificar o modelo básico:
Se quiser mais posts com linguagem acessível como este, navegue em /blog.
Nota: Se você experimentar maneiras modernas de transformar “instruções” em sistemas em execução — seja escrevendo código diretamente ou usando plataformas de construção orientadas por chat como Koder.ai — considere documentar o que aprender. A Koder.ai também oferece um programa de ganho de créditos para conteúdo publicado e referências, o que pode ser um modo prático de financiar mais experimentos e tutoriais.
Um computador de programa armazenado mantém as instruções do programa na mesma memória interna usada para guardar os dados sobre os quais essas instruções operam. Para mudar a tarefa, você carrega um conjunto diferente de instruções na memória em vez de religar ou reconfigurar fisicamente o hardware da máquina.
Antes dos programas armazenados, muitas máquinas eram efetivamente “programadas” com painéis de conexão (plugboards), cabos de emenda e chaves. Mudar a sequência de operações podia significar horas ou dias de reconexão e retestes, e um único cabo mal colocado podia introduzir erros difíceis de localizar.
Aqui, “memória” significa a memória de trabalho rápida do computador (mais parecida com a RAM moderna) que a CPU pode ler e escrever constantemente enquanto executa. É diferente do armazenamento de longo prazo (como discos/SSDs), que serve para manter programas e arquivos quando a energia está desligada.
O relatório EDVAC descreveu claramente a organização em que instruções e dados compartilham a memória interna, além de oferecer um vocabulário útil para falar sobre as partes de um computador (memória, controle, aritmética, entrada/saída). Essa clareza ajudou outras equipes a discutir, comparar e construir sistemas semelhantes mais rapidamente.
O nome dele ficou ligado à ideia em grande parte porque suas descrições foram amplamente divulgadas e fáceis de referenciar, não porque ele fosse o único contribuinte. A abordagem de programa armazenado emergiu de uma comunidade mais ampla (engenheiros, matemáticos e primeiros programadores) trabalhando em problemas relacionados ao mesmo tempo.
“Arquitetura von Neumann” costuma referir-se a um modelo com:
É um rótulo didático conveniente para a organização de programa armazenado, não uma afirmação de que exista uma única máquina histórica ou um único inventor.
Em um projeto estilo von Neumann, instruções e dados compartilham uma mesma memória (e normalmente o mesmo caminho até a CPU). Em um projeto estilo Harvard, a memória de instruções é separada da memória de dados (frequentemente com caminhos distintos). Muitos sistemas modernos misturam as duas abordagens — por exemplo, um espaço de endereços unificado para o software, mas caches separados para instruções e dados.
O “gargalo von Neumann” é o limite de desempenho que ocorre quando CPU e memória compartilham um caminho restrito para mover tanto instruções quanto dados. Mitigações comuns incluem caches, prefetching (leitura antecipada) e paralelismo (múltiplos núcleos), que reduzem o tempo de espera da CPU, mas não eliminam completamente a restrição subjacente.
Como programas são apenas informação que pode ser carregada na memória, você pode mudar o comportamento ao atualizar o software em vez de trocar chips. Por isso o mesmo telefone ou laptop roda vários apps, e por que atualizações de firmware/OS podem adicionar recursos sem redesenhar o hardware.
Como as instruções são representadas como dados na memória, atacantes às vezes tentam fazer com que dados não confiáveis sejam tratados como código executável (por exemplo, injeção de código). Defesas modernas incluem proteção de memória (regiões não executáveis), assinatura de código e outros controles que separam “dados que você pode ler” de “código que você pode executar”.