COBOL (Português)

SyntaxEdit

COBOL tem uma sintaxe semelhante ao inglês, que é usada para descrever quase tudo em um programa. Por exemplo, uma condição pode ser expressa como x É MAIOR QUE y ou mais concisamente como x MAIOR y ou x > y . Condições mais complexas podem ser “abreviadas” removendo condições e variáveis repetidas. Por exemplo, a > b AND a > c OR a = d pode ser abreviado para a > b AND c OR = d . Para oferecer suporte a essa sintaxe semelhante ao inglês, COBOL tem mais de 300 palavras-chave. Algumas das palavras-chave são alternativas simples ou grafias pluralizadas da mesma palavra, o que fornece mais declarações e orações semelhantes ao inglês; por exemplo, as palavras-chave IN e OF podem ser usadas alternadamente, assim como É e SÃO e VALOR e VALORES .

Cada programa COBOL é composto de quatro itens lexicais básicos: palavras, literais, strings de caracteres de imagem (ver § IMAGEM cláusula) e separadores. Palavras incluem palavras reservadas e identificadores definidos pelo usuário. Eles têm até 31 caracteres e podem incluir letras, dígitos, hifens e sublinhados. Literais incluem numerais (por exemplo, 12 ) e strings (por exemplo, "Hello!" ). Os separadores incluem o caractere de espaço e vírgulas e ponto e vírgula seguidos de um espaço.

Um programa COBOL é dividido em quatro divisões: a divisão de identificação, a divisão de ambiente, a divisão de dados e a divisão de procedimento. A divisão de identificação especifica o nome e o tipo do elemento de origem e é onde as classes e interfaces são especificadas. A divisão do ambiente especifica quaisquer recursos do programa que dependem do sistema que o executa, como arquivos e conjuntos de caracteres. A divisão de dados é usada para declarar variáveis e parâmetros. A divisão do procedimento contém as instruções do programa. Cada divisão é subdividida em seções, que são compostas de parágrafos.

MetalanguageEdit

A sintaxe do COBOL é geralmente descrita com um metalinguagem única usando chaves, colchetes, barras e sublinhado. A metalinguagem foi desenvolvida para as especificações COBOL originais. Embora a forma Backus – Naur existisse na época, o comitê não tinha ouvido falar dela.

Elementos da metalinguagem do COBOL
Elemento Aparência Função
Todas maiúsculas EXEMPLO Palavra reservada
Sublinhado EXEMPLO A palavra reservada é obrigatório
Chaves {} Apenas uma opção pode ser selecionada
Parênteses Zero ou uma opção pode ser selecionada
Reticências O elemento anterior pode ser repetido
Barras {| |} Uma ou mais opções podem ser selecionadas. Qualquer opção pode ser selecionada apenas uma vez.
Zero ou mais opções podem ser selecionadas. Qualquer opção pode ser apenas selecionado uma vez.

Como exemplo, consi der a seguinte descrição de uma ADD instrução:

Esta descrição permite as seguintes variantes:

ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"

FormatEdit de código

COBOL pode ser escrito em dois formatos: fixo (o padrão) ou livre. No formato fixo, o código deve ser alinhado para caber em certas áreas (uma limitação do uso de cartões perfurados).Até o COBOL de 2002, eram:

Nome Coluna (s) Uso
Área do número de sequência 1–6 Originalmente usado para cartão / números de linha (facilitando a classificação mecânica dos cartões perfurados para garantir a sequência do código do programa pretendida após a edição / manipulação manual), esta área é ignorada pelo compilador
Área do indicador 7 Os seguintes caracteres são permitidos aqui:

  • * – Linha de comentário
  • / – Linha de comentário que será impressa em uma nova página de uma lista de origem
  • - – Linha de continuação, onde palavras ou literais do a linha anterior é continuada
  • D – Linha habilitada no modo de depuração, que de outra forma é ignorada
Área A 8-11 Contém: DIVISION, SECTION e cabeçalhos de procedimento; Números de nível 01 e 77 e descritores de arquivo / relatório
Área B 12–72 Qualquer outro código não permitido na área A
Área do nome do programa 73– Historicamente até a coluna 80 para cartões perfurados, é usada para identificar o programa ou sequência à qual o cartão pertence

Em COBOL 2002, as áreas A e B eram mesclado para formar a área de texto do programa, que agora termina em uma coluna definida pelo implementador.

O COBOL 2002 também introduziu o código de formato livre. O código de formato livre pode ser colocado em qualquer coluna do arquivo, como nas linguagens de programação mais recentes. Os comentários são especificados usando *>, que pode ser colocado em qualquer lugar e também pode ser usado em código-fonte de formato fixo. As linhas de continuação não estão presentes e a diretiva >>PAGE substitui o indicador /.

Identificação divisionEdit

A divisão de identificação identifica a seguinte entidade de código e contém a definição de uma classe ou interface.

Edição de programação orientada a objetos

Classes e interfaces estão em COBOL desde 2002. Classes têm objetos de fábrica, contendo métodos e variáveis de classe, e objetos de instância, contendo métodos e variáveis de instância. Herança e interfaces fornecem polimorfismo. O suporte para programação genérica é fornecido por meio de classes parametrizadas, que podem ser instanciadas para usar qualquer classe ou interface. Os objetos são armazenados como referências que podem ser restritas a um determinado tipo. Existem duas maneiras de chamar um método: a instrução INVOKE , que atua de forma semelhante a CALL , ou por meio de invocação de método embutido, que é análogo ao uso de funções.

*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation

O COBOL não fornece uma maneira de ocultar métodos. Os dados da classe podem ser ocultados, entretanto, declarando-os sem uma cláusula PROPERTY , o que deixa o usuário sem nenhuma maneira de acessá-los. A sobrecarga de método foi adicionada ao COBOL 2014.

Environment divisionEdit

A divisão de ambiente contém a seção de configuração e a seção de entrada-saída. A seção de configuração é usada para especificar recursos variáveis, como sinais de moeda, locais e conjuntos de caracteres. A seção de entrada e saída contém informações relacionadas ao arquivo.

FilesEdit

COBOL oferece suporte a três formatos de arquivo ou organizações: sequencial, indexado e relativo. Em arquivos sequenciais, os registros são contíguos e devem ser percorridos sequencialmente, de forma semelhante a uma lista vinculada. Os arquivos indexados têm um ou mais índices que permitem que os registros sejam acessados aleatoriamente e que possam ser classificados neles. Cada registro deve ter uma chave exclusiva, mas outras chaves de registro alternativas não precisam ser exclusivas. As implementações de arquivos indexados variam entre os fornecedores, embora as implementações comuns, como C-ISAM e VSAM, sejam baseadas no ISAM da IBM. Arquivos relativos, como arquivos indexados, têm uma chave de registro exclusiva, mas não têm chaves alternativas. A chave do registro relativo é sua posição ordinal; por exemplo, o 10º registro tem uma chave 10. Isso significa que a criação de um registro com uma chave 5 pode exigir a criação de registros anteriores (vazios). Os arquivos relativos também permitem acesso sequencial e aleatório.

Uma extensão não padrão comum é a organização sequencial de linha, usada para processar arquivos de texto. Os registros em um arquivo são encerrados por uma nova linha e podem ter comprimentos variáveis.

Edição de divisão de dados

A divisão de dados é dividida em seis seções que declaram itens diferentes: a seção do arquivo, para registros de arquivo; a seção de armazenamento de trabalho, para variáveis estáticas; a seção de armazenamento local, para variáveis automáticas; a seção de ligação, para parâmetros e o valor de retorno; a seção de relatório e a seção de tela, para interfaces de usuário baseadas em texto.

DataEdit agregado

Os itens de dados em COBOL são declarados hierarquicamente por meio do uso de números de nível que indicam se um item de dados faz parte de outro. Um item com um número de nível superior está subordinado a um item com um número inferior. Os itens de dados de nível superior, com um número de nível 1, são chamados de registros. Os itens que possuem dados agregados subordinados são chamados de itens de grupo; aqueles que não o fazem são chamados de itens elementares. Números de nível usados para descrever itens de dados padrão estão entre 1 e 49.

No exemplo acima, item elementar num e item de grupo a data são subordinados ao registro algum registro , enquanto itens elementares o ano , o mês e o -day fazem parte do item de grupo the-date .

Itens subordinados podem ser desambigados com IN (ou OF ). Por exemplo, considere o código de exemplo acima junto com o seguinte exemplo:

 01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.

Os nomes o ano , o mês e o dia são ambíguos por si próprios, uma vez que mais de um item de dados é definido com esses nomes. Para especificar um determinado item de dados, por exemplo, um dos itens contidos no grupo data de venda , o programador usaria o ano da data de venda IN (ou o equivalente o ano DA data de venda ). (Esta sintaxe é semelhante à “notação de ponto” suportada pela maioria das linguagens contemporâneas.)

Outros níveis de dados Editar

Um número de nível 66 é usado para declarar um reagrupamento de itens previamente definidos, independentemente de como esses itens são estruturados. Este nível de dados, também referido pela cláusula RENAMES associada, raramente é usado e, por volta de 1988, era geralmente encontrado em programas antigos. Sua capacidade de ignorar os dados da estrutura hierárquica e lógica significava que seu uso não era recomendado e muitas instalações proibiam seu uso.

Um número de nível 77 indica que o item é autônomo e, em tais situações, é equivalente a o número de nível 01. Por exemplo, o código a seguir declara dois itens de dados de nível 77, nome da propriedade e sales-region , que são itens de dados não pertencentes ao grupo que são independentes (não subordinados a) quaisquer outros itens de dados:

 77 property-name PIC X(80). 77 sales-region PIC 9(5).

Um número de nível 88 declara um nome de condição (chamado de nível 88) que é verdadeiro quando seu item de dados pai contém um dos valores especificados em seu cláusula VALUE . Por exemplo, o código a seguir define dois itens de nome de condição de nível 88 que são verdadeiros ou falsos, dependendo do valor de dados do caractere atual do item de dados tipo salarial . Quando o item de dados contém um valor de "H" , o nome da condição wage-is-hourly é verdadeiro, enquanto quando contém um valor de "S" ou "Y" , o nome da condição wage-is-Annual é verdadeiro. Se o item de dados contiver algum outro valor, ambos os nomes das condições são falsos.

 01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".

Data typesEdit

O COBOL padrão fornece os seguintes tipos de dados:

Tipo de dados Exemplo de declaração Notas
Alfabético PIC A (30) Só pode conter letras ou espaços
Alfanumérico PIC X (30) Pode conter quaisquer caracteres
Booleano PIC 1 USAGE BIT Dados armazenados na forma de 0s e 1s, como um número binário
Índice ÍNDICE DE USO Usado para referenciar elementos de tabela
Nacional PIC N (30) Semelhante ao alfanumérico, mas usando um caractere estendido definido, por exemplo UTF-8
Numérico PIC 9 (5) V9 (5) Pode conter apenas números
Objeto USO DE REFERÊNCIA DE OBJETOS Pode fazer referência a um objeto ou NULL
Ponteiro PONTEIRO DE USO

A segurança de tipo é variável em COBOL.Os dados numéricos são convertidos entre diferentes representações e tamanhos silenciosamente e os dados alfanuméricos podem ser colocados em qualquer item de dados que pode ser armazenado como uma string, incluindo dados numéricos e de grupo. Em contraste, referências de objetos e ponteiros só podem ser atribuídos a partir de itens do mesmo tipo e seus valores podem ser restritos a um determinado tipo.

PICTURE clauseEdit

A PICTURE (ou PIC ) cláusula é uma sequência de caracteres, cada um dos quais representa uma parte do item de dados e o que pode conter. Alguns caracteres de imagem especificam o tipo do item e quantos caracteres ou dígitos ele ocupa na memória. Por exemplo, um 9 indica um dígito decimal e um S indica que o item é assinado. Outros caracteres de imagem (chamados de caracteres de inserção e edição) especificam como um item deve ser formatado. Por exemplo, uma série de + caracteres definem as posições dos caracteres e também como um caractere de sinal inicial deve ser posicionado nos dados do caractere final; o caractere não numérico mais à direita conterá o sinal do item, enquanto outras posições de caractere correspondentes a um + à esquerda desta posição conterão um espaço. Repetido os caracteres podem ser especificados de forma mais concisa, especificando um número entre parênteses após um caractere de imagem; por exemplo, 9 (7) é equivalente a 9999999 . Especificações de imagem contendo apenas dígitos ( 9 ) e sinal ( S ) caracteres definem itens de dados puramente numéricos, enquanto especificações de imagem contendo alfabéticos ( A ) ou alfanuméricos ( X ) caracteres definem itens de dados alfanuméricos. A presença de outros caracteres de formatação define itens de dados numéricos ou alfanuméricos editados.

USAGE clauseEdit

O USAGE declara o formato os dados são armazenados em. Dependendo do tipo de dados, eles podem complementar ou ser usados no lugar de uma cláusula PICTURE . Embora possa ser usado para declarar ponteiros e referências de objeto, é principalmente voltado para a especificação de tipos numéricos. Esses formatos numéricos são:

  • Binário, onde um tamanho mínimo é especificado pela cláusula PICTURE ou por uma USAGE cláusula como BINARY-LONG.
  • USO COMPUTACIONAL , onde os dados podem ser armazenado em qualquer formato que a implementação fornecer; frequentemente equivalente a USAGE BINARY
  • USAGE DISPLAY , o formato padrão , onde os dados são armazenados como uma string
  • Ponto flutuante, em um formato dependente da implementação ou de acordo com IEEE 754.
  • USAGE NATIONAL , onde os dados são armazenados como uma string usando um conjunto de caracteres estendidos
  • USAGE PACKED-DECIMAL , onde os dados é armazenado no menor formato decimal possível (geralmente decimal compactado com codificação binária)

Editor de redator de relatório

O redator de relatório é um recurso declarativo para a criação de relatórios. O programador precisa apenas especificar o layout do relatório e os dados necessários para produzi-lo, liberando-o da necessidade de escrever código para lidar com coisas como quebras de página, formatação de dados e cabeçalhos e rodapés.

Os relatórios são associados ao relatório arquivos, que são arquivos que só podem ser gravados por meio de declarações do elaborador de relatórios.

 FD report-out REPORT sales-report.

Cada relatório é definido na seção de relatório da divisão de dados. Um relatório é dividido em grupos de relatórios que definem os cabeçalhos, rodapés e detalhes do relatório. Os relatórios contornam as quebras de controle hierárquico. As quebras de controle ocorrem quando uma variável-chave altera seu valor; por exemplo, ao criar um relatório detalhando pedidos de clientes, um A quebra de controle pode ocorrer quando o programa atinge os pedidos de um cliente diferente. Aqui está um exemplo de descrição de relatório para um relatório que fornece as vendas de um vendedor e que avisa sobre quaisquer registros inválidos:

A descrição do relatório acima descreve o seguinte layout:

Quatro instruções controlam o redator do relatório: INITIATE , que prepara o redator do relatório para impressão; GERAR , que imprime um grupo de relatórios; SUPPRESS , que suprime a impressão de um grupo de relatórios; e TERMINATE , que encerra o processamento do relatório.Para o exemplo de relatório de vendas acima, a divisão do procedimento pode ter a seguinte aparência:

 OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .

O uso do recurso Report Writer tendia a variar consideravelmente; algumas organizações o usaram extensivamente e outras nem mesmo. Além disso, as implementações do Report Writer variaram em qualidade, com aqueles na extremidade inferior às vezes usando quantidades excessivas de memória em tempo de execução.

Procedure divisionEdit

ProceduresEdit

As seções e parágrafos na divisão do procedimento (chamados coletivamente de procedimentos) podem ser usados como rótulos e como sub-rotinas simples. Ao contrário de outras divisões, os parágrafos não precisam estar em seções. A execução segue os procedimentos de um programa até que seja encerrada. Para usar procedimentos como sub-rotinas, o PERFORM código> verbo é usado.

Uma instrução PERFORM lembra um pouco uma chamada de procedimento em uma linguagem moderna no sentido de que a execução retorna ao código seguindo a instrução PERFORM no final do código chamado; no entanto, ele não fornece nenhum mecanismo para passagem de parâmetro ou para retornar um valor de resultado. Se uma sub-rotina é chamada usando uma instrução simples como PERFORM sub-rotina , então o controle retorna no final do procedimento chamado. No entanto, PERFORM é incomum, pois pode ser usado para chamar um intervalo que abrange uma sequência de vários procedimentos adjacentes. Isso é feito com a construção PERFORM sub-1 THRU sub-n :

PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".

A saída deste programa será: “AABC”.

PERFORM também difere das chamadas de procedimento convencionais em que não há, pelo menos tradicionalmente, nenhuma noção de pilha de chamadas. Como consequência, invocações aninhadas são possíveis (uma sequência de código sendo PERFORM “ed pode executar um PERFORM própria instrução), mas requer cuidado extra se partes do mesmo código forem executadas por ambas as invocações. O problema surge quando o código na invocação interna atinge o ponto de saída da invocação externa. Mais formalmente, se o controle passa pelo ponto de saída de uma invocação PERFORM que foi chamada anteriormente, mas ainda não foi concluída, o padrão COBOL 2002 estipula oficialmente que o comportamento é indefinido.

A razão é que COBOL, ao invés de um “endereço de retorno”, opera com o que pode ser chamado de endereço de continuação. Quando o fluxo de controle chega ao final de qualquer procedimento, o endereço de continuação é pesquisado e o controle é transferido para esse endereço. o programa é executado, o endereço de continuação para cada procedimento é inicializado para o endereço inicial do profissional procedimento que vem a seguir no texto do programa para que, se nenhuma instrução PERFORM acontecer, o controle flui de cima para baixo no programa. Mas quando uma instrução PERFORM é executada, ela modifica o endereço de continuação do procedimento chamado (ou o último procedimento do intervalo chamado, se PERFORM THRU foi usado), de modo que o controle retornará ao site da chamada no final. O valor original é salvo e restaurado posteriormente, mas há apenas uma posição de armazenamento. Se duas invocações aninhadas operam em código sobreposto, elas podem interferir no gerenciamento mútuo do endereço de continuação de várias maneiras.

O exemplo a seguir (tirado de Veerman & Verhoeven 2006) ilustra o problema:

Pode-se esperar que a saída deste programa seja “1 2 3 4 3”: Depois de exibir “2”, o segundo PERFORM faz com que “3” e “4” sejam exibidos e, em seguida, a primeira invocação continua com “3”. Em implementações COBOL tradicionais, esse não é o caso. Em vez disso, o primeiro PERFORM a instrução define o endereço de continuação no final de LABEL3 para que retorne ao chamar o site dentro de LABEL1 . A segunda instrução PERFORM define o retorno no final de LABEL4 mas não modifica o endereço de continuação de LABEL3 , esperando que seja a continuação padrão. Assim, quando a invocação interna chega ao final de LABEL3 , ela volta para o PERFORM statement, e o programa deixa de imprimir apenas “1 2 3”. Por outro lado, em algumas implementações COBOL, como o compilador TinyCOBOL de código aberto, as duas instruções PERFORM não interferem entre si e a saída é de fato “1 2 3 4 3 “.Portanto, o comportamento em tais casos não é apenas (talvez) surpreendente, também não é portátil.

Uma consequência especial dessa limitação é que PERFORM não pode ser usado para escrever código recursivo. Outro exemplo simples para ilustrar isso (ligeiramente simplificado de Veerman & Verhoeven 2006):

 MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".

Pode-se esperar que a saída seja “1 2 3 END END END” e, de fato, é isso que alguns compiladores COBOL irão produzir. Mas alguns compiladores, como IBM COBOL, produzirão código que imprime “1 2 3 END END END END …” e assim por diante, imprimindo “END” repetidamente em um loop infinito. Como há espaço limitado para armazenar endereços de continuação de backup, os backups são sobrescritos no curso das invocações recursivas e tudo o que pode ser restaurado é o salto de volta para DISPLAY "END" .

StatementsEdit

COBOL 2014 tem 47 declarações (também chamadas de verbos), que podem ser agrupadas nas seguintes categorias amplas: fluxo de controle, E / S, manipulação de dados e o redator do relatório. As instruções do redator do relatório são abordadas na seção do redator do relatório.

Control flowEdit

As instruções condicionais do COBOL são IF e AVALIAR . AVALIAR é uma declaração semelhante a um switch com a capacidade adicional de avaliar múltiplos valores e condições. Isso pode ser usado para implementar tabelas de decisão. Por exemplo, o seguinte pode ser usado para controlar um torno CNC:

EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE

A instrução PERFORM é usada para definir loops que são executados até que uma condição seja verdadeira (não enquanto verdadeira, o que é mais comum em outras linguagens). também é usado para chamar procedimentos ou intervalos de procedimentos (consulte a seção de procedimentos para obter mais detalhes). CALL e INVOKE chama subprogramas e métodos, respectivamente. O nome do subprograma / método está contido em um str que pode ser um literal ou um item de dados. Os parâmetros podem ser passados por referência, por conteúdo (onde uma cópia é passada por referência) ou por valor (mas apenas se um protótipo estiver disponível). CANCELAR descarrega subprogramas da memória. IR PARA faz com que o programa salte para um procedimento especificado.

O GOBACK é uma instrução de retorno e a instrução STOP para o programa. A instrução EXIT tem seis formatos diferentes: ela pode ser usada como uma instrução de retorno, uma instrução break, uma instrução continue, um marcador de fim ou para deixar um procedimento.

Exceções são levantadas por uma instrução RAISE e capturadas com um manipulador, ou declarativo, definido no DECLARATIVES parte da divisão do procedimento. Declarativas são seções que começam com uma instrução USE que especifica os erros a serem tratados. As exceções podem ser nomes ou objetos. RESUME é usado em um declarativo para pular para a instrução após aquela que levantou a exceção ou para um procedimento fora do DECLARATIVES . Ao contrário de outras linguagens, as exceções não detectadas podem não encerrar o programa e o programa pode continuar sem ser afetado.

E / OEdit

A E / S do arquivo é tratada pelo autodescritivo ABRIR , FECHAR , LER , e WRITE instruções junto com mais três: REWRITE , que atualiza um registro; START , que seleciona os registros subsequentes para acessar encontrando um registro com uma determinada chave; e UNLOCK , que libera um bloqueio no último registro acessado.

A interação do usuário é feita usando ACEITAR e EXIBIR .

Data manipulationEdit

Os seguintes verbos manipulam dados:

  • INITIALIZE , que define os itens de dados para seus valores padrão.
  • MOVE , que atribui valores aos itens de dados; MOVE CORRESPONDING atribui campos com nomes semelhantes correspondentes.
  • SET , que tem 15 formatos: pode modificar índices, atribuir referências de objetos e alterar tabelas capacidades, entre outras funções.
  • ADICIONE , SUBTRAIR , MULTIPLY , DIVIDE e COMPUTE , que manipulam aritmética (com COMPUTE atribuindo o resultado de uma fórmula a uma variável).
  • ALLOCATE e GRATUITO , que manipulam memória dinâmica.
  • VALIDATE , que valida e distribui os dados conforme especificado na descrição de um item na divisão de dados.
  • STRING e UNSTRING , que concatenam e dividem strings, respectivamente.
  • INSPECIONE , que registra ou substitui instâncias de substrings especificadas em uma string.
  • SEARCH , que procura a primeira entrada em uma tabela satisfazendo uma condição.

Arquivos e tabelas são classificados usando SORT e MERGE verbo mescla e classifica arquivos. O verbo RELEASE fornece registros para classificar e RETURN recupera os registros classificados em ordem.

Scope terminationEdit

Algumas instruções, como IF e READ , podem conter declarações. Essas instruções podem ser encerradas de duas maneiras: por um ponto (encerramento implícito), que encerra todas as instruções não terminadas contidas, ou por um terminador de escopo, que encerra a instrução aberta correspondente mais próxima.

Instruções aninhadas encerradas com um período são uma fonte comum de bugs. Por exemplo, examine o seguinte código:

IF x DISPLAY y. DISPLAY z.

Aqui, a intenção é exibir y e z se a condição x for verdadeira. No entanto, z será exibido qualquer que seja o valor de x porque a instrução IF foi encerrada por um ponto incorreto após DISPLAY y .

Outro bug é resultado do problema de else pendurado, quando dois IF as instruções podem ser associadas a um ELSE.

IF x IF y DISPLAY aELSE DISPLAY b.

No fragmento acima, o ELSE se associa à instrução IF y em vez da instrução IF x instrução, causando um bug. Antes da introdução de terminadores de escopo explícitos, evitá-lo exigiria que OUTRA PRÓXIMA SENTENÇA fosse colocada após a IF interna .

CodeEdit de automodificação

A especificação COBOL original (1959) suportava o infame ALTER X PARA PROSSEGUIR PARA Y declaração, para a qual muitos compiladores geraram código de auto-modificação. X e Y são rótulos de procedimento e o único IR PARA instrução no procedimento X executado após uma instrução ALTER significa Vá para Y em vez disso. Muitos compiladores ainda o suportam, mas foi considerado obsoleto no padrão COBOL 1985 e excluído em 2002.

A instrução ALTER foi mal considerada porque minava a “localidade de contexto” e tornava a lógica geral de um programa difícil de compreender. Como escreveu o autor do livro Daniel D. McCracken em 1976, quando “alguém que nunca viu o programa antes deve se familiarizar com ele o mais rápido possível , às vezes sob pressão crítica de tempo porque o programa falhou … a visão de uma instrução GO TO em um parágrafo por si só, sinalizando a existência de um número desconhecido de instruções ALTER em locais desconhecidos ao longo do programa, causa medo em o coração do programador mais corajoso. “

Hello, worldEdit

Um programa” Hello, world “em COBOL:

 IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .

Quando o – agora famoso – exemplo de programa “Hello, World!” em The C Programming Language foi publicado pela primeira vez em 1978, um mai semelhante A amostra do programa nframe COBOL teria sido enviada por meio do JCL, muito provavelmente usando um leitor de cartão perfurado e cartões perfurados de 80 colunas. A lista abaixo, com uma DIVISÃO DE DADOS vazia, foi testada usando GNU / Linux e o emulador System / 370 Hercules executando MVS 3.8J. O JCL, escrito em julho de 2015, é derivado dos tutoriais e amostras do Hercules hospedados por Jay Moseley. De acordo com a programação COBOL daquela época, OLÁ, MUNDO é exibido em letras maiúsculas.

Depois de enviar o JCL, o console MVS exibiu:

 19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED

Linha 10 da lista do console acima é realçado para efeito, o realce não faz parte da saída real do console.

A lista do compilador associado gerada em quatro páginas de detalhes técnicos e informações de execução de trabalho, para a única linha de saída das 14 linhas de COBOL.

Leave a Reply

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *