Linguagem de Programação COMAL
Eduardo O C Chaves
COMAL é uma nova linguagem de programação para microcomputadores. Um dos fatos mais interessantes acerca do COMAL é que está no domínio público: é basicamente gratuita e pode ser copiada à vontade. Além disso, tem características técnicas que a tornam verdadeiramente atraente, principalmente para o programador em BASIC.
A linguagem COMAL foi criada em 1974, na Dinamarca, por Borge R. Christensen e Benedict Leofstedt. Quando de sua criação, não passava de um BASIC expandido. A versão original, porém, veio a receber refinamentos, nas mãos de Mogens Kjaer, que acabaram por torná-la uma linguagem autônoma,, que recebeu o nome de COMAL 80. Novas reformulações e vários acréscimos foram feitos para se chegar ao COMAL Kernel, núcleo fundamental da linguagem,, que serve de base para implementações específicas bem mais expandidas. Apesar de reformulações, COMAL ainda mantém muito do "sabor" de BASIC, tornando-se, portanto, uma evolução natural para o programador nesta linguagem.
Características Técnicas
O COMAL possibilita a fácil realização de uma programação bastante estruturada. Com recursos de programação estruturada semelhantes aos encontrados no PASCAL, mantém a interatividade e o "caráter amigo" do BASIC.
Alguns dos comandos que possibilitam programação estruturada em COMAL aparecem no quadro. Outras características importantes do interpretador são:
Admite funções de múltiplas linhas e procedimentos (PROC e EXEC são os comandos usados para procedimentos), que permitem transferência de parâmetros e variáveis tanto globais como locais. Além disso,, após o programa ter sido executado,, todos os procedimentos e funções são "lembrados" pelo sistema, de modo que podem ser chamados e executados a partir do modo direto ou imediato de execução.
Ao listar um programa, realiza, automaticamente, a necessária tabulação da listagem, de modo a tornar a estrutura do programa claramente visível. Caso o programador ou usuário queira, porém, essa característica pode ser eliminada, fazendo com que a listagem saia da maneira normal, sem tabulações.
Permite que o programador use números de linha, mas esses números não são utilizados pelo interpretador, não sendo, portanto, obrigatórios à vista do fato de que COMAL possibilita IF ... THEN ... ELSE e funções com múltiplas linhas, procedimentos com rótulos, etc.
A eliminação de um bloco de linhas é feita com apenas um comando, DEL. Os comando AUTO e RENUM permitem a numeração automática e a renumeração de programas, caso o programador prefira ter linhas numeradas.
O comando LIST permite que se liste o programa todo ou apenas parte dele. Pode também haver listagem por procedimento, meramente indicando-se o nome ou rótulo do procedimento a ser listado. Se o procedimento, por exemplo, tem o rótulo de ITROD, apenas digita-se LIST INTROD e o procedimento será listado. COMAL permite que se liste em impressora e também em disco ou fita, bastando, para tanto, acrescentar um nome de arquivo ao comando LIST.
Programas podem ainda ser digitados e listados em maiúscula ou minúsculas ou misturando-se os dois tipos. É possível, por exemplo, listar-se todas as palavras-chave em maiúsculas, deixando os nomes de variáveis e identificadores em minúsculas. Na verdade é esta a forma normal de listagem com COMAL.
Os programas ou segmentos de programa listados em um disco ou fita poderão, também, ser incluídos em outro programa através do comando ENTER.
O diretório do disco pode ser listado em sua totalidade ou seletivamente, através de combinações que utilizam, como no CP/M, "?" e "*". A seleção também pode ser feita em função dos tipos de arquivo: apenas arquivos de programas, ou arquivos de dados em forma seqüencial, ou arquivos aleatórios, ou indexados.
A impressora pode ser ligada ou desligada com o comando SELECT. O COMAL permite que a saída para a impressora seja idêntica ao que aparece na tela. A impressora aceita os comandos TAB, ZONE (que permite impressão em zonas predefinidas), imprime a tela (simplesmente com o comando SELECT "LP" [line printer]).
Ainda em termos de entrada e saída, a linguagem de programação COMAL apresenta PRINT USING e PRINT AT. Tem READ, DATA e RESTORE, como o BASIC, mas permite que o comando RESTORE seja aplicado a qualquer grupo identificável de enunciados DATA. Não é necessário enumerar o enunciado DATA: basta que a linha anterior a ele tenha um rótulo que permita identificar a partir de que enunciado DATA se quer aplicar o comando RESTORE.
O BASIC divide a tela em zonas de 10, 14 ou 16 segmentos. O COMAL, através do comando ZONE, que se aplica inclusive à impressora,, permite que as zonas tenham seu tamanho variado. ZONE 6 cria zonas de seis espaços. ZONE 9, de nove. E assim por diante.
Há também um comando CURSOR, que permite colocar o cursor em qualquer coluna ou linha desejada.
O interpretador verifica a sintaxe de cada linha introduzida e aponta erros de sintaxe na hora, sem esperar pela execução do programa. Uma mensagem de erro específica - e não o genérico "Syntax Error" - é fornecida na linha debaixo, e o cursor é colocado em cima do erro. Feita a correção, aperta-se a tecla RETURN, e a mensagem de erro é automaticamente apagada,, permitindo que a linha seguinte seja digitada no local correto - ou, se havia algum texto onde a mensagem foi impressa, que ele seja reconstituído, pois as mensagens de erro e outras comunicações do sistema não são destrutíveis na tela.
Ao se acionar o comando RUN, mas antes de o programa ser executado, o COMAL faz uma varredura completa do código digitado para averiguar se há algum erro de estrutura. Se houver, é apontado antes da execução. Não havendo todos os desvios são transformados em saltos para endereços absolutos. Em virtude disso, o COMAL pode e deve ser visto como um interpretador de três fases - a primeira, a digitação da linha; a segunda, a varredura do código; e a terceira, a execução propriamente dita. Mas é também o que se convencionou chamar de um Run Time Compiler, visto que, antes da execução, transforma todos os desvios do programa em endereços absolutos, diminuindo, assim, consideravelmente o tempo de execução.
Um programa COMAL normalmente pode ser executado seis vezes mais rapidamente do que o seu equivalente em BASIC. Em busca de cadeias de caracteres, o COMAL chega a ter uma rapidez oito vezes maior do que o BASIC. Além disso, admite matrizes de até 33 dimensões (36 no caso de matrizes numéricas) e índices sem nenhum limite inferior ou superior. Permite que os nomes de variáveis tenham até 78 caracteres, todos eles significativos. Esses nomes podem incluir apóstrofo, colchetes e barra, de modo que línguas que usam combinações especiais de sinais gráficos possam usar esses caracteres em sua representação. Embora palavras-chave não possam ser nomes de variáveis, nada impede que nomes de variáveis contenham palavras-chave. FORTUNA, por exemplo, é nome de variável aceitável, apesar de conter a palavra-chave FOR.
Subcadeias de caracteres podem ser formadas e manipuladas com facilidade, sem precisar recorrer-se a MID$, por exemplo. Basta indicar o caractere inicial e final da subcadeia. O COMAL permite que se tome uma subcadeia de caracteres, transforme-se esta subcadeia em algo diferente, sem afetar a cadeia original. O comando FIND permite que se localize no programa qualquer cadeia ou subcadeia de caracteres.
Cada linha do programa que contém o que é procurado é então listada, uma a uma, com o cursor aparecendo em cima do texto desejado. A linha pode ser alterada ou editada nessa ocasião. Apertando-se a tecla RETURN, a próxima linha com o texto será mostrada.
COMAL fornece dois tipos diferentes de arquivo seqüencial - "puro" e indexado ou relativo - bem como arquivos de acesso direto. Ele também inclui indicadores de fim de dados (EOD) e fim de arquivo (EOF), facilitando extremamente a leitura de dados de enunciados DATA ou de arquivos.
Programas em linguagem de máquina podem ser carregados de dentro de um programa COMAL com o comando OBJLOAD. Programas ou sub-rotinas (procedimentos)em linguagem de máquina podem ser acessados mediante o comando SYS ou anexados ao programa COMAL mediante o comando LINK. Neste último caso, usando-se o comando SAVE, o programa COMAL e os programas ou procedimentos em linguagem de máquina a ele anexados serão gravados num mesmo arquivo. PEEK e POKE são mantidos no COMAL.
O COMAL tem ainda uma série de outras características, entre elas:
Distinção entre os sinais de igualdade e de atribuição: o primeiro é "=", e o segundo é ":=" - algo importante para o ensino de computação. No caso de atribuição, não é necessário que o programador digite o sinal ":=", pois o próprio sistema interpreta o enunciado e o sinal é colocado automaticamente. Para incrementar o valor de uma variável não é preciso usar T = T + C, como em BASIC: basta usar T: + N. Esta sintaxe permite também a concatenação de cadeias de caracteres, atribuídas a variáveis ou não.
Fornecimento automático de palavras opcionais omitidas pelo programador ou digitador. Se "THEN" for omitida, o COMAL a inclui automaticamente; "SELECT`LP’" vai aparecer na listagem como "SELECT ou OUTPUT `LP’", visto que "LP" só pode ser periférico de saída. O BASIC permite que o segundo sinal de aspas seja omitido em uma constante de caracteres, quando esta estiver no final de uma linha. O COMAL também, com a diferença de que o COMAL insere o sinal automaticamente, caso seja omitido.
Há comandos especiais para fornecer o resultado de uma operação aritmética em números inteiros, o resto de uma divisão, etc.
Em resumo, o grande número de características novas no COMAL permite prever que logo encontrará maiores aplicações em microcomputadores pessoais, em grande número de áreas. Embora ainda não esteja disponível no Brasil, pode ser obtido através de clubes de usuários, principalmente do Commodore 64.
Comandos para Programação Estruturada em COMAL
- IF ... THEN ... ELSE ... ENDIF. Este comando permite que múltiplas linhas sejam usadas tanto a nível da cláusulas conseqüentes. A opção IFEL é permitida,, de modo a possibilitar vários condicionais dentro da mesma estrutura.
Exemplos:
IF Cont’erros > o THEN
PRINT "Você completou esta seção com"; cont’erros; "erros".
PRINT "Isto significa que você deve estudar um pouco mais."
PRINT "Volte depois de ter estudado novamente." Þ
ELSE
PRINT "Meus parabéns, você concluiu o teste sem erro algum."
PRINT "Poucos conseguem esta façanha."
ENDIF
IF talão < extrato THEN
PRINT "Seu talão indica saldo menor do que o extrato;"
PRINT "Talvez algum cheque não tenha sido descontado ainda."
ELIF talão > extrato THEN
PRINT "Seu talão indica saldo maior do que o extrato;"
PRINT "Talvez haja algum depósito com cheque ainda não liberado."
ELSE
PRINT "O talão e o extrato batem. Tudo certo."
ENDIF
- REPEAT ... UNTIL e WHILE ... DO ... ENDWHILE, além do tradicional FOR ... NEXT.
REPEAT
INPUT "Qual é a resposta?": resposta tentativas: + 1
UNTIL resposta = resp OR tentativas > 3
WHILE NOT EOF (arq’teste) DO
READ FILE arq’teste: texto$
PRINT texto$
ENDWHILE
- LOOP ... EXIT WHEN ... ENDLOOP.
LOOP
READ FILE arq. nomes: nome$
EXIT WHEN nome$ = "*FIM*"
contador: + 1
matriz$ (contador): = nome$
ENDLOOP
- CASE, como uma alternativa a GOTO e GOSUB. Þ
CASE escolha$ OF
WHEN "H", "h", "?"
EXEC instruções
WHEM "A", "a"
CHAIM "adição"
WHEM "S", "s"
CHAIM "subtração"
OTHERWISE
PRINT "Não consigo entender sua escolha."
PRINT "Suas opções são:"
PRINT "A - para adição;"
PRINT "S - para subtração;"
PRINT "H - para instruções."
END CASE
© Copyright by Eduardo Chaves
Last revised: 02 May 2004