• Nenhum resultado encontrado

ENIAC 1943-1946 Harvard Mark

7 A revolução do hardware e do software

7.5 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

* A Teoria da Complexidade Computacional é um ramo da Computação que estuda o grau de dificuldade envolvido na resolução algorítmica de classes de problemas. Um dos principais tópicos abordados diz respeito à eficiência (em termos de tempo) envolvida na execução de um algoritmo.

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 processadores específicos a que se destina 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 (assertivas) indutivas para a verificação (prova) de programas e uma técnica envolvendo “conjuntos com ordenação bem fundada para provar o término de um programa”*.

Uma extensão das idéias de Floyd foi proposta por C. A. Hoare em 1969. Hoare formulou uma teoria axiomática 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 (síntese) de um programa e não apenas para sua verificação [Luc82].

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 conseqüência de erros detectados ao longo dessa 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 lingüí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

* O objetivo é escolher essas proposições de tal forma que elas sejam satisfeitas cada vez que o fluxo de controle do programa passe pelo ponto anotado e de maneira que cada ciclo do fluxograma seja “cortado” (anotado) por uma proposição. † Para estabelecer uma distinção entre as várias espécies de abordagem vamos seguir uma classificação sugerida por Bjorner

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.

É necessário notar que essas duas últimas abordagens exigem um conhecimento mais profundo do raciocínio lógico formal e de um sistema lingüístico formal adequado. Embora a abordagem formal se apresente como único meio de se dar uma garantia real à atividade de construção de sistemas, muitos autores mostram-se céticos quanto ao verdadeiro impacto que ela venha a ter na prática, devido à dificuldade de aprendizado do necessário arcabouço matemático.

Figura 40: Donald E. Knuth

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 [Knu69], 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

* É importante notar que a prova formal pode ser feita.

Um problema dito P (de polinomial) é executado em um computador com um número de passos dado pela fórmula Ank ( A e k são inteiros fixos e n é o número de dados de entrada). Algoritmos NP (de tempo não determinístico polinomial) executam em tempo exponencial, em um número de passos 2n ou n! (problema do caixeiro viajante por exemplo, a solução de alguns teoremas lógicos de primeira ordem, o problema da torre de Hanói, etc.).

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 [Tei97].