SciELO - Scientific Electronic Library Online

 
vol.10 issue26Von Neumann e a previsão numérica de tempo e climaAlgumas contribuições de von Neumann à Física Matemática author indexsubject indexarticles search
Home Pagealphabetic serial listing  

Estudos Avançados

Print version ISSN 0103-4014

Estud. av. vol.10 no.26 São Paulo Jan./Apr. 1996

http://dx.doi.org/10.1590/S0103-40141996000100022 

A OBRA E O LEGADO DE JOHN VON NEUMANN

 

Von Neumann: suas contribuições à Computação

 

 

Tomasz Kowaltowski

 

 

A TAREFA DE ESTUDAR as contribuições de John von Neumann é, ao mesmo tempo, complexa e fascinante. A complexidade deve-se em parte à existência de muitas fontes de informação, algumas pouco acessíveis, outras discordantes entre si ou polêmicas. Entretanto, a causa principal dessa complexidade é a riqueza das contribuições de von Neumann. O seu espectro inclui várias áreas da Matemática, Matemática Aplicada, Física, Meteorologia, Economia e Computação. Em vários casos as suas contribuições foram muito além de solução de problemas propostos por outros, desbravando novas áreas de pesquisa e lançando novos problemas. Descrição muito pessoal das contribuições de von Neumann foi feita por seus amigos e colaboradores Ulam (1958) e Halmos (1973). Vários trabalhos dedicados às contribuições de von Neumann podem ser encontrados no número especial da revista Annals of the History of Computing (Brink & Haden, 1989), bem como nos Anais de um simpósio da American Mathematical Society (Glimm et al., 1990b) realizado em 1990. O ambiente em que von Neumann foi criado e educado é descrito por seu irmão Nicholas A. Vonneuman (1989, 1991).

Para uma grande parte dos praticantes da Computação, o nome de von Neumann está geralmente associado à idéia de arquitetura de von Neumann, ou seja, à estrutura, hoje considerada clássica, de computadores digitais com programa armazenado na própria memória e, portanto, passível de automodificação e de geração por outros programas. Outras contribuições de von Neumann à Computação são, em geral, pouco conhecidas entre os que atuam na área.

Procuraremos demonstrar que von Neumann teve contribuições importantes nas áreas de arquitetura de computadores, princípios de programação, análise de algoritmos, análise numérica, computação científica, teoria dos autômatos, redes neurais, tolerância a falhas, sendo o verdadeiro fundador de algumas delas. O volume V da série John von Neumann: collected works (Taub, 1963) contém a maior parte das publicações de von Neumann referentes à Computação e áreas afins. Uma visão geral destas contribuições pode ser encontrada no trabalho de Aspray (1989).

A ênfase principal deste trabalho está nas contribuições diretamente ligadas à arquitetura de computadores digitais e à sua programação, complementada com alguns comentários sobre outros trabalhos seminais de von Neumann. A bibliografia apresentada, apesar de razoavelmente extensa, certamente está incompleta. Alguns trabalhos foram publicados mais de uma vez e, neste caso, a fonte citada é a que acessamos, não necessariamente a original. Não conseguimos localizar alguns dos trabalhos citados, mas seu conteúdo foi comentado por outros autores e constitui fonte importante de informações.

 

Contexto histórico

As grandes invenções tecnológicas dificilmente aparecem de maneira independente. A idéia de automatizar os cálculos vem desde a antigüidade e começou com a utilização de pedras e outros dispositivos que deram origem aos abacos, progredindo durante vários séculos até o aparecimento de computadores digitais na década de 1940.

O resumo apresentado a seguir é uma tentativa de indicar alguns marcos importantes nesta história. Foram citados apenas aqueles eventos que nos parecem mais significativos; muitos outros podem ser encontrados na literatura especializada. Os fatos apresentados referem-se apenas à construção de máquinas digitais, pois vários dispositivos analógicos, incluindo a régua de cálculo, astrolábios, integradores e diferenciadores, com aplicações à Astronomia, à navegação entre outros, de há muito já eram desenvolvidos. Tampouco foram citadas outras contribuições indiretas, como os trabalhos teóricos de George Boole ou Alan Turing. As referências mais importantes consultadas neste levantamento histórico são as de Rosen (1969), Goldstine (1972) e Randell (1973, 1994).

  • Aprox. 100 d. C.: Herão de Alexandria descreve duas idéias. Ligação de rodas dentadas de maneira a realizar a operação de vai um, e utilização de cilindros rotatórios com pinos e cordas para controlar seqüências de ações de outros mecanismos.

  • 1624-1694: máquinas calculadoras de Wilhelm Schickard (Alemanha), Blaise Pascal (França) e Gottfried Leibnitz (Alemanha).

  • 1790-1801: controle de teares por meio de cartões perfurados, de Joseph Marie Jacquard (França).

  • 1822-1853: projeto e desenvolvimento da máquina de diferenças de Charles Babbage (Grã Bretanha) que nunca foi terminado. Máquina de diferenças mais simples de Pehr Georg Scheutz e Edvard Scheutz (Suécia).

  • 1833-1910: projeto e desenvolvimento da máquina analítica de Charles Babbage, com controle por cartões perfurados, incluindo as idéias de controle condicional e iterações (não terminado). Continuação da construção da máquina por Henry Babbage, com resultados parciais.

  • 1890-1896: máquina tabuladora de Herman Hollerith usada para processamento dos resultados do censo norte-americano, registrados em cartões perfurados. Fundação por Hollerith da Tabulating Machine Company, predecessora da IBM (criada em 1924).

  • 1934-1941: trabalhos de Konrad Zuse (Alemanha) culminando com uma máquina eletro-mecânica com controle primitivo por fita de papel; seguiram-se vários modelos melhorados.

  • 1935-1942: trabalhos de John V. Atanasoff no Iowa State College (EUA) na construção de uma máquina eletrônica com leitura e perfuração de cartões para resolução de sistemas de até 30 equações lineares (não terminada).

  • 1937-1944: trabalho de Howard Aiken e sua equipe, desenvolvido conjuntamente pela Universidade de Harvard e IBM (EUA), resultando em MARK I, um computador eletromecânico, com com controle por fita de papel, ainda bastante primitivo e de operação complexa; a IBM continou o desenvolvimento com outros modelos.

  • 1937-1944: trabalhos de George Stibitz e seus colaboradores, da Bell Telephone Laboratories (EUA) na área de cálculos balísticos, resultando em máquina controlada por fita de papel; seguiram-se outros modelos mais avançados, com ênfase em confiabilidade e autoverificação.

  • 1941-1945: trabalho de Alan Turing e seus colaboradores (Grã-Bretanha) no desenvolvimento de máquinas que ficaram conhecidas como Bombs e Colossus, dedicadas à criptoanálise. Dado o caráter sigiloso do trabalho, o desenvolvimento tornou-se conhecido somente na década de 1970.

  • 1942-1945: projeto e desenvolvimento do ENIAC por J. Presper Eckert e John W. Mauchly da Universidade da Pensilvânia (EUA): primeiro computador de propósito geral completamente eletrônico.

  • 1944-1951: projeto e construção do EDVAC, primeiro computador com programa armazenado na memória, resultante principalmente da colaboração de John von Neumann, J. Presper Eckert e John Mauchly. O EDVAC foi utilizado até dezembro de 1962.

  • 1946-1952: projeto e construção do computador do Instituto de Estudos Avançados (IAS) de Princeton por John von Neumann e seus colaboradores.

  • 1947-1949: projeto e construção do EDSAC por Maurice Wilkes da Universidade de Cambridge (Grã Bretanha), primeiro computador com programa armazenado na memória a entrar em funcionamento.

  • 1950 em diante: construção de vários outros sucessores baseados no projeto do IAS, em universidades e na indústria: JOHNNIAC, ORD-VAC, ILLIAC, MANIAC, máquinas da Universidade de Manchester e outras.

Este histórico mostra que houve aceleração no desenvolvimento de máquinas automáticas de cálculo na década de 1930, coincidindo com a disponibilidade de dispositivos eletromecânicos (relés) e eletrônicos (válvulas). Fator decisivo para esse desenvolvimento foi o apoio de agências militares, tanto nos EUA quanto na Europa, durante a Segunda Guerra Mundial.

O envolvimento direto de von Neumann com a Computação teve início naquela época, conforme descrito por Goldstine (1972) e Stern (1980). John von Neumann já era então um matemático de reputação mundial, com publicações em diversas áreas da Matemática e da Física Matemática, professor visitante da Universidade de Princeton (1930-1933) e fazendo parte, desde 1933, do corpo de pesquisadores do prestigioso Instituto de Estudo Avançado (IAS) de Princeton. Entre os muitos interesses de von Neumann estava a resolução numérica de problemas para os quais não se conheciam soluções analíticas. Em função de tais interesses e com o início das atividades bélicas na Europa, von Neumann tornou-se consultor científico de várias agências governamentais ligadas às forças armadas, incluindo o Laboratório de Pesquisas Balísticas de Aberdeen (Maryland) e o Laboratório Científico de Los Alamos (New México), este último responsável pelo desenvolvimento da primeira bomba atômica.

Von Neumann foi cativado pela possibilidade de automatizar os cálculos e entrou em contato com alguns dos construtores mencionados no resumo histórico. Entretanto, o contato mais importante e mais frutífero foi com o trabalho de construção do computador chamado ENIAC (1) desenvolvido por J. Presper Eckert e John Mauchly, na Escola Moore da Universidade de Pensilvânia, sob contrato do Laboratório de Pesquisas Balísticas. O encontro de von Neumann com a equipe do ENIAC materializou-se, nos meados do ano de 1944, através de Herman H. Goldstine, um matemático que, recrutado pelas forças armadas, era na época tenente e oficial de ligação entre o Laboratório e a equipe. Este evento deu início à colaboração muito íntima e duradoura entre von Neumann e Goldstine.

O projeto do ENIAC já estava então congelado e von Neumann contribuiu apenas para que os cientistas de Los Alamos fossem os primeiros usuários da máquina. Na mesma época, a Universidade de Pensilvânia celebrou um contrato suplementar para a construção de uma nova máquina, denominada EDVAC (2), proposta pouco antes por Eckert e Mauchly, mas cujas características ainda eram muito vagas. O novo projeto despertou enorme interesse de von Neumann que iniciou uma série de visitas regulares à Escola Moore, participando de reuniões relativas ao projeto, juntamente com Eckert, Mauchly, Goldstine e outros.

 

Arquitetura de computadores

Todas as máquinas construídas até o início do projeto do EDVAC eram programadas através de meios externos como cartões perfurados, fitas perfuradas, painéis, cabos de conexão etc, e dispunham de muito pouca memória para armazenar os dados e os resultados intermediários dos cálculos. Mesmo assim, a construção do ENIAC, cuja capacidade de armazenamento era de 20 números decimais de 10 dígitos (cerca de 700 bits), consumiu mais de 17 mil válvulas eletrônicas. Um fator decisivo para viabilizar o projeto de uma nova máquina foi a idéia de Eckert de utilizar linhas de atraso para implementar elementos de memória de custo muito mais baixo do que se fossem utilizadas válvulas. Com esta idéia, tornou-se possível pensar numa máquina com dezenas ou centenas de milhares de bits.

Como resultado das reuniões com a equipe de projeto e da frqüente troca de correspondência, von Neumann ficou encarregado de produzir um documento descrevendo os detalhes da organização da nova máquina. Como indica o próprio título First draft of a report on the EDVAC (von Neumann, 1945), o documento nunca passou da fase de'rascunho, publicado na íntegra somente vários anos mais tarde, sob forma ligeiramente editada (von Neumann, 1993) (3).

Existe controvérsia quanto a quem teria sido o primeiro a propor o conceito de programa armazenado (Randell, 1994; Rosen, 1969; Stern, 1980; Wilkes, 1995). O trabalho teórico de Turing (1936), com o qual von Neumann estava familiarizado, já indicava essa possibilidade. Por outro lado, existem algumas referências ao assunto, bastante obscuras e ambíguas, em algumas fontes anteriores ao documento produzido por von Neumann, além das afirmações posteriores de Eckert, Mauchly e outros. Não há dúvida de que a idéia de programa armazenado estava no ar e é bastante provável que tenha sido sugerida por mais de uma pessoa ou nascido no meio de discussões sobre o novo projeto. Apesar da notoriedade desta controvérsia, não nos parece que a sua importância seja mais do que simbólica. Independentemente de quem tenha sido primeiro a sugerir a idéia de programa armazenado na memória, o fato é que o documento redigido por von Neumann é a primeira descrição minunciosa e quase completa da arquitetura de um computador desse tipo, com repertório de operações que permitiriam a utilização plena dos seus recursos. O documento é resultado, sem dúvida, das várias reuniões realizadas e das trocas de correspondência entre os pesquisadores, mas o próprio fato de ter sido von Neumann, consultor do projeto, encarregado da sua redação indica a importância e o grau da sua contribuição. De acordo com depoimentos de alguns dos seus colaboradores, o projeto lógico do computador deve-se principalmente a von Neumann, enquanto Eckert e Mauchly foram os principais responsáveis pelo projeto de circuitos de alta velocidade, linhas de atraso e outros detalhes físicos. Todos eles deram contribuições fundamentais ao projeto.

O relatório de von Neumann nunca foi completado. O texto contém muitas referências a seções que estavam planejadas mas não foram descritas, principalmente no que se refere à programação (maiores detalhes no item Programação de computadores). Mesmo assim, a leitura do relatório é muito instrutiva. Nota-se que não existia naquela época linguagem adequada para descrever muitos dos conceitos que estavam sendo introduzidos, o que dá ao texto um certo sabor medieval sob o ponto de vista da Computação. Além disso, os interesses de von Neumann incluíam sistemas neurais de McCulloch e Pitts, o que gerou uma tendência de explicar os vários dispositivos do computador em termos de analogia com o sistema nervoso. Por outro lado, é surpreendente a riqueza de idéias, muitas das quais continuam válidas até hoje. Von Neumann separa claramente o conceito de arquitetura lógica do computador da sua execução física. Apesar da hipótese de que linhas de atraso seriam utilizadas para implementar a memória da máquina, toda a descrição é feita em termos de blocos lógicos e suas interconexões. A própria divisão do projeto em unidades de controle, aritmética, memória e de entrada e saída é precursora de todos os projetos posteriores. Na realidade, quase todos os conceitos ainda nos parecem familiares.

As decisões de projeto apresentam justificativas, se possível, quantitativas, como por exemplo, o comprimento da palavra de 32 bits, o tamanho da memória de 2.048 ou 8.196 palavras, a decisão de construção de dispositivos aritméticos seriais. O repertório de instruções é suficiente para implementação de cálculos com as quatro operações fundamentais, de controle de execução (seleção e iteração), de sub-rotinas. A profundidade de análises é demonstrada por vários pormenores, por exemplo, operandos imediatos em instruções. Há, também, uma análise dos problemas introduzidos por cálculos com número finito de dígitos, utilizando representação com ponto fixo. Algumas decisões de von Neumann podem parecer estranhas ou equivocadas, como a distinção das palavras que representam dados, das que representam instruções (4), o que dificulta a sua manipulação.

O relatório de von Neumann, apesar de incompleto, teve grande divulgação e tornou-se um paradigma de projeto para muitas máquinas de primeira geração. O interesse despertado entre instituições de pesquisa e empresas foi tão grande que a Escola Moore organizou, em 1946, um curso sobre a arquitetura do EDVAC (Williams, 1993). A maior parte das palestras foi apresentada por membros originais da equipe do projeto (Eckert, Mauchly, Goldstine e von Neumann) apesar de não mais participarem da construção da máquina. A importância da influência exercida pelo projeto pode ser comprovada pela construção da máquina EDSAC (5) na Universidade de Cambridge, por Maurice Wilkes que participou do curso. O EDSAC foi o primeiro computador controlado por programa armazenado que entrou em funcionamento (1949). Seu projeto, apesar de mais modesto, aproveitou muitas das idéias do EDVAC, fato realçado pela semelhança do nome.

Deve-se mencionar que a máquina final que foi construída e entrou em operação somente em 1951, no Laboratório de Pesquisas Balísticas, era bastante diferente daquela descrita no relatório de von Neumann, além de ter sido modificada várias vezes durante a sua vida útil, de 1951 a 1962. Mais detalhes sobre estes aspectos podem ser encontrados nos trabalhos de Godfrey & Hendry (1993), Knuth (1970) e Williams (1993). Segundo Goldstine (6), von Neumann foi contrário a algumas das modificações introduzidas no projeto. A exemplo do formato final das instruções. De acordo com o projeto original descrito no relatório redigido por von Neumann, o EDVAC teria instruções com um endereço. Assim, operações aritméticas seriam precedidas, quando necessário, por instruções de carga do primeiro operando no acumulador e seguidas por instruções de armazenamento do resultado na memória. Na versão final do EDVAC, cada instrução podia ter até quatro endereços: dois para os operandos, um para o resultado e um para indicar a instrução a ser executada a seguir. Von Neumann era de opinião que este formato era muito antieconômico. Grande parte das arquiteturas de hoje demonstra que von Neumann tinha razão na discussão, que pode ser considerada a precursora das discussões entre as tendências RISC e CISC (7).

Com o fim da guerra, em 1945, von Neumann iniciou gestões para a construção de outro computador, que seria utilizado para aplicações científicas em geral. Em função do seu prestígio científico, conseguiu convencer a direção do IAS a abrigar o projeto, apesar da conhecida vocação da instituição para a pesquisa pura. Von Neumann conseguiu também o apoio da empresa RCA, que acabava de estabelecer um laboratório de pesquisa na Universidade de Princeton. A principal colaboração da RCA seria na construção de memória a ser baseada em tubos iconoscópicos, semelhantes aos tubos de televisão. O empreendimento do IAS recebeu ainda o apoio do Exército e da Marinha americanos.

O projeto foi descrito num documento fundamental composto de duas partes. O projeto lógico está apresentado na primeira parte, escrita por Burks, Goldstine e von Neumann (1946), intitulada Preliminary discussion of the logical design of an electronic computing instrument. O nível da descrição lógica é mais elevado do que o do relatório sobre o EDVAC, e utiliza linguagem mais moderna. As operações aritméticas são discutidas em grande detalhe, incluindo problemas de arredondamento. Contrariamente ao EDVAC, tendo em vista as características de memória (40 iconoscópios em ligação paralela, um para cada bit da palavra), as operações sobre os 40 bits seriam executadas em paralelo. Há demonstração de que a operação de soma de dois números de 40 bits produziria, em média, cinco vai-um. Existe também discussão completa de mecanismos de entrada e de saída. E notada a necessidade de relocação de instruções para que possam ocupar quaisquer posições de memória, bem como o problema de dar início no sistema a partir de um dispositivo de entrada. Finalmente, é discutida a utilização de redundância para deteção de falhas nas unidades lógicas e outros dispositivos.

Por outro lado, o documento descarta a utilização de representação de números com ponto flutuante que estava sendo proposta então para outras máquinas. A justificativa é bastante elaborada, alegando um desperdício maior de memória e o fato de que a programação das operações com ponto fixo, mantendo em separado um fator de escala, não seria muito complicada. Certamente, este é um ponto no qual a avaliação dos autores não foi correta, se bem que a introdução desta facilidade complicaria bastante o projeto da unidade aritmética.

Os documentos relativos ao projeto do IAS tiveram divulgação ainda maior do que a descrição incompleta do projeto do EDVAC. Conjuntamente, constituem a inspiração para a arquitetura de quase todos os projetos de computadores subseqüentes àquela época, tanto no meio acadêmico quanto na indústria, originando o termo arquitetura de von Neumann. Entre os exemplos mais conhecidos podem ser citados ED-SAC de Cambridge, SEAC do National Bureau of Standards, ORDVAC e ILLIAC da Universidade de Illinois, JOHNNIAC (8) da Rand Corporation. A influência continuou, especialmente nas empresas que passaram a atuar na área, notadamente a IBM e a UNIVAC. A história dessa influência foi descrita, entre outros, por Gruenberger (1979) e Rosen (1969).

Uma expressão que tornou-se comum nos meios computacionais, com certa conotação negativa, é o gargalo de von Neumann (9). A expressão parece ter sido usada pela primeira vez por Backus (1978), em 1977, em sua palestra de recepção do Prêmio Turing da ACM, intitulada Can programming be liberated from the von neumann style? A functional style and its algebra of programs. No trabalho, Backus critica o fato de que, mais de 30 anos depois da sua introdução, as arquiteturas de von Neumann ainda eram dominantes e exerciam enorme influência sobre o paradigma imperativo de linguagens de programação mais utilizadas, impedindo o desenvolvimento de outros modelos. Na sua opinião, as abordagens aplicativa ou funcional à programação seriam mais adequadas para o futuro e as tendências de pesquisa em arquitetura deveriam acompanhar a idéia. A expressão usada por Backus tornou-se bastante popular e passou a denotar, de maneira genérica, o fato de que a eficiência de processamento das máquinas com a concepção introduzida por von Neumann é limitada por problemas de comunicação entre a memória e as outras unidades. É interessante notar que no documento que descreve o EDVAC, o próprio von Neumann utiliza a palavra gargalo quando comenta as dificuldades de projeto e funcionamento da memória (10).

Dentro do princípio geral de utilização de componentes eletrônicos, houve algumas tentativas de ruptura com os conceitos da arquitetura de Von Neumann. Exemplo notável é o da arquitetura a fluxo de dados (11), proposta no fim da década de 1960 no MIT e na Universidade de Stanford, que seria mais adequada para o modelo aplicativo proposto por Backus. Apesar de conceitualmente muito elegante, a sua realização física provou ser pouco eficiente, não passando de alguns projetos acadêmicos. Um conjunto de artigos dedicados ao assunto pode ser encontrado em Agerwala & Arvind (1982).

Propostas verdadeiramente inovadoras têm surgido apenas mais recentemente; uma descrição muito superficial pode ser vista em Glanz (1995). Uma delas é o conceito de computação molecular introduzido por Adleman (1994, 1995). Na proposta, moléculas de DNA (12) são utilizadas para codificar problemas combinatoriais e uma solução é obtida através de métodos laboratoriais que permitem simular algumas operações com estas codificações. Adleman utilizou o exemplo do problema de caminhos hamiltonianos para um grafo de sete vértices e 14 arestas. O trabalho laboratorial levou cerca de sete dias, mas demonstrou a viabilidade da proposta quando aplicada a tal tipo de problemas devido ao enorme grau de paralelismo obtido. Não está clara a possibilidade de utilizar a idéia para construção de computadores de propósito geral, se bem que é apresentada em Adleman (1995) uma maneira de simular memória num computador molecular.

Outra proposta de arquitetura inovadora é a computação quântica sugerida, entre outros, por Deutsch (1985); descrição mais acessível pode ser encontrada em Lloyd (1995). Nela, o fato de que, pelo princípio de superposição, um sistema quântico pode estar simultaneamente em mais de um estado, também permite obter um grau muito alto de paralelismo. Exemplo de problema, computacionalmente difícil com métodos clássicos, que poderia ser resolvido de maneira eficiente com esta formulação é o da fatoração de números compostos apresentado por Shor (1994). Não está claro, por enquanto, se a proposta de computação quântica é praticamente viável e se possível a sua utilização para idealizar computadores não restritos apenas a algumas classes de problemas. Entretanto, já foi testada com sucesso, num pequeno protótipo, a utilização de técnicas quânticas para o problema de distribuição confiável de chaves criptográficas (Bennett et al., 1992).

Pode-se afirmar, portanto, que a estrutura lógica introduzida nos projetos do EDVAC e da máquina do IAS constitui o princípio de funcionamento de computadores digitais até hoje, apesar do progresso tecnológico que nos separa daquela época. Na realidade, não parece provável que os conceitos básicos da arquitetura de von Neumann sejam abandonados em futuro próximo. Essa é a opinião, por exemplo, de Patterson (1995), um dos cientistas que mais contribuíram para a concepção de modernos circuitos integrados.

Deve-se notar finalmente que, apesar da ênfase do trabalho de von Neumann na parte de projeto lógico dos computadores, ele fez também algumas incursões na parte eletrônica. Tanto na descrição do EDVAC quanto na da máquina do IAS são discutidos vários detalhes técnicos referentes às opções de implementação de memória existentes então: linhas de atraso e iconoscópios. No primeiro projeto, foram escolhidas as linhas de atraso pois os iconoscópios não eram ainda considerados suficientemente confiáveis. No segundo projeto, foi feita opção pelos iconoscópios depois de passarem por alguns aperfeiçoamentos. Outro exemplo do interesse de von Neumann pelos aspectos eletrônicos é o trabalho escrito por ele (1954) sobre o uso de capacitância e indutância não-lineares para implementação de circuitos lógicos. Com base nesse trabalho, a IBM, da qual von Neumann era então consultor, obteve uma patente concedida em 1957.

 

Programação de computadores

Ao desenvolver os projetos lógicos do EDVAC e da máquina do IAS, von Neumann tinha também grande preocupação com a sua programação. No caso do primeiro projeto, seu plano original previa a inclusão de exemplos de programação no próprio relatório, que ficou inacabado. Entretanto, existe um manuscrito de von Neumann contendo o que é quase certamente o primeiro programa escrito para um computador com programa armazenado na memória. Uma análise muito detalhada do manuscrito e da sua história foi feita por Knuth em 1970, no artigo intitulado Von Neumann's First Computer Program, no qual está baseado este relato.

O programa foi escrito em 1945, pouco tempo depois do relatório sobre o EDVAC, mas refere-se à versão ligeiramente modificada da máquina com relação ao projeto original. O problema proposto é o da classificação de uma série de dados em ordem não decrescente de uma chave. A própria escolha do problema é muito significativa e, até um certo ponto, surpreendente. Tendo em vista as origens e as motivações de von Neumann, seria de se esperar que o exemplo de programação escolhido para testar a consistência do projeto fosse, por exemplo, um programa para resolver numericamente equações diferenciais. Entretanto, a adequação da máquina proposta para cálculos numéricos era óbvia. Assim, a escolha de uma aplicação não-numérica mais complexa é perfeitamente compreensível e denota grande visão. Além disso, von Neumann queria demonstrar que esse tipo de máquina poderia realizar, de maneira muito eficiente, uma tarefa que era então executada pelas classificadoras de cartões da IBM, máquinas eletromecânicas especialmente projetadas para tal finalidade. Ficaria demonstrada assim a aplicabilidade do EDVAC não apenas a cálculos científicos mas também a propósitos mais gerais.

Von Neumann propôs o método que ficou conhecido mais tarde como classificação por intercalação (13), até hoje o algoritmo mais usado para classificar dados em memórias secundárias. Na realidade, o manuscrito de von Neumann contém a codificação de apenas uma parte do método que é o processo de intercalação de duas seqüências já em ordem. Em linhas gerais, a codificação segue exatamente o padrão que seria esperado para resolver esse problema. Nota-se apenas que a arquitetura, mais primitiva do que as de hoje, exigia, na falta de indexadores ou de ene-dereçamento indireto, que o efeito de indexação fosse conseguido através de modificação das próprias instruções do programa. Toda a codificação foi feita em nível que seria chamado mais tarde de linguagem de máquina.

Entretanto, von Neumann usa alguns expedientes que prenunciam o surgimento das linguagens de montagem (14), utilizando símbolos para denotar algumas grandezas. A atribuição de endereços é feita com relação a uma origem arbitrária, para ser preenchida mais tarde. Consegue-se, assim, o efeito de relocação manual de código para que possa ser usado como uma sub-rotina aberta. Outra preocupação de von Neumann refere-se à eficiência. A seqüenciação das instruções leva em consideração a latência da memória constituída de linhas de atraso. A descrição do programa termina com uma análise do tempo de execução, de forma muito semelhante às análises que foram difundidas mais tarde pelo próprio Knuth. Esse primeiro programa de von Neumann nunca pôde ser testado, pois o EDVAC ficou operacional somente vários anos mais tarde e, na realidade, tem um pequeno erro. Uma versão mais completa e mais polida do programa foi apresentada por Goldstine & von Neumann (1948a) e será comentada mais adiante.

O projeto da máquina do IAS contou com uma descrição muito mais completa e foi mais divulgada do que a do EDVAC. A primeira parte foi comentada na seção anterior. A segunda, escrita por Goldstine e von Neumann, compõe-se de três volumes (1947, 1948a, 1948b) intitulados Planning and coding of problems for an electronic computing instrument. Havia previsão para a publicação de um quarto, mas este, aparentemente, nunca foi escrito. Os três volumes constituem verdadeiro manual de técnicas de programação com múltiplos exemplos.

O primeiro volume (1947) é dedicado à metodologia de programação. Sugere que a tarefa seja separada em duas fases: a primeira referente à parte lógica da solução a ser representada por diagramas de fluxo (15) e, a segunda, a codificação propriamente dita. Nota que o problema de codificação é de tradução da linguagem matemática em que o problema e sua solução foram concebidos para outra linguagem, a da máquina. Explica a utilização de construções iterativas e de decisão e a correspondente notação em termos de diagramas. Explicita a conexão óbvia entre iteração e indução. O treino de von Neumann em lógica aparece na discussão de primeiros conceitos de linguagens de programação: constantes, variáveis livres (isto é, parâmetros) e variáveis ligadas (ou seja, variáveis locais) de um programa. Outra conseqüência dos seus conhecimentos de lógica é a introdução de asserções indutivas para descrever o estado da computação em pontos selecionados dos diagramas. Através de pequenos exemplos, são introduzidos vários conceitos como os de indexação e sub-rotinas. Novamente é dada ênfase à análise de eficiência de execução dos programas codificados. O documento chega a sugerir uma técnica para a modificação de programas, após a deteção de algum erro, através de inserção de desvios incondicionais para o fim do programa e subseqüente retorno. Tal técnica é utilizada até hoje com o nome de patches. Finalmente, há uma seção com sub-rotinas para conversão entre as notações decimal e binária, bem como para aritmética de precisão dupla.

O segundo volume desta parte da documentação (1948a) traz vários exemplos de programação. Os primeiros são de natureza numérica, envolvendo problemas de integração pelo método de Simpson e de interpolação. E discutido também o problema de erros de arredondamento e são apresentados alguns variantes, conforme a maneira de representar dados. Como sempre, há análises de tempo de execução.

Grande parte do segundo volume é dedicada novamente ao problema de classificação por intercalação, apresentando de maneira mais completa e acabada o mesmo algoritmo codificado no manuscrito analisado por Knuth. Há justificativa explícita para a utilização do problema a fim de testar a eficiência das partes não-aritméticas da máquina: memória e controle lógico. O problema de intercalação é resolvido de maneira muito semelhante à apresentada anteriormente. O de classificação é apresentado então como um problema de repetição da intercalação com seqüências de comprimentos crescentes 1, 2, 4, 8, 16, .... A análise de tempo de execução produz o resultado, hoje bem conhecido, com número de operações proporcional a n log n. A descrição da implementação do algoritmo termina com uma comparação com a eficiência das máquinas classificadoras de cartões, mostrando que, com hipóteses razoáveis sobre o tamanho dos registros classificados e das suas chaves, o computador deve ser de 15 a 30 vezes mais veloz, para uma massa de dados que caberia na memória. Finalmente, há considerações sobre a utilização do mesmo método para a classificação externa com dados em memória secundária como, por exemplo, numa fita magnética.

A escolha do problema de classificação e a solução adotada não podem ser subestimadas. Mesmo antes do advento dos computadores eletrônicos, classificadoras e intercaladuras eletromecânicas eram muito usadas em aplicações empresariais e em processamento de grandes volumes de dados. Durante muitos anos, as aplicações de computadores dependiam em boa parte de sua capacidade de classificação, principalmente de grandes arquivos de dados contidos em fitas magnéticas. Knuth (1973) menciona que, de acordo com as estimativas dos fabricantes de computadores daquela época, mais de 25% do tempo de uso dos seus computadores eram dedicados à classificação, chegando a mais de 50% em muitas instalações. Os projetistas do EDVAC estavam cientes deste fato, tanto que a aplicação da máquina para resolver o problema da classificação constava do programa do curso organizado pela Escola Moore, em 1946.

É muito significativo que von Neumann, ao resolver o problema de classificação para exemplificar aplicações não-numéricas, não tenha utilizado algum método mais óbvio e muito mais simples de programar como, por exemplo, o conhecido método de bolha (16). A razão aparente é que este último não poderia ser estendido para classificação externa; outra, é que von Neumann havia percebido que os métodos óbvios necessitam da ordem de n2 operações para classificar n registros, o que poderia tornar o computador mais lento do que as máquinas eletromecânicas.

O último volume (1948b) desta parte da documentação do computador do IAS é dedicado à construção de sub-rotinas reutilizáveis e à formação de bibliotecas dessas sub-rotinas. São tratados os problemas de passagem de parâmetros e de retorno de sub-rotinas. A maior parte do volume trata do problema de relocação de uma sub-rotina, ou seja, o deslocamento das instruções da sub-rotina para localizações que dependem da posição de outras que devem fazer parte do mesmo programa e já foram relocadas. O problema é resolvido por uma rotina especial, denominada rotina preparatória, que nada mais é que uma versão ainda primitiva do que posteriormente seria denominado de ligador/relocador. O documento apresenta código completo para a rotina, que supõe que as sub-rotinas relocáveis estão armazenadas num meio externo e com alguns dados fornecidos manualmente inicia a sua leitura e relocação automática na memória. A própria rotina preparatória é colocada no fim da memória para que o espaço por ela ocupado possa ser reaproveitado após o término da relocação.

Não podemos deixar de notar, entretanto, que aparentemente von Neumann não estava convencido da necessidade de ferramentas de programação mais avançadas como linguagens de montagem ou linguagens de alto nível, como FORTRAN cujo projeto estava sendo iniciado em 1954 por John Backus (Lee, 1994). Tal informação, caso seja exata, não seria surpreendente. Devemos lembrar que naquela época o custo dos computadores e, conseqüentemente, da sua utilização era muito alto. Assim, era natural certa ênfase em que os programas fossem tão eficientes quanto possível e que o computador fosse utilizado apenas para a sua execução. Além disso, a própria limitação dos computadores impunha que os programas fossem relativamente pequenos.

Concluímos notando que esta descrição tão minuciosa e precisa de conceitos, os mais diversos, de programação foi feita sem que os autores pudessem testá-los, pois não havia ainda qualquer computador disponível!

 

Outras contribuições

Algumas contribuções de von Neumann à teoria da Computação aparecem nos documentos relativos aos dois projetos de computadores relatados nos tópicos anteriores. Entre elas estão as idéias de prova de correção de programas através de asserções indutivas e de análise de algoritmos.

O interesse de von Neumann em fundamentos da computação e suas conexões com o funcionamento do cérebro antecedem o seu envolvimento direto com computadores (Nagy et al., 1989). O trabalho de Aspray (1990) analisa as origens desse interesse, especialmente no que diz respeito à teoria dos autômatos. Deve-se notar que, na época de von Neumann, tal teoria era ainda bastante incipiente, com as primeiras idéias sugeridas em 1943 por McCulloch & Pitts (1943). A formulação mais moderna da teoria apareceu somente na segunda metade da década de 1950. Uma avaliação deste aspecto das contribuições de von Neumann foi feita por Shannon (1958).

A principal motivação para o trabalho de von Neumann foi a tentativa de unificar as varias idéias existentes na época relativas ao processamento de informação por organismos vivos e por dispositivos artificiáis: modelos lógicos, como as redes neurais de McCulloch e Pitts, e a teoria de computabilidade de Alan Turing, com modelos estatísticos como a teoria de comunicação de Claude Shannon e a cibernética de Norbert Wiener. Apesar de muitas discussões, contatos e troca de correspondências desde o inicio dos anos 1940, a primeira publicação de von Neumann relativa ao assunto, da qual temos notícia, é o trabalho apresentado em 1948 no Simpósio Hixon, no Instituto de Tecnologia da Califórnia em Pasadena (von Neumann, 1948c). Neste trabalho, de natureza bastante descritiva, von Neumann discute as várias analogias e diferenças entre organismos vivos e dispositivos artificiais, notando especialmente as disparidades de complexidade e velocidade de processamento de ambos. Não apresenta resultados muito técnicos, exceto um esboço da construção de autômatos auto-reprodutores. O trabalho foi seguido de outros, de natureza mais técnica, explorando e ampliando algumas idéias.

Um texto mais completo relativo a autômatos auto-reprodutores foi publicado vários anos mais tarde, em coautoria com Burks (1966). O trabalho refere-se à síntese de organismos confiáveis (von Neumann, 1956), publicado pela primeira vez em 1956, mas precedido de uma serie de palestras em 1952, lançou os fundamentos da teoria de confiabilidade e tolerância a falhas que continuou atraindo muito interesse e contribuições de outros pesquisadores. Na realidade, o assunto aparece pela primeira vez em 1946 no documento que descreve o projeto do IAS (Burks et al., 1946). O artigo de Pippenger (1990) é um relato da história dessa teoria.

A idéia geral de explorar as analogias entre o computador e o cérebro está apresentada no texto The computer and the brain (von Neumann, 1958) publicado postumamente. O texto, inacabado, estava sendo preparado para a prestigiosa série de palestras Silliman da Universidade de Yale, a ser proferida em 1956, mas o estado de saúde de von Neumann impediu a sua realização. A história do desenvolvimento posterior da área foi apresentada por Sejnowski (1989).

Deve-se mencionar, também, que uma das linhas de pesquisa atualmente mais ativas em inteligência artificial são as aplicações das redes neurais que tinham despertado muito interesse de von Neumann (vide a avaliação de Cowan (1990).

As contribuições de van Neumann à computação científica e, em particular, à moderna análise numérica são atestadas por vários trabalhos. De acordo com Glimm (1990a), von Neumann é o fundador da área. Desde o início do seu envolvimento com os computadores, von Neumann notou que os métodos tradicionais para solução numérica de problemas matemáticos teriam de ser reformulados e novos métodos deveriam ser elaborados em função das características dos equipamentos utilizados. Em análise numérica propriamente dita, seus trabalhos incluem problemas de estabilidade numérica, acumulação de erros, solução de grandes sistemas lineares, inversão de grandes matrizes, solução de equações diferenciais parciais, utilização de métodos do tipo Monte Cario entre outros. As aplicações de computação científica incluem hidrodinâmica, difusão de neutrons, meteorologia e outros. Von Neumann introduziu, também, a utilização de computadores como ferramenta de pesquisa, iniciando o que poderia ser chamado de matemática experimental. Como exemplo, cita-se o estudo numérico da conjetura de Kummer (von Neumann & Goldstine, 1943).

 

Conclusões

Um dos aspectos mais impressionantes das contribuições de John von Neumann, tanto em Computação como em geral, é a sua diversidade. Este aspecto é realçado na avaliação de Aspray (1989). O pesquisador nota que a computação contou com muitos cientistas e engenheiros que deram contribuições importantes a uma ou duas áreas; von Neumann contribuiu a muitas: arquitetura, construção de hardware, programação, análise numérica, computação científica, teoria da computação. Outro papel importante de von Neumann foi o de legitimizar as atividades da área nascente. Ele foi o único entre os pioneiros que tinha estatura científica internacional suficiente para convencer os órgãos do governo a investir pesadamente num desenvolvimento cujo sucesso não estava garantido e cuja aplicabilidade não era ainda muito evidente.

Há vários pontos que merecem ser notados quanto às contribuições específicas na área de arquitetura e programação de computadores cuja análise teve mais destaque neste trabalho. Devemos lembrar que estas . contribuições foram feitas há cerca de 50 anos. Somente nos últimos 25 anos, desde a introdução dos primeiros microprocessadores, o seu desempenho melhorou 25 mil vezes, o que equivale a dobrar a cada 18 meses (Patterson, 1995). Desde o surgimento dos computadores, a sua velocidade aumentou cerca de 100 mil vezes. Um computador pessoal atual tem a memória cerca de 100 vezes maior e o seu preço é cerca de 1.000 vezes menor (em valores corrigidos). Temos assim um fator desempenho/preço da ordem de 1010 em cerca de 40 anos, o que equivale a dobrar este fator a cada 15 meses! Não existe qualquer outro exemplo de progresso tecnológico que tenha tido tal taxa de progresso. Mesmo assim, é impressionante a quantidade e a atualidade de muitos conceitos introduzidos por von Neumann. O próprio fato de que a leitura dos seus trabalhos ainda nos parece tão familiar comprova essa atualidade. No fundo, apesar de contarmos com grande diversificação tecnológica, que inclui conceitos como microprocessadores, computação paralela e distribuída, redes de computadores, interfaces gráficas e outros, os princípios básicos de sua arquitetura e programação ainda são os mesmos derivados das descrições do EDVAC e da máquina do IAS.

Por outro lado, a velocidade de progresso fez com que von Neumann não pudesse prever a maneira como os computadores revolucionariam todos os campos da vida moderna, especialmente com a explosão de utilização de computadores pessoais. Na sua visão, os computadores seriam utilizados principalmente em aplicações científicas e para processamento de grandes volumes de dados, como censo ou outros. Entretanto, ele estava ciente do fato de que os computadores seriam cada vez mais velozes mas, mesmo assim, haveria mais problemas, cada vez mais complexos para serem resolvidos, conforme palestra por ele proferida (von Neumann, 1949).

Gostaríamos de concluir este trabalho destacando novamente que a característica principal das contribuições de von Neumann não é apenas a solução de alguns problemas, mas, muito mais, o desbravamento de novas áreas e o lançamento de novos problemas para as gerações futuras. O seguinte comentário de Claude Shannon (17) expressa bem a idéia, apesar de mencionar principalmente as contribuições à teoria dos autômatos: "In summary, von Neumann's contributions to automata theory have been characterized, like his contributions to other branches of mathematics and science, by the discovery of entirely new fields of study and the penetrating application of modern mathematical techniques. The areas which he opened for exploration will not be mapped in detail for many years. It is unfortunate that several of his projects in the automata area were left unfinished."

 

Agradecimentos

O autor agradece à comissão organizadora do encontro A Obra e o Legado de John von Neumann o convite para apresentar as contribuições deste grande cientista. Agradecimentos especiais são dirigidos ao prófessor Imre Simon do IME-USP, por ter apoiado este trabalho indicando algumas das importantes fontes de informação, além de contribuir com vários comentários referentes à obra de von Neumann e a versões preliminares deste artigo. Outras pessoas ajudaram na localização de alguns trabalhos relevantes, entre elas, o professor Brian Randell, da Universidade de Newcastle upon Tyne (Inglaterra) e o professor João Setúbal, do DCC-IMECC-UNICAMP e Marcelo Savio da IBM Brasil.

 

Notas

1 Electronic Numerical Integrator and Computer.

2 Electronic Discrete Variable Computer.

3 Partes do documento foram publicados também em Randell (1973), p. 383-392; outros dois trabalhos diretamente relacionados ao assunto encontram-se em Godfrey fe Hendry (1993) e Williams (1993).

4 Isto é, tagged architecture.

5 Electronic Delay Storage Automatic Calculator.

6 Goldstine, 1972, p. 264.

7 Reduced instruction set computers e complex instruction set computers.

8 Em homenagem a John von Neumann.

9 The von Neumann bottleneck.

10 Von Neumann (1993), seção 12.4.

11 Data flow architecture.

12 Acido desoxirribonucléico.

13 Merge sort.

14 Assembly languages.

15 Flow diagrams.

16 Bubblesort.

17 Shannon, 1958, p. 129.

 

Referências bibliográficas

ADLEMAN, L. M. On constructing a molecular computer (draft). Relatório técnico, University of Southern California, Janeiro 1995.

__________. Molecular computation of solutions to combinatorial problems. Science 266 1994, p. 1021-1024.

AGERWALA, T. & ARVIND, Eds. Computer (número especial), v. 15(2). IEEE, 1982.

ASPRAY, W. The origins of John von Neumann's theory of automata. Em Glimm et al (1990b), p. 289-309, 1990.

ASPRAY, W. & BURKS, A. W., Eds. Papers of John von Neumann on Computing and Computer Theory, volume 12 de Charles Babbage Institute Reprint Series (1987), MIT Press.

ASPRAY, W. F. John von Neumann's contributions to computing and computer science. Em Brink & Haden (1989), p. 189-195, 1989.

BACKUS, J. Can programming be liberated from the von Neumann style? A functional style and its algebra of programs. Communications of the ACM 21, 8 1978, p. 613-641.

BENNETT, C. H.; BRASSARD, G. & EKERT, A. K. Quantum cryptography. Scientific American 269, 10 1992, p. 26-33.

BRINK, J. R. & HADEN, C. R., Eds. The Computer and the Brain: An International Symposium in Commemoration of John von Neumann (1903-1957) (1989), v. 11(3) of Annals of the History of Computing (special number).

BURKS, A. W.; GOLDSTINE, H. H. & VON NEUMANN, J. Preliminary discussion of the logical design of an electronic computing instrument, Part I. Em Taub (1963), p. 34-79, 1946.

COWAN, J. D. Von Neumann and neural networks. Em Glimm et al (1990b), p. 243-274, 1990.

DEUTSCH, D. Quantum theory, the Church-Turing principle and the universal quantum computer. Proceedings of the Royal Society A400 1985.

ECKERT, Jr., J. P. & MAUCHLY, J. W. Automatic high-speed computing: a progress report on the EDVAC. Relatório técnico, Moore School of Electrical Engineering, University of Pennsylvania, Setembro 1945.

GLANZ, J. A quantum leap for computers? Science 269 1995, p. 28-29.

GLIMM, J. Scientific computing: von Neumann's vision, today realities, and the promise of the future. Em Glimm et al (1990b), p. 185-196, 1990.

GLIMM, J.; IMPAGLIAZZO, J. & SINGER, L, Eds. The Legacy of John von Neumann (1990), v. 50 of Proceedings of Symposia in Pure Mathematics, American Mathematical Society.

GODFREY, M. D. & HENDRY, D. F. The computer as von Neumann planned it. Annals of the History of Computing 15, 1 Jan. 1993, p. 11-21.

GOLDSTINE, H. H. The Computer from Pascal to von Neumann. Princeton University Press, 1972.

GOLDSTINE, H. H. & VON NEUMANN, J. Planning and coding of problems for an electronic computing instrument, Part II, Vol. I. Em Taub (1963), p. 80-151, 1947.

__________. Planning and coding of problems for an electronic computing instrument, Part II, Vol. II. Em Taub (1963), p. 152-214, 1948a.

__________. Planning and coding of problems for an electronic computing instrument, Part II, Vol. III. Em Taub (1963), p. 215-235, 1948b.

GRUENBERGER, F. J. The History of JOHNNIAC. Annals of the History of Computing 1, 1 July 1979, p. 49-64.

HALMOS, P. R. The Legend of John von Neumann. American Mathematical Monthly 80, 4 Apr. 1973, p. 382-394.

KNUTH, D. E. Von Neumann's First Computer Program. Computing Surveys 2, 4 Dec. 1970, p. 247-260.

KNUTH, D. E. The Art of Computer Programming, Volume 3: Sorting and Searching. Addison-Wesley, 1973.

LEE, J. A. N. John Louis von Neumann. Disponível na rede WWW sob o endereço http://ei.cs.vt.edu:80/~history/VonNeumann.html, 1994.

LLOYD, S. Quantum-mechanical computers. Scientific American 273, 4 1995, p. 44-48,50.

McCULLOCH, W. S. & PITTS, W. A logical calculus of the ideas immanent in nervous activity. Bull. Math. Biophysics 5 1943, p. 115-133.

NAGY, D.; HORVÁTH, P. & NAGY, F. The John von Neumann-Ortvay Connection. Annals of the History of Computing 11, 3 1989, p. 183-188.

PATTERSON, D. A. Microprocessors in 2020. Scientific American 273, 3 1995, p. 48-51.

PIPPENGER, N. Developments in "The synthesis of reliable organisms from unreliable components". Em Glimm et al (1990b), p. 311-324, 1990.

RANDELL, B. The Origins of Digital Computers. Springer-Verlag, 1973.

__________. The origins of computer programming. Annals of the History of Computing 16, 4 Oct. 1994, p. 6-14.

ROSEN, S. Electronic computers: a historical survey. Computing Surveys 1, 1 Mar. 1969, p. 7-36.

SEJNOWSKI, T. J. "The computer and the brain" revisited. Em Brink & Haden (1989), p. 197-201, 1989.

SHANNON, C. E. Von Neumann's contributions to automata theory. Bulletin of the American Mathematical Society (volume especial: John von Neumann 1903-1957) 64, 3,2 1958, p. 123-129.

SHOR, P. W. Algorithms for quantum computation: discrete logarithms and factoring. Em Shafi Goldwasser, editor, Proceedings of the 35th Annual Symposium on Foundations of Computer Science, p. 124-134, 1994.

STERN, N. John von Neumann's influence on electronic digital computing, 1944-1946. Annals of the History of Computing 2, 4 Oct. 1980, p. 349-362.

TAUB, A. H., Ed. John von Neumann: Collected Works, 6 volumes. Oxford University Press, 1963.

TURING, A. N. On computable numbers, with an application to the Entschei-dungsproblem. Proc. London Math. Soc. 42, 2 1936, p. 230-267.

ULAM, S. John von Neumann, 1903-1957. Bulletin of the American Mathematical Society (volume especial: John von Neumann 1903-1957) 64, 3,2 1958, p. 1-49.

VON NEUMANN, J. The future of high-speed computing. Em Taub (1963), p. 236, 1949.

__________. The general and logical theory of automata. Em Taub (1963), p. 288-328, 1948c.

__________. Non-linear capacitance or inductance switching, amplifying and memory devices. Em Taub (1963), p. 379-419, 1954.

__________. Probabilistic logics and the synthesis of reliable organisms from unreliable components. Em Taub (1963), p. 329-378, 1956.

__________. First draft of a report on the EDVAC. Originalmente inédito; versão editada apareceu como von Neumann (1993); primeiras cinco seções reproduzidas em Randell (1973), p. 383-392, 1945.

__________. The Computer and the Brain. Yale University Press, 1958.

__________. First draft of a report on the EDVAC. Annals of the History of Computing 15, 4 Oct. 1993, p. 27-75. Referenda de von Neumann (1945) editada por Michael D. Godfrey.

VON NEUMANN, J. & BURKS, A. W. Theory of Self-Reproducing Automata, University of Illinois Press, 1966.

VON NEUMANN, J. & GOLDSTINE, H. H. A numerical study of a conjecture of Kummer. Em Taub (1963), p. 771-772, 1943.

VONNEUMAN, N. A. John vont Neumann: Formative Years. 1989. Em Brink fe Haden (1989), p. 171-175, 1989.

__________. John von Neumann as Seen by his Brother, Rev. ed. Nicholas Von-neuman, Meadowbrook, PA, 1991. MR 89i:01108, by Dieudonné.

WILKES, M. V. A Tribute to Presper Eckert. Communications of the ACM 38, 9 Sept. 1995, p. 20-22.

WILLIAMS, M. R. The origins, uses, and fate of the EDVAC. Annals of the History of Computing 15, 1 Jan. 1993, p. 22-38.

 

 

Tomasz Kowaltowski é professor do Departamento de Ciência da Computação do Instituto de Matemática e Estatística e Ciência da Computação da UNICAMP.
Palestra feita pelo autor no encontro A obra e o legado de John von Neumann, organizado pelo Instituto de Estudos Avançados da USP e pela Academia Brasileira de Ciências no Instituto de Matemática e Estatística da USP em 14 de novembro de 1995.