Pré-história tecnológica
Dispositivos
mais antigos
Os primeiros dispositivos que surgiram para ajudar o homem a calcular têm sua
origem perdida nos tempos. É o caso por exemplo do ábaco e do quadrante. O
primeiro, capaz de resolver problemas de adição, subtração, multiplicação e
divisão de até 12 inteiros, e que provavelmente já existia na Babilônia por
volta do ano 3.000 a.C. Foi muito utilizado pelas civilizações egípcia, grega,
chinesa e romana, tendo sido encontrado no Japão, ao término da segunda guerra
mundial.
O quadrante era um instrumento para cálculo astronômico, tendo existido por
centenas de anos antes de se tornar objeto de vários aperfeiçoamentos. Os
antigos babilônios e gregos, como por exemplo Ptolomeu, usaram vários tipos de
dispositivos desse tipo para medir os ângulos entre as estrelas, tendo sido
desenvolvido principalmente a partir do século XVI na Europa. Outro exemplo é o
compasso de setor, para cálculos trigonométricos, utilizado para se determinar
a altura para o posicionamento da boca de um canhão, e que foi desenvolvido a
partir do século XV.
Os antigos gregos chegaram até a desenvolver uma espécie de computador. Em
1901, um velho barco grego foi descoberto na ilha de Antikythera. No seu
interior havia um dispositivo (agora chamado de mecanismo Antikythera)
constituído por engrenagens de metal e ponteiros. A descoberta desse
dispositivo, datada do primeiro século a.C., foi uma total surpresa, provando
que algum artesão do mundo grego do mediterrâneo oeste estava pensando em termos
de mecanização e matematização do tempo.
Logaritmos e os
primeiros dispositivos mecânicos de cálculo
John Napier, Barão de Merchiston, é bastante conhecido pela descoberta dos
logaritmos, mas também gastou grande parte de sua vida inventando instrumentos
para ajudar no cálculo aritmético, principalmente para o uso de sua primeira
tabela de logaritmo.
A partir dos logaritmos de Napier surgiu uma outra grande invenção,
desenvolvida pelo brilhante matemático Willian Oughtred e tornada pública em
1630: a régua de cálculo. Ganhou sua forma atual por volta do ano de 1650 (de
uma régua que se move entre dois outros blocos fixos), tendo sido esquecida por
duzentos anos, para se tornar no século XX o grande símbolo de avanço
tecnológico, com uso extremamente difundido, até ser definitivamente
substituída pelas calculadoras eletrônicas.
Com o desenvolvimento dos primeiros dispositivos mecânicos para cálculo
automático, começa efetivamente a vertente tecnológica que levará à construção
dos primeiros computadores.
Charles Babbage
e suas máquinas
A idéia de Leibniz de, através de máquinas, liberar o homem das tarefas
repetitivas e de simples execução foi quase posta em prática pelo matemático e
astrônomo inglês Charles Babbage (1792-1871), considerado unanimemente um dos
grandes pioneiros da era dos computadores. No ano de 1822 ele apresentou a sua
Máquina de Diferenças em Londres: o projeto de um mecanismo feito de madeira e
latão, que poderia ter alterado o rumo da história se tivesse sido construído
efetivamente. Babbage concebeu a idéia de um dispositivo mecânico capaz de
executar uma série de cálculos.
Já por volta da década de 1820 ele tinha certeza de que a informação poderia
ser manipulada por máquina, caso fosse possível antes converter a informação em
números. Tal engenho seria movido a vapor, usaria cavilhas, engrenagens,
cilindros e outros componentes mecânicos que então compunham as ferramentas
tecnológicas disponíveis em sua época. Para descrever os componentes de sua
máquina faltavam-lhe os termos que atualmente são usados. Chamava o processador
central de "usina" e referia-se à memória da máquina como
"armazém". Mas o que motivou esse inglês a fazer um dispositivo capaz
de resolver equações polinomiais através do cálculo de sucessivas diferenças
entre conjuntos de números foi a necessidade de uma maior precisão na
elaboração de tabelas logarítmicas.
No final do século XVIII houve uma proliferação de tabelas de vários tipos.
Desde Leibniz e Newton os matemáticos estiveram preocupados com o problema da
produção de tabelas, tanto por meios matemáticos ou por meio de medições
físicas. A intenção era reduzir o trabalho de cálculo, mas as tabelas
produzidas pelos especialistas tinham muitos erros. Os matemáticos estavam
cientes deles e estudos foram elaborados para se tentar melhorar a situação.
Nestas circunstâncias apareceu o projeto denominado Difference Engine de
Babbage, que lhe valeu o apoio de seus colegas da Sociedade Real e fundos do
governo britânico para iniciá-lo. O desafio era construir um dispositivo para
computar e imprimir um conjunto de tabelas matemáticas. Em 1833, Babbage
projetou a sua Máquina Analítica ou Diferencial, semelhante ao computador
atual, pois dispunha de programa, memória, unidade de controle e periféricos de
entrada e saída. Todos os seus trabalhos prolongaram-se por alguns anos, sem
sucesso, até que o governo inglês desistiu do financiamento. Em 1833 Charles
Babbage parou de trabalhar em sua máquina.
Apesar de tudo, esse teimoso inglês já vinha desenvolvendo novas idéias. Provavelmente
tentando alguma nova modificação no projeto da Máquina de Diferenças foi que
Charles Babbage concebeu um mecanismo mais complicado que este em que falhara,
após vários anos de tentativas. Era a idéia de uma máquina de cálculo
universal, que virá a ser retomada em 1930 por Alan Turing, e que terá então
consequências decisivas. A Máquina Analítica poderia seguir conjuntos mutáveis
de instruções e, portanto, servir a diferentes funções - mais tarde isso será
chamado de software. Ele percebeu que para criar estas instruções precisaria de
um tipo inteiramente novo de linguagem e a imaginou como números, flechas e
outros símbolos. Ela seria para Babbage "programar" a Máquina
Analítica, com uma longa série de instruções condicionais, que lhe permitiriam
modificar suas ações em resposta a diferentes situações.
Reconhecendo a importância de se terem resultados impressos, Charles procurou
que os resultados finais e os intermediários fossem impressos para evitar
erros. Dispositivos de entrada e saída eram assim necessários. A entrada de
dados para a máquina seria feita através de três tipos de cartões:
"cartões de números", com os números das constantes de um problema;
"cartões diretivos" para o controle do movimento dos números na máquina;
e "cartões de operação" para dirigir a execução das operações tais
como adições, subtrações, etc. Mas o mais genial estava por vir: duas inovações
simples mas que produziram um grande impacto. A primeira era o conceito de
"transferência de controle" que permitia à máquina comparar
quantidades e, dependendo dos resultados da comparação, desviar para outra
instrução ou seqüência de instruções. A segunda característica era possibilitar
que os resultados dos cálculos pudessem alterar outros números e instruções
colocadas na máquina, permitindo que o "computador" modificasse seu
próprio programa.
A máquina de
Jacquard, inspiração de Babbage
É importante fazer uma menção a Joseph-Mariae Jacquard (1752-1834), o francês
que introduziu a primeira máquina para substituir o trabalho humano. Na
verdade, Babbage despertou para seu novo projeto observando a revolução
produzida pelos teares de Jacquard. Era uma máquina que automatizava os
processos de fabricação de tecido. Para executar um determinado trançado, a
fiandeira deveria ter um plano ou programa que lhe dissesse que fios deveria
passar por cima ou por baixo, quando repetir o processo, etc. O ponto chave da
máquina de Jacquard era o uso de uma série de cartões cujos buracos estavam
configurados para descrever o modelo a ser produzido. O sucesso foi total e em
1812 havia na França 11.000 teares de Jacquard. Adaptando o tear de Jacquard, a
Máquina Analítica processava padrões algébricos da mesma maneira que o tear
processava padrões de desenhos.
Uma Lady como
primeira programadora
Bem cedo Ada Augusta Byron (1851 – 1852) demonstrou ter grandes talentos na
área. Apresentada a Babbage durante a primeira demonstração da Máquina de
Diferenças, tornou-se uma importante auxiliar em seu trabalho, sendo sobretudo
alguém que compreendeu o alcance das novas invenções. Ela percebeu que
diferentemente das máquinas anteriores com funcionamento analógico (execução de
cálculos usando medidas), a Máquina de Diferenças era digital (execução de
cálculos usando fórmulas numéricas). Mais importante ainda, deu-se conta da
combinação entre funções lógicas e aritméticas na máquina de Babbage.
Quando Charles Babbage visitou Turim, ministrou uma série de palestras para
distintos públicos, incluindo Luigi F. Menabrea, futuro primeiro-ministro da
Itália. Este ficou impressionado com o trabalho de Babbage e tomou uma série de
notas, publicadas depois em 1842 pela Biblioteca da Universidade de Genebra.
Lady Lovelace traduziu para o inglês essas notas, acrescentando muitas
observações pessoais. Esta publicação e outro ensaio a colocam como patrona da
arte e ciência da programação. Mesmo não estando a máquina construída, Ada
procurou escrever seqüências de instruções tendo descoberto conceitos que
seriam largamente utilizados na programação de computadores como subrotinas,
loops e saltos.
Outras Máquinas
Diferenciais e Máquinas Analíticas
Embora não fosse fácil, o trabalho de Babbage foi divulgado por um certo Dr.
Dionysus Lardner, que procurou descrever a máquina e seu modo geral de
operação. Um sueco, George Scheutz, editor de um jornal técnico de Estocolmo,
leu e ficou entusiasmado pela máquina descrita por Lardner e, sem comunicar-se
com Babbage, propôs-se a construir a sua Máquina de Diferenças, junto com seu
filho. Os anos de 1840, 1842 e 1843 marcaram etapas bem sucedidas no
desenvolvimento do projeto, culminando com um modelo preliminar. Em outubro de
1854 o dispositivo de Scheutz estava completo e em funcionamento.
Outros, como por exemplo Alfred Decon, inglês, Martin Wiberg, sueco e G. B.
Grant, americano, construíram modelos derivados e até 1931 Máquinas de
Diferenças foram construídas para produzir diferentes tipos de tabelas.
Com relação à Máquina Analítica, parece que o irlandês Percy Ludgate
(1883-1922) projetou e tentou construir um mecanismo similar ao de Babbage,
conforme pequena descrição feita em um diário científico de Dublin, em 1909.
Herman Hollerith
O próximo passo importante na História da Computação não está relacionado com
tabelas de cálculo de logaritmos ou desenvolvimento de leis do pensamento. O
próximo "pensador" a avançar o estado da arte foi Herman Hollerith,
um funcionário de apenas 19 anos do United States Census Office. Seu papel não
teve impacto sobre os importantes fundamentos teóricos da Computação e sua
invenção já é obsoleta. Mas sua pequena inovação cresceu tanto na indústria que
mais tarde Hollerith veio a dominar o uso da tecnologia de computadores. Em
1890 ele ganhou a concorrência para o desenvolvimento de um equipamento de
processamento de dados para auxiliar o censo americano daquele ano. A empresa
fundada para isto, Hollerith Tabulating Machines, veio a ser uma das três que
em 1914 compôs a empresa CTR (Calculating-Tabulating-Recording), renomeada em
1924 para International Business Machine - IBM.
Hollerith, inspirado pelos teares de Jacquard, desenvolveu a idéia de se
aproveitar os cartões perfurados dos teares em uma máquina que pudesse
interpretar, classificar e manipular as somas aritméticas representadas pelas
perfurações. Ele combinou cartões perfurados com os novos dispositivos
eletromagnéticos de então.
Em 1887, o francês Leon Bolle construiu uma máquina de multiplicar que
executava essa operação de maneira direta, sem utilizar o processo de somas
sucessivas. Também no final dos Séc. XIX, um espanhol residente nos E.U.A,
Ramón Verea, construiu uma máquina semelhante à máquina de Bolle, que realizava
a multiplicação de forma direta.
Em 1893, o suíço otto Steiger, construiu a primeira calculadora a obter sucesso
comercial, chamada A Milionária, que foi utilizada em grandes transações e em
algumas aplicações de cálculos científicos.
Computadores
Analógicos
Muitos dispositivos analógicos foram desenvolvidos a partir do ano 400 a.C.
Típicos instrumentos deste tipo são os astrolábios, o mecanismo Antikythera, os
instrumentos de sinalização e os planetários. Um computador analógico é um
dispositivo no qual os números são representados por quantidades medidas e nos
quais equações ou relações matemáticas são representadas por diferentes
componentes, correspondendo a operações matemáticas singulares, tais como,
integração, adição ou multiplicação.
Um dispositivo analógico muito conhecido é a régua de cálculo. Ela consiste
basicamente de dois trilhos graduados de acordo com os logaritmos de números, e
os trilhos deslizam um sobre o outro. Os números são representados através de
comprimentos nos trilhos e a operação física que pode ser executada é a soma de
dois comprimentos nos trilhos.
Os componentes analógicos podem ser divididos em duas classes, dependendo da
maneira como os números são representados: I) por quantidades mecânicas, como
um deslocamento linear ou rotação angular; II) quantidades elétricas, como
voltagem, corrente, impedância, condutividade.
Se os deslocamentos lineares são usados para representar números, há caminhos
simples, nos quais relações geométricas podem aparecer através de formas
mecânicas. As operações matemáticas podem ser realizadas usando-se uma relação
geométrica correspondente.
Dois nomes famosos estão diretamente ligados à efetiva produção de dispositivos
analógicos para resolução de cálculos mais complexos: James Clerk Maxwell
(1831-1879), o criador da teoria sobre a eletricidade e o magnetismo, e James
Thomson. Ambos inventaram dispositivos analógicos por volta de 1860.
Em todos os dispositivos analógicos que começaram a aparecer, a operação
fundamental é a da integral, isto é, todos eles produziam como saída , dado
f(x) como entrada.Dentro da evolução das máquinas analógicas, os analisadores
diferenciais foram os dispositivos analógicos que mais tarde passaram a ser
chamados propriamente de computadores analógicos.
Primeiras
evoluções: século XV
É por volta do século XV que aparecem dispositivos analógicos mais
sofisticados, utilizados para prever os tempos de maré alta e baixa em alguns
portos europeus. São os chamados "tide predictors", com suas escalas
circulares, seus ponteiros que marcavam a posição do sol e da lua e que,
juntamente com algumas informações específicas do porto, permitia ao usuário
ler nas escalas do instrumento o tempo aproximado entre a maré alta e baixa.
Quando na metade do século XVIII foi possível encontrar uma fórmula para o
cálculo de séries de coeficientes de cosseno, Lord Kelvin construiu uma máquina
analógica para avaliar essa fórmula. Chamou-a analisador harmônico.
Um desses primeiros dispositivos foi elaborado em 1878. Escrevendo sobre seu
analisador harmônico de ondas do mar Kelvin disse: "O objetivo desta
máquina é substituir o grande trabalho mecânico de calcular os fatores
elementares que constituem a subida e descida da maré (...)". Uma análise
harmônica consiste em se formar um número de integrais do tipo geral , onde g é
uma função seno ou cosseno.
A última invenção de Kelvin relevante para nossa história foi o que agora é
chamado Analisador Diferencial, um dispositivo para a solução de sistemas de
equações diferenciais ordinárias. Kelvin nunca chegou a construir sua máquina
por não dispor de tecnologia suficiente. A dificuldade estava em como usar a
saída de um integrador como entrada em outro. Na explicação de Maxwell, o
problema central era a saída estar medida pela rotação de um disco ligado a uma
roda. Esta roda é acionada por estar apoiada sobre um disco que gira em torno
de um eixo. O torque desse disco - sua capacidade de girar a roda - é muito
pequeno e consequentemente ele não pode fornecer uma entrada para outro
integrador. Esses problemas permaneceram suspensos por quase 50 anos até o
desenvolvimento dos amplificadores de torque. Analisadores diferenciais
mecânicos foram revitalizados por volta de 1925 e o mais famoso destes foi o
construído no Instituto de Tecnologia de Massachusetts (MIT) por Vannevar Bush.
Michelson e seu
analisador harmônico; I Guerra Mundial
Durante a I Guerra Mundial tornaram-se estratégicos os problemas referentes aos
cálculos balísticos, o que foi um incentivo à continuidade do desenvolvimento
de máquinas computacionais. Um destes problemas é o de como determinar a função
de deslocamento, observando-se a resistência do ar, em função da velocidade.
Quando a artilharia aponta para objetos que se movem, como navios ou aviões, é
essencial prever o movimento dos alvos.
Foram duas décadas (1910 e 1920) em que houve um grande aprofundamento teórico,
com a formação de grupos de matemáticos nos EUA e Inglaterrra, cujas principais
descobertas estão nos procedimentos numéricos para solução de equações
diferenciais com grande precisão.
Computadores
Analógicos Eletromecânicos
Nos primeiros anos do século XX muitos físicos e engenheiros de todo o mundo
estiveram trabalhando em questões fundamentais da área de eletricidade. Centros
de pesquisa foram criados em Harvard, no MIT, na IBM, na General Electric, e
outros lugares. Eles tiveram sucesso na formulação matemática dos problemas em
teoria de circuitos e muitos textos foram escritos nos anos da década de 1920.
Também não se pode esquecer o trabalho fundamental de Oliver Heaviside
(1850-1897), um inglês que desenvolveu um dispositivo matemático para manipular
equações e analisar indução eletromagnética, e o trabalho de Norbert Wiener
junto a Bush.
A partir de 1927 até 1931, Vannevar Bush e sua equipe no MIT desenvolveram
mecanismos para resolver equações diferenciais ordinárias. Bush deve
especialmente a C. W. Niemann, engenheiro e inventor do amplificador de torque
Bethlehem, a possibilidade de ter construído seu famoso analisador diferencial,
terminado em 1931. Usando o amplificador de Niemann, Bush pôde construir uma
máquina usando exclusivamente integradores. Ainda mecânico, este dispositivo
foi aprimorado durante a II Guerra Mundial. Entram aqui conceitos de
servo-mecanismos e amplificadores operacionais.
Ainda dentro do mundo dos computadores analógicos, deve-se destacar o trabalho
do físico inglês Douglas Hartree, que tentou resolver equações diferenciais
parciais com analisadores diferenciais e que ao deparar-se com cálculos
altamente complexos, anteviu e preparou o advento dos computadores eletrônicos.
As novas descobertas da indústria e da ciência no campo da eletricidade -
proporcionando rapidez e precisão nos equipamentos - juntamente com a limitação
dos equivalentes analógicos eletromecânicos, acabaria por impor a nova
tecnologia de circuitos. Uma nova era da Computação começava a ser desvelada. É
necessário assinalar que novas máquinas analógicas eletromecânicas sucedâneas
da última máquina de Bush, no MIT, em 1942 foram construídas e até 1960 ainda
estavam em uso.
Circuitos
elétricos e formalismo lógico: Claude Elwood Shannon
Aos poucos, juntando idéias, vamos chegando à construção do computador digital.
Paralelamente aos matemáticos, também um jovem engenheiro, Claude E. Shannon,
com a idade de 22 anos, deu uma grande contribuição à Computação: em 1937 ele
estabeleceu uma ligação entre os circuitos elétricos e o formalismo lógico.
Durante a Segunda Guerra Mundial, Shannon começou a desenvolver uma descrição
matemática da informação, dando origem a um ramo de estudos conhecido como
Teoria da Informação .
O que Shannon fez em 1937 foi mostrar um caminho para projetar máquinas
baseadas na lógica algébrica descrita um século antes por George Boole, aquela
em que só havia dois valores no sistema de cálculo lógico: 1 e 0. Se um valor é
verdadeiro, ele pode ser representado pelo valor 1 e, se falso, pelo 0. Uma das
características importantes da álgebra de Boole é que as operações lógicas
podem ser colocadas juntas e formar novas operações. Claude Shannon percebeu
que a mesma álgebra poderia descrever o comportamento de circuitos elétricos
chaveados. Com a álgebra booleana torna possível a construção de um dispositivo
de "estado" que pode armazenar qualquer informação específica, seja
um dado ou uma operação. E se um circuito elétrico pode executar operações
matemáticas e lógicas, e pode também armazenar os resultados de tais operações,
então os computadores digitais podem ser construídos. .
Em breve já seria possível a construção de circuitos elétricos que simulavam
algumas operações lógicas. Shannon estava procurando um procedimento matemático
que fosse o mais adequado para se descrever o comportamento de circuitos a relé
e nos dez anos seguintes ao seu primeiro trabalho, Shannon dirigiu seu
interesse para o estudo da comunicação, parte de um trabalho já iniciado por
Norbert Wiener.
Depois da guerra, tendo encontrado uma ferramenta perfeita para a descrição de
circuitos a relé, Claude Shannon procurou definir matematicamente aquilo que as
novas máquinas processavam. Shannon estava interessado nas leis subjacentes aos
sistemas de comunicação de mensagens feitos pelo homem, na diferença entre
ruído e mensagem e de como esta mantinha a sua ordem em um meio onde a
"desordem" é muito alta. Chegou a equações muito parecidas às do
físico Boltzmann sobre as leis da entropia.
Em 1948 Shannon publicou dois trabalhos que originaram a Teoria da Informação.
O desenvolvimento deu-se rapidamente, afetando não somente o projeto de
sistemas de comunicação, mas também áreas como automatização, ciência da
informação, psicologia, linguística e termodinâmica.
Em 1950 publicou "A Chess Playing Machine" onde propunha que
computadores digitais poderiam ser adaptados para trabalhar simbolicamente com
elementos representando palavras, proposições ou outras entidades conceituais,
dando prosseguimento ao emergente ramo de estudos denominado mais tarde
Inteligência Artificial. Em 1953, com "Computers and Automata" falou
sobre simulação através de hardware e software de algumas operações do cérebro
humano.
As primeiras máquinas
Os primeiros
computadores eletromecânicos
A partir da década de 1930 alguns cientistas começaram a trabalhar com dispositivos
de cálculo com algum tipo de sistema de controle automático. Já se dispunha da
tecnologia necessária para se construir aquela estrutura imaginada por Babbage.
Surgiram os primeiros computadores mecânicos e eletromecânicos e muitos
projetos de computadores eletrônicos feitos posteriormente sofreram muitas
influências dessas primeiras máquinas. Pode-se dividir esta primeira etapa em 3
partes:
1. o trabalho do alemão Konrad Zuse;
2. a produção, pelos laboratórios da Bell Telephone, de uma série de computadores
baseados em tecnologia de relés e os projetos de Howard Aiken em Harvard;
3. os projetos de computadores eletromecânicos de pequeno e grande porte da IBM
.
Konrad Zuse
Konrad Zuse (1910-1995) foi o primeiro a desenvolver máquinas de cálculo
controladas automaticamente. Esse engenheiro civil percebeu rapidamente que um
dos aspectos mais onerosos ao se fazerem longos cálculos com dispositivos
mecânicos era guardar os resultados intermediários para depois utilizá-los nos
lugares apropriados nos passos seguintes . Em 1934, depois de várias idéias e
tentativas, Zuse chegou à conclusão que um calculador automático somente
necessitaria de três unidades básicas: uma controladora, uma memória e um
dispositivo de cálculo para a aritmética. Ele desenvolveu o seu Z1, em 1936, um
computador construído inteiramente com peças mecânicas e que usava uma fita de
película cinematográfica para as instruções que controlavam a máquina.
Em 1938, antes mesmo de terminar o Z1, um aluno de Zuse, Helmut Schreyer, construiu
uma parte do Z1 usando válvulas. Em função da situação de pré-guerra, Zuse teve
de abandonar essa linha de desenvolvimento - seriam necessárias 1000 válvulas,
o que era impossível naquele momento - e continuou o Z2 usando tecnologia
baseada em relés.
Esses dois primeiros modelos eram somente para teste: tinham todas as
características do computador posterior, mas não trabalhavam satisfatoriamente.
O Z3 foi terminado em 1941 e foi o primeiro modelo totalmente operacional"
. O Z3, como a maioria das máquinas dessa primeira geração, usava dois
mecanismos separados para as funções aritméticas e tinha uma unidade especial
para conversão de números na notação decimal para a binária. Em termos de
velocidade podia ser comparado ao MARK I, que foi terminado dois anos após o
Z3. O Z3 executava três a quatro adições por segundo e multiplicava dois
números em quatro ou cinco segundos. Nunca chegou a ser usado para grandes
problemas em função de possuir uma memória de tamanho limitado. Foi destruído,
junto com a casa de Zuse, por um bombardeio em 1944.
O Z4 começou a ser desenvolvido quase que simultaneamente ao final do trabalho
do Z3. Era essencialmente a mesma máquina, com maior capacidade de memória e
mais rápida. Por causa do avanço das tropas aliadas, o trabalho do Z4 foi
interrompido quase ao seu final e a máquina ficou escondida em uma pequena
cidade da Bavária chamada Hinterstein Em 1950, na Suíça, Zuse reconstruiu o seu
Z4, e fundou uma empresa de computadores, absorvida depois pela Siemens. As
máquinas de Zuse tiveram pouco impacto no desenvolvimento geral da Computação
pelo absoluto desconhecimento delas até um pouco depois da guerra .
As máquinas da
Bell e as máquinas de Harvard
Por volta de 1937, enquanto Turing desenvolvia a idéia da sua "Máquina Universal"
e formalizava o conceito do que é computar e do que é um algoritmo, nos Estados
Unidos dois outros matemáticos também consideravam o problema da computação:
Howard Aiken, em Harvard, cujo trabalho daria seus frutos em 1944, e George
Stibitz, nos laboratórios da Bell Telephones. Eles procuravam componentes
eletromecânicos que pudessem ser usados na computação de cálculos.
Nos últimos anos da década de 1930 os problemas envolvendo cálculos com números
complexos no projeto de equipamentos telefônicos começaram a dificultar o
crescimento da Cia. Bell Telephone. As pesquisas da empresa então começaram a
ser direcionadas à descoberta de mecanismos que pudessem satisfazer essa
necessidade cada vez mais crescente de cálculos mais rápidos. Stibitz demonstrou
que relés podiam ser utilizados para executar operações aritméticas. A partir
de 1938, juntamente com S. B. Willians começou a implementar suas idéias, e em
1939 estava pronto o seu Modelo I. Seus outros 'Modelos' chegaram até o número
VI, terminado em 1950 - tendo estado em uso até 1961 -, e juntamente com os
computadores K do Dr. Zuse foram os primeiros computadores de código binário,
baseados em relés.
Ao mesmo tempo, nos Laboratórios de Computação de Harvard, Howard Aiken e
engenheiros da IBM começaram a desenvolver um outro tipo de máquinas
eletromecânicas, não totalmente baseada nos relés, já incorporando uma nova
tecnologia que seria amplamente utilizada mais tarde: as memórias de núcleo de
ferrite. Ao término de sua primeira versão, em 1943, o IBM Automatic Sequence
Controlled Calculator, comumente chamado de Harvard Mark I, tinha uma série de
novas capacidades: modificava instruções dinamicamente baseando-se nos
resultados obtidos durante o processamento, possuía unidades para decidir qual
o melhor algoritmo para execução de um cálculo através do argumento de uma
função, testava o conteúdo de registradores, etc. Quando terminado em 1944, foi
imediatamente adotado pela marinha americana, para fins militares. Novas
versões foram produzidas até 1952.
A participação
da IBM
As máquinas de calcular mecânicas produzidas por empresas como a IBM não tinham
linha de produção até a entrada dessas empresas no mercado de computadores
propriamente dito. Eram equipamentos para auxiliar tarefas computacionais, que
variaram desde as tabuladoras de Hollerith até tabuladoras para cálculos
científicos como as produzidas por L.J. Comrie na Inglaterra ou Wallace J.
Eckert nos Estados Unidos. Em 1935 a IBM começou a produzir suas séries 602,
602A até 605, calculadoras baseadas em relés que produziam em altas velocidades
tabelas de vários tipos, com alta confiabilidade. Uma posterior evolução foi a
possibilidade dessas máquinas poderem ser programadas através de painéis de
controle para ler um cartão, executar até 60 diferentes cálculos aritméticos, e
perfurar o resultados no próprio cartão de leitura. Outras empresas como a
Remington Rand produziram equipamentos semelhantes.
Depois do sucesso do Mark I em Harvard, no qual teve grande participação com o
laboratório em Endcott, a IBM lançou-se na produção do Selective Sequence
Electronic Calculator (SSEC), sob o comando de Frank Hamilton, que pertenceu ao
grupo de Aiken, em Harvard. Terminado em 1947, atraiu um importante grupo de
pesquisadores que buscavam o aprimoramento da capacidade de cálculo e cujas
soluções apontavam para um conceito decisivo para os computadores: o de
programa armazenado. O último computador eletromecânico produzido foi o CPC,
Card-Programmed Electronic Calculator, modelos I e II que finalizaram a série
700.
O início da era
da computação eletrônica
Durante os anos de 1936 a 1939, "John Vincent Atanasoff, com John Berry,
desenvolveu a máquina que agora é chamada de ABC (Atanasoff-Berry Computer), na
Universidade de Iowa, EUA, como uma máquina dedicada especialmente à solução de
conjuntos de equações lineares na Física. Embora sendo um dos primeiros
exemplos de calculadora eletrônica, o ABC propiciou o desenvolvimento dos
primeiros conceitos que iriam aparecer nos computadores modernos: a unidade aritmética
eletrônica e a memória de leitura e gravação.
Ocupa também um importante lugar na História da Computação o computador ENIAC:
esta máquina e a equipe que a projetou e a construiu serão responsáveis por um
grande avanço no desenvolvimento dos computadores eletrônicos. Eckert
(1919-1995) e um pouco mais tarde John Mauchly (1907-1980), físico, e Herman H.
Goldstine, matemático, tornaram-se os principais protagonistas na construção do
Electronic Numerical Integrator and Computer, o primeiro computador onde cada
unidade era composta de válvulas eletrônicas e relés.
trabalho sobre projetos de computadores, que foi fundamental nos 40 anos que se
seguiram. Em 30 de junho de 1945 ele publicou o First Draft of a Report on the
EDIVAC, que estabeleceu o paradigma de projetos de computadores para várias
gerações seguintes de máquinas. Esta arquitetura ficou conhecida com o nome de
"arquitetura de von Neumann", e entre outras coisas incluía o
conceito de programa armazenado. John von Neumann foi o responsável pela criação
do código a ser usado no ENIAC e elaborou o projeto lógico do dispositivo
eletrônico para executá-lo. O ENIAC começou a operar em 1943, tendo sido
terminado totalmente em 1946, encerrando suas operações em 1955.
Enquanto isso, na Inglaterra, o grande esforço era decifrar o código secreto de
guerra germânico. Um grupo especial formado por cientistas e matemáticos
reuniu-se em Bletchley Park, um lugar entre as Universidades de Cambridge e
Oxforf, para tentar construir uma máquina capaz de decodificar o alfabeto
produzido pela versão germânica de um dispositivo inventado nos Estados Unidos,
o ENIGMA. A equipe era liderada pelo prof. T. H. Flowers, sendo o prof. M. H.
A. Newman o responsável pelos requisitos que levariam, em 1943, à construção do
computador digital eletrônico COLOSSUS. O trabalho do grupo de Betchley foi
enormemente influenciado pelos resultados sobre computabilidade obtidos por
Alan Turing, que trabalhava no departamento de comunicação criado pelo governo
britânico em função da guerra, com a missão de treinamento em lógica matemática
e logo alocado também para os esforços de decifrar o código secreto alemão. O
COLOSSUS acabou não sendo conhecido em sua época por duas razões. A primeira é
não ter sido ele um computador para uso geral, mas sim projetado especialmente
para decodificar mensagens secretas. A segunda: a existência desta máquina
somente foi revelada a partir de 1970, sendo que seus algoritmos de
decodificação são ainda secretos.
Ainda na Inglaterra, após o fim da guerra, Turing uniu-se ao centro de
pesquisas do National Physical Laboratory, onde rapidamente elaborou o projeto
básico do Automatic Computing Engine (ACE), que iniciou operações em 1950.
Um importante aspecto do desenvolvimento dos computadores foi a produção de
dispositivos chamados de 'memória'. A memória de núcleos magnéticos acabou
preponderando, tendo sido utlizada primeiramente em uma máquina de teste no MIT
e mais tarde no computador conhecido como Whirlwind. O uso das memórias de
núcleo magnético aumentaram excepcionalmente a performance dos computadores.
Importantes também nesse primeiro período foram duas grandes revoluções
tecnológicas: o emprego de válvulas para tornar o computador mais rápido,
confiável e de uso geral, e o conceito de programa armazenado. Von Neumann, um
dos envolvidos no projeto do ENIAC, foi para Princeton construir a sua própria
versão do EDVAC (Electronic Discrete Variable Automatic Computer), que tinha
sido projetado por Eckert e Mauchly na Pensilvânia. Era evidente para von
Neumann que a programação de computadores com um grande número de chaves e
cabos era lenta e pouco flexível. Ele começou a perceber que o programa poderia
ser representado em forma digital na memória do computador, juntamente com os
dados. Seu projeto básico, hoje conhecido como máquina de von Neumann, foi
utilizado no EDSAC, o primeiro computador de programa armazenado. Esta técnica
de usar uma "memória de armazenamento" assim como a
"transferência de controle por condição", que permitiam parar e
reiniciar o processamento a qualquer instante, abriu enorme perspectiva para a
programação de computadores. O elemento chave dessa arquitetura era a unidade
central de processamento, que permitia a coordenação de todas as funções do
computador através de uma única fonte. Em 1951, o UNIVAC I (Universal Automatic
Calculator), construído pela Remington-Rand, tornou-se o primeiro computador
comercialmente disponível que utilizava esses conceitos.
As Primeiras Linguagens
Alguns aspectos
teóricos
Um dos pontos fundamentais do projeto formalista de Hilbert para a solução de
problemas matemáticos era descobrir um procedimento efetivo para verificar a
validade de proposições matemáticas. Depois do Teorema de Gödel evidenciou-se
que tal proposta é irrealizável. Tornou-se claro o que é um procedimento
efetivo, tornando-se claro ao mesmo tempo o que é um problema computável.
Um procedimento efetivo é uma sequência finita de instruções que podem ser
executadas por um agente computacional, seja ele homem ou não. Esse
procedimento efetivo também é chamado de algoritmo. A descrição finita do
algoritmo deve ser feita através de uma determinada linguagem. Esta linguagem
algoritmica deve pertencer a um conjunto não ambíguo de uma linguagem natural,
tal como Francês ou Inglês, ou de uma linguagem artificial como FORTRAN ou
LISP. As frases da linguagem descreverão as operações a serem executadas. A
forma ou formato de procedimentos efetivos em uma linguagem algoritmica
qualquer é especificada por um conjunto de regras chamada regras de sintaxe.
Esta sintaxe refere-se aos programas corretamente escritos nela e o
relacionamento entre os símbolos e frases que ocorrem nesses programas. Uma
linguagem de programação torna-se assim uma notação formal para a descrição de
um algoritmo, entendo-se por notação formal um simbolismo que não tenha as
imprecisões nem a variabilidade de uma linguagem natural, que possibilite rigor
nas definições e demonstrações sobre os procedimentos.
Uma linguagem de programação necessita ainda de outros requisitos. Deve ser universal
e qualquer problema que tenha solução por computador pode ser escrito com ela.
Qualquer linguagem em que se possa definir uma função recursiva será universal.
Na prática deve ser apta a resolver, no mínimo, os problemas da área para a
qual foi projetada. E uma característica fundamental: ser implementável em
computador, isto é, deve ser possível executar qualquer procedimento bem
formado na linguagem.
Uma linguagem de programação também possui uma semântica. A semântica de um
programa irá depender exclusivamente do que se deseja causar objetivamente
quando o programa for executado por um agente computacional, eletrônico ou não.
Os computadores atualmente são máquinas complexas. Quando estão executando
programas, luzes se acendem, cabeçotes dos discos movem-se, corrente elétrica
flui pelos circuitos, letras aparecem na tela ou são impressas, e assim por
diante. Um programa controla todos esses 'fenômenos' através de sua semântica.
E se são consideradas as linguagens de programação de alto nível, que não
controlam diretamente esses detalhes de ordem física, falar de semântica
signifca falar das características que tornam tais linguagens implementáveis,
independentemente de ser este ou aquele computador. Portanto a semântica é uma
entidade abstrata: ela modela o que o programa quer causar quando é executado,
independente do seu uso nesse ou naquele computador. A semântica de uma
linguagem de programação é a mesma semântica de todos os programas escritos
nela.
Desenvolvimentos
anteriores a 1940
Os mais antigos algoritmos escritos que se conhecem são os da velha
Mesopotâmia. Eram sequências de cálculos sobre conjuntos particulares de dados
e não uma abstração de procedimento como entendido na programação atual. Na
civilização grega, vários algoritmos não triviais foram estudados, como por
exemplo o de Euclides.
A notação matemática começou a evoluir efetivamente a partir dos séculos XIII e
XIV e notações para relações funcionais tiveram tido um bom desenvolvimento. Na
Computação, Babbage e Lady Lovelace elaboraram, entre outros, um programa para
o cálculo dos números de Bernoulli. Era na verdade uma espécie de programa em
linguagem de máquina, como nos primórdios dos computadores digitais na década
de 1940. Em 1914, Leonardo Torres e Quevedo usaram uma linguagem natural para
descrever um pequeno programa para seu autômato hipotético.
O próprio Alan M. Turing, para tratar do problema da indecidibilidade de
Hilbert construiu uma linguagem muito primitiva para sua máquina. Nela só havia
comandos para ler, testar uma condição e escrever símbolos sobre uma fita,
movendo para a direita ou esquerda uma cabeça de leitura e gravação. Conforme
Knuth, as 'tabelas' de Turing representaram a notação de mais alto nível para
uma descrição precisa de algoritmo que foram desenvolvidas antes da nossa
história começar.
As primeiras
tentativas
Nos primeiros tempos da computação propriamente dita os programas eram escritos
em código de máquina e colocados diretamente no computador por meio de cabos e
fios. Por exemplo: 0000 0001 0110 1110
Percebeu-se claramente que os programas em código de máquina eram extremamente
difíceis de editar e modificar, e quase impossíveis de se compreender. A
comunidade computacional logo entendeu que era necessário inventar uma notação
simbólica para tornar os programas mais fáceis de escrever. Nesta evolução as
instruções acima ficam com o formato: LOAD X , ADD R1 R2, JUMPZ H
Uma vez feito o programa dessa maneira, o programador o prepararia para ser
executado, 'escrevendo' manualmente as instruções no correspondente código de
máquina. Este processo foi chamado de assembling. O que depois se queria fazer
era com que a própria máquina executasse essa operação.
Mas mesmo quando programava com esses códigos de operação mnemônicos (também
chamados de linguagem de montagem), o programador ainda estava trabalhando em
termos dos conjuntos de instruções da máquina, isto é, os algoritmos eram
expressos em termos de instruções muito primitivas. Daí a denominação
linguagens de baixo nível. A busca de linguagens que pudessem permitir que os
algoritmos fossem expressos em termos análogos à idéia elaborada na mente do
programador fez com que aparecessem os primeiros compiladores e começaram a
surgir as chamadas linguagens de alto nível.
Konrad Zuse e
seu 'Plancalculus'
Depois de salvar o Z4 das bombas dos aliados e mudar-se para a pequena vila
Hintesrtein nos Alpes, Konrad Zuse percebeu que ainda não existia uma notação
formal para a descrição de algoritmos e começou a trabalhar em uma. O resultado
foi uma linguagem chamada Plankalkül (program calculus), uma extensão do
cálculo proposicional e de predicado de Hilbert. Em uma monografia sobre o
Plankalkül, em 1945, Zuse começava dizendo: "A missão do Plancalculus é
fornecer um descrição formal pura de qualquer procedimento computacional".
O Plancalculus incluía alguns conceitos fundamentais da programação: tipos de
dados, estrutura de dados hierárquicos, atribuição, iteração, etc. Ele pensou
inclusive em usar o Plancalculus como base de uma linguagem de programação que
pudesse ser traduzida por uma máquina.
O diagrama de
fluxos
Em Princeton, Herman H. Goldstine e John von Neumann estavam preocupados com o
mesmo problema: como se poderiam representar algoritmos de uma maneira precisa,
em uma linguagem de mais alto nível que a de máquina. Eles propuseram então uma
representação pictórica. Eles descreveram fluxogramas que continham uma caixa
denominada "caixa de anotação (especificação)". Nesta caixa
descreviam-se certos fatos sobre o resultado de uma computação O conteúdo desta
caixa deveria ser confrontado com as operações descritas pelo fluxograma,
possibilitando uma verificação da consistência entre o fluxograma e as
intenções do programador expressas através das anotações. A ênfase era no poder
de cálculo e foi largamente difundido entre as pessoas envolvidas com
computadores na época. O conceito matemático de igualdade foi substituído pelo
de atribuição.
A contribuição
de Haskell
Haskell B. Curry, contemporâneo de Goldstine e von Neumann, após uma experiência
com um programa complexo no ENIAC sugeriu uma notação mais compacta que a
deles. Na prática não obteve sucesso pela maneira estranha com que analisava e
dividia os problemas. O principal ponto de interesse no trabalho de Curry, não
foi a sua linguagem de programação, mas os algoritmos que ele analisou para
conversão de parte desses em código de máquina. Com isso ele proporcionou uma
descrição recursiva de um procedimento para converter expressões aritméticas
claras em um código de máquina apropriado, sendo por isso a primeira pessoa a
descrever a fase de geração de código de um compilador.
Interpretadores
algébricos e linguagens intermediárias
Em 1951 apareceu um trabalho de John Mauchly, o Short Order Code, que,
codificado para o computador BINAC em 1949 por William F. Schmitt, foi
recodificado pelo mesmo em 1950 para o UNIVAC e usava dois dígitos para
representar alguns símbolos, ao invés do usual código binário. Era na verdade
uma espécie de interpretador algébrico: o programa percorria cada linha de
representação de código, da direita para a esquerda, desviava para as chamadas
subrotinas, executava-as e ia para a próxima instrução.
Arthur W. Burks e colegas, na Universidade de Michigan, investigando o processo
de passar alguns problemas de processamento de dados descritos em uma linguagem
comum para a 'linguagem interna' de um computador, esboçou uma 'linguagem
intermediária' que seria o passo anterior de uma 'linguagem interna' do
computador, e que tinha um alto nível de abstração.
Heinz Rutishauser, colaborador de Zuse no Z4 publicou em 1952 um trabalho
descrevendo um computador hipotético e uma linguagem algébrica simples, junto
com os fluxogramas de von Neumann para o que seriam dois 'compiladores' para
essa linguagem. Um para decodificar todos os loops enquanto o outro produzia
código compacto através de registradores de índice. Como o Short Code, o
programador deveria reservar manualmente as localizações de memória para
variáveis e constantes. Um trabalho semelhante apareceu na Itália, na tese de
dissertação de Corrado Böhm, que desenvolveu uma linguagem algébrica e o
primeiro compilador para ela na própria linguagem, que reconhecia precedência
de operações.
Os primeiros 'compiladores'
Conforme Knuth e Trabb, o termo compilador não era ainda
utilizado nessa época. Na verdade falavam sobre programação automática. No
início da programação em linguagem de máquina foram desenvolvidas subrotinas de
uso comum para entrada e saída, para aritmética de ponto flutuante e funções
transcedentais. Junto com a idéia de um endereçamento realocável foram criadas
rotinas de montagem para facilitar a tarefa de uso das subrotinas e de
endereçamento relativo, idéia desenvolvida por M. V. Wilkes. Para isso foi
inventada uma pseudo linguagem de máquina. Uma rotina interpretativa iria
processar estas instruções, emulando um computador hipotético.
AUTOCODE foi o primeiro 'compilador' real, que tomava uma declaração algébrica
e a traduzia em linguagem de máquina. Seu desconhecido autor, Alick E. Glennie,
das forças armadas da Inglaterra, declarava em Cambridge, em 1953 sua motivação
para elaborá-lo: "A dificuldade da programação tornou-se a principal
dificuldade para o uso das máquinas. Aiken expressou sua opinião dizendo que a
solução para esta dificuldade deveria ser buscada pela construção de uma
máquina especial para codificar(...) Para tornar isto fácil deve-se elaborar um
código compreensível. Isto somente pode ser feito melhorando-se a notação da
programação". John Backus discute esta distinção que Knuth faz, citando J.
Halcomb Laning, Jr. e Niel Zierler como os inventores do primeiro 'compilador'
algébrico, para o computador Whirlwind. Como esta, são muitas as discussões
ainda hoje sobre quem foi o pioneiro no assunto. De qualquer maneira estes
primeiros sistemas denominados genericamente de programação automática eram
muito lentos e não fizeram muito sucesso, embora tivessem sido fundamentais
para preparar a base do desenvolvimento que se seguiu.
Este veio com o A-0, agora sim o primeiro compilador propriamente dito,
desenvolvido por Grace Murray Hopper e equipe, aprimorado para A-1 e A-2
subsequentemente. O próximo passo seria o A-3, desenvolvido em 1955, produzido
ao mesmo tempo com o tradutor algébrico AT-3, mais tarde chamado MATH-MATIC.
Em 1952 a IBM construía o computador 701 e em 1953 foi montada uma equipe
liderada por John Backus para desenvolver um código automático que facilitasse
a programação. O resultado foi o Speedcoding. Backus tornou-se uma das
principais figuras na história da evolução das linguagens de programação, tendo
um papel fundamental no desenvolvimento dos grandes compiladores que viriam a
partir do ano de 1955 como o FORTRAN e o ALGOL, além do estabelecimento da
moderna notação formal para a descrição sintática de linguagens de programação,
denominada BNF, Backus Normal Form.
A Revolução do Hardware e do Software
Da segunda geração de computadores aos dias de hoje
A segunda geração (1956 - 1963) foi impulsionada pela invenção do transistor (1948) e em 1956 já se produziam computadores com esta tecnologia. Apareceram também os modernos dispositivos, tais como as impressoras, as fitas magnéticas, os discos para armazenamento, etc. Os computadores passaram a ter um desenvolvimento rápido, impulsionados principalmente por dois fatores essenciais: os sistemas operacionais e as linguagens de programação. Os circuitos integrados propiciaram um novo avanço e com eles surgiram os computadores de terceira geração (1964 - 1970). As tecnologias LSI, VLSI e ULSI abrigam milhões de componentes eletrônicos em um pequeno espaço ou chip, iniciando a quarta geração, que vem até os dias de hoje. Os atuais avanços em pesquisa e o projeto de novas tecnologias para os computadores estão possibilitando o surgimento da quinta geração. Dois avanços que configuram um divisor de águas são o processamento paralelo, que quebrou o paradigma de von Neumann, e a tecnologia dos supercondutores.
O desenvolvimento das linguagens
Várias linguagens, muitas delas conceitualmente diferentes
entre si, foram surgindo e sendo aprimoradas, incorporando-se umas em outras.
Com algumas poucas exceções, o projeto de cada linguagem foi influenciado pela
experiência em linguagens anteriores. Merecem especial atenção pelo seu
pioneirismo e pelos novos paradigmas que introduziram as linguagens, chamadas
de alto nível: FORTRAN e LISP.
Com relação ao FORTRAN, em 1954 ocorreu um simpósio sobre 'computação
automática', e seu maior evento foi a apresentação do compilador algébrico de
Laning e Zierler. Foi o primeiro 'software' que permitiu como entrada de dados
um código algébrico elegante, embora limitado. Nesse meio tempo John Backus já
montara um grupo de pesquisa dentro da IBM para trabalhar em um projeto sobre
programação automática, para responder a uma questão fundamental: "(...)
pode uma máquina traduzir uma linguagem matemática abrangente em um conjunto
razoável de instruções, a um baixo custo, e resolver totalmente uma
questão?". Em novembro de 1954 a equipe de Backus tinha criado o IBM
Mathematical FORmula TRANslation System, o FORTRAN. Com o FORTRAN apareceram as
expressões simbólicas, subprogramas com parâmetros, mas principalmente ocorreu
a primeira tentativa de se definir rigorosamente a sintaxe de uma linguagem de
programação. Um pouco mais tarde surgiu a notação BNF para a descrição
sintática de uma linguagem de programação.
A história do LISP remonta a Turing e Church. Pela análise de Turing nos anos
de 1936 e 1937, após seu famoso artigo sobre o décimo problema de Hilbert, o
cálculo-lambda de Church, apesar da sua sintaxe simples, era suficientemente
poderoso para descrever todas as funções mecanicamente computáveis, ou seja,
pode ser visto paradigmaticamente como uma linguagem de programação. No
cálculo-lambda muitos problemas de programação, especificamente aqueles referentes
às chamadas de procedimento, estão em sua forma mais pura, e isto influenciará
diretamente linguagens como LISP e Algol.
Em 1955 e 1956 E.K. Blum, no U.S. Naval Ordinance Laboratory desenvolveu uma
linguagem completamente diferente das demais, ADES (Automatic Digital Encoding
System), baseada na teoria das funções recursivas e no esquema desenvolvido
para elas por Kleene. Foi a primeira linguagem "declarativa", no
sentido de que o programador estabelece as relações entre as variáveis quantitativas
sem explicitamente especificar a ordem de avaliação.
Aparece agora a figura de John McCarthy, matemático, um dos primeiros a
trabalhar no tema de Inteligência Artificial. Juntamente com Marvin Minsky
iniciou um grande projeto nessa área. Estava procurando desenvolver uma
linguagem algébrica para processamento de listas, preocupado com o problema de
como representar informações da realidade por meio de sentenças escritas em uma
linguagem formal adequada, e de como criar um programa que executasse fazendo
inferências lógicas. Surgiu então o LISP, uma linguagem que pode ser utilizada
como um formalismo para descrição de algoritmos, para escrever programas e
provar propriedades de algoritmos, sendo adequada à computação simbólica e à
inteligência artificial. Sobretudo com LISP pode-se visualizar melhor um
importante conceito na computação moderna que é o uso de estruturas de dados
como objetos abstratos..
Nos inícios da década de 1960, fruto do trabalho de americanos e europeus,
surgiu uma linguagem projetada para representar algoritmos ao invés de se
escrever programas simplesmente, o Algol-60. Ela implementava o conceito de
estrutura de blocos, onde variáveis, procedimentos, etc., poderiam ser
declarados onde quer que o programa os necessitasse. Algol-60 influenciou
profundamente muitas linguagens que vieram depois e evoluiu para o Algol-68.
PL/I surgiu como uma tentativa de se projetar uma linguagem de uso geral
reunindo características de linguagens para aplicações numéricas como FORTRAN e
Algol e para processamento de dados comerciais. Ela inovou ao permitir a
construção de código de 'baixo nível' para o controle de exceções e o conceito
de processamento concorrente, entre outros. Foi a linguagem Pascal entretanto
que se tornou a mais popular das linguagens do estilo Algol, porque é simples,
sistemática e facilmente implementável nos diferentes computadores. Junto com o
Algol-68, está entre as primeiras linguagens com uma ampla gama de instruções
para controle de fluxo, definição e construção de novos tipos de dados. Ada,
que veio depois do Pascal, introduziu o conceito de pacotes e permite a
construção de grandes programas com estrutura modular.
Podem-se discernir na história das linguagens certas tendências. A primeira foi
perseguir altos níveis de abstração. Os rótulos simbólicos e mnemônicos das
linguagens de montagem abstraem códigos de operação e endereços. Variáveis e
atribuição abstraem acesso a um endereço de memória e atualização. Estruturas
de dados abstraem formas de armazenamento. Estruturas de controle abstraem
desvios. Procedimentos abstraem subrotinas. E assim por diante.
Outra tendência foi a proliferação dos paradigmas. A maioria das linguagens
mencionadas até agora são imperativas, caracterizadas por comandos que
atualizam variáveis. A estrutura das linguagens imperativas é induzida pelo
hardware, com preocupação de que os dados trafeguem o mais rapidamente
possível. Daí alguns de seus aspectos relevantes: sequência de comandos,
atribuição, controles (loopings), etc. É ainda o paradigma dominante. Já as
linguagens que seguem o paradigma funcional como o LISP, tem como
características a clareza e a busca de um maior poder expressivo, procurando
manter a maior independência possível do paradigma de von Neumann, que
caracteriza as linguagens imperativas. Buscam uma transparência referencial e a
não ocorrência de efeitos colaterais nas suas instruções. Em LISP não há o
conceito de estado, memória, sequência de instruções, etc., procurando-se
tornar mais visível o uso das funções. Nas linguagens imperativas as funções
dependem de estados internos, fora de seu contexto, com a produção de efeitos
colaterais. LISP foi a ancestral das linguagens funcionais que culminaram
atualmente em linguagens como Miranda, ML e Haskell, que tratam funções como
valores de primeira classe.
Smalltalk é uma linguagem baseada em classes de objetos. Um objeto é uma
variável que pode ser acessada somente através de operações associadas a ele.
Smalltalk é um exemplo de uma linguagem que segue o paradigma de orientação a
objeto. Simula foi um ancestral de tais linguagens.
Muitos projetistas de linguagens quiseram explorar subconjuntos da notação
matemática em linguagens de programação. Surgiram então tentativas de se
construir uma 'linguagem lógica', isto é, baseada em um subconjunto da lógica
matemática. O computador é programado para inferir relacionamentos entre
valores, ao invés de computar valores de saída a partir de valores de entrada.
Prolog popularizou a linguagem lógica.
No início da década de 1990 ocorreu um difusão intensa do paradigma da
orientação a objeto. Este paradigma esteve em gestação por cerca de 30 anos e
as novas tecnologias como a Internet, as necessidades geradas pela novas
arquiteturas, tais como a de cliente-servidor e a do processamento distribuído,
coincidiam com o paradigma da orientação a objeto: encapsulamento, mensagem,
etc. O crescimento da Internet e o "comércio eletrônico" introduziram
novas dimensões de complexidade no processo de desenvolvimento de programas.
Começaram a surgir linguagens que buscam superar esses novos desafios de
desenvolvimento de aplicações em um contexto heterogêneo. Apareceram C++ e
linguagens como Eifell, Objective C, Cedar/Mesa (elaborada pela Xerox, para
fazer pesquisa de dados), Delphi (uma evolução da lingaugem Pascal) entre
outras. E, surge a linguagem JAVA.
A origem da Java está ligada a um grupo de pesquisa e desenvolvimento da Sun
Microsystems formado em 1990, liderado por Patrick Naughton e James Gosling,
que buscava uma nova ferramenta de comunicação e programação, independente da
arquitetura de qualquer dispositivo eletrônico. Em 1994, após o surgimento do
NCSA Mosaic e a popularização da Internet, a equipe refocalizou seus esforços
para criar uma linguagem para aplicações multimídia on line.
Conforme Linden, Java foi inspirada por várias linguagens: tem a concorrência
da Mesa, tratamento de exceções como Modula-3, linking dinâmico de código novo
e gerenciamento automático de memória como LISP, definição de interfaces como
Objective C, e declarações ordinárias como C. Apesar destas qualidades, todas
importantes, na verdade duas outras realmente fazem a diferença e tornam Java
extremamente atrativa: sua portabilidade e o novo conceito de arquitetura
neutra.
Portabilidade significa que Java foi projetada objeticando aplicações para
vários sistemas heterogêneos que podem compor uma rede como a Internet, por
exemplo, e as diferentes características dessa rede.
Por arquitetura neutra entende-se que programas em Java são compilados para se
obter um código objeto (byte code na terminologia Java) que poderá ser
executado em um Power PC que use o sistema operacional OS/2, ou em um sistema
baseado no chip Pentium debaixo do Windows 95 ou em um Macintosh usando MacOs,
ou em uma estação de trabalho Sparc rodando Unix. Ou seja, em qualquer
computador, desde que tal computador implemente o ambiente necessário para
isso, denominado conceitualemente de Máquina Virtual Java.
Com a linguagem Java começou superar-se a barreira para a Internet tornar-se um
computador: a barreira que impede o uso de um software utilizado em um
determinado lugar, executando-o em qualquer plataforma.
Arquiteturas de
computadores e sistemas operacionais
O termo arquitetura de computador vem da possibilidade de se visualizar uma
máquina como um conjunto hierárquico de níveis que permite entender como os
computadores estão organizados. Os primeiros computadores digitais por exemplo
somente possuiam dois níveis. O primeiro é chamado o nível da lógica digital,
formado no início por válvulas e depois por transistores, circuitos integrados,
etc. O segundo é chamado de nível 1, também chamado de nível de microprograma,
que é o nível da linguagem da máquina, onde toda a programação era feita,
através de 0 e 1, e que posteriormente seria o responsável por interpretar as
instruções do nível 2.
Com Maurice Wilkes em 1951 surgiu outro nível, onde as instruções eram escritas
de um modo mais conveniente para o entendimento humano: a técnica consistia em
substituir cada instrução desse novo nível por um conjunto de instruções do
nível anterior ou examinar uma instrução de cada vez e executar a sequência de
instruções equivalentes do nível da máquina. Denominam-se estes procedimentos
por tradução e interpretação. Isto simplificou o hardware que agora somente
tinha um conjunto mínimo de instruções e portanto menos circuitos eram
necessários.
A partir daí a evolução do hardware avança juntamente com as novas descobertas
científicas: quase na mesma época do aparecimento dos transistores, surgiu o
conceito de barramento de dados, que acelerou a velocidade dos computadores. Ao
mesmo tempo apareceram os grandes sistemas operacionais, como o DOS e OS, da
IBM. Estes evoluíram possibilitando novos conceitos que melhoraram a
performance das máquinas, como por exemplo os sistemas de multiprogramação,
isto é, a possibilidade de vários programas serem executados em paralelo em uma
mesma da máquina. Se um destes programas tiver origem em um terminal remoto,
tal sistema será chamado de tempo compartilhado. Um importante marco que
possibilitou esses avanços foi a introdução de processadores de entrada e
saída, também chamados de canais. Isso motivou o aparecimento dos conceitos de
concorrência, comunicação e sincronização.
É a era das arquiteturas mainframes: o suporte às tarefas computacionais e o
desenvolvimento das aplicações eram feitos numa área central, denominada centro
de computação. Terminais conectados diretamente à máquina eram utilizados
somente por pessoas relacionadas às aplicações disponíveis.
Nos anos 70 surgiram os supercomputadores, máquinas que inovaram na
arquitetura. Até o momento, o crescimento da eficiência dos computadores estava
limitado pela tecnologia, mais especificamente pelo processamento escalar que
exigia que o processador central de um computador terminasse uma tarefa para
começar a realizar outra, produzindo o gargalo de von Neumann. Um avanço
significativo veio com o supercomputador Cray-1, da Cray Research, em 1971. Foi
a primeira máquina pipeline, cujo processador executava uma instrução
dividindo-a em partes, como na linha de montagem de um carro. Enquanto a
segunda parte de uma instrução estava sendo processada, a primeira parte de
outra instrução começava a ser trabalhada. A evolução seguinte foi a denominada
máquina vetorial, ou máquina SIMD (single instruction multiple data) cujo
processador trabalhava com mais de um conjunto de dados ao mesmo tempo. Um
pouco depois surgiu a arquitetura MIMD (multiple instructions multiple data) e
apareceram máquinas com múltiplos processadores como a Connection Machine, com
65.536 processadores.
Há primariamente três limites para a performance dos supercomputadores: a
velocidade do processador, o gasto de tempo, que envolve fazer um grande número
de processadores trabalharem juntos em uma única tarefa, e a velocidade de
entrada e saída entre os processadores e memória. A velocidade dos
processadores aumenta a cada dia, mas a um alto custo de pesquisa e
desenvolvimento, e a realidade é que se está alcançando os limites dos
processadores baseados em silício. Seymour Cray demonstrou que a tecnologia de
gálio arsênico poderia ser a solução, mas é muito difícil trabalhar com ele e
poucas indústrias estariam aptas a desenvolver processadores desse tipo. A
solução caminha para o uso de um maior número de processadores, dando maior
velocidade ao computador pelo uso desses processadores através do processamento
paralelo.
Com a tecnologia VLSI (quarta geração de computadores) surgiram os
minicomputadores, o que possibilitou muitas empresas e universidades
informatizarem seus departamentos. Os grandes usuários interligavam os
minicomputadores para enviar tarefas aos seus mainframes. A arquitetura
principal continuava no entanto estabelecida no centro de computação. Do
minicomputador para o computador pessoal foi somente um passo, e no início da
década de 1980 apareceram os primeiros PC's. Ainda nos anos de 1980 apareceram
as arquiteturas RISC (Reduced Instruction Set Code), com a promessa de ganho de
desempenho pela eliminação do conceito de microprograma. De qualquer maneira
estas máquinas ainda são máquinas de von Neumann tradicionais, com todas as
suas limitações, a maior delas a velocidade dos circuitos que não pode crescer
indefinidamente.
As tentativas de quebrar o gargalo de von Neumann e o início da
descentralização dos sistemas, com o surgimento das arquiteturas de rede que
possibilitaram a universalização do uso da tecnologia da Computação, fizeram
emergir e desenvolver as arquiteturas paralelas de hardware.
A idéia de incluir paralelismo nos computadores é tão antiga quanto os próprios
computadores. Trabalhos desenvolvidos por von Neumann na década de 1940 já
discutiam a possibilidade de algoritmos paralelos para a solução de equações
diferenciais. O sistema Model V, desenvolvido entre 1944 e 1947 por G. R.
Stibitz e S. B. Willians nos laboratórios da Bell Telephone é um exemplo típico
de máquina paralela. Constituído por dois processadores e de três posições de
entrada e saída, esse multiprocessador primitivo tanto era capaz de executar
dois programas distintos como era possível que os dois processadores ficassem
alocados para um mesmo programa. Posteriormente foi desenvolvido o Illiac IV,
na década de 1960, constituído por 64 processadores. Como foi citado, a partir
da década de 1970 começaram a ser produzidos supercomputadores baseados em
arquiteturas paralelas.
Juntamente com as arquiteturas evoluiram os sistemas operacionais e a evolução
das linhas de processadores de uma empresa como a Intel servem para refletir a
evolução da indústria dos computadores em um determinado período. Como destaque
podem-se citar o MS-DOS, o OS/2 e o UNIX. Especialmente este último, que surgiu
como fruto dos trabalhos de um engenheiro da Bell Labs, Ken Thompson, foi
popularizado nos meios universitários que usavam computadores PDP-11/45, durante
a década de 1970.
A mais nova arquitetura, que determinou a mais recente evolução da Computação
foi o resultado da rápida convergência das tecnologias de comunicações de
dados, telecomunicações e a própria informática. É a Internet, ou modelo
computacional baseado em uma rede, que teve sua origem nos anos da década de
1970, como um esforço do Departamento de Defesa dos EUA para conectar a sua
rede experimental, chamada ARPAnet, a várias outras redes de rádio e satélites.
Espalhou-se logo em seguida nos meios acadêmicos e está bastante popularizada.
A Computação
como Ciência Ao lado dessa evolução do hardware e do software, a
Computação abriu-se em leque e novas tendências surgiram dentro dela,
incorporando estas duas entidades.
A Inteligência Artificial, a Teoria da Complexidade Computacional e a Teoria de
Bancos de Dados abriram novos campos de estudo. Na década de 1960 a Ciência da
Computação tornou-se uma disciplina verdadeira. A primeira pessoa a receber um
título de Ph. D. de um departamento de Ciência da Computação, foi Richard
Wexelblat, na Universidade da Pensilvânia , em 1965. Consolidaram-se os estudos
sobre a Teoria dos Autômatos e a Teoria de Linguagens Formais, principalmente
com Noam Chomsky e Michael Rabin. O nascimento do ramo das especificações
formais, que introduziu um novo paradigma no desenvolvimento de sistemas
computacionais, veio dentro dessa década, com o início das buscas pela
corretude de programas através do uso de métodos formais.
R. W Floyd, em 1967, propôs que a semântica de linguagens de programação fosse
definida independentemente dos porcessadores específicos a que se destinam
aquela linguagem. A definição pode ser dada, segundo Floyd, em termos do método
para a prova de programas expresso na linguagem. O seu trabalho introduziu o
que passou a ser conhecido como o método das anotações indutivas para a
verificação de programas e uma técnica envolvendo conjuntos com ordenação bem
fundada para provar a terminação de um programa.
Uma extensão das idéias de Floyd foi proposta por C. A. Hoare em 1969. Hoare
formulou uma teoria axiomáticana de programas que permite a aplicação do método
das invariantes de Floyd a textos de programas expressos em linguagens de
programação cuja semântica é precisamente formulada. Este trabalho tornou-se
ainda um dos fundamentos do que se chamou mais tarde "programação
estruturada". Dijkstra desenvolveu a idéia de que a definição (no estilo
proposto por Hoare) pode ser usada para a derivação de um programa e não apenas
para sua verificação.
A partir dessas pesquisas surgiu a Engenharia de Software, que busca garantir a
corretude na construção de sistemas. O desenvolvimento de sistemas
computacionais até então era feito de uma maneira quase que artesanal. Não
havia critério orientativo algum durante o processo. Isso acabou sendo fatal,
como o revelaram certos estudos, elaborados na década de 1970, sobre o
desenvolvimento de sistemas: ausência de corretude e consistência, baixa
qualidade, manutenção extremamente custosa em função de problemas não detectados
por ausência de uma validação de requisitos mais rigorosa, não reaproveitamento
de código, prazos de implementação não cumpridos em consequência de erros
detectados ao longo desta mesma fase de implementação, etc.
Obedecendo a um grau de formalização maior, apareceram como primeira reação a
essa abordagem informal modelos e métodos de desenvolvimento de sistemas
chamados estruturados, que na verdade são conjuntos de normas e regras que
guiam as várias fases de desenvolvimento de sistemas e as transições entre
elas. É a abordagem sistemática. Ainda aqui não está presente um formalismo
definido com regras precisas. A prototipação e a orientação a objeto são
abordagens que podem ser consideradas sistemáticas.
A abordagem rigorosa já apresenta um sistema linguístico formal para documentar
as etapas de desenvolvimento e regras estritas para a passagem de uma etapa a
outra. Não se exige que as demonstrações de corretude das transformações
realizadas sejam feitas formalmente, bastando uma argumentação intuitiva. E
finalmente a abordagem puramente formal, rigorosa, com a exigência de que todas
as demonstrações necessárias para garantir a corretude do processo sejam
realizadas formalmente.
Donald E. Knuth iniciou nos fins dessa década um rigoroso tratado sobre as
bases matemáticas para a análise de algoritmos, produzindo os três conhecidos
volumes do The Art of Computer Programming, que propiciaram a base para o
amadurecimento dos estudos da complexidade de algoritmos. Pode-se dizer que o
trabalho de Knuth é um dos grandes marcos da Computação no século XX: antes de
Knuth não havia um corpo sistemático do estudo da programação e dos algoritmos.
Ainda no campo da Complexidade Computacional novos avanços se deram a partir de
1971, com o trabalho de Steve Cook e Richard Karp sobre problemas NP-completos
e os estudos sobre criptografia de Ronald Rivest, Adi Shamir e Leonard Adleman.
Em 1977 H.J. Bremermann desenvolveu alguns trabalhos pioneiros dentro da teoria
da complexidade, mostrando os limites físicos na arquitetura de computadores de
qualquer tipo e que estes limites físicos atuam como fatores restritivos para a
computação de determinados problemas. De acordo com ele, existe um tempo
chamado limite fundamental para a velocidade dos computadores que não pode ser
ultrapassado. Tal limite deriva-se da idéia de que a velocidade máxima de
transmissão de sinal entre os componentes internos da máquina é limitada pela
velocidade da luz. Mesmo que se pudessem construir máquinas muito pequenas,
otimizando-se a trajetória de transmissão de sinais, esse limite não pode ser
ultrapassado. E ainda que se chegue a uma máquina cuja velocidade de
transmissão seja próxima à da luz, existem problemas computacionais que são
intratáveis, como por exemplo os "problemas NP": mesmo com a
velocidade da luz tais problemas poderiam levar a idade do universo para serem
processados.
A Inteligência
Artificial É aquela área da Computação, voltada para o estudo de
técnicas de construção de programas que permitam ao computador simular aspectos
do comportamento da inteligência, tais como jogar xadrez, provar teoremas
lógicos, compreeder de partes específicas de uma linguagem como por exemplo o
português, etc.
Os primórdios da Inteligência Artificial (IA) remontam à década de 1940.
Começou a predominar nestes anos o movimento ciberneticista, que acreditava
entre outras coisas que a atividade humana poderia um dia ser estudada por meio
de modelos matemáticos, como se faz com outros tantos fenômenos da natureza.
Seguindo os trabalhos de Gödel, muitos matemáticos imbuíram-se do ideal de
formalizar a noção de procedimento e sobre o que poderia ser feito através de
um algoritmo e vieram a tona os trabalhos de Turing, Church, Kleene e Post.
No ano de 1943 foram publicados os trabalhos de Warren McCulloch e Walter
Pitts, que propuseram um modelo de neurônios artificiais, onde cada neurônio
era caracterizado como sendo "on" ou "off", e era
representado por uma chave onde "on" seria a resposta a estímulos por
um dado número de neurônios vizinhos. Eles mostraram que qualquer função
computável poderia ser processada por algum tipo de rede de neurônios
conectados e que os conectivos lógicos poderiam ser implementados através de
estruturas de rede simples. A fusão das idéias de Shannon e Boole, junto a um
tratamento simplificado do neurônio do cérebro humano, tornou possível o
trabalho de McCulloch e Pitts, que propuseram um modelo de neurônio artificial.
Queriam esses dois pesquisadores mostrar que se os neurônios artificiais
pudessem efetuar computações lógicas, estaria aberto o caminho para simular o
raciocínio humano.
Os trabalhos de Warren McCulloch e Walter Pitts tiveram grande sucesso e outros
trabalhos apareceram, mas logo foram objeto de fortes críticas. Frank
Rosemblatt e seus colegas da Universidade de Cornell projetaram uma máquina
parecida com o modelo de McCulloch e Pitts, denominada Perceptron. Marvin
Minsky e Seymour Papert mostraram algumas limitações dos perceptrons. De
qualquer maneira surgiu uma primeira vertente da emergente IA: a que buscava a
simulação do cérebro humano do ponto de vista físico, para simular a atividade
mental, e que fará surgir anos mais tarde, na década de 1970, a Ciência
Cognitiva ou Conexionismo, que está apoiada em um paradigma da IA de
processamento serial da informação e no "approach" da manipulação
simbólica para linguística.
Outra vertente por onde se encaminharam os estudos da IA foi a chamada
Inteligência Artificial simbólica, que buscava a representação e a simulação
dos estados e do comportamento mentais através de programas computacionais. A
representação e simulação da inteligência não estaria na construção de um
determinado tipo de hardware, mas no desenvolvimento de um software que opere
sobre dados. Isto teve profundos reflexos nas pesquisas posteriores e suscitou
inúmeros debates, sobretudo na filosofia, sobre as relações entre a mente e o
cérebro.
Em 1950 Turing introduziu através de um artigo, Computing Machinery and
Intelligence, o chamado 'Turing Test", considerado também um dos primeiros
esforços no campo da Inteligência Artificial . Mais tarde o próprio Turing
(1953) escreveu um programa de xadrez para computadores que tinham a
arquitetura de von Neumann. Ao mesmo tempo, Marvin Minsky e Deam Edmonds, do
Departamento de Matemática de Princeton, construíram o primeiro computador
baseado em rede neural, em 1951, o SNARC. Era um computador analógico para
simular uma rede de 40 neurônios.
John McCarthy, outra figura influente da IA, após formar-se em Princeton,
dirigiu-se ao Dartmouth College e convenceu Minsky, Shannon e Nathaniel
Rochester, um pesquisador da IBM, a ajudá-lo a trazer pesquisadores
interessados em teoria dos autômatos, redes neurais e no estudo da
inteligência. Allen Newell e Herbert Simon, da Carnegie Mellon University
elaboraram o LT (Logic Theorist), um programa capaz de trabalhar
não-numericamente e que provou a maioria dos teoremas do segundo capítulo do
Principia Mathematica, de Russell e Whitehead. Em 1952, Arthur Samuel mostrou
que os computadores não fazem somente o que se lhes pede, mas são capazes de
"aprender". Outros programas provadores de teoremas se seguiram ao LT
e em 1958, com McCarthy surgiu o LISP, que se tornou a linguagem de programação
predominante para IA a partir daí.
McCarthy seguiu para Stanford na busca da representação do raciocínio através
da lógica formal (seu trabalho recebeu grande impulso quando J. A. Robinson
elaborou um algoritmo completo para a prova de teorema na lógica de primeira
ordem). Estas aplicações da lógica incluíam robótica e um projeto para demonstrar
a completa integração entre raciocínio lógico e atividade física. Minsky estava
mais interessado em descobrir programas para resolver problemas que exigiam
inteligência para ser solucionados: problemas de analogia geométrica que
aparecem nos testes de QI, problemas de álgebra, etc.
Os anos de 1966 a 1974 foram marcados por um certo ceticismo diante das
dificuldades que começaram a ser encontradas, como por exemplo a não
tratabilidade de muitos problemas de IA, acentuada pelos primeiros estudos dos
problemas NP, as limitações das estruturas básicas usadas para gerar
comportamento inteligente, como por exemplo os algoritmos de aprendizado por
back-propagation.
A década de 1970 marcou a busca pelos sistemas baseados em conhecimento e pelos
sistemas especialistas, protagonizada inicialmente por Ed Feigenbaum, Bruce
Buchanan e Joshua Lederberg. Os sistemas especialistas são solucionadores de
problemas acoplados a grandes bancos de dados onde o conhecimento humano
específico sobre determinado assunto encontra-se armazenado. O sistema deverá
fornecer respostas a consultas, dar conselhos a um leigo sobre um determinado
assunto, auxiliar especialistas, ensinar, etc. A idéia subjacente é que a
inteligência não é somente raciocínio mas também memória. O problema, ainda em
aberto, é a difícil tarefa de se representar o conhecimento, aliás nome de uma
nova área surgida dentro da IA para solucionar os inúmeros problemas surgidos,
principalmente os de como representar o "senso comum", o "sexto
sentido" ou ainda a intuição, termos que resistem a uma conceituação
clara. Ou ainda qualquer tipo de conhecimento não representável por uma
expressão simbólica como ensinar alguém a jogar bola. De qualquer maneira
surgiram os sistemas especialistas para diagnóstico médico, manipulação de
linguagens, etc.
Lembrando o trabalho de H.J. Bremermann, sobre os limites físicos que impedem a
construção de um dispositivo com velocidade 'ilimitada', deve-se reparar que
esses mesmos limites estão presentes também dentro das reações químicas e nos
impulsos elétricos que se dão nas complexas conexões dos neurônios do cérebro.
Se a mente humana consegue resolver determinados problemas intratáveis e
funciona de maneira algorítmica, as operações mentais tem algo a mais do que as
características físicas do cérebro humano. Ou então há processamentos mentais
não algorítmicos, e se cai no problema da impossibilidade de uma representação
formal disso. São debates em aberto e que geram um saudável intercâmbio de
idéias entre a Computação e outras áreas do conhecimento humano como a
Psicologia, Biologia e Filosofia.
Também a robótica demandou estudos da área de IA, principalmente no que se
refere à Visão Computacional. Os anos da década de 1980 foram os da introdução
da IA na indústria e um retorno ao uso de redes neurais. De 1987 para cá houve
uma mudança tanto no conteúdo quanto na metodologia das pesquisas em IA. Agora
é mais comum trabalhar em teorias existentes do que a proposição de novas, e
basear-se em teoremas rigorosos ou em fortes evidências experimentais do que
sobre intuição. O campo do reconhecimento da voz é um exemplo disto.
A Cibernética
O nascimento da cibernética como ciência está associado aos trabalhos de
Norbert Wiener (1894-1964). Wiener desenvolveu suas investigações no MIT e
idealizou um sistema mediante o qual o erro, ou diferença entre o objetivo que
se pretendia alcançar e o efeito real alcançado, era medido e utilizado para
regular o próprio sistema, corrigindo as variáveis de velocidade, ângulo de
tiro, etc. O fenômeno de auto-regulação recebeu o nome de realimentação
(feedback).
Wiener alcunhou o termo "cibernética" tomando diretamente o vocábulo
grego "kybernetiké", que significa "a arte de governar um
barco". Este termo tinha um amplo uso no pensamento grego, em referência precisamente
a fenômenos muito similares ao estudado pelo engenheiro norte-americano. Assim
ele próprio define a cibernética como "controle e comunicação no animal e
na máquina", como aparece no título de seu livro Cybernetics.
A Cibernética é uma teoria formada pelos aspectos relevantes de outras quatro
teorias: da informação, dos jogos, do controle e do algoritmo. Estão
diretamente relacionados com essa teoria os trabalhos de:
* Alan M. Turing em seus estudos sobre a possibilidade lógica das máquinas;
* Claude E. Shannon na Teoria da Informação;
* Ludwig Von Bertalanffy, biólogo que, em resultado de 30 anos de trabalhos,
publicou a famosa obra intitulada "Teoria Geral dos Sistemas";
* James Watt (1736-1819), inventor do regulador centrífugo de pressão nas
máquinas a vapor, germe da automatização via feedback negativo;
* John von Neumann com sua Teoria Matemática dos Jogos.
Embora a cibernética como ciência não tenha como objetivo o computador, ela
criou juntamente com a teoria da informação de Shannon um novo caminho para se
tentar entender o homem e as máquinas. Ao se ocupar das estruturas e funções
lógico-matemáticas de auto-regulação, independentemente de que estejam
inscritas e se cumpram em um organismo vivo, ou em uma população humana ou em
um computador eletrônico, acabou tomando parte indiretamente no desenvolvimento
do hardware e do software.
A idéia de informação como uma das características fundamentais do universo
levou Wiener e Shannon, separadamente, a demonstrarem que muitas coisas, desde
o movimento aleatório de partículas subatômicas até o comportamento de redes
baseadas em chaveamentos elétricos ou alguns aspectos do discurso humano, estão
relacionados de um modo que possam ser expressados através de algumas equações
matemáticas básicas. Estas equações foram úteis na construção de computadores e
redes telefônicas: muitos conceitos elaborados e delineados pela cibernética e
teoria da informação tornaram-se centrais no projeto lógico de máquinas e na
criação do software.
Bibliografia
Home Page : http:/www.cic.unb.br/tutores/hci/hcomp/hcomp.html
Data : 14/04/1999 De autoria de : Cléuzio Fonseca Filho
----
Informática Básica
Autores : Eduardo A. Lancharro , Miguel C. Lopez , Salvador P. Fernandez
Tradução : Sérgio Molina – Editora : McGraw-Hill