COBOL 60 anos: Um dos primeiros programas da História escritos em Cobol – GotoCobol
COBOL 60 anos: Um dos primeiros programas da História escritos em Cobol
Depois que uma primeira proposta da linguagem Cobol foi apresentada ao comitê executivo do CODASYL em dezembro de 1959, e uma primeira especificação oficial foi descrita pelo Departamento de Defesa dos EUA, em abril de 1960, programadores da Remington Rand Univac e da RCA escreveram seus primeiros compiladores para traduzir os comandos do Cobol para linguagem de máquina.
Ao mesmo tempo, escreveram diversos programas para testar seus compiladores.
O National Museum of American History possui em seu acervo uma das primeiras listagens de um desses programas. Ele foi executado pela RCA em 16 de Agosto de 1960 num computador RCA 501. Em dezembro do mesmo ano, Remington Rand e RCA trocaram seus fontes e conseguiram executar, com poucas alterações, o programa de uma no computador da outra, atendendo à premissa principal do CODASYL: a interoperabilidade da linguagem COBOL.
Isso é Cobol?
A listagem não é completa, mas nos permite observar as semelhanças com o Cobol que conhecemos hoje, e também notar diferenças não só com o Cobol atual mas também com a especificação original da linguagem, de abril de 1960.
National Museum of American History. Courtesy of Howard Bromberg.
O código abaixo é uma transcrição literal do que aparece na primeira página:
2 HEADER-A; SIZE IS 68; CLASS IS AN.
2 PAGE; SIZE IS 7; CLASS IS NUMERIC; SIGNED; ZERO SUPPRESS; LEAVING 1 PLACES.
2 FILL-7; SIZE IS 4; CLASS IS AN.
1 SECOND-HEADINNG; SIZE IS 120; CLASS IS AN.
77 DEFFICIENCY; SIZE IS 8; CLASS IS NUMERIC; SIGNED.
77 PRODUCTION-QUOTA; SIZE IS 8; CLASS IS NUMERIC; SIGNED.
77 DIFFERENCE-FACTOR; SIZE IS 8; CLASS IS NUMERIC; SIGNED.
77 PAGE-COUNT; SIZE IS 7; CLASS IS NUMERIC; SIGNED.
77 LINE-COUNT; SIZE IS 4; CLASS IS NUMERIC; SIGNED.
1 COMPILATION-DATE; SIZE IS 17; CLASS IS AN.
2 SM; SIZE IS 1
2 DATE; SIZE IS 15.
2 EM: SIZE IS 1.
77 TWENTY-PERCENT; SIZE IS 2; CLASS IS NUMERIC; SIGNED; POINT LOCATION IS LEFT 1 PLACE; VALUE IS "2".
77 TEN-PERCENT; SIZE IS 2; CLASS IS NUMERIC; SIGNNED; POINT LOCATION IS LEFT 1 PLACE; VALUE IS "1".
77 HEADER-B; SIZE IS 120; CLASS IS AN; VALUE IS "       PRODUCT NUMBER          PRODUCT       MEASURE       QUANTITY ON
HAND   EXPECTED TURNOVER    PRODUCTION QUOTA       ".
00001. OPEN INPUT MASTER, TRANSACTION; OUTPUT NEW-MASTER, REPORT.
00002. ACCEPT COMPILATION-DATE FROM PAPER-TAPE-READER.
00003. MOVE ZEROS TO PAGE-COUNT, LINE-COUNT.
00004. PERFORM 35 THRU 42.
00005. READ MASTER; AT END GO TO 46.
00006. READ TRANSACTION; AT END GO TO 48.
00007. IF PRODUCT-NUMBER OF MASTER-1 IS EQUAL TO PRODUCT-NUMBER OF TRANSACTION-1 GO TO 8; IF GREATER GO TO 44; OTH-
ERWISE GO TO 12.
E abaixo, a transcrição da segunda página:
00036. ADD "1" TO PAGE-COUNT.
00037. MOVE PAGE-COUNT TO PAGE.
00038. MOVE "PLAST-WIRE PRODUCTION REQUIREMENTS REPORT                    PAGE" TO HEADER-A.
00039. MOVE DATE TO R-DATE.
00040. WRITE FIRST-HEADING BEFORE ADVANCING 1 LINE.
00041. MOVE HEADER-B TO SECOND-HEADING.
00042. WRITE SECOND-HEADING BEFORE ADVANCING 2 LINES.
00043. MOVE ZEROES TO LINE-COUNT; GO TO 31.
00044. DISPLAY "NO MATCH ERROR",. PRODUCT-NUMBER OF TRANSACTION-1 UPON MONITOR; GO TO 6.
00045. DISPLAY "CHANGE-CODE ERROR", PRODUCT-NUMBER OF TRANSACTION-1 UPON MONITOR; GO TO 6.
00046. DISPLAY "NO MATCH ERROR", PRODUCT-NUMBER OF TRANSATION-1 UPON MONITOR.
00047. READ TRANSACTION; AT END GO TO 50; GO TO 46.
00048. ALTER 31 TO PROCEED TO 49; GO TO 12.
00049. READ MASTER; AT END GO TO 50; GO TO 12.
00050. CLOSE MASTER, TRANSACTION, NEW-MASTER, REPORT.
00051. STOP RUN.
Cadê as Pictures?
A cláusula PICTURE já era prevista na especificação original da linguagem, publicada em 1960. Mas o que vemos aqui é o uso de outras cláusulas também previstas naquela especificação: SIZE IS, CLASS IS, SIGNED, POINT LOCATION…
Neste artigo que postei aqui, citei um comentário de Jean Sammet, uma das participantes das discussões no CODASYL, que disse que havia um certo sentimento anti-IBM por parte de alguns participantes. Sabemos que a cláusula PICTURE veio da linguagem COMTRAN, que vinha sendo desenvolvida pela IBM.
Logo, o que me parece é que o fato da especificação permitir as duas formas de declaração de variável mais o fato da RCA ter optado por não utilizar a PICTURE no seu programa, mostra que o comentário de Jean Sammet faz sentido.
Ao longo do tempo, a PICTURE acabou prevalecendo. E não por acaso…
77 TWENTY-PERCENT; SIZE IS 2; CLASS IS NUMERIC; SIGNED;
POINT LOCATION IS LEFT 1 PLACE; VALUE IS "2".
… é muito menos prático que…
77 TWENTY-PERCENT PIC S9V9 VALUE 0.2.
Pois é… havia uma seção para itens cujo valor não seria alterado pelo programa.
Hoje, o padrão COBOL ISO 2002 prevê uma cláusula CONSTANT para informar ao compilador que determinado item (da WORKING) não será alterado. Mas não existe mais uma SECTION específica para esse tipo de dado.
Curiosamente, os compiladores da Fujitsu e da Bull ainda permitem a criação dessa seção. Mas que eu saiba são os únicos.
PERFORM 35 THRU 42
Como eu comentei neste artigo, uma das grandes discussões realizadas pelo subcomitê de curto prazo do CODASYL estava relacionada ao uso de comandos GO TO sequence-number, ou seja, a possibilidade de desviar para uma linha específica do programa, e não para um parágrafo.
No relatório apresentado em 1959 e no documento final publicado em abril de 1960 essa possibilidade não existe, nem para o comando GO TO nem para o comando PERFORM.
Mas o que vemos aqui é que a RCA implementou essa opção. De fato não há um só parágrafo em toda a PROCEDURE DIVISION. Agora sabemos que Ben Cheydleur, o representante da RCA no CODASYL, foi um dos que defendiam o uso da numeração de linha em comandos de desvio.
A listagem que está no museu tem ainda o relatório que foi gerado por esse programa. Nada excepcional. Apenas um relatório de controle de inventários…
Mas o que me chamou a atenção é a data que aparece no canto superior direito:
DATE: GUST 16, 1960.
É… não deve ter sido culpa do compilador.
A última página da listagem está em branco, com quatro frases escritas a caneta:
"Bom output – 8/16/60"
(Não está bonito?)
Na verdade não (riscado)
Bem… quase
Se tem uma coisa que não mudou (e não mudará nunca) é o orgulho que nós programadores sentimos quando fazemos algo que ninguém fez antes.