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¶
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, 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. 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).
Figura pendente
pilha de camadas — software aplicativo → navegador → sistema operacional → hardware, com setas de dependência apontando para baixo
2.2 Do transistor às portas lógicas¶
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. Nota técnica: na prática, os níveis TTL reais são faixas, não valores exatos — um nível alto válido é qualquer tensão a partir de aproximadamente 2,4 V, e um nível baixo válido vai até aproximadamente 0,4–0,5 V; "5 V e 0 V" é a simplificação didática usual para os valores nominais de saída.
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: um dispositivo de três terminais — coletor, base e emissor — que se comporta como uma chave eletromecânica. 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.
Nota técnica. Esse modelo (série = AND, paralelo = OR) é uma simplificação pedagógica — um "modelo de chave" coerente com a lógica CMOS moderna — e não corresponde exatamente à topologia de circuitos comerciais TTL/DTL, que tradicionalmente implementam AND/OR com lógica a diodo e usam um transistor inversor separado [2]. O modelo aqui é útil para a intuição, mas não deve ser confundido com a topologia exata de um circuito integrado comercial.
Figura pendente
três circuitos lado a lado — porta AND (transistores em série), porta OR (transistores em paralelo) e porta NOT (transistor inversor), com tabela-verdade de cada uma
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:
| 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) é justamente definido por quantos desses circuitos estão encadeados no hardware.
Figura pendente
circuito do meio-somador — porta XOR e porta AND recebendo as entradas A e B, produzindo Soma e Carry
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 armazenar um valor de forma persistente, para além do instante em que ele é calculado.
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").
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, por exemplo, quando a saída está ligada a um motor que precisa estar energizado antes de receber o sinal.
- 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 utilizado em aula 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.
Figura pendente
registrador de 4 bits com entradas de dados, clock, reset e habilitação de saída identificadas
2.5 A hierarquia de linguagens: de L0 a L5¶
A hierarquia de níveis apresentada nesta seção segue o modelo de máquinas multiníveis proposto por Tanenbaum [4]. 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.
| 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 | Tradução (compiladores/montadores) | Converte código de alto nível em código de máquina executável pelo sistema operacional |
| L5 | Linguagem orientada a problema | Python, C++, JavaScript — nível em que a maioria dos desenvolvedores trabalha |
Nota terminológica. É comum que a imprensa especializada em hardware anuncie uma "nova arquitetura" ao descrever um novo processador quando, tecnicamente, o que mudou foi a microarquitetura (nível L1) — a forma como aquele conjunto de instruções é implementado internamente —, enquanto a arquitetura do conjunto de instruções (nível L2, por exemplo x86-64) permanece a mesma.
2.5.1 Exemplo: de Python ao circuito¶
Retomando o programa 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 (L4) traduz essas instruções para código de máquina. 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, 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.
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: um conjunto de mnemônicos (como ADD, MOV) que correspondem quase diretamente às instruções do processador, mas ainda exigem gerenciamento manual explícito de registradores e endereços de memória — por isso, extremamente trabalhosa para programas complexos.
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; 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.
Nota sobre o uso de ferramentas de IA. Um modelo de linguagem gera texto com alta probabilidade estatística de ser relevante — não é um interlocutor consciente, ainda que a fluência de suas respostas possa sugerir o contrário. Isso reforça um ponto prático para o técnico de informática: modelos de linguagem e agentes de IA são ferramentas, e a responsabilidade por uma tarefa delegada a eles continua sendo de quem concedeu essa liberdade — da mesma forma que dizer "o macaco trocou o pneu do carro" ignora que foi a pessoa quem usou o macaco.
2.6 A arquitetura de von Neumann¶
O conceito de 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 — já apresentado como fundamento histórico da computação de uso geral, foi formalizado por escrito no relatório "First Draft of a Report on the EDVAC" (jun. 1945), de John von Neumann, e detalhado em 1946 em coautoria com Arthur Burks e Herman Goldstine [5]. A disputa de crédito mais discutida na literatura histórica não é com Alan Turing, mas com 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, produziu um relatório equivalente sobre programa armazenado (o projeto ACE, apresentado ao National Physical Laboratory em fevereiro de 1946, já em tempos de paz) — o sigilo que de fato cercou o trabalho de Turing durante a guerra foi o da criptoanálise em Bletchley Park, não o do próprio projeto ACE [6]. 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:
- 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 — é fisicamente provida pela placa-mãe.
Figura pendente
diagrama da arquitetura de von Neumann — CPU (unidade de controle + ULA), memória, entrada e saída interligados por um barramento central
2.7 O gargalo de von Neumann¶
A separação física entre processador e memória — necessária, já que nenhum dispositivo conhecido realiza simultaneamente as funções de processamento e de armazenamento — traz uma limitação estrutural conhecida como gargalo de von Neumann.
Abordagens modernas de arquitetura, como o System-on-Chip (SoC), 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 é, em si, 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 [7].
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 [8]. 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 [9].
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 — sustentam os capítulos seguintes: a Arquitetura e Organização de Processadores (Capítulo 3) aprofunda o nível L2 (ISA); a Memória (Capítulo 5) usa diretamente o flip-flop aqui apresentado.
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.
- 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. São Paulo: Aleph. (Tradutor e ano da edição a confirmar pelo autor.)