There's no sense in being precise when you don't even know what you're talking about. (Não faz sentido ser preciso quando nem ao menos se sabe do que se está falando) - J. von Neumann
Os computadores modernos não têm um “inventor”. Pode-se falar em precursores, indo até os tempos de < http://blogs.forumpcs.com.br/bpiropo/2006/08/28/analytical-engine-i-um-velho-ranzinza/ > Babbage e < http://blogs.forumpcs.com.br/bpiropo/2006/09/26/analytical-engine-v-o-tear-de-jacquard/ > Jacquard ou mesmo dos artesãos que criaram as caixas de música do século XVI, a rigor os primeiros artefatos programáveis. Mas não se atribui a um único indivíduo – ou pelo menos não há consenso sobre o tema – a glória de haver “inventado” os computadores. Eles são, na verdade, uma criação coletiva, um trabalho em conjunto de diversas equipes de mentes privilegiadas, trabalhando juntas ou de forma independente, tomando ou não conhecimento do trabalho umas das outras. Nossos computadores são, portanto, fruto do trabalho e esforço colaborativo de um formidável grupo de grandes cientistas.
|
Figura 1: A máquina de tabular de H. Hollerith
|
Alguns nomes, naturalmente, se destacam. Alan Turing e seu Colossus é o primeiro que me vem à mente, mas não se podem esquecer as figuras de Herman Hollerith e sua “máquina de tabular” de 1888 que usava os cartões perfurados inventados por Jacquard como dispositivos de entrada, Howard Aiken e seu Harvard Mark I construído em 1944 e os jovens John Mauchly e J. Presper Eckert, com seu magnífico ENIAC. Cada um deles ofereceu uma contribuição extraordinária para a concepção do que hoje chamamos de “computador”. Perto delas, talvez, a contribuição de John von Neumann talvez não fosse tão gigantesca. Mas foi ele que deu, talvez, o maior impulso para que a primeira máquina digna de ser chamada de “computador” fosse efetivamente construída. Pois, mostrando mais uma vez sua peculiar habilidade de “continuar de onde os outros não conseguiam prosseguir”, foi ele que “juntou as partes”, reuniu concepções esparsas, algumas delas já eventualmente estabelecidas e, literalmente, arquitetou um meio de reuni-las em algo prático, que funcionasse. E é justamente graças a esta concepção que, até hoje, todas as máquinas que de uma forma ou outra são classificadas como “computadores”, desde os pequenos artefatos de bolso até os supercomputadores modernos, são consideradas “máquinas de von Neumann” porque obedecem à “arquitetura de von Neumann” engendrada por ele.
Mas por que cargas d’água ele se meteu nesta empreitada?
O projeto
Durante a primeira metade dos anos quarenta do século passado, ou seja, durante a Segunda Grande Guerra, o Governo americano se empenhou vivamente no desenvolvimento de computadores. E a razão eram as imensas possibilidades de uso bélico destas máquinas. Neste contexto, “uso bélico” pode significar desde máquinas destinadas a decifrar mensagens criptografadas, como o Colossus britânico de Alan Turing, até computadores como o ENIAC, desenvolvido especificamente para criar tabelas usadas para efetuar cálculos balísticos (até então feitas pelas “computadoras”, ou seja, uma equipe feminina – já que os homens estavam empenhados na guerra – que efetuava manualmente os cálculos e produzia as tabelas).
|
Figura 2: ENIAC e seus criadores: Eckert (à esquerda) e Mauchly (atrás, á direita)
|
Encerrada a guerra, cessou o entusiasmo oficial. Tanto assim que a montagem do ENIAC – sigla de Integrador e Calculador Numérico Eletrônico , ou “Electronic Numeric Integrator And Calculator” – que teve início em 1943 na Universidade de Pensilvânia, praticamente deu em nada. Isto porque a missão de conceber e montar um gigante de trinta toneladas, mais de dezessete mil válvulas e ocupando 170 metros quadrados, demandava tempo. E a máquina só foi dada como pronta em fevereiro de 1946, mais de meio ano depois que os japoneses assinaram o armistício que pôs fim às hostilidades, o que a transformou – pelo menos do ponto de vista das autoridades militares americanas que a haviam encomendado – em um artefato imprestável. De que serviria uma máquina concebida para criar tabelas cuja principal finalidade era estabelecer a trajetória dos projéteis disparados pelos canhões usados na Segunda Grande Guerra se o confronto havia terminado?
Foi então que von Neumann passou a exercer um papel fundamental neste panorama. Não apenas pela concepção de uma nova máquina – embora sua colaboração neste sentido tenha sido crucial, como já veremos – mas principalmente por se dispor a reunir recursos materiais e, sobretudo, científicos e acadêmicos para cumprir uma tarefa que, na época, não era tida como essencial. Isto porque, não existindo computadores, tanto o público em geral quanto as autoridades que poderiam se empenhar em seu desenvolvimento desconheciam totalmente suas reais possibilidades. Na verdade, nem mesmo algumas das mais poderosas mentes envolvidas na empreitada tinham uma noção sequer aproximada do que poderiam significar: Howard Aiken, por exemplo, o principal desenvolvedor do Mark I, estimou em 1947 – quando seu computador estava em plena atividade e portanto ele já tinha exata noção daquilo que a máquina podia realizar – que “six electronic digital computers would be sufficient to satisfy the computing needs of the entire United States” (seis computadores digitais seriam suficientes para satisfazer as necessidades computacionais totais dos Estados Unidos). Vejam vocês, quem diria: por este critério tenho hoje em minha casa máquinas suficientes para satisfazer de sobra todas as necessidades computacionais dos EUA...
A única mente suficientemente aberta para antever do que um dia os computadores seriam capazes foi justamente a de von Neumann que, como foi dito na < http://blogs.forumpcs.com.br/bpiropo/2011/04/17/von-neumann-iii-o-matematico/ > coluna anterior, via estas máquinas como artefatos para resolver problemas e não como meros executores de cálculos e confeccionadores de tabelas (referindo-se certamente às tabelas para cujo desenvolvimento o ENIAC tinha sido concebido).
Então, apoiado na enorme influência de membro fundador do IAS de Princeton, usando a experiência, os contatos com cientistas e os conhecimentos adquiridos em Los Alamos durante o Projeto Manhattan, o respeito que sua personalidade despertava nos meios acadêmicos e, sobretudo, sua sólida reputação de gênio matemático, von Neumann empenhou-se pessoalmente em reunir recursos materiais e humanos e levantar fundos para desenvolver e implementar um projeto ambicioso.
O projeto consistia em desenvolver um computador digital eletrônico e talvez fosse ele, naquele momento, a única pessoa que reunisse todos os requisitos necessários para propor tal empreitada com alguma chance de sucesso.
E, de fato, foi bem sucedido. Usando sua influência para apoiar a proposta original de Mauchly e Eckert, ainda durante o desenvolvimento do ENIAC, von Neumann conseguiu convencer o Governo americano a participar do projeto através do Laboratório de Pesquisas Balísticas do Exército (“U.S. Army's Ballistics Research Laboratory”), projeto este desenvolvido pela Moore School of Electrical Engineering da Universidade de Pensilvânia sob a supervisão dos criadores do ENIAC.
Tratava-se da concepção e montagem do EDVAC.
O EDVAC
A grande contribuição de von Neumann para a ciência da computação vem de sua própria concepção do que seria um “computador”.
Senão, vejamos.
Até então, “computadores” eram máquinas destinadas essencialmente a fazer cálculos (ou a calcular tabelas destinadas a fazê-los, como o ENIAC) ou a alguma tarefa específica (como o Colossus desenvolvido com a genial colaboração de Alan Turing pelo Governo britânico, destinado a “quebrar” códigos e decifrar mensagens criptografadas). Eram máquinas programáveis, sim, como o Mark I de Aiken, mas o “programa” era parte do computador propriamente dito (ou seja, do hardware). Neste sentido, uma máquina de calcular eletrônica, destas vendidas nas ruas do Centro do Rio de Janeiro por “dezrréal”, pode ser considerada um computador deste tipo, já que “computa” (calcula) operações com diferentes operandos. Mas o “programa” que gerencia os cálculos vem gravado em ROM, ou seja, faz parte da máquina.
|
Figura 3: Programa “rodando” no Mark I
|
O Mark I era mais ou menos assim: um conjunto de engrenagens “rodava” (“run”) o programa, ou seja, fazia uma fita perfurada correr em uma trilha e contatos elétricos eram fechados por escovas metálicas através dos orifícios da fita. Estes contatos “liam” as instruções na sequência que apareciam na fita e as executavam imediatamente. Para rodar outro programa era necessário trocar a fita, da mesma forma que para fazer com que uma caixa de música “tocasse” outra música era preciso trocar o rolete com os pinos que acionavam as hastes vibratórias que emitiam as notas. E, o que é mais importante: um programa não podia modificar a si mesmo durante sua execução nem alterar ou repetir a ordem em que as instruções eram executadas em função de resultados intermediários: as instruções eram executadas uma após a outra exatamente na ordem em que constavam na fita e temos conversado. Em resumo: o programa era uma parte (física) do conjunto.
Incidentalmente: foi operando o Mark I que a Almirante Grace Hopper encontrou a famosa mariposa que fechava intermitentemente o contato entre dois terminais elétricos, alterando o programa e gerando resultados erráticos. E foi esta mariposa que deu origem ao termo “bug” (inseto, em inglês), com a acepção de “erro de programação”. Mas esta história < http://blogs.forumpcs.com.br/bpiropo/2006/02/05/computadores-xxiii-a-almirante-e-a-mariposa/ > já foi contada...
Outra observação importante: muitos anos mais tarde, computadores de grande porte (“mainframes”) ainda eram programados usando cartões perfurados, o que pode dar a impressão que sua arquitetura seria semelhante à do Mark I. Mas há uma diferença fundamental: nestas máquinas os cartões eram usados apenas como meio de introdução do programa na memória, ou seja, depois de perfurados eram introduzidos em uma maquineta que funcionava como dispositivo de entrada, lendo os cartões e transferindo as instruções neles contidas para a memória, de onde eram recuperadas e executadas pela UCP (na verdade, como veremos mais tarde, a primeira máquina a adotar este conceito foi justamente o EDVAC). No Mark I as instruções não eram armazenadas na memória, usada apenas para dados e resultados parciais e finais das operações. Como se verá adiante, esta diferença é essencial.
Para von Neumann um computador tinha que ser “elástico” (palavra usada por ele mesmo). Deveria ser uma “máquina de fazer coisas”, “de resolver problemas”, e não apenas de calcular ou desempenhar uma única tarefa. Segundo a concepção de von Neumann, tinha que ser uma máquina versátil. Sim, eu sei que isto lhe parece evidente. Mas é preciso viajar no tempo até o final da primeira metade do século passado para perceber o quanto esta ideia tem de revolucionária.
Foi baseado nesta filosofia que von Neumann traçou as linhas gerais para desenvolvimento do EDVAC, primeiro artefato a merecer oficialmente o nome de “computador”, posto que sua sigla provinha de “Electronic Discrete Variable Automatic Computer” ou “computador eletrônico automático de variáveis discretas”.
O histórico “First Draft”
As linhas gerais que descrevem como deveria ser o EDVAC estão consubstanciadas em um documento histórico, o < http://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC > “First Draft of a Reporto n the EDVAC” (“Rascunho preliminar de um relatório sobre o EDVAC”), um manuscrito de 101 páginas redigido por von Neumann como rascunho da proposta de uma concepção lógica e física para o projeto do EDVAC.
|
Figura 4: von Neumann e seu EDVAC
|
O documento, conhecido desde então simplesmente como “First Draft”, se reveste de inestimável valor histórico, pois foi nele que von Neumann esboçou as bases da arquitetura que determinou a estrutura lógica não apenas do EDVAC como do seu, do meu e de todos os computadores modernos, inclusive dos supercomputadores como o Craig: a “Arquitetura de von Neumann”.
O relatório, manuscrito e datado de 30 de junho de 1945, foi enviado ao oficial encarregado da segurança do projeto. Pelo correio, já que foi redigido em uma viagem entre Philadelphia e Los Alamos no interior de um trem – portanto sem qualquer fonte de consulta (uma conexão móvel sem fio à Internet teria ajudado muito, sem dúvida...).
No “First Draft” von Neumann define o que esperava da máquina, descreve as principais partes que a compunham, estabelece uma base para as discussões que se seguiriam, informa que todo o projeto se baseará em uma forte analogia dos componentes ativos da máquina com os neurônios que formam o sistema nervoso dos animais superiores e, a partir deste ponto, inicia o detalhamento da máquina.
Começa por discutir os princípios que governam as operações aritméticas que o computador será capaz de realizar, definindo e descrevendo seus elementos ativos, expondo a razão pela qual eles deveriam ser constituídos por válvulas eletrônicas e, detalhadamente, porque o sistema numérico a ser usado internamente deveria ser o binário (de base 2). Em seguida descreve detalhadamente os circuitos eletrônicos que serão usados para efetuar cada uma destas operações, que incluem as quatro operações fundamentais, a raiz quadrada, e operações auxiliares como reconhecimento do sinal do número relativo, recebimento de dados a partir do dispositivo de entrada, fornecimento de resultados através do dispositivo de saída e, finalmente, já que tanto os dados de entrada quanto os de saída seriam fornecidos e recebidos por humanos que se utilizariam do sistema decimal, as duas operações adicionais para efetuar a conversão de um sistema para o outro. Uma descrição completa e detalhada daquilo que ele chama de “unidade aritmética central”, ou CA.
Estabelecidas as diretrizes operacionais da máquina, von Neumann passa a discutir um item fundamental: a memória. Começa por estimar a capacidade necessária (e determina, imaginem vocês, que um total de armazenamento de 256 Kb – reiterando: 256 quilobits – seria suficiente). Depois, discute a organização da memória e conclui que o tipo mais viável para a época seria a “memória de linha de retardo“, um alvitre tão interessante e diabolicamente engenhoso – embora já não mais usado – que talvez um dia, se os leitores manifestarem interesse, eu me disporei a escrever uma coluna sobre ela (a memória de linha de retardo proposta e descrita por von Neumann usa elementos ativos constituídos por válvulas eletrônicas; um par de anos mais tarde, baseado no conhecimento adquirido durante a guerra no desenvolvimento das linhas de retardo usadas nos radares para distinguir entre objetos estáticos e em movimento, o mesmo Prosper Eckert engajado na criação do ENIAC e que também participou do projeto do EDVAC, inventou as memórias de linha de retardo de mercúrio, que foram as usadas no projeto – o que em nada invalida as considerações de von Neumann sobre a memória por ele proposta, já que embora usando materiais diversos, adotava rigorosamente a mesma lógica de funcionamento).
Estabelecidas as bases para implantação da memória, von Neumann passa a discutir sua relação com a unidade de controle do computador – e, neste ponto, surge o ponto mais revolucionário do projeto, o conceito de “programa armazenado”, alicerce da sua arquitetura, que será detalhado na próxima coluna. Finalmente, já com todo o projeto delineado, von Neumann dedica o item final do “First Draft” para o estabelecimento do código, ou seja, determina os oito tipos de instruções (que ele chama de “ordens”) que a máquina deverá executar, estabelece que parâmetros cada uma delas deve usar e como serão codificadas.
E com isto descreve de forma resumida mas absolutamente completa não apenas as estruturas lógica e física mas o próprio funcionamento do EDVAC.
Interessado? Então leia uma transcrição exata do original (disponível na Internet em formato PDF) fornecida no CD-ROM que acompanha o livro < http://virtualtravelog.net.s115267.gridserver.com/wp/wp-content/media/2003-08-TheFirstDraft.pdf > "The Anatomy of a Microprocessor: A Systems Perspective" de Shriver & Smith.
O “First Draft”, como o nome indica, não é um documento definitivo. Nele há grande número de referências a itens inexistentes (que deveriam ser redigidos em estágios subsequentes) e alguns conceitos posteriormente modificados. Mas nada disto empana seu brilho. Do ponto de vista lógico e conceitual descreve, em detalhes quase inconcebíveis para a época, o funcionamento dos computadores de acordo com uma concepção tão sólida que, a partir de então e até os dias atuais, tem sido adotada em toda a máquina que merece o nome de “computador”. Uma concepção que ficou conhecida como “Arquitetura de von Neumann” e que será assunto da próxima e – espero – derradeira coluna desta série.
Até lá.