Relatório Algol-60

O relatório Algol-60 foi escrito entre 1959 e 1960 por uma equipe de especialistas em linguagem de programação composta pelo editor Peter Naur e vários educadores e praticantes da Europa e dos Estados Unidos. O objetivo do relatório era desenvolver uma descrição completa de uma linguagem algorítmica internacional para expressar processos numéricos de uma forma adequada para tradução em linguagens de programação de computador. Não pretendia ser uma linguagem de programação, embora tenha sido posteriormente implementada como uma linguagem e se tenha tornado popular na Europa.

Muitas versões da linguagem de programação Algol foram implementadas nos anos 60 e início dos anos 70. Também levou ao desenvolvimento de várias outras linguagens de programação, tais como Pascal, implementado por Niklaus Wirth no início dos anos 70, e C.

O relatório introduziu as noções de uma linguagem de referência, uma linguagem de publicação, e uma representação de hardware. A linguagem de referência foi o padrão para o relatório, redatores de compilação e implementação de hardware. Ela ditava a forma da linguagem e sua sintaxe. A linguagem de publicação utilizou a linguagem de referência com pequenos ajustes para variações de publicação entre países e variações de impressão e escrita, como o tratamento de subscritos, superescritos, e outras notações. A representação de hardware levou em consideração as características da máquina. A linguagem de referência foi a linguagem de definição, e a linguagem de publicação e representação de hardware teve que ser traduzida para ela.

O propósito do relatório e da linguagem foi dar uma representação inequívoca a vários conceitos computacionais – em particular, o desenho de algoritmos, ou linguagem ALGOrithmic Language 1960. Uma versão posterior, Algol68, não foi tão popular ou amplamente implementada como Algol-60, embora fosse mais poderosa.

Algol é uma linguagem estruturada, incorporando declarações while, if-then-else-statements, e outras construções que implementam seleção, iteração, declarações básicas, estrutura de blocos, e recursividade. Embora tenha sido desenvolvida apenas alguns anos depois de FORTRAN (FORmula TRANslator), lançado em 1957 pela IBM, incorporou recursos que faltavam em FORTRAN – principalmente a recursividade e a linguagem estruturada – e foi um grande avanço na área de programação.

Um dos descendentes de Algol e FORTRAN era a linguagem BASIC (Beginner’s All-purpose Symbolic Instruction Code), desenvolvida por John Kemeny e Thomas Kurtz da Dartmouth University. BASIC era uma espécie de versão sem formatação de FORTRAN para computação interativa e iniciante. BASIC gozou de um longo reinado desde os anos 70 até aos anos 80 e foi recentemente implementado de uma forma bastante diferente, Visual Basic.

Um descendente de Algol foi Pascal, que também gozou de um longo reinado como linguagem popular para implementar estruturas de dados e estudar compiladores . Não era uma linguagem de produção, mas uma ferramenta de ensino. O C era uma linguagem do sistema e levou ao desenvolvimento do C, uma linguagem orientada a objetos que ainda é popular.

A linguagem Algol foi descrita numa notação chamada Backus normal ou Backus-Naur form (BNF). A notação foi sugerida por John Backus, que a baseou em uma notação de E. L. Post, um famoso lógico da década de 1930. Era semelhante à notação desenvolvida por Noam Chomsky em 1957 para lingüística, que era usada para implementar gramáticas. Uma gramática é uma forma sucinta e inequívoca de descrever línguas. O uso de uma notação formal na teoria das linguagens foi um grande avanço.

A evolução das linguagens de programação foi impressionante, mas não tão impressionante como a evolução da teoria dos compiladores. Logo após o relatório Algol-60, vários teóricos de compiladores usaram a notação gramatical para implementar compiladores de uma forma “automática”. Estes compiladores eram conhecidos como compiladores-compiladores. Esforços similares foram o desenvolvimento do Lex, um analisador lexical, e Yacc (“Mais um compilador-compilador”) nos Laboratórios Bell em meados dos anos 70.

Understanding Programming Language

Gramática inglesa tem certas construções, como uma frase de substantivo, que é composta de outras construções, como um substantivo e um modificador. Linguagens de programação têm construções como while-statements, e expressões aritméticas. Estes construtos são indicados por símbolos especiais chamados de símbolos não terminais ou meta símbolos da linguagem.

Os símbolos que realmente aparecem na linguagem são chamados de símbolos terminais. A terminologia vem das estruturas de dados, ou árvores parciais, usadas para implementar a linguagem.

Um exemplo é:

Esta gramática indica que uma expressão aritmética, E, consiste de outras expressões aritméticas e termos, T, adicionados juntos (E–>E T). Um termo, T, é composto de um termo vezes um fator, F, de modo que T–>T*F. Finalmente, um fator, F, é a expressão mais básica, composta de expressões parênteses (o parênteses E), identificadores (identificador definido pelo usuário ou variáveis), id e constantes numéricas (num). A gramática dá a forma das expressões aritméticas.

O exemplo dá um sabor da notação. Os itens à esquerda da seta são compostos pelos itens à direita. Neste caso, os E, T e F são os meta-symbols. Os outros símbolos, *, (, ), e, neste caso, id e num, aparecem no idioma. Eles são as palavras do idioma. Neste caso, E é o símbolo inicial ou o primeiro símbolo não-terminal. É a expressão mais geral a ser definida. Embora a notação possa parecer estranha no início, ela é útil no projeto da linguagem, teoria do compilador e implementação.

O desenvolvimento de gramáticas em informática deu um grande impulso ao projeto e implementação da linguagem de programação.

ver também Algoritmos; Linguagens de Procedimentos; Programação.

Roger R. Flynn

Bibliografia

Naur, Peter, ed. “Revised Report on the Algorithmic Language Algol-60”. Communications ACM 6, no. 1 (1963): 1-17.

Wexelblat, Richard L., ed. “History of Programming Languages” (História das Linguagens de Programação). Nova York: Academic Press, 1981.