Programação em Binário Absoluto
Os primeiros programadores escreviam em binário absoluto: cada instrução & cada endereço em dígitos binários brutos. Uma única instrução poderia parecer 01100101 00001010 — código de instrução & endereço de memória em binário.
O Problema do Código Espaguete
Quando um erro exigia inserir uma nova instrução, os programadores enfrentavam um dilema. Inserir no lugar significava que cada endereço de instrução subsequente mudava em um — exigindo que o programador atualizasse cada referência de endereço em todo o programa. Catastrófico.
A solução: substituir a instrução imediatamente antes do ponto de inserção por um salto para memória vazia. Naquele local vazio: escrever a instrução sobrescrita, adicionar as novas instruções, depois saltar de volta. Quando erros apareciam nas correções, aplicar o mesmo truque novamente usando outra memória vazia.
Resultado: o caminho de execução através do programa saltava para locais aparentemente aleatórios. Hamming chamou isto de 'uma lata de espaguete.' O caminho de fluxo de controle, desenhado no papel, parecia exatamente com espaguete embaraçado.
As Rotas de Fuga
Duas melhorias imediatas: notação octal (agrupar dígitos binários em conjuntos de 3) e hexadecimal (grupos de 4, usando A–F para valores além de 9). Estas reduziram erros de escrita mas não resolveram o problema fundamental de endereçamento.
Assembly simbólico (por exemplo, SAP da IBM — Symbolic Assembly Program — e SOAP — Symbolic Optimizing Assembly Program no IBM 650) permitiu que programadores escrevessem nomes de instruções (ADD, MOVE) e rótulos de endereço simbólicos em vez de binário. O assembler traduzia para binário na entrada, gerenciando automaticamente atribuições de endereço.
SOAP realizou uma otimização adicional: arranjou instruções no tambor rotativo para que a próxima instrução chegasse à cabeça leitora exatamente quando a anterior foi concluída — codificação de latência mínima. SOAP até compilou a si mesmo: programa A processado como dados para produzir B, B executado em A para medir quanto a auto-compilação o melhorou.
Bibliotecas & Código Relocável
Hamming notou que a ideia de software reutilizável (bibliotecas matemáticas) veio muito cedo — Babbage tinha concebido isto. O problema: uma biblioteca com endereços absolutos exigia que cada rotina ocupasse os mesmos locais de memória toda vez que fosse usada. Quando a biblioteca total crescia muito, os programas competiam pelos mesmos endereços.
A solução: código relocável. O assembler gera instruções que fazem referência à memória relativamente — deslocamentos de um endereço base — em vez de endereços absolutos. Um linker resolve os endereços finais na hora do carregamento.
Os relatórios não publicados de Von Neumann (amplamente circulados) descreveram os truques de programação necessários. O primeiro livro de programação publicado (Wilkes, Wheeler & Gill, EDSAC, 1951) codificou estas técnicas.
A Bifurcação do Design de Linguagem
FORTRAN (1957, IBM) e ALGOL (1958, comitê internacional) representam duas filosofias de design que produziram resultados radicalmente diferentes.
FORTRAN
John Backus liderou o projeto FORTRAN (FORmula TRANslation) na IBM. O objetivo de design: tornar a linguagem fácil de usar para cientistas & engenheiros. FORTRAN aceitava notação matemática que parecia natural aos seus usuários: A = B + C * D em vez de ADD B, C; STORE T; MULTIPLY T, D; STORE A.
FORTRAN sobreviveu 60+ anos. Permanece em uso ativo em computação científica, dinâmica de fluidos, modelagem climática, & física computacional. Hamming notou esta durabilidade como prova de design bem-sucedido.
ALGOL
ALGOL (ALGOrithmic Language) foi design por um comitê de lógicos & cientistas da computação visando rigor matemático: uma linguagem logicamente limpa, formalmente definível. A Forma de Backus-Naur (BNF) para descrever gramáticas foi inventada para especificar ALGOL.
ALGOL falhou na prática. Apesar de sua elegância lógica & sua enorme influência no design subsequente de linguagens (Pascal, C, & quase toda linguagem moderna descende dos conceitos de gramática de ALGOL), ALGOL em si nunca foi amplamente implantado. Veredicto de Hamming: logicamente design, humanamente inutilizável.
A Hierarquia de Linguagens
Hamming descreveu uma hierarquia natural do código de máquina através de assembly, linguagens de nível superior, & ultimamente uma 'linguagem orientada para o problema' próxima de como praticantes pensam sobre seu domínio de problema. Cada nível adiciona legibilidade humana ao custo de eficiência de máquina.
Os Quatro Critérios de Design de Linguagem de Hamming
Hamming destilou a lição de FORTRAN vs ALGOL em quatro critérios para uma linguagem de programação bem-sucedida:
1. Fácil de aprender — um novato pode se tornar produtivo rapidamente
2. Fácil de usar — tarefas rotineiras exigem cerimônia mínima
3. Fácil de depurar — erros produzem mensagens significativas e localizáveis
4. Fácil de usar sub-rotinas — reutilização & abstração não exigem esforço heróico
Ele adicionou uma observação estrutural: linguagem humana carrega aproximadamente 60% de redundância; linguagem escrita cerca de 40%. Linguagens de baixa redundância (como APL) produzem one-liners elegantes que especialistas acham bonitos & iniciantes acham opacos — & que contêm erros indetectáveis quando um único caractere muda de significado.
A implicação: uma linguagem design para elegância lógica otimiza para o leitor errado. O programador é humano; humanos precisam de redundância para capturar erros & comunicar intenção.
Design de Linguagem Psicológico vs Lógico
Hamming retornou ao contraste FORTRAN/ALGOL como uma lição em dinâmicas institucionais & humanas, não apenas design de linguagem.
FORTRAN foi design psicologicamente — para os humanos que o usariam, especificamente cientistas que pensavam em notação matemática. ALGOL foi design logicamente — para correção formal & elegância teórica.
O paradoxo que Hamming identificou: uma linguagem logicamente correta que humanos resistem falha; uma linguagem design pragmaticamente que humanos adotam sucede, mesmo que seja mais logicamente confusa.
Ele citou APL como o caso extremo: logicamente elegante, expressível em one-liners, com seu próprio conjunto de caracteres especiais. Especialistas a amavam. Programadores normais a achavam ilegível. Uma mudança de caractere único poderia transformar silenciosamente o significado de um programa. APL tem uma pequena comunidade dedicada & quase zero uso convencional.
O argumento de redundância humana: linguagem falada é ~60% redundante (contexto repetido, palavras esclarecedoras, estrutura previsível). Linguagem escrita ~40% redundante. Esta redundância serve detecção de erro — humanos são não confiáveis, então linguagem evoluiu para carregar informação repetida suficiente para capturar & corrigir erros. Uma linguagem de baixa redundância remove esta rede de segurança.
A Hierarquia do Compilador
Hamming descreveu as camadas de compilador/interpretador: um programa pode ler em uma linguagem de nível superior & traduzi-la para uma de nível inferior. Empilhe estas camadas — cada uma traduz um nível abaixo. No topo: uma linguagem orientada para domínio que especialistas em um campo (biologia, finanças, física) escrevem naturalmente. Na base: código de máquina. Cada transição é um compilador ou interpretador.
Prevendo Sobrevivência de Linguagem
Em 1993, Hamming havia observado muitas linguagens suceder & falhar. FORTRAN (1957) sobreviveu. ALGOL (1958) falhou. COBOL (1959) sobreviveu décadas em computação comercial. LISP (1958) sobreviveu em pesquisa de IA. PL/I (1964) tentou unificar tudo & falhou.
O Padrão Recorrente
O capítulo de história de software de Hamming contém uma estrutura recorrente:
1. Uma limitação dolorosa existe (endereços absolutos, notação binária, código inmanutível)
2. Alguém inventa uma camada de abstração que esconde a limitação
3. A abstração habilita nova escala, que cria novas limitações dolorosas
4. Repita
Binário → octal/hex → assembly simbólico → FORTRAN → programação estruturada → linguagens orientadas a objetos → linguagens orientadas para domínio. Cada camada resolve a dor mais aguda do antecessor enquanto introduz uma nova classe de problema.
O problema de código espaguete (endereços absolutos) levou a assembly simbólico. Grandes programas assembly levaram a FORTRAN. Grandes programas FORTRAN levaram a programação estruturada & depois orientação a objetos. A palestra de Hamming terminou antes estas transições posteriores, mas o padrão continua.
Sua lição para engenheiros: você está sempre resolvendo a dor exposta pela abstração anterior. Entender a camada em que você está atualmente requer saber por que a camada abaixo existe.