Capítulo 2 — Do Transistor à Arquitetura de von Neumann¶
Neste capítulo você vai reconstruir, camada por camada, a ponte entre o software que se escreve e o hardware que efetivamente o executa: da plataforma de execução ao transistor, do transistor às portas lógicas, das portas lógicas aos circuitos aritméticos e de memória, e destes à hierarquia de linguagens que culmina na arquitetura de von Neumann e em sua limitação estrutural, o gargalo de von Neumann. Esses fundamentos sustentam os capítulos seguintes: a Arquitetura e Organização de Processadores (Capítulo 3) usa o vocabulário de arquitetura do conjunto de instruções construído aqui, e a Memória (Capítulo 5) usa diretamente o flip-flop apresentado na Seção 2.4.
2.1 Plataforma e abstração em camadas¶
O Capítulo 1 definiu o computador como uma máquina que resolve problemas executando instruções que lhe são dadas. Falta responder como uma instrução escrita por uma pessoa chega a virar tensão elétrica num circuito. O primeiro passo é perceber que nenhum software roda "no vazio": todo software é desenvolvido para ser executado em um determinado local — o que este livro chama de plataforma. A plataforma de um software pode ser um programa (por exemplo, um navegador específico), um sistema operacional, ou, em última instância, uma arquitetura de hardware.
Exemplo. Um bloqueador de anúncios desenvolvido para o navegador Firefox tem como plataforma o próprio Firefox: o software não funciona no Chrome nem no Safari. Por sua vez, o Firefox tem como plataforma diversos sistemas operacionais (Windows, macOS, Linux, Android, iOS). E cada um desses sistemas operacionais tem como plataforma hardwares fisicamente distintos — um processador Snapdragon num smartphone Android, um chip Apple M1 num MacBook (ambos SoCs, como visto na Seção 1.11.1), um processador Intel ou AMD num desktop Windows.
Essa organização em camadas — software sobre navegador, navegador sobre sistema operacional, sistema operacional sobre hardware — é chamada abstração em camadas (Figura 2.1). Ela é o motivo pelo qual um desenvolvedor de software para navegador não precisa se preocupar com qual câmera, qual placa de rede ou qual processador está instalado no dispositivo do usuário final: cada camada delega à camada abaixo dela a responsabilidade por lidar com a complexidade que está fora do seu escopo.
A estratégia de camadas não é exclusiva da relação hardware-software: a mesma lógica organiza, por exemplo, os protocolos de rede em camadas (física, enlace, transporte, aplicação). Este capítulo adota uma abordagem top-down (do software visível ao usuário até o hardware que o executa) para, nas seções seguintes, reconstruir a mesma pilha de forma bottom-up (do transistor até a linguagem de programação).

2.2 Do transistor às portas lógicas¶
Começa aqui a reconstrução bottom-up anunciada na Seção 2.1. Para entender como um software é efetivamente executado por um hardware, é necessário responder a uma pergunta simples em aparência: como um circuito eletrônico realiza uma operação lógica ou aritmética?
2.2.1 O combinado entre bit e tensão¶
Um programa como x = 2 instrui o computador a reservar um espaço de memória, nomeá-lo x e armazenar ali o valor 2. Esse número, em base decimal, é convertido para binário antes de ser armazenado, porque a eletrônica digital opera sobre um combinado (convenção) entre os símbolos binários (0 e 1) e grandezas elétricas mensuráveis. Na lógica TTL, por exemplo, o combinado usual é: 5 volts representa o bit 1, e 0 volts representa o bit 0 [1]. Esse combinado é arbitrário — poderia ser outro par de tensões — mas precisa ser fixado entre fabricante e desenvolvedor para que a informação seja interpretada de forma consistente. Na prática, esses valores são faixas, e não pontos exatos: uma saída TTL em nível alto pode apresentar qualquer tensão a partir de cerca de 2,4 V, e em nível baixo, até cerca de 0,4–0,5 V — "5 V e 0 V" são os valores nominais, usados aqui como simplificação.
2.2.2 O semicondutor e o transistor¶
Um semicondutor é um material que, dependendo das condições (como a temperatura), pode se comportar como isolante ou como condutor — o silício é o exemplo mais usado na indústria. Ao dopar o silício com impurezas específicas, obtêm-se dois tipos de material: o tipo N (com excesso de elétrons) e o tipo P (com déficit de elétrons, ou "buracos"). A junção entre um material tipo P e um tipo N forma um diodo, que conduz corrente em apenas um sentido quando polarizado corretamente.
Empilhando três camadas alternadas (P-N-P ou N-P-N), obtém-se o transistor, já apresentado na Seção 1.2 como o componente que viabilizou a computação moderna: um dispositivo de três terminais — coletor, base e emissor — que se comporta como uma chave eletrônica, sem partes móveis, cumprindo o papel que o relé e a válvula cumpriam nas máquinas da Seção 1.2. Quando há nível lógico alto (1) na base, o transistor fecha o contato entre coletor e emissor, permitindo a passagem de corrente; quando há nível lógico baixo (0) na base, o contato permanece aberto.
2.2.3 Construindo portas lógicas com transistores¶
A partir dessa chave elementar, é possível construir as portas lógicas estudadas em eletrônica digital:
- Porta AND: dois transistores ligados em série. A saída só apresenta nível lógico 1 se ambas as entradas estiverem em 1 — cada transistor precisa estar "fechado" para que a tensão chegue até a saída.
- Porta OR: dois transistores ligados em paralelo. A saída apresenta nível lógico 1 se qualquer uma das entradas estiver em 1 — basta que um dos dois caminhos esteja fechado.
- Porta NOT (inversora): um único transistor usado como chave que inverte o sinal de entrada — 1 na entrada produz 0 na saída, e vice-versa.
Esse "modelo de chave" (série = AND, paralelo = OR) é uma simplificação útil para a intuição, coerente com a lógica CMOS moderna; circuitos comerciais TTL/DTL, por exemplo, podem implementar as portas AND e OR também com diodos, deixando o transistor para casos como o inversor [2].

Na Figura 2.2, a saída S de cada porta é lida no ponto marcado em vermelho. Na AND, a tensão só chega a S se os dois transistores conduzirem ao mesmo tempo; na OR, basta um dos dois caminhos; na NOT, quando o transistor conduz ele liga a saída ao terra, e S vai a 0 — por isso a saída é sempre o inverso da entrada.
2.3 Circuitos aritméticos: o meio-somador¶
Se é possível construir portas lógicas com transistores, também é possível construir um circuito capaz de somar dois números binários.
A adição em binário segue a mesma lógica da adição em decimal, mas com apenas dois símbolos disponíveis: assim como 9 + 1, em decimal, "estoura" a casa e vai um, 1 + 1, em binário, resulta em 10 (lê-se "um-zero") — soma 0, vai um. A tabela a seguir reúne os quatro casos possíveis:
| A | B | Soma | Vai-um (carry) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Observando essa tabela, nota-se que a coluna "Soma" corresponde exatamente à tabela-verdade da porta OU exclusivo (XOR), e a coluna "Vai-um" corresponde exatamente à tabela-verdade da porta AND.
O circuito que combina uma porta XOR (para o bit de soma) e uma porta AND (para o bit de vai-um), ambas recebendo as mesmas duas entradas A e B, é chamado meio-somador (half adder). Ele soma dois bits e produz dois resultados: o bit de soma e o bit de transporte para a próxima posição. Encadeando vários meios-somadores (com o acréscimo da entrada de vai-um recebido da posição anterior, o que dá origem ao somador completo, ou full adder), constrói-se um circuito capaz de somar números de qualquer quantidade de bits — o tamanho da palavra binária que um processador consegue somar de uma vez (32 bits, 64 bits) está diretamente ligado a quantos desses circuitos estão encadeados no hardware — tema que reaparece no Capítulo 3 (§3.4), na transição de 32 para 64 bits.

Na Figura 2.3, as duas portas recebem as mesmas entradas A e B ao mesmo tempo: a XOR produz o bit de soma, e a AND, o vai-um — exatamente as duas colunas da tabela da adição binária acima.
2.4 Memória: o flip-flop e os sinais de controle¶
Se as portas lógicas resolvem o problema das operações lógicas e aritméticas, resta um terceiro problema: como manter um valor guardado depois do instante em que ele é calculado — ainda que, como em toda memória feita de transistores, apenas enquanto houver energia (a memória volátil da Seção 1.10).
A célula de memória mais básica é o flip-flop: um circuito construído a partir da combinação de portas lógicas (e, portanto, em última instância, de transistores) capaz de armazenar um bit e responder a duas operações — leitura ("qual valor você tem?") e escrita ("guarde este valor"). É ele a base da memória SRAM (Capítulo 5, §5.2).
A tabela-verdade do flip-flop tipo JK, um dos modelos mais estudados, resume seu comportamento:
| J | K | Comportamento |
|---|---|---|
| 0 | 0 | Mantém o valor atual (memória não é alterada) |
| 0 | 1 | Escreve 0 |
| 1 | 0 | Escreve 1 |
| 1 | 1 | Inverte o valor atual |
O flip-flop só responde a essas entradas no instante em que recebe um sinal de clock — um pulso periódico que sincroniza a operação. É esse sinal de clock, gerado em alta frequência, que corresponde à frequência de operação anunciada para um processador (em megahertz ou gigahertz).
2.4.1 Sinais de controle¶
A operação de leitura e escrita não esgota o funcionamento de um chip de memória real. Um registrador construído com flip-flops — como o circuito integrado 74HC173, um registrador de 4 bits disponível comercialmente [3] — expõe também:
- Reset: zera o valor armazenado, independentemente do estado do clock.
- Habilitação de saída (output enable): liga ou desliga a conexão entre o valor armazenado e a saída do chip — relevante quando vários chips compartilham os mesmos fios de saída, como num barramento (Seção 2.6), já que apenas um deles pode "falar" de cada vez.
- Habilitação de escrita (write enable): determina se o chip está em modo de leitura ou de escrita naquele instante, mesmo que o sinal de clock continue chegando.
Exemplo. Um simulador de eletrônica digital demonstra por que os sinais de controle são indispensáveis: ao conectar um circuito somador simples diretamente a um decodificador binário e um display de sete segmentos, o resultado exibido fica incorreto se o segundo operando for alterado antes de o primeiro ter sido efetivamente processado. Os sinais de controle são o que permite dizer ao circuito "carregue este valor agora" e "leia o resultado agora" em momentos distintos e bem definidos — sem eles, não há garantia de que a operação foi concluída antes da leitura.
Esses sinais — de ligar/desligar, de habilitar saída, de selecionar entre operações possíveis de um chip — reaparecem em praticamente todo circuito digital: um somador, um circuito de memória, um controlador de barramento. Entender que eles existem é o que permite compreender a camada seguinte da abstração, tratada na próxima seção.

A Figura 2.4 reúne os sinais desta seção num único chip: os dados entram por D0–D3 e saem por Q0–Q3, mas só são gravados no pulso de clock e com a escrita habilitada, e só aparecem na saída quando ela está habilitada.
2.5 A hierarquia de linguagens: de L0 a L5¶
A lógica digital descrita nas seções anteriores é poderosa, mas impraticável de programar diretamente: escrever um programa inteiro em sequências de 0 e 1 é uma tarefa inviável para qualquer problema não trivial. A solução histórica para esse problema foi a criação de sucessivas camadas de linguagem, cada uma mais próxima do raciocínio humano do que a anterior, e cada uma traduzida (por um interpretador, compilador ou circuito de controle) para a camada imediatamente abaixo — a mesma ideia de abstração em camadas da Seção 2.1, agora vista de baixo para cima. O modelo mais usado para descrever essas camadas é o de máquinas multiníveis proposto por Tanenbaum [4]:
| Nível | Nome | Função |
|---|---|---|
| L0 | Lógica digital | Portas lógicas, somadores, memórias (Seções 2.2–2.4) |
| L1 | Microarquitetura (microprograma) | Controla o fluxo de dados: o que é carregado, de onde, para onde, acionando a camada L0 |
| L2 | Arquitetura do conjunto de instruções (ISA) | Define se o processador é RISC ou CISC, e qual conjunto de instruções ele reconhece (x86, ARM, etc.) |
| L3 | Sistema operacional | Permite a execução de múltiplos programas e o gerenciamento do hardware por eles |
| L4 | Linguagem de montagem (Assembly) | Mnemônicos (ADD, MOV) que correspondem quase diretamente às instruções do processador, traduzidos por um montador (assembler) |
| L5 | Linguagem orientada a problema | Python, C++, JavaScript — nível em que a maioria dos desenvolvedores trabalha, traduzido por compiladores ou interpretadores |
Antes da existência de linguagens de alto nível, a única alternativa a programar diretamente em código de máquina (sequências binárias) era a linguagem Assembly do nível L4: seus mnemônicos tornam o código legível, mas ainda exigem gerenciamento manual explícito de registradores e endereços de memória — por isso, ela é extremamente trabalhosa para programas complexos.
Essa separação entre níveis explica uma confusão frequente na imprensa especializada: anunciar uma "nova arquitetura" quando o que mudou foi a microarquitetura (L1) — a forma como aquele conjunto de instruções é implementado internamente —, enquanto o conjunto de instruções (L2, por exemplo x86-64) permanece o mesmo. O Capítulo 3 (§3.1) formaliza essa distinção como arquitetura versus organização.
2.5.1 Exemplo: de Python ao circuito¶
Retomando o programa da Seção 2.2.1, agora acrescido de uma soma — x = 2; y = x + 1: em L5 (Python), a atribuição e a soma são expressas em sintaxe legível por humanos. O interpretador ou compilador traduz essas instruções para código de máquina — do qual a linguagem de montagem (L4) é a forma legível. O sistema operacional (L3) aloca memória e agenda a execução do processo. O processador consulta seu conjunto de instruções (L2) para decodificar cada instrução recebida. O microprograma (L1) aciona os circuitos específicos — leitura de memória, soma no somador da Seção 2.3, escrita de memória — que fisicamente existem no nível de lógica digital (L0), executando a operação por meio de tensões elétricas.
2.5.2 O nível além de L5¶
Um nível ainda não formalizado na literatura clássica de arquitetura de computadores, mas cada vez mais concreto na prática, é o de linguagem natural: comandos dados a um modelo de linguagem (LLM) que gera código executável em Python, C++ ou outra linguagem de nível L5 a partir de um pedido descrito em português ou inglês comum. Ferramentas como assistentes de voz (Alexa, Google Assistant) representaram uma primeira aproximação limitada desse nível; grandes modelos de linguagem contemporâneos ampliam significativamente essa capacidade, embora ainda não exista uma camada intermediária formal, treinada especificamente para maximizar a taxa de acerto entre o pedido em linguagem natural e o código gerado.
2.6 A arquitetura de von Neumann¶
A Seção 1.4 apresentou o programa armazenado — a ideia de que as instruções de um programa, e não apenas os dados que ele manipula, residem na mesma memória do computador — como fundamento histórico da computação de uso geral. Agora que as camadas L0 a L5 estão montadas, é possível ver como esse conceito se organiza em hardware. Ele foi formalizado por escrito pela primeira vez no relatório "First Draft of a Report on the EDVAC" (jun. 1945), de John von Neumann [5], e detalhado em 1946 em coautoria com Arthur Burks e Herman Goldstine [6].
O crédito pela ideia, no entanto, é disputado. A controvérsia mais discutida na literatura histórica não envolve Alan Turing, mas Eckert e Mauchly, engenheiros do grupo ENIAC/EDVAC que consideravam a ideia um resultado coletivo e ficaram descontentes por o relatório circular só com o nome de von Neumann. Turing, por sua vez, apresentou em 1946 seu próprio projeto de computador de programa armazenado, o ACE — uma aplicação prática da máquina universal que ele concebera em 1936 (Seção 1.3) [7]. Ainda assim, "arquitetura de von Neumann" é o nome consagrado que este livro adota para a formalização.
Essa arquitetura organiza o computador em quatro unidades funcionais — as três etapas do modelo entrada–processamento–saída da Seção 1.5, acrescidas da memória, que guarda tanto os dados quanto o próprio programa:
- Unidade de entrada — capta dados do mundo externo (teclado, mouse, câmera).
- Unidade de saída — expõe dados processados ao mundo externo (monitor, alto-falante).
- Unidade de processamento (CPU) — subdividida em unidade de controle (coordena a sequência de operações) e unidade lógica e aritmética — ULA (executa as operações lógicas e aritméticas propriamente ditas).
- Unidade de memória — armazena tanto os dados quanto o próprio programa em execução.
No computador desktop moderno, a via de dados que interliga processador, memória e dispositivos de entrada e saída — o barramento, tema do Capítulo 10 — é fisicamente provida pela placa-mãe. É por causa dele que a habilitação de saída da Seção 2.4.1 é indispensável: todos os componentes estão pendurados nos mesmos fios.

Na Figura 2.5, as quatro unidades não se ligam diretamente umas às outras: toda a comunicação passa pelo barramento. Processador e memória trocam dados nos dois sentidos; a entrada só envia dados para o barramento, e a saída só os recebe dele.
2.7 O gargalo de von Neumann¶
A Figura 2.5 deixa visível o ponto fraco dessa organização: instruções e dados moram na mesma memória e chegam ao processador pelo mesmo barramento, um de cada vez. Como o processador opera muito mais rápido do que a memória consegue entregar o que ele pede, ele passa boa parte do tempo esperando — a limitação estrutural conhecida como gargalo de von Neumann. A separação entre processador e memória, por sua vez, não é um descuido de projeto: nas tecnologias usadas em computadores comerciais, os circuitos que processam e os que armazenam em grande volume são fisicamente distintos.
A hierarquia de memória da Seção 1.10 é, em boa parte, uma resposta a esse gargalo: a cache mantém perto do processador uma cópia pequena e rápida dos dados mais usados (Capítulo 5, §5.8). Abordagens como o System-on-Chip (SoC) (Seção 1.11.1) vão além e aproximam fisicamente processador e memória dentro de um único encapsulamento, reduzindo a latência de comunicação entre eles. Essa aproximação mitiga o problema, mas não o elimina: processamento e memória continuam sendo entidades fisicamente distintas, e o gargalo de von Neumann permanece um problema em aberto na arquitetura de computadores.
2.8 Computação além do silício¶
A abstração em camadas construída ao longo deste capítulo — da tensão elétrica à porta lógica, da porta lógica ao circuito aritmético, do circuito à linguagem de programação — revela algo importante sobre a natureza da computação: o que importa é a estrutura lógica das operações, não o material físico que as implementa.
Exemplo. Utilizando o sistema de circuitos do jogo Minecraft (o mecanismo de redstone), é possível reproduzir portas lógicas, meios-somadores e células de memória, e a partir deles construir um computador funcional dentro do próprio jogo — capaz, por exemplo, de executar um programa que calcula a sequência de Fibonacci. Um projeto ainda mais extremo levou essa ideia ao limite: como o computador construído em redstone é uma máquina de propósito geral no sentido de Turing (Seção 1.3) — capaz de executar qualquer programa —, um desenvolvedor conseguiu rodar uma cópia do próprio Minecraft dentro do computador que havia construído dentro do Minecraft — a um custo de desempenho da ordem de milhões de vezes mais lento, mas funcionalmente completo [8].
Outros projetos substituem o transistor por outros meios físicos para implementar as mesmas portas lógicas — por exemplo, circuitos hidráulicos que implementam portas AND, OR e NOT utilizando água e tubulações [9]. O romance de ficção científica O Problema dos Três Corpos, do autor chinês Liu Cixin, descreve um exército de seres humanos treinados para atuar, cada um, como uma porta lógica — formando coletivamente um computador funcional operado inteiramente por pessoas [10].
Esses exemplos, por mais lúdicos que pareçam, sustentam um ponto central deste capítulo: a computação é uma estrutura lógica de camadas de abstração, e o silício é apenas o meio físico mais eficiente conhecido atualmente para implementá-la — não o único possível.
Síntese do capítulo¶
Este capítulo reconstruiu a ponte entre software e hardware por meio da abstração em camadas: da plataforma de execução ao transistor, do transistor às portas lógicas, das portas lógicas aos circuitos aritméticos e de memória, e destes à hierarquia de linguagens que culmina na arquitetura de von Neumann e em sua limitação estrutural, o gargalo de von Neumann. Esses fundamentos — sobretudo a noção de que todo problema pode ser localizado numa camada específica dessa pilha, e de que o flip-flop e a porta lógica são os blocos de construção de qualquer circuito digital — são retomados adiante, na ordem do livro: a distinção entre arquitetura (L2) e microarquitetura (L1), o tamanho da palavra binária e a própria arquitetura de von Neumann são aprofundados no Capítulo 3 (§3.1, §3.4 e §3.2); o flip-flop torna-se a célula da memória SRAM, e a cache, como resposta ao gargalo de von Neumann, é detalhada no Capítulo 5 (§5.2 e §5.8); o nível L3 e a ideia de plataforma reaparecem no sistema operacional (Capítulo 6, §6.1.1); e o barramento ganha forma física no Capítulo 10.
Referências¶
- MALVINO, Albert Paul; BROWN, Jerald A. Digital Computer Electronics. 3. ed. Nova York: Glencoe/McGraw-Hill, 1993, Cap. 4 "TTL Circuits".
- MALVINO, Albert Paul; BROWN, Jerald A. Digital Computer Electronics. 3. ed. Nova York: Glencoe/McGraw-Hill, 1993, Cap. 2 ("2-1 Inverters", "Diode OR Gate", "2-3 AND Gates", "Diode AND Gate").
- NEXPERIA. "74HC173; 74HCT173 — Quad D-type flip-flop; positive-edge trigger; 3-state." Datasheet. Disponível em: https://assets.nexperia.com/documents/data-sheet/74HC_HCT173.pdf.
- TANENBAUM, Andrew S.; AUSTIN, Todd. Organização Estruturada de Computadores. 6. ed. São Paulo: Pearson Education do Brasil, 2013, Seção 1.1.
- VON NEUMANN, John. First Draft of a Report on the EDVAC. Filadélfia: Moore School of Electrical Engineering, University of Pennsylvania, 30 jun. 1945.
- BURKS, A. W.; GOLDSTINE, H. H.; VON NEUMANN, J. Preliminary Discussion of the Logical Design of an Electronic Computing Instrument. Princeton: Institute for Advanced Study, 1946.
- COPELAND, B. Jack (org.). Alan Turing's Automatic Computing Engine. Oxford: Oxford University Press, 2005.
- MOJANG. "Minecraftception." Minecraft.net. Disponível em: https://www.minecraft.net/en-us/article/-minecraftception.
- "Hydraulic logic gates: building a digital water computer." European Journal of Physics, v. 39, 2018. IOP Publishing. Disponível em: https://iopscience.iop.org/article/10.1088/1361-6404/aa97fc.
- LIU, Cixin. O problema dos três corpos. Tradução de Leonardo Alves. Rio de Janeiro: Suma, 2016.