Introdução ao Tiny Cobol
Jonathan Riddell, jr@jriddell.org
v0.2 Novembro 2001
Uma breve introdução do Tiny Cobol para aqueles que são novos ao Tiny Cobol ou
Cobol em geral(tradução de Hudson Reis, <<hudsonreis@softhome.net>>).
Este Documento
Objetivo
Uma breve introdução ao Tiny Cobol para aqueles que são novos ao Tiny Cobol ou
Cobol em geral, levando o leitor a olhar através do Cobol, o primeiro e um
programa mais complicado usando o make.
Novas versões deste documento
A última versão desse documento pode ser encontrada no website do Tiny
Cobol em
http://tiny-cobol.sourceforge.net
Copyrights (em lingua original)
This document is Copyright Jonathan Riddell 2001.
You may copy and distribute it only under the terms of the GNU Free
Documentation License, available at http://www.gnu.org/copyleft/fdl.html
Copyrights (em lingua portuguesa)
Este documento é copyright de Jonathan Riddell 2001.
Você pode copiá-lo e distribuí-lo somente sobre os termos da licença de
documentação livre GNU, disponível em http://www.gnu.org/copyleft/fdl.html
Agradecimentos
Agradecimentos para a equipe do Tiny Cobol e especialmente para
Rildo Pragana, (http://members.zoom.com/rpragana) nosso líder fiel.
Agradecimentos a Richard Bland, meu instrutor e professor do all things
Cobol.
Aplausos também para as pessoas da Debian por incluirem um programa
sgmltools que funcione. Ele é muito apreciado.
Traduções
Não há traduções deste documento ainda(exceto a italiana e brasileira),
mas alguns voluntários são bemvindos.
E sim, este documento é em Inglês
britânico. Parênteses são como (), e períodos são alguma coisa que as
meninas tem todo mês.
Considere-se sortudo... Eu não pus em escocês.
Introdução ao Cobol e ao Tiny Cobol
Sobre Cobol
Cobol é uma das últimas linguagens de terceira geração. Ela
foi desenvolvida em 1959 (em torno do mesmo tempo como Fortran)
para substituir linguagens de processamento específico assembler
(linguagens de segunda geração). O primeiro padrão ANSI foi o
padrão 68(embora ele tivesse sido usado comumente desde 1961).
Padrões posteriores eram o padrão 74 e o padrão 85. A maioria
dos programas Cobol usados hoje são de acordo com o padrão 85
(e então faz-se o Tiny Cobol).
Linguagens que competiam com as principais vantagens do Cobol
(tais como C) éram pela rapidez e velocidade na leitura/gravação
que ele pode entregar, a aritimética de ponto fixo para a
contabilidade exata e o inglês como sintaxe para documentação e
legibilidade. Isto fê-lo muito útil para trabalhos de grande
processamento de dados tais como manter-se informado sobre um
milhão de contas bancárias cada noite ou processar pagamentos
combinados. A sintaxe em inglês tornaram os programas fáceis para
entendimento, então programas comerciais podem ser facilmente
modificados em seu tempo de vida assim como as regras de negócio
são modificadas.
Cobol é significantemente diferente das linguagens estruturadas
de bloco, tais como Pascal, C e descendentes. Ele não tem uma
estrutura de blocos e consequentemente sem nenhuma maneira de
esconder variáveis; há mais liberdade na escrita do programa;
números são próximos a aritimética humana, por exemplo: ponto
fixo ou números decimais são geralmente usados ao invés do ponto
flutuante; O I/O é orientado por registro, não por classificação;
recursividade não é permitido e a lingua própria é muito extensa
pois não usa bibliotecas.
Mais informações sobre Cobol podem ser encontradas em um FAQ Cobol
em http://www.cobolreport.com/faqs/cobolfaq.htm
Sobre Tiny Cobol
Tradicionalmente a sorte das pessoas que usam software livre não
é a sorte das pessoas que usam COBOL. Este é o que o arquivo
jargão tem a dizer sobre o assunto:
COBOL /koh'bol/ n.
[COmmon Business-Oriented Language] (Sinônimo de maldade.) Uma fraca,
verbosa, e uma flácida linguagem usada pelos perfuradores de cartão
fazendo coisas monótonas nos mainframes dinossauros. Hackers acreditam
que todos os programadores COBOL são fracos ou moedores de código, e
nenhum hacker que tenha amor próprio irá jamais admitir ter aprendido
a linguagem. Ela é um nome muito raramente pronunciado sem rituais de
aversão ou horror. Uma expressão popular é a famosa observação de
Edsger W. Dijkstra que "o uso de COBOL aleija a mente", o seu ensino,
deve, portanto, ser considerado uma ofensa criminal".
Crítica realmente bem forte. Mas para opor-se a isto há boas razões
por que o Cobol é relevante hoje.
Há aproximadamente 100 bilhões de linhas de Cobol em uso hoje.
A grande parte do desenvolvimento é ainda feito em Cobol - há
contudo para ser 1 milhão de desenvolvedores ao redor do mundo
e 2 bilhões de linhas de Cobol escritas a cada ano.
Há uma demanda considerável de programadores Cobol
para trabalharem com sistemas legados
Muitos cursos universitários ensinam Cobol
Você pode discordar do autor do arquivo Jargão.
Assim se Cobol é ainda relevante hoje, significa que
será relevante para muitos bons usuários do software livre
e significa que serão ambas usadas e importantes para
haver a criação de um compilador Cobol livre.
É para isso que o Tiny Cobol veio. Sua criação é encabeçada
por Rildo Pragana e foi criado primeiramente para o restritivo
ambiente do DOS. O Tiny Cobol é desenvolvido agora por programadores
muito mais amigáveis do ambiente do Linux e avança em um longo
caminho.
A Competição
Cobol for
GCC, é um projeto para desenvolver um compilador Cobol
que será integrado com a coleção de compiladores GNU. Ele não
está ainda em um estado usável.
Instalação
Obtendo Tiny Cobol
O Tiny Cobol atualmente funciona somente com Linux ou FreeBSD
em uma máquina i386. Ele está sendo completamente compilado
na plataforma win32 com as ferramentas do cygwin, tente olhar
os arquivos da mailing list, se você interessar em fazê-lo
(Binários também podem estar disponíveis). O mais provável é
que não compile, embora você seja benvindo a tentar.
Você pode obter o Tiny Cobol do seu website no Sourceforge:
http://tiny-cobol.sourceforge.net.
Há algumas versões de RPM disponíveis, mas a maioria das pessoas
quer obter as versões GZIPadas. O tamanho do arquivo é menor que
metade de um megabyte.
Copie este arquivo para algum lugar semelhante a /usr/local/src
e descompacte-o (ele irá criar um diretório próprio). Acesse o
diretório, tire um parecer do arquivo README e leia completamente
o arquivo INSTALL. O arquivo INSTALL irá dizer a você quais
bibliotecas você precisa; se você não tem alguma destas
bibliotecas então instale-as do CD de sua distribuição ou obtenha-as
dos sites sugeridos. Ele irá dizer também que você precisa do GCC
instalado, se este não estiver instalado, você não obterá muito,
assim, instale-o do CD de sua distribuição ou por um servidor de
FTP ou por download da GNU.
Compilando e Instalando
Para preparar para a compilação, vá para o diretório do Tiny Cobol
e digite ./configure (há várias opções para customizar o configure,
veja o arquivo INSTALL para detalhes). Então digite "make" para
compilar. Você não necessita ser root para isso.
Agora mude de diretório, 'cd test_suite' e digite 'make tests'.
Você irá ver um rastro de resultados quando novamente o compilador
compilado poderá funcionar com os programas de teste. Nem todos eles
irão passar, relembrando que isto é um software alpha, mas a maioria
deve.
Agora vá para o diretório original e digite 'make install',
que copiará as bibliotecas, o compilador e o pré-processador
e alguns outros arquivos assim eles estão prontos para usar. Você
precisará de ser root para isto. Os binários estão inseridos em
/usr/local/bin, as bibliotecas em /usr/local/lib e todos os
outros arquivos em /usr/local/share/htcobol, a não ser que seja
especificado com o programa configure.
Ajuda, se não funcionar!
Se alguma coisa foi errada e você não sabe como corrgí-la, leia
este documento outra vez. Tenha certeza que você tem todos as
pacotes importantes como o GCC e as bibliotecas necessárias
instaladas(você deve ser capaz obtê-los de qualquer CD de
distribuição baseado em linux que você usa). Depois leia
a webpage do Tiny Cobol em
http://tiny-cobol.sourceforge.net.
Ainda não está resolvido? vá e cadastre-se na mailing list
tiny-cobol-users e pergunte as simpáticas pessoas de lá.
Você pode assiná-la em http://lists.sourceforge.net/mailman/listinfo/tiny-cobol-users
ou por enviando um e-mail para tiny-cobol-users-request@lists.sourceforge.net
com subscribe no corpo da mensagem. O endereço para postagem é
tiny-cobol-users@lists.sourceforge.net.
Você deve também olhar através dos arquivos no caso da sua pergunta
ter sido respondida antes. Ela está em
http://lists.sourceforge.net/archives/tiny-cobol-users/.
Primeiro Programa
Editores
Como a maioria das linguagens de programação, um programa Cobol
é exatamente um arquivo texto, que você pode editar em seu
editor de textos favorito. Felizmente, para evitar algumas
guerras de religião, ambos vim e Emacs funcionam com Cobol.
Emacs
Não há um modo Cobol que venha como padrão para o GNU Emacs.
Ao invés disso, obtenha uma cópia do Cobol.el do projeto
Cobol for GCC. Você pode obter o arquivo diretamente do CVS
deles em
http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/gcc/cobol/cobol.el?cvsroot=CobolForGCC.
Abra o emacs e compile o arquivo lisp com M-X byte-compile-file.
Movimente o arquivo Cobol.elc resultante para
/usr/share/emacs/20.7/lisp/textmodes/ ou o equivalente para sua
instalação. Finalmente adicione este código para o arquivo .emacs
ou .gnu-emacs em algumas distribuições) em seu diretório pessoal:
(autoload 'cobol-mode "cobol" "COBOL Editing mode" t)
(setq auto-mode-alist
(append '(("\\.cpp$" . c++-mode)
("\\.hpp$" . c++-mode)
("\\.lsp$" . lisp-mode)
("\\.scm$" . scheme-mode)
("\\.pl$" . perl-mode)
("\\.cbl$" . cobol-mode)
("\\.CBL$" . cobol-mode)
("\\.COB$" . cobol-mode)
("\\.cob$" . cobol-mode)
("\\.CPY$" . cobol-mode)
("\\.cpy$" . cobol-mode)
) auto-mode-alist))
;; Auto font lock mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode
'perl-mode 'scheme-mode 'scribe-mode 'shell-script-mode 'cobol-mode
'dired-mode)
"List of modes to always start in font-lock-mode")
(defvar font-lock-mode-keyword-alist
'((c++-c-mode . c-font-lock-keywords)
(perl-mode . perl-font-lock-keywords)
(cobol-mode . cobol-font-lock-keywords)
(dired-mode . dired-font-lock-keywords))
"Associations between modes and keywords")
(add-hook 'cobol-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) t)
(set (make-local-variable 'dabbrev-case-replace) t))
Abra o arquivo Cobol no emacs e digite 'M-x cobol-mode' e
'M-x font-lock-mode' para recolher belas cores. Agradecimentos
para a equipe do Cobol for GCC por fazer um modo para o emacs.
VIM
Para um guia para usar Cobol no VIM vá para
http://dimensional.com/~sitaram/cobol/.
Outros
Há muitos outros editores lá fora. Um interessante é o THE,
um editor que imita editores de mainframe semelhante ao
Xedit. Ele está disponível em
http://www.lightlink.com/hessling/
Primeiro Programa
Aqui está um programa Hello World em Cobol:
* Hello World Program
* GPL Copyleft Jonathan Riddell 2001
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
DISPLAY "hello ," WITH NO ADVANCING
DISPLAY "world!"
STOP RUN.
A estrutura do programa é bastante simples, quatro seções, duas que
tem conteúdo. PROGRAM-ID é um nome simples para o programa, você
pode opcionalmente ter outras informações na IDENTIFICATION DIVISION.
A ENVIRONMENT DIVISION pode(opcionalmente agora) conter informações
sobre sua configuração, semelhante ao do compilador que você está
usando. A DATA DIVISION contém muitas declarações de variáveis que
nós podemos precisar. Finalmente a PROCEDURE DIVISION são as atuais
instruções do programa.
Você pode notar que há uma série de maiúsculas no código. Usar
maiúsculas para palavras reservadas do COBOL mantém o programa mais compatível com outros compiladores e assegura às palavras
reservadas uma posição contra as literais e variáveis. Com o
Tiny Cobol você é perfeitamente livre para não usar maiúsculas
que irão parar o seu Caps Lock desgastando a rapidez.
A outra coisa a notar é o espaçamento. Voltando aos dias dos
cartões perfurados, cobol mantém um controle severo das partes
onde o código deve estar:
column 1-6 : numeração de linhas.
column 7 : área de indicação,
asterisco para comentar linhas,
menos para continuação de linhas,
barra para pular páginas na listagem
de compilação caso contrário espaços.
column 8-11 : Margem A, aqui inicia divisões, seções,
identificadores de parágrafo e muitas
numerações de nível.
column 12-72 : Margem B, para tudo que não pertencer
a margem A
column 73-80 : área de identificação do programa.
O Tiny Cobol não força você a manter este regime mas ele pode
manter seus programas mais bem arrumados, ele também para
estardalhaços de alguns outros compiladores sobre espaçamento
e ele mantém o modo Cobol no emacs felizmente. Tiny Cobol,
entretanto, insiste em ter um asterisco que denota um comentário
na primeira ou segunda coluna.
Agora compilaremos o programa. Salve o código acima como
hello.cob e digite o seguinte comando:
htcobol hello
Há chances que o htcobol avise que $COBDIR não esteja setado,
enquanto você instalar no diretório default não deve ser um
problema mas se você mudar o diretório ou se você recebeu mensagens
estranhas de aviso então adicione
'export $COBDIR=/usr/local/share/htcobol' ou similar para seu arquivo
.bashrc ou .profile. Ele irá dizer isso também
'Processing compiler parameters', isto é uma boa coisa.
O Htcobol irá produzir os arquivos hello.lis e hello.s. hello.lis
é a conversão do código Cobol em alguma coisa mais amigável para
o compilador. hello.s é um código assembly, à leitura humana
equivalente ao código de máquina.
Se seu shell não pode encontrar um programa chamado htcobol,
primeiramente cheque sua variável $PATH apontando para
/usr/local/bin/htcobol ou onde quer que você instalou-o
(digite 'echo $PATH'). Se ele existir, então, cheque
duplamente se ele está configurado, compilado e instalado
corretamente.
Se você se embaraçou com o código abaixo, você vai notar que o
Tiny Cobol não é ainda muito bom para reportar erros. De fato
tudo que você receberá será uma "Falha de Segmentação". Cheque
duplamente se você soletrou tudo corretamente, e se você não
esqueceu de nenhuma pontuação e os asteriscos dos comentários
da primeira coluna.
O próximo passo é compilar o arquivo assembly hello.s para
código de máquina. O comando para isto é:
as -o hello.o hello.s
o AS é parte da coleção de compiladores GNU, GCC, e se você
não o tem instalado, você tem uma distribuição de fato muito
esquisita (dado que nós já compilamos o Tiny Cobol hoje).
Cheque a documentação da sua distribuição para instalá-lo.
hello.o é um arquivo objeto, mas não é um executável que
funciona por que ele não está sendo linkado com as bibliotecas
necessárias. Este é o comando final:
gcc -o hello hello.o -lhtcobol -lm
Se você achou isso difícil, você provavelmente não tem tido
nenhum problema com isso, mas se o gcc não encontrar as
bibliotecas libhtcobol ou libm então você pode ter que
atualizar a base de dados das bibliotecas com o comando
ldconfig.
Finalmente há um programa funcional que pode ser chamado
com:
./hello
E você deve ver na tela:
Hello, world!
Que será praticamente previsível. Se você olhar o código do
programa, ele deve ser óbvio que DISPLAY mostra e que
WITH NO ADVANCING mostra(sem quebrar a linha).
Programação Adicional
Outro Programa
Aqui está um programa um pouco mais complicado, digite-o
em um arquivo e salve-o como addition.cob.
IDENTIFICATION DIVISION.
PROGRAM-ID. addition.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 myvar PIC 999 .
77 a PIC 99V999 VALUE 1.777 .
77 b PIC 99V99 VALUE ZERO .
77 c PIC 9V9 VALUE 5.5 .
77 d PIC 9v9 VALUE 5.5 .
PROCEDURE DIVISION.
DISPLAY "Por favor insira um número"
ACCEPT myvar
DISPLAY "O número é ", myvar
ADD a TO b ROUNDED
DISPLAY "b is ", b
ADD c TO d
DISPLAY "d is ", d
STOP RUN.
Você pode compilar este com a mesma rotina, a qual você usou
com hello.cob, se você encontrou alguma falha de segmentação,
cheque duplamente seu programa antes de se queixar.
Se você é novo com o Cobol, há um ponto para se tomar aqui.
Primeiramente nós temos variáveis declaradas na WORKING-STORAGE
SECTION na DATA DIVISION. O Cobol requer que todas as variáveis sejam
declaradas desta maneira. As outras seções da DATA DIVISION lidam
com arquivos e linkage.
As variáveis declaradas aqui iniciam com '77'. Isso significa
que a variável está no nível 77: ele não tem estrutura interna e
num relacionamento definido com nenhuma outra variável. Ele
não é um parte de um registro(ou qual as estruturas de chamadas C).
O Nome da primeira variável é myvar, nome das variáveis podem ser
letras maiúsculas ou minúsculas, mas com o TinyCobol você deve
ser consistente em todas as partes do seu programa.
A cláusula PIC especifica o tipo da variável. Usando "9s", significa
que ela é uma variável decimal e usando 3"9s", cria uma variável que
recebe os números 0 a 999. Você pode ter também um S antes do "9s"
para criar uma variável com sinal. Um 'V' na declaração PIC
significa uma variável com um ponto decimal assumido na posição V.
Para variáveis grandes, você pode escrever 9(15), que é uma variável
que tem 15 espaços. Usando "As" ao invés de "9s", criamos uma variável
alfabética e usando "Xs" para criar uma variável alfanumérica.
Finalmente um VALUE inicial pode ser indicado para a variável.
Programadores Cobol inexperientes podem estar preocupados como o
final de um parâmetro é marcado. O final dos blocos são
marcados com uma parada completa, mas os parâmetros não
são marcados definitivamente. Ao invés disso o compilador Cobol
reconhece quando um novo parâmetro se inicia ao notar um grande
número de verbos Cobol. O final das linhas não é importante no Cobol.
Outra coisa para notar no código acima é as vírgulas adicionadas.
Vírgulas são completamente opcionais, você pode inserí-las no lugar
que você preferir ou em lugar nenhum que não fará diferença.
Use-as com moderação e elas farão seu programa ficar mais
caprichado.
Quando executar o programa, ele deve perguntar a você por um
número, então irá mostrar este número ao longo de dois outros
cálculos que ele acabou de realizar. O número dado não pode
ser maior que 3 espaços alocados para ele, senão somente os
três caracteres finais que são dados, se ele são dados menos
que 3 caracteres, então mostrará zeros primeiro. Caracteres
não numéricos irão mostrar algum código de debug.
A adição das variáveis a e b devem mostrar um bom funcionamento,
embora você note que a resposta é arredondada, como nós pedimos.
Adicionando c e d não fará coisa alguma, desde que a resposta
seja muito grande para adequar-se na variável d. Tente mudar c para,
digo, 1.5 e tudo irá funcionar muito bem.
Make
Por agora você pode obter um pequeno aborrecimento com as rotinas
htcobol, as e gcc. Bom há um caminho melhor, make. O make exige
um arquivo chamado Makefile e usa as instruções para funcionar
que necessitamos compilar em um simples passo. Ele também checa
se o arquivo necessita de compilação antes de ele fazer
qualquer coisa, se nenhuma das dependências dos programas foram
modificados desde a última compilação, nenhum sendo feito.
As regras do makefile são da seguinte forma:
alvo:dependências
comando
O alvo(que deve iniciar na primeira coluna) é o arquivo que você
está tentando obter. As dependências são os arquivos dos quais ele
depende. O comando(que deve ser a segunda linha e precedida
por um tab) é o comando que você normalmente, digita no shell
para fazer seu arquivo. Aqui está um makefile para addition:
#um simples makefile para um programa cobol
addition:addition.o
gcc -o addition addition.o -lhtcobol -lm
addition.o:addition.s
as -o addition addition.s
addition.s:addition.cob
htcobol addition
Salve o como makefile neste mesmo diretório como addition.cob
e digite make. Ele deve compilar, assemblar e linkar para você.
Por default, make irá compilar a primeira regra no arquivo. Este
é para criar o binário addition, mas este depende do addition.o
que para fazer addition.o depende do addition.s. Então este é o
primeiro comando que o make executa. Agora ele cria addition.o e
finalmente addition.o está pronto para criar addition. Se você
tentar digitar make novamente, não irá fazer coisa alguma, por
que nenhum dos arquivos foi modificado então não há necessidade
(o make olha o arquivo timestamp para determinar isso), mude
addition.cob bem de leve e execute make e todo o processo
executará novamente.
Make Avançado
Mas o makefile anterior tem um problema: e se você quiser
adaptá-lo para trabalhar com um outro programa? há bastante
mudanças em addition para fazê-lo e com um programa mais
complicado que irá pedir tempos. Felizmente make tem muitas
complexidades na manga. Aqui está um makefile avançado:
#makefile para um programa cobol composto de um único arquivo.
PROGRAM := addition
LIBS := -lhtcobol -lm
OBJECTS := $(PROGRAM).o
$(PROGRAM):$(OBJECTS)
gcc -o $(PROGRAM) $(OBJECTS) $(LIBS)
#regras para os mesmos arquivos terminados em .o
#depende do arquivo com mesmo prefixo com .s
# $@ é o alvo
%.o:%.s
as -o $@ $<
%.s:%.cob
htcobol $(PROGRAM)
O makefile inicia com algumas variáveis. PROGRAM é o nome do programa
que nós estamos criando. Você pode ver se ele está sendo usado na
primeira regra(precedido por um sinal de dólar delimitado com
parênteses). LIBS é justamente as bibliotecas que nós precisamos
para compilar o programa. OBJECTS é alguns arquivos objetos
necessários, neste caso é exatamente um, e que possui o mesmo nome
com um .o no final, que é justamente como ele é declarado.
A segunda regra combina os alvos terminados em .o (%.o) e ele
requer o mesmo arquivo com um sufixo .s (%.s como uma dependencia).
A variável automática $@ iguala o nome do alvo e $< iguala a
primeira dependência. Por agora você deve estar também trabalhando
o seu caminho até o alvo final.
Se você quiser adaptar este makefile para outro programa COBOL,
tudo que você tem que fazer é mudar o valor da variável $PROGRAM.
O Final
Isto é tudo por agora. Deve possivelmente haver um outro capítulo aqui
com um programa que usa mais de um arquivo e o pré-processador,
mas isto é além do meu conhecimento por hoje. Talvez também alguns
links para recursos do COBOL.
Jonathan Riddell, jr@jriddell.org