• Nenhum resultado encontrado

ENIAC 1943-1946 Harvard Mark

6.3 As primeiras linguagens

6.3.1 Alguns aspectos teóricos

Como foi visto, um dos pontos fundamentais do projeto formalista de Hilbert para a solução de problemas matemáticos era descobrir um procedimento efetivo (ou mecânico) para verificar a validade de proposições matemáticas. Depois do Teorema de Gödel evidenciou-se que tal proposta é irrealizável, mas todos os estudos em torno desse projeto de Hilbert e dos resultados de Gödel propiciaram, entre outras coisas, uma adequada caracterização do termo efetivamente computável, através da Máquina de Turing e das funções lambda-definíveis de Church e Kleene. Tornou-se claro o que é um procedimento efetivo, tornando-se claro ao mesmo tempo o que é um problema computável.

Um procedimento efetivo é uma seqüência finita de instruções que podem ser executadas por um agente computacional, seja ele homem ou não. Propriedades:

I. a descrição deve ser finita;

II. parte de um certo número de dados, pertencente a conjuntos específicos de objetos, e espera-se que produza um certo número de resultados que mantenham relação específica com os dados;

III. supõe-se que exista um agente computacional − humano, eletrônico, mecânico, etc. − que execute as instruções do procedimento;

IV. cada instrução deve ser bem definida;

V. as instruções devem ser tão simples que poderiam ser executadas por alguém usando lápis e papel, em um espaço de tempo finito.

Esse procedimento efetivo também é chamado de algoritmo. Programas de computadores que terminam sua execução, fornecido qualquer conjunto específico de dados de entrada, são algoritmos.

A descrição finita do algoritmo deve ser feita através de uma determinada linguagem. Essa linguagem algorítmica deve pertencer a um subconjunto não ambíguo de uma linguagem natural, tal como Francês ou Inglês, ou ser uma linguagem artificial construída para isso, como, por exemplo, as linguagens de programação (Fortran, Lisp, Ada, Cobol, Pascal, etc.). As frases da linguagem descreverão as operações a serem executadas. A forma ou formato de procedimentos efetivos em uma linguagem algorítmica qualquer é especificada por um conjunto de regras chamado regras de sintaxe, cujas propriedades estão acima enumeradas [BL74]. Essa sintaxe refere-se aos programas corretamente escritos nela e o relacionamento

entre os símbolos e frases que ocorrem nesses programas. Alguns autores a dividem em

concreta e abstrata [Mos92]. A concreta envolve:

• reconhecimento de textos (seqüências de caracteres) corretamente escritos de acordo com as especificações da linguagem;

• a colocação dos textos, de maneira não ambígua, dentro das frases que compõe o programa. A sintaxe abstrata molda as estruturas de frases do programa.

Portanto a sintaxe refere-se à forma dos programas: de que modo expressões, comandos e declarações podem ser justapostos para compor um programa. Uma linguagem de programação torna-se assim, entre outras coisas, uma notação formal para a descrição de um algoritmo, entendendo-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, isto é, que qualquer problema cuja solução possa ser encontrada através de um computador pode ser escrito com ela*. 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 [LSSK79].

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’ mediante 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 significa falar das características que tornam tais linguagens implementáveis em qualquer computador, isto é, quais as características da execução do programa que são comuns a todas as implementações. Portanto a semântica é uma entidade abstrata: ela modela o que o programa quer causar quando é executado, independentemente 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 [Mos92].

A evolução das linguagens de programação chegou até esses conceitos por caminhos e esforços muitas vezes paralelos. Alguns informatas buscam caminhos para projetar linguagens que combinem uma grande generalidade de usos (aplicações matemáticas e científicas, gráficas, comerciais, etc.) com simplicidade e eficiência. Isso levou ao desenvolvimento de diferentes paradigmas – estilos e objetivos – de programação como o

imperativo, o funcional, o orientado a objeto, o lógico, etc. Outros buscaram e buscam caminhos para

* Qualquer linguagem em que se possa definir uma função recursiva será universal.

Uma linguagem com somente tipos numéricos e arrays deve resolver naturalmente problemas numéricos, por exemplo. A maioria dos livros ao falar de semântica usa a palavra behavior, de difícil tradução. Pode-se dizer que é um conjunto de

regras que determinam a ordem na qual as operações do programa irão ser executadas, quais serão executadas primeiro e quando se encerrarão.

expressar a sintaxe e a semântica, esta última talvez a parte mais importante dentro do assunto linguagens de programação e que levou ao surgimento de diversas linhas: a semântica algébrica, a denotacional, a de ações, etc.