# COBOL

COBOL (sigla de COmmon Business Oriented Language) - Linguagem Comum Orientada para os Negócios é uma linguagem de programação orientada para o processamento de banco de dados comerciais. É a linguagem de programação inteira mais usada, produto do Departamento de Defesa norte-americano sob a direção da contra-almirante Grace Murray Hopper.
A linguagem ainda é amplamente utilizada em sistemas legados armazenados em mainframes. Entretanto, devido à sua baixa popularidade e à aposentadoria dos programadores experientes, muitos dos sistemas estão sendo migrados para novas plataformas e reescritos em linguagens mais modernas. Atualmente, a maior parte do código em COBOL existe essencialmente para manter aplicações existentes.
As especificações do COBOL 2002 incluem suporte à programação orientada a objetos e outras características das linguagens modernas.

## História e especificação

O COBOL foi criado por um comitê de investigadores de várias instituições civis e governamentais durante o segundo semestre de 1959. As especificações eram em grande parte inspiradas na linguagem de programação FLOW-MATIC inventada pela Grace Hopper - referida como "a mãe da língua COBOL."
A linguagem de programação da IBM COMTRAN inventada por Bob Bemer também foi utilizada, mas a especificação da FACT da Honeywell tinha sido distribuída até tarde aos membros do comitê do processo, e teve relativamente pouco impacto.
O uso corrente e o estudo do FLOW-MATIC como a única linguagem do grupo de estudo que efetivamente tinha sido utilizada numa situação real, fez com que fosse bastante atractiva ao comitê.
Em 8 de abril de 1959, na CODASYL (Conference on Data Systems Language) destinada a usuários e pessoas da universidade, no centro de computação da Universidade da Pensilvânia, o Departamento de Defesa dos Estados Unidos, posteriormente, concordou em patrocinar e supervisionar as próximas atividades. A reunião presidida por Charles A. Phillips foi realizada no Pentágono em 28/29 de maio de 1959 (exatamente um ano após a reunião em Zurique do ALGOL 58), não foi decidido definir de três comissões: de curto, médio e longo alcance (a última nunca foi realmente formada).
Foi o Comitê de Curto Prazo, presidido por Joseph Wegstein do National Bureau of Standards (NBS) que durante os meses seguintes criou uma descrição da primeira versão do COBOL.
O Comitê de Curto Prazo foi constituído por membros representantes de seis fabricantes de computadores e três órgãos governamentais, a saber: Burroughs Corporation, IBM, Minneapolis-Honeywell (Honeywell Labs), RCA, Sperry Rand, Sylvania Electric Products, a Força Aérea dos Estados Unidos, o David Taylor Model Basin (DTMB) e o NBS. Este comitê foi presidido por um membro do NBS.
Um comitê de Médio Prazo e outro de Longo Prazo foram também propostos na reunião do Pentágono. Entretanto, embora tenha sido formado, o Comitê de Médio Prazo nunca chegou a funcionar; e o Comitê de Longo Prazo nem chegou a ser formado. Por fim, um subcomitê do Comitê de Curto Prazo desenvolveu as especificações da linguagem COBOL. Este subcomitê era formado por seis pessoas:
* William Selden e Gertrude Tierney da IBM
* Howard Bromberg e Howard Discount da RCA
* Vernon Reeves e Jean E. Sammet da Sylvania Electric Products
A decisão de usar o nome "COBOL" foi feita em uma reunião do comitê realizada em 18 de setembro de 1959. O subcomitê completou as especificações para o COBOL em dezembro de 1959.
O primeiro compilador para COBOL foi posteriormente implementado em 1960 e em 6/7 de dezembro, essencialmente o mesmo programa COBOL funcionou em dois computadores diferentes, um computador RCA e uma Remington-Rand Univac, demonstrando que a compatibilidade pode ser alcançada.

### ANS COBOL 1968

Depois de 1959 o COBOL-1968 sofreu várias modificações e melhorias. Na tentativa de superar o problema da incompatibilidade entre diferentes versões de COBOL, o American National Standards Institute (ANSI) desenvolveu uma forma padrão de língua, em 1968, após o lançamento da versão COBOL-61 que se tornou a pedra angular para mais versões. Esta versão ficou conhecida como American National Standard (ANS) COBOL.

### COBOL 1974

Em 1974, a ANSI publicou uma versão revista do COBOL-1968, que continha uma série de recursos que não estavam na versão 1968.

### COBOL 1985

Em 1985, a ANSI publicou ainda uma outra versão revista do COBOL-1985 que tinha novas funcionalidades que não apareciam no padrão 1974, como construções de linguagem mais notavelmente estruturadas ("terminadores de escopo"), incluindo END-IF, END-PERFORM, END-READ, etc.

### História de normas COBOL

As especificações aprovadas por todo o Comitê de Curto Prazo foram aprovadas pelo Comitê Executivo em 3 de janeiro de 1960, e enviadas para a gráfica do governo que editou e imprimiu essas especificações como COBOL 60.
O American National Standards Institute (ANSI) produziu várias revisões do padrão COBOL, incluindo:
* COBOL-1968
* COBOL-1974
* COBOL-1985
* Intrinsic Functions Amendment - 1989
* Corrections Amendment - 1991
Após as alterações de 1985 o padrão ANSI (que era adotado pela ISO), o desenvolvimento e a apropriação foi assumida pela ISO. As seguintes edições e TRs (Relatórios Técnicos) foram emitidas pelo padrão ISO (e adotados como ANSI):
* COBOL 2002
* Finalizer Technical Report - 2003
* Native XML syntax Technical Report - 2006
* Bibliotecas de coleção de classes orientadas a objeto - aprovação pendente
Desde 2002, o padrão ISO também está disponível para o público codificado como ISO / IEC 1989.
O trabalho progride na próxima revisão integral da norma COBOL. A aprovação e disponibilidade era esperado primeiros em 2010. Para obter informações sobre esta revisão, ver o mais recente projeto desta revisão, ou para ver o que as outro trabalhos em progresso no padrão COBOL, consulte o site de normas do COBOL.

## COBOL Orientado a Objetos

A linguagem de programação de computadores COBOL continua a evoluir até hoje. No início de 1990, decidiu-se acrescentar a orientação a objetos na próxima revisão completa do COBOL. A estimativa inicial era ter esta revisão concluída em 1997 e um ISO CD (Committee Draft, rascunho do comitê) disponível até 1997.
Assim como a C++ e a Java, os compiladores COBOL estão disponíveis enquanto a linguagem se move em direção à padronização.
Alguns fornecedores (incluindo a Micro Focus, a Fujitsu, a Hitachi, a Veryant e a IBM) introduziram a sintaxe orientada a objetos, com base nos rascunhos de 1997 ou outro da revisão completa.
A Fujitsu, a Micro Focus e a Raincode PL/1 atualmente suportam os compiladores COBOL orientados a objetos visando o .NET.

## ISO COBOL 2002

A versão ISO COBOL 2002, é uma versão do COBOL que foi criado no padrão ISO (adotado como um padrão ANSI por INCITS) que foi aprovada e disponibilizada em 2002, e foi projetado para ser utilizado em servidor mainframe, como por exemplo: IBM, HITACHI, etc.
O ISO COBOL 2002 incluiu diversos recursos extras, além da orientação a objetos, (mas não estão limitados a):
* Suporte a idiomas (incluindo, mas não limitado a suporte ao Unicode)
* Processamento baseado em Locale
* Funções amigáveis ao usuário
* CALL (e função) protótipos (para a verificação de parâmetro em tempo de compilação)
* Ponteiros e sintaxe para a obtenção/liberação de armazenagem
* Convenções de chamada de e para línguas não-COBOL, como C
* Suporte para execução em ambientes estruturas como .NET e Java (incluindo COBOL instanciado como Enterprise JavaBeans)
* Suporte a Bit e Bool
* Suporte a "True", até esta melhoria itens binários eram truncados (pela especificação de base-10) dentro da DATA DIVISION.
* Suporte a ponto flutuante
* Resultados aritméticos padrão (ou portáteis)
* Geração e parsing de XML

## Microsoft COBOL

O Microsoft COBOL é uma versão de COBOL orientado a objetos que é utilizado dentro do Microsoft Visual Studio .NET. O Cobol é uma linguagem de alto nível projetada para uso em negócios, e que usa comandos com sintaxe em inglês. A Microsoft começou cedo produzindo produtos de idiomas como este. Seus outros produtos de idiomas antigos incluíam Microsoft Fortran, Microsoft Pascal, Microsoft Visual Basic e Macro Assembler. Este produto também foi licenciado para a IBM como IBM Cobol Compiler. Atualmente o Microsoft COBOL está na versão 5.0 disponível para download.

## Micro Focus Visual COBOL

A empresa Micro Focus produz o software Micro Focus Visual COBOL que é uma versão do COBOL orientado a objetos, projetado para uso em sistema operacional Windows, com suporte para execução em ambiente .NET.

## GnuCOBOL

O compilador Livre/Aberto COBOL que produz executáveis nativos a partir do código-fonte. A atual versão (3.2), funciona em plataformas como Linux, BSD, muitos sistemas Unix proprietários, MacOs, Windows, dentre outros. Esta é a melhor versão para os usuários, extensivamente testada em uma variedade de ambientes comerciais.
Algumas das suas características incluem:
* Integração com a Linguagem de Programação C (linguagem de programação);
* 19 Dialetos;
* Declarações REPORT SECTION, SCREEN SECTION e FUNCTION-ID;
* Instalação do compilador COBOL 2014, com conjunto de características;
* Mais de 9740 testes NIST COBOL;
** 85 testes passados;
** mais de 1000 verificações internas;
* Depuração integrada do IDE e Suporte ao GNU Gbd.
A versão recente inclui muitas novas características que mantém a completa compatibilidade com a fonte. Alguns dos destaques são:
* Manipulação melhorada do dialeto, incluindo alterações de incumprimentos para melhor correspondência do dialeto selecionado, um novo dialeto completo GCOS e apoio para mais declarações de COBOL, funções intrínsecas e sintaxe de ambos os "velhos" e novos dialetos.
* Tempo de execução altamente melhorado para várias declarações, juntamente com menos uso de memória, especialmente se as verificações de tempo de execução estiverem ativadas.
* Alterações no arquivo para o suporte a LINE-SEQUENTIAL por COBOL2023 e opções de tempo de execução de modo a manusear arquivos. (Veja NEWS e runtime.cfg).
* Otimizações para a depuração em nível de fonte via GDB e coredump.
Muitas outras características mantém uma completa compatibilidade com a fonte. Veja o arquivo NEWS para uma completa descrição da versão disponibilizada, assim como para compilações com qualquer -std para saber mais sobre as implicações.

## ISO / IEC 1989: 2014
### Linguagem de programação COBOL

ISO / IEC 1989: 2014 especifica a sintaxe e semântica do COBOL. Seu objetivo é promover um alto grau de independência da máquina para permitir o uso de COBOL em uma variedade de sistemas de processamento de dados.
ISO / IEC 1989: 2014 especifica:
* a forma de um grupo de compilação escrito em COBOL;
* o efeito de compilar um grupo de compilação;
* o efeito da execução de unidades de execução;
* os elementos da linguagem para os quais uma implementação conforme é necessária para fornecer uma definição;
* os elementos da linguagem para os quais o significado é explicitamente indefinido;
* os elementos da linguagem que dependem dos recursos do processador.
ISO / IEC 1989: 2014 não especifica:
* os meios pelos quais um grupo de compilação escrito em COBOL é compilado em código executável por um processador;
* o momento no qual o método, função ou módulos de tempo de execução do programa são vinculados ou vinculados a uma instrução de ativação, exceto que a ligação de tempo de execução ocorre por necessidade quando a identificação do programa ou método apropriado não é conhecido no tempo de compilação;
* o momento em que as classes e interfaces parametrizadas são expandidas;
* o mecanismo pelo qual as localidades são definidas e disponibilizadas em um processador;
* a forma ou conteúdo das mensagens de erro, sinalização ou aviso;
* a forma e o conteúdo das listagens produzidas durante a compilação, se houver;
* a forma de documentação produzida por um implementador de produtos em conformidade com esta Norma;

## Fujitsu NET COBOL

A empresa Fujitsu produz o software Fujitsu NET COBOL que é uma versão do COBOL orientado a objetos, projetado para uso em servidor mainframe, com suporte para execução em ambiente .NET.

## IBM COBOL

A empresa IBM nos últimos anos já produziu o software IBM COBOL em diversas versões: IBM OS/VS COBOL, IBM COBOL/II, IBM COBOL SAA, IBM Enterprise COBOL, IBM COBOL/400, IBM ILE COBOL, projetado para uso em servidor mainframe, com suporte para execução em ambiente com sistema operacional compatível com UNIX. A versão mais atualizada dele é o "IBM Enterprise COBOL for z/OS".

## Legado COBOL

Os programas criados em linguagem COBOL estão em uso globalmente em agências governamentais e militares além de empresas comerciais, e estão sendo executados em sistemas operacionais como o da IBM z/OS e z/VSE, as famílias POSIX (Unix / Linux, etc) e Windows da Microsoft, bem como Unisys |OS 2200.
Em 1997, o Gartner Group relatou que 80% dos negócios do mundo rodavam em COBOL com mais de 200 bilhões de linhas de código existentes e cerca de 5 bilhões de linhas de código novo por ano.

## Características

O COBOL teve como meta servir como uma linguagem de programação para negócios. Os programas para negócios não precisam de cálculos tão precisos como os encontrados em engenharia, assim o COBOL foi concebido basicamente com as características:
* Acesso rápido e atualização de arquivos e bases de dados;
* Geração de uma grande quantidade de informações; e
* Saída com um formato compreensível ao usuário.
O COBOL é geralmente a linguagem escolhida em cálculos financeiros por suportar aritmética inteira aplicada a números muito grandes (milhões, bilhões etc) ao mesmo tempo que é capaz de lidar com números muito pequenos como frações de centavos. Outra característica é a formatação, classificação e geração de relatórios.

### Olá, mundo

Um exemplo do programa "Olá, Mundo" em COBOL:
Existem vários dialetos do COBOL. Alguns compiladores, por exemplo, permitem o uso de aspas duplas, além do padrão de aspas simples:

### Olá, OS/360 cerca de 1972

Em um IBM System/360 executando OS/360 MVT 21.8f, por volta de 1972, o teste Olá, Mundo teria levado cartões perfurados de 80 colunas, contendo o código-fonte semelhante a:

## Estrutura básica

No COBOL há três tipos básicos de dados usados nas instruções:
* Numérico (sinalizado ou não, com decimal ou inteiros)
* Alfanumérico
* Constantes figurativas
O COBOL consiste basicamente em quatro divisões separadas:
* IDENTIFICATION DIVISION
A IDENTIFICATION DIVISION possui informações documentais, como nome do programa, quem o codificou e quando essa codificação foi realizada.
* ENVIRONMENT DIVISION
A ENVIRONMENT DIVISION descreve o computador e os periféricos que serão utilizados pelo programa.
* DATA DIVISION
A DATA DIVISION descreve os arquivos de entrada e saída que serão usadas pelo programa. Também define as áreas de trabalho e constantes necessárias para o processamento dos dados.
* PROCEDURE DIVISION
A PROCEDURE DIVISION contém o código que irá manipular os dados descritos na DATA DIVISION. É nesta divisão que o desenvolvedor descreverá o algoritmo do programa.

### Área de codificação no COBOL

Colunas Descrição

## Críticas e defesas
### Falta de estruturalismos

Na década de 1970, a adoção da programação estruturada paradigma estava se tornando cada vez mais difundido. Edsger Dijkstra , um cientista da computação proeminente, escreveu uma carta ao editor de Comunicações da ACM , publicado 1975, intitulado "Como podemos dizer verdades que possam ferir?", No qual ele foi crítico de COBOL e várias outras linguagens contemporâneas; observando que "o uso de COBOL aleija a mente". Em uma dissidência publicado para observações de Dijkstra, o cientista da computação Howard E. Tompkins afirmou que não estruturada COBOL tendiam a ser "escrito por programadores que nunca tiveram o benefício de estruturada COBOL ensinou bem", argumentando que a questão era primariamente um de treinamento.
Uma causa de código espaguete foi o GO TOcomunicado. As tentativas para remover GO TOs de código COBOL, no entanto, resultou em programas complicados e qualidade do código reduzida. GO TOs foram em grande parte substituído pela declaração PERFORM e procedimentos, que promoveu a programação modular e deu fácil acesso aos meios de looping poderosos. No entanto, PERFORMsó poderia ser usado com procedimentos tão corpos de loop não foram localizados onde foram usados, fazendo programas mais difícil de entender.
Programas COBOL foram infame por ser monolítico e sem modularização. COBOL código só pode ser modularizado através de procedimentos, os quais se verificou serem inadequados para grandes sistemas. Era impossível restringir o acesso aos dados, significando que um procedimento poderia acessar e modificar qualquer item de dados. Além disso, não havia maneira de passar parâmetros para um procedimento, uma omissão Jean Sammet considerado como maior erro do comitê. Outra complicação resultou da capacidade de PERFORM THRUuma sequência específica de procedimentos. Isto significava que o controle poderia saltar para e retornar a partir de qualquer procedimento, a criação de fluxo de controle complicado e permitindo um programador para quebrar a regra - saída única de entrada única.
Esta situação melhorou como COBOL adotada mais recursos. COBOL-74 subprogramas adicionados, dando programadores a capacidade para controlar os dados de cada parte do programa pode aceder. COBOL-85, em seguida, acrescentou subprogramas aninhados, permitindo que programadores pudessem esconder subprogramas. Além disso controle sobre os dados e código veio em 2002, quando a programação orientada a objetos, funções e tipos de dados, definidos pelo usuário, foram incluídos.
No entanto, muito mais importante software legado COBOL usa código não estruturados, que se tornou insustentável. Ele pode ser muito arriscado e caro para modificar ainda uma seção de código simples, uma vez que pode ser usado a partir de lugares desconhecidos em caminhos desconhecidos.

### Problemas de compatibilidade após normalização

O COBOL 85 não era totalmente compatível com as versões anteriores, resultando nem um "parto de cesariana" do COBOL 85. Joseph T. Brophy, CIO, St. Paul Travelers (Travelers Insurance), lideraram uma força-tarefa para informar aos usuários de COBOL dos pesados custos de reprogramação para implementar o novo padrão. Como resultado, o Comitê ANSI do COBOL recebeu mais de 3.200 cartas do público, em sua maioria negativas, exigindo que o comitê fizesse as alterações. Por outro lado, a conversão para COBOL 85 foi pensada para aumentar a produtividade nos próximos anos, justificando, assim, os custos de conversão.

### Sintaxe verbosa

A sintaxe da COBOL tem sido muitas vezes criticada por sua verbosidade. No entanto, os defensores notam que isto foi intencional no projeto da linguagem, e muitos a consideram um dos pontos fortes da COBOL. Um dos objetivos do projeto de COBOL foi que gerentes, supervisores e usuários não-programadores pudessem ler e entender seu código. É por isso que a COBOL tem o inglês como sintaxe e elementos estruturais, incluindo: substantivos, verbos, orações, frases, seções e divisões. Consequentemente, a COBOL é considerada por pelo menos uma fonte a ser "A linguagem de programação mais legível, compreensível e documentada em uso hoje. [...] Não só esta legibilidade geralmente auxilia o processo de manutenção, mas quanto mais velho um programa se tornar, mais valiosa se torna essa legibilidade." Por outro lado, a mera capacidade de ler e entender algumas linhas de código da COBOL não concede a um executivo ou usuário final a experiência e os conhecimentos necessários para projetar, construir e manter sistemas de software de grande porte.

### Isolamento da área acadêmica

Nenhum acadêmico da ciência da computação participou do projeto do COBOL: todos do comitê faziam parte da área comercial ou do governo. Enquanto o COBOL procurava resolver problemas de processamento de arquivos comerciais, os cientistas da computação estavam mais interessados em campos como análise numérica, física e programação de sistemas. O desdém dos acadêmicos pelo processamento de dados empresariais e a não participação de cientistas da computação influentes no projeto da linguagem contribuíram para a impopularidade do COBOL.

### Outras defesas

Além disso, tradicionalmente a COBOL é uma linguagem simples, com alcance limitado da função (sem ponteiros, sem tipos definidos pelo usuário e sem funções definidas pelo usuário), estimulando um estilo de codificação simples. Isso fez com que seja bem adequada ao seu domínio principal de computação de negócios, onde a complexidade do programa encontra-se em regras de negócio que precisam ser codificados em vez de sofisticados algoritmos e estruturas de dados. E porque a norma não pertence a nenhum fornecedor em particular, os programas escritos em COBOL são altamente portáteis. A língua pode ser utilizada numa grande variedade de plataformas de hardware e sistemas operativos. E sua estrutura hierárquica rígida restringe a definição de referências externas para a Divisão de Ambiente (environment division), o que simplifica a mudança de plataforma em particular.