Sítio do Piropo

B. Piropo

< Coluna em Fórum PCs >
Volte
09/05/2011

< A arquitetura de von Neumann >


It would appear that we have reached the limits of what it is possible to achieve with computer technology, although one should be careful with such statements, as they tend to sound pretty silly in 5 years (Pode parecer que já alcançamos os limites do que é possível conseguir com a tecnologia de computadores, embora se deva encarar afirmações como esta com cautela pois elas tendem a se mostrar extremamente tolas em 5 anos). John von Neumann em 1949
Vimos na < http://blogs.forumpcs.com.br/bpiropo/2011/05/02/a-maquina-de-von-neumann/ > coluna anterior que, conforme as definições correntes (e nela citadas) dos conceitos de “organização de computadores” e “arquitetura de computadores”, esta última está relacionada com as características da máquina relevantes para o programador enquanto a primeira se relaciona àquilo que interessa ao projetista ou montador (o que inclui a subdivisão da máquina em partes, unidades ou componentes).


Figura 1: O Colossus

Vimos também que, à luz das observações de von Neumann em seu First Draft, duas das definições mais comuns de “arquitetura de von Neumann” na verdade não definem a arquitetura da máquina, mas sim sua organização. E que, portanto, elas poderiam servir perfeitamente para definir o que vem a ser uma “máquina de von Neumann”, mas não a “arquitetura de von Neumann” (para os que não leram a coluna anterior e não querem se dar ao trabalho de lê-la, as duas definições citadas são aquelas que identificam a máquina de von Neumann como a] aquela composta por cinco partes, a saber: unidade de controle, unidade aritmética, memória, unidade de entrada e unidade de saída, ou então b] aquela composta por três partes, a saber: unidade de processamento, memória e unidade de entrada/saída).
Então sobrou para esta coluna a agradável missão de continuar examinando o First Draft em busca de conceitos que nos ajudem a definir qual foi a arquitetura (e não a organização, posto que sobre esta nos pusemos de acordo) proposta por von Neumann para seu EDVAC.
E em que se baseariam estes conceitos?
Bem, se a conceituação estabelecida para arquitetura de computadores se relaciona com a forma como um computador “aparece para um programador” e se um programador, ao desenvolver seu programa (em linguagem de máquina, naturalmente, a única forma concebível em 1945 de programar computadores) nada mais faz que escrever instrução após instrução, temos que buscar a conceituação da arquitetura de von Neumann na forma pela qual a máquina por ele idealizada deveria tratar estas instruções (que ele chamava de “ordens”).
Até então, como as máquinas existentes faziam isto?
Bem, elas simplesmente as executavam. Isto porque, até então, as máquinas que existiam eram do tipo “controladas por programa” (program-controlled computers), como o Colossus (mostrado na Figura 1, obtida na Wikipedia), o ENIAC e o Mark I, nas quais as instruções praticamente faziam parte do hardware. Mais especificamente, e segundo a < http://en.wikipedia.org/wiki/Von_Neumann_architecture > descrição da Wikipedia: “which were programmed by setting switches and inserting patch leads to route data and to control signals between various functional units” (que eram programadas ajustando-se interruptores e inserindo terminais que fechavam contatos para fazer fluir dados e sinais de controle entre as diversas unidades funcionais).
Máquinas deste tipo padeciam de duas graves limitações. A primeira tinha a ver com o fato de que, para carregar um programa (isto que você faz com um simples clique sobre um ícone nesta reluzente e moderníssima máquina de von Neumann na qual está lendo este texto) era preciso desligar o sistema e alterar as posições de todos os interruptores e contatos elétricos conforme a nova tarefa a ser executada (é verdade que nas máquinas mais “modernas” de então, isto podia ser feito usando cartões perfurados para fechar ou abrir os contatos necessários). A segunda era ainda mais incômoda: como as instruções eram introduzidas fisicamente no hardware, um programa não podia alterar suas próprias instruções em função de resultados intermediários obtidos pelo próprio programa.
O que von Neumann propôs no First Draft era algo completamente diferente e, indubitavelmente, revolucionário: armazenar instruções na própria memória do computador e tratá-las de tal forma que pudessem alterar a ordem em que eram executadas.

Armazenamento de instruções
O que diz o First Draft sobre isto? Vamos ver, ainda citando apenas os trechos que me pareceram pertinentes. Começando já pelo item 1.0-Definições:
1.2 Um sistema de computação automática é um ... dispositivo que pode executar instruções para efetuar cálculos de uma ordem considerável de complexidade ... Estas instruções devem ser fornecidas de alguma forma que o dispositivo possa reconhecê-las ... Uma vez fornecidas as instruções, o dispositivo deve executá-las completamente e sem qualquer necessidade de posterior intervenção humana inteligente.... 2.3 Se o dispositivo for concebido para ser ... de uso genérico, então deve-se distinguir entre as instruções específicas destinadas a resolver ... um problema particular e aquelas que serão levadas a efeito pelos órgãos de controle geral ... As primeiras devem ser armazenadas de alguma maneira ... 2.4 [o] dispositivo ... deve ter uma memória considerável. Pelo menos as seguintes fases de sua operação requererão uma memória: ... As instruções que governam um problema complicado ...
Note que segundo o descrito, as instruções que constituem um programa devem ser fornecidas ao computador e executadas sem qualquer interferência posterior do usuário. E em uma máquina de uso geral (ou seja, uma que não tenha sido concebida para resolver um problema específico como o Colossus, destinado a decifrar códigos, e o ENIAC, a efetuar cálculos balísticos) as instruções que constituem um programa devem ser armazenadas na memória, um conceito absolutamente revolucionário para a época já que, até então, em todo artefato programável, incluindo o Harward Mark I (mostrado na Figura 2, obtida na Wilipedia), Colossus e ENIAC, as instruções faziam parte do hardware.


Figura 2: Harvard Mark I

É verdade que o conceito de armazenar programas na própria memória do computador não parece ter sido da lavra de von Neumann. A própria Wikipedia, no < http://en.wikipedia.org/wiki/Von_Neumann_architecture > artigo sobre Arquitetura de von Neumann, menciona que Alan Turing já havia publicado em 1936 nos “Proceedings of the London Mathematical Society” seu famoso trabalho intitulado “On Computable Numbers, with an Application to the Entscheidungsproblem” no qual descrevia aquilo que ele chamou de "universal computing machine" (hoje conhecida como “Máquina de Turing"), uma máquina hipotética que dispunha de uma memória infinita capaz de armazenar tanto dados quanto instruções. O mesmo artigo afirma que von Neumann e Turing mantiveram contato tanto em Cambridge, onde o primeiro lecionava, quanto em Princeton, onde Turing viveu de 1936 a 1937, alguns anos antes da redação do FirstDraft e, por conseguinte, é provável que von Neumann tivesse conhecimento do trabalho de Turing. Mais que isso: em dezembro de 1943 John Mauchly e Presper Eckert escreveram (sobre o próprio EDVAC que então planejavam) que a máquina armazenaria “dados e programas” em sua memória (a Wikipedia afirma que esta foi a primeira proposição prática para a construção de uma “máquina de programa armazenado” ou “stored program computer”, cuja < http://blogs.forumpcs.com.br/bpiropo/2011/05/02/a-maquina-de-von-neumann/2/ > definição estabelecemos na coluna anterior).
Mas o fato é que von Neumann jamais disputou esta primazia. Nem nunca se arvorou em criador de uma arquitetura que levasse seu nome. Pelo contrário: a expressão “arquitetura de von Neumann”, cujo uso só se disseminou após sua morte quando se reconheceu seu papel seminal na concepção do projeto do EDVAC, jamais foi mencionada por ele (e, com certeza absoluta, não consta do First Draft). O que ele fez ao elaborar o First Draft foi, mais uma vez, aquilo que sabia fazer como ninguém: juntar ideias esparsas e conceitos ainda mal estabelecidos (lembre que a máquina de Turing era hipotética) e formular algo absolutamente coerente e funcional com base naquelas e em suas próprias ideias. E quem se dispuser a ler o First Draft com a atenção merecida perceberá claramente que, embora ainda incompleto (afinal, trazia bem no título, a qualidade de First Draft, ou “rascunho preliminar”), descrevia de forma primorosa tudo o que era preciso para se construir a primeira máquina digna de merecer o nome de “computador”.
Mas voltando à questão da arquitetura: o fato de armazenar instruções na memória, por mais revolucionário que fosse, não bastava para definir uma arquitetura. Era preciso mais.
E tudo o que era preciso constava do First Draft. Senão vejamos.

Execução sequencial e desvios
Sobre a forma pela qual as instruções deveriam ser executadas, diz von Neumann em seu First Draft:
2.4 qualquer dispositivo que deva executar uma longa e complexa sequência de operações... deve ter uma memória considerável. Pelo menos as seguintes fases de sua operação requererão uma memória: b) As instruções que governam um problema complicado podem constituir um material considerável ... Este material deve ser lembrado.


Figura 3: O EDVAC concebido por von Neumann

Interpretando: ao dizer que “este material deve ser lembrado” von Neumann explicita que deve ser mantido na memória, pois ao longo de todo o First Draft ele usa o verbo “lembrar” com o significado de “manter na memória” (da máquina), pois jamais se dissociou da analogia do EDVAC (mostrado na Figura 3 já montado e funcionando no Ballistics Research Laboratory do exército Americano) com o “sistema nervoso dos animais superiores” que cita no início do documento. E o “material” a que ele se refere em 2.4.b é o conjunto de instruções “que governam um problema”. Portanto não há dúvida quando ao fato de que von Neumann concebeu o EDVAC como o primeiro computador de programa armazenado. O que é enfatizado adiante quando ele menciona:
14.1 ...a função de CC é receber estas ordens, interpretá-las e então ou executá-las ou estimular apropriadamente os órgãos encarregados desta execução... As ordens que serão recebidas por CC provêm de M, isto é, do mesmo local onde o material numérico é armazenado.
Neste ponto é importante notar que ao longo de todo o First Draft von Neumann usa preferentemente o termo “ordens” para se referir a “instruções”. E neste parágrafo deixa claro que a memória usada para armazená-las era a mesma usada para dados: “o mesmo local onde o material numérico é armazenado”.
Mas como von Neumann espera que estas instruções sejam executadas? Quando analisa os diferentes tipos de instruções que a máquina deve obedecer (ou seja, o resumo de seu “conjunto de instruções” ou “instruction set”) afirma:
14.1 ... As ordens que CC recebe recaem naturalmente em uma destas quatro classes: ... (c) ordem para CC alterar sua própria conexão com M para um ponto diferente de M, com o objetivo de obter de lá a ordem seguinte a ser executada; ...
Uma leitura atenta do parágrafo acima mostra que von Neumann concebeu o EDVAC para executar sequencialmente instruções armazenadas em posições sucessivas de memória, do contrário não haveria necessidade de “alterar a conexão para um ponto diferente de M para obter a ordem seguinte”. Isto ficará perfeitamente claro adiante. Aqui, o importante é enfatizar que a conexão poderia ser alterada “para um ponto diferente” por efeito de uma “ordem” (ou seja, a sequência de execução podia ser mudada pelo próprio programa). É verdade que, como logo se verá, ele considerava que isto ocorreria apenas em “ocasiões especiais”. Mas, seja como for, fica claro que o programa poderia alterar sua própria ordem de execução. Pois, continuando com o First Draft:
14.3 ... em princípio CC deve ser instruída, após cada ordem, sobre onde encontrar a próxima ordem a ser executada. Vimos, entretanto, que por si mesmo isto não é o mais desejável, devendo ser reservado para ocasiões especiais, enquanto que durante a rotina normal CC deve obedecer a ordenação em sequência cronológica em que as ordens aparecem naturalmente... ... Deve haver, entretanto, ordens disponíveis para serem usadas nas ocasiões excepcionais acima referidas, para instruir CC a transferir sua conexão para qualquer outro ponto desejado de M... esta ordem de transferência deve ainda providenciar que, após receber e executar a ordem ... CC deve restabelecer sua conexão [com o ponto de onde recebeu a ordem anterior] e a partir daí continuar a aceitar ordens na sequência cronológica natural. Ou, alternativamente, ... CC deve manter esta conexão e continuar aceitando ordens de lá, na natural sequência cronológica
Basta analisar o parágrafo acima para perceber que nele von Neumann descreve – tanto quanto eu saiba, pela primeira vez – aquilo que os programadores classificam como “desvios”, ou seja, mudança no fluxo das instruções comandadas pelas próprias instruções (em resumo: a possibilidade de um programa buscar na memória instruções fora “da natural sequência cronológica” baseado em ações comandadas pelo próprio programa, mais especificamente nos resultados de operações intermediárias de natureza aritmética ou lógica, que configurariam as tais “ocasiões especiais).
E os desvios são a essência da programação moderna.
Resumindo: pelo que se lê no First Draft, von Neumann concebeu uma máquina que, além de armazenar as instruções na mesma memória usada para dados, as executava sequencialmente de acordo com a ordem em que elas apareciam nesta memória mas que dispunha de instruções capazes de alterar esta ordem para um “ponto” diferente da memória, continuar a execução a partir de lá, ou retornar para o ponto anterior.

A arquitetura de von Neumann (afinal!)
Bem, agora que temos uma clara noção da diferença entre “organização” e “arquitetura” de computadores e sabemos como von Neumann esperava que sua máquina tratasse as instruções, poderemos analisar o que se diz por aí sobre o assunto.


Figura 4 – EDSAC, pioneiro da Arquitetura de Von Neumann

Primeiro, para não ser injusto com Mário Monteiro, um respeitável autor do respeitabilíssimo livro didático “Introdução à Organização de Computadores”, editora LTC, 5ª edição, citado < http://blogs.forumpcs.com.br/bpiropo/2011/05/02/a-maquina-de-von-neumann/3/ > na coluna anterior e fartamente adotado pelos professores das disciplinas “Arquitetura de computadores” e “Organização de computadores” (sim, existem as duas e as ementas são diferentes), vejamos o que diz ele quando se refere ao First Draft:
“Em resumo, os sistemas atuais, embora mais potentes, possuem os mesmos componentes básicos e realizam suas funções essenciais orientados pelos mesmos conceitos fundamentais expostos no relatório apresentado por John von Neumann, relativo à arquitetura de seu sistema EDVAC e do IAS, quais sejam:
- dados e instruções são armazenados em uma memória do tipo que escreve e recupera (leitura);
- o conteúdo da memória é endereçável conforme sua posição independente do tipo de informação nele contido;
- a execução das instruções ocorre de forma sequencial (a não ser que uma instrução específica mude momentaneamente a sequência) uma em seguida à outra”.
Neste ponto convém ter em mente que os três conceitos fundamentais coincidem exatamente com o que é proposto por von Neumann. E, o que é mais importante: referem-se não aos componentes ou partes da máquina, mas a forma pela qual estes componentes “realizam suas funções essenciais” – e este é justamente o domínio “arquitetura”.
Agora, “limpemos a barra” do Tanenbaum lembrando que, na tradução para o português de seu livro “Organização Estruturada de Computadores”, Prentice Hall do Brasil, ao descrever a primeira geração dos computadores e referindo-se a von Neumann, afirma: “Ele começou a perceber que o programa poderia ser representado em forma digital na memória do computador, juntamente com os dados” e, mais adiante: “seu projeto básico, agora conhecido como ‘Máquina de von Neumann’, foi utilizado no EDSAC, o primeiro computador com programa armazenado e é ainda a base de quase todos os computadores digitais, até mesmo hoje”.
Neste parágrafo não apenas ele reconhece a importância da colaboração de von Neumann no que toca ao conceito de “computador de programa armazenado” como cita o EDSAC – e não o EDVAC – como primeira máquina a adotá-lo. E ele está correto: embora o projeto do EDVAC – mais particularmente, o First Draft – tenha, reconhecidamente, servido de modelo para a montagem do EDSAC (mostrado na Figura 4, obtida na Wikipedia), questões ligadas à burocracia e às dificuldades para resolver certos problemas de hardware fizeram com que este último, cuja montagem foi iniciada posteriormente à do primeiro – pudesse entrar em funcionamento efetivo antes. De fato o EDSAC – Electronic Delay Storage Automatic Calculator – < http://www.cs.clemson.edu/~mark/edsac.html > efetuou seu primeiro cálculo em maio de 1949, em Cambridge, Reino Unido, onde foi construído, enquanto o EDVAC, cujo contrato para montagem foi assinado em abril de 1946 com o governo americano, somente foi instalado em agosto de 1949 porém, devido a problemas no sistema de memória e E/S, < http://ftp.arl.army.mil/~mike/comphist/61ordnance/chap3.html > apenas entrou efetivamente em serviço, ainda assim em bases limitadas, no final de 1951. Porém nada disto empana a participação de von Neumann na criação da primeira máquina de programa armazenado pois tanto uma máquina quanto a outra foram construídas baseadas em suas diretivas, portanto ambas foram por ele concebidas.
Agora, ainda no campo dos livros-texto, vejamos o que diz Williams Stallings, autor daquela que, em minha modesta opinião, é a melhor publicação didática sobre o tema, seu excelente “Computer Organization & Architecture – Designing for Performance”, da Pearson – Prentice Hall:
“Such a design is referred to as the ‘von Neumann Architecture’ and is based in three key concepts: a) Data and instructions are stored in a single read-write memory; b) The content of this memory is addressable by location, without regard to the type of data contained there; c) Execution occurs in a sequential fashion (unless explicitly modified) from one instruction to the next” (Esta concepção é designada de “arquitetura de von Neumann e é baseada em três conceitos chave: a) dados e instruções são armazenados em uma única memória do tipo escrita e leitura; b) o conteúdo desta memória é endereçável por posição, independentemente do tipo de dado lá contido; c) a execução ocorre de modo sequencial (exceto se explicitamente modificada) de uma instrução para a seguinte). O que coincide quase integralmente com aquilo que foi afirmado por Mário Monteiro, citado alguns parágrafos acima.
Agora, finalmente, apelemos para a Wikipedia. Sua definição de “Arquitetura de von Neumann” diz que: “is a design model for a stored-program digital computer that uses a central processing unit (CPU) and a single separate storage structure ("memory") to hold both instructions and data. It is named after the mathematician and early computer scientist John von Neumann” (é um modelo de concepção para um computador digital de programa armazenado que usa uma unidade central de processamento e uma única unidade independente de armazenamento (“memória”) para armazenar tanto instruções quanto dados. Foi batizada em homenagem ao matemático e pioneiro cientista da computação John von Neumann).
Uma definição bastante confusa. Para começar, mistura componentes (UCP e memória, cujo domínio é a organização) com funcionalidades (armazenamento de dados e instruções, o que cai no domínio da arquitetura). Pior que isto, afirma que: “The terms ‘von Neumann architecture’ and ‘stored-program computer’ are generally used interchangeably” (Os termos “arquitetura de von Neumann e “computador de programa armazenado” são, em geral, intercambiáveis), o que à luz do próprio First Draft é bastante discutível. É certo que “computador de programa armazenado” (“stored program computer”) e “arquitetura de von Neumann” são conceitos muito próximos e não se pode definir o segundo sem estabelecer claramente em que consiste o primeiro, mas daí a dizer que são “intercambiáveis” é exagerar um pouco. Portanto, não convém se basear na Wikipedia para definir arquitetura de von Neumann ou computador digital de programa armazenado, já que ela confunde uma com o outro.
Mas o fato é que não precisamos dela, posto que nesta altura dos acontecimentos o próprio First Draft, a fonte confiável por excelência no que toca a este tema, já nos forneceu informações mais que suficientes para definir ambos os conceitos.
Então vamos a elas, exclusivamente à luz do disposto no First Draft (que, afinal, é o único documento que interessa em toda esta quizomba):
Computador de programa armazenado (“stored program computer”) é aquele que armazena em um único espaço endereçável de memória de leitura e escrita tanto dados quanto instruções.
Arquitetura de von Neumann é uma concepção de computador de programa armazenado cujas instruções são executadas sequencialmente na ordem em que são encontradas na memória, exceto se esta ordem for explicitamente modificada por uma destas instruções.
Aí estão as definições de ambos os conceitos segundo o que este vosso criado conseguiu garimpar no First Draft.
Quem concordar, basta acenar com a cabeça. Quem discordar, que fale agora (de preferência nos comentários da coluna) ou cale-se para sempre.
E acabou-se o que era doce... Exceto por um comentário final:
Eu não sei se vocês desfrutaram algum prazer em ler esta série de colunas que, de tão longa, correu o risco de assemelhar-se à espada de Affonso Henriques, tornando-se comprida e chata. Mas de uma coisa tenho certeza: eu tive um prazer imenso em escrevê-la...


B. Piropo