Пример программы на cobol

реализован на нескольких моделях мэйнфреймов и мини- ЭВМ. Благодаря этому языку многие тысячи молодых людей приобщились к программированию. Среди них — школьники из г. Сиэтл (США), будущие основатели фирмы Microsoft Билл Гейтс (р. 1955) и Пол Аллен (р. 1954).

Особенности современного Basic

• «Удав» — «проглатывает и переваривает» все новые идеи в программировании. От Алгола и Паскаля — современный гибкий синтаксис ; от Smalltalk — объекты . • Восприняв визуальную CASE-оболочку, Бэйсик сам стал источником идей для визуальных систем программирования. Вслед за Visual Basic появились Delphi, Visual FoxPro, Visual C++ и др. • Системы программирования на Бэйсике долго развивались только как интерпретаторы , что ограничивало его применение. В последнее время — появились оптимизирующие компиляторы , предоставляющие полноценную среду программирования, сравнимую с Delphi, Visual C. 22

5) Cobol – язык для бухгалтеров

Проблема Basic — мало пригоден для экономических, бухгалтерских расчетов. Там нет длинных формул, зато есть сложные структуры данных, которые Basic «не воспринимает». Инициатива Грейс Хоппер, рабочая группа CODASYL — Conference on Data Systems Languages, которая предложила проект языка Cobol — COmmon Business Oriented Language — Общий язык, ориентированный на бизнес . 23

How Much does it Take to Create «Hello World» Program in COBOL Language

Фрагмент программы на Коболе

1030-1070 «привязка» к оборудованию 1100-1150 описание двухуровневой структуры внешних записей

Некоторые особенности языка Cobol

• «привязка» к оборудованию • возможность описания сложных (иерархических) структур данных • многословный раздел процедур (язык максимально приближен к обычному английскому языку) Кобол широко распространен в США. Наряду с Фортраном стал одним из «великих» языков (существует уже 40 лет и «не думает» сдавать позиции). По оценкам, на нем до сих пор пишется не менее 50% коммерческих программ 25 .

6) Algol, его влияние на языки

программирования Algol ( ALGO rithmic L anguage) — Algol-58, 60 (1958-60 гг., Европа), обновление — Algol-68. «Революция» в языках программирования, т. к. создавался с учетом теории. Основные особенности языка • Впервые строгая формализация: для описания синтаксиса предложили форму задания правил синтаксиса, ставшую стандартом для всех языков. • «Навели порядок» с типами данных и блочной структурой программ, появились обязательные описания данных и процедур в начале блоков, разделители операторов в виде точки с запятой. В целом, текст программы пробрел современный вид.

Источник: studfile.net

Enterprise COBOL: пример проекта

Эта статья завершает Курс программирования на COBOL, освещая важные аспекты разработки программного обеспечения, такие как модульность кодовой базы, зависимости, модульное тестирование, мокинг, DevOps на z/OS и автодокументация. Современный подход представлен здесь наилучшим образом — на примере.

COBOL in 100 seconds

Photo by Hunter Haley on Unsplash

TLDR

Скачайте архив с GitHub, разархивируйте от откройте папку sales .

Предварительные условия

Предполагается, что вы уже знакомы с основными принципами, методами и стандартами IBM Enterprise COBOL для z/OS — проприетарного компилятора COBOL, который реализует значительную часть стандартов COBOL 85, COBOL 2002 и COBOL 2014. Мы будем запускать проект на z/OS — проприетарной 64-разрядной операционной системе для мэйнфреймов IBM, которая вышла в октябре 2000 года и все еще обратно совместима с функциями, появившимися с 1960-х годов.

  • Убедитесь, что у вас установлен NPM, менеджер пакетов для JavaScript:

$ npm -v

  • У вас есть аккаунт мэйнфрейма IBM.

Вы можете получить аккаунт в учебных целях бесплатно. Зарегистрируйтесь в IBM и следуйте инструкциям. Вы получите емейл с указанным USER ID, IP и PORT. Затем войдите в Open Mainframe Project Slack и добавьте приложение zih через Apps меню. Отправьте приложению сообщение, например, Hi, и бот попросит ввести емейл и USER ID, которые вы получили. Отправьте эти данные, и бот создаст ваш PASSWORD.

  • Вам понадобится COBOLget, менеджер пакетов для COBOL:

$ npm i -g cobolget $ cobolget -v

  • Вам понадобится Zowe, платформа управления для мэйнфреймов с открытым исходным кодом, и ваш профиль Zowe, созданный с использованием указанных выше данных:

Вы можете выбрать любой текстовый редактор по вашему желанию, но я рекомендую Visual Studio Code с установленным расширением IBM Z Open Editor.

Спецификация

У хороших проектов есть исчерпывающее описание функциональности и ограничений. Наш проект Sales суммирует вымышленные продажи в определенном регионе. Данные о продажах представлены в формате CSV, где каждая строка (кроме заголовка) описывает одну продажу следующим образом:

Region,Country,Units Sold,Unit Price,Total Revenue

Region и Country это PIC X(48) , Units Sold это PIC 9(9) , Unit Price и Total Revenue это PIC 9(9)V99 монетарные десятичные значения. Желаемый регион также PIC X(48) . Для простоты мы определим фильтр по региону прямо в основной программе, и будем полагать, что строки CSV не могут превышать 80 символов.

Читайте также:
Как посмотреть когда в последний раз открывалась программа

Декомпозиция

Благодаря Zowe программисты COBOL могут создавать любую структуру проекта, свободную от условностей и ограничений мэйнфреймов. Современная разработка имеет тенденцию фокусироваться на проблемной области, делегируя специфичные для платформы задачи на уровень DevOps.

Разберем спецификацию на функциональные блоки. В основном программа:

  1. Читает файл продаж.
  2. Разбирает строки одну за другой.
  3. Проверяет Region на соответствие.
  4. Агрегирует Total Revenue.
  5. Отображает агрегированное значение.

Таким образом, можно выделить как минимум четыре блока — три программы и одну copybook. Точка входа определяет фильтр по региону, вызывает Reader и отображает результат. Программа Reader инкапсулирует операции с файлами (DataSet) и анализирует записи CSV, возвращаемые Parser. Программа Parser преобразует строки CSV в записи.

├── src ├── parser.cbl ├── reader.cbl ├── sales.cbl └── sales.cpy

Другими словами, наша copybook — это структурированная форма строки CSV, совместно используемая в Reader и Parser. Поместим ее в файл CPY:

01 csv-rec. 05 Region PIC X(48). 05 Country PIC X(48). 05 UnitsSold PIC 9(9). 05 UnitPrice PIC 9(9)V99.

05 TotalRevenue PIC 9(9)V99.

Зависимости

До того, как Zowe разделил среду разработки и исполнения, инженеры Enterprise COBOL использовали следующие блоки комментариев для документирования изменений:

***************************************************************** * DATE CHANGED BY DESCRIPTION * * ——— ———— ————————————-* * 99.99.99 Author Description *

Этот метод не вполне отражает историю программы и не может использоваться для ретроспективного анализа. Напротив, Системы Контроля Версий в настоящее время являются стандартом в разработке программного обеспечения, позволяя командам сотрудничать через пространство, время и границы организаций. Эксперименты с кодом, параллельные версии, атомарные модификации и обзоры кода помогают разрабатывать софт эффективно с низким уровнем риска.

Тенденция разделения монолитных программ с огромным количеством SECTIONS на более мелкие и многократно используемые блоки была бы невозможна без Семантического Версионирования и Управления Пакетами. Несмотря на то, что в наших модулях мы не использовали никакой внешний код, встроенных в COBOL функций (Intrinsic functions) обычно недостаточно в более сложных проектах.

С 2020 года у COBOL есть собственный менеджер пакетов COBOLget, который стандартизирует повторное использования исходного кода разработчиками как открытого, так и проприетарного кода. Инструмент командной строки автоматизирует процесс установки и обновления библиотек, разрешения зависимостей и интеграции внешнего кода COBOL в проекты. Реестр COBOLget аккумулирует библиотеки на диалектах GnuCOBOL и Enterprise COBOL, помогая доставлять публичный и закрытый код командам.

Сердце COBOLget — это Манифест modules.json, который описывает проект и его зависимости.

. «modules»: [ «src/parser.cbl», «src/reader.cbl», «src/sales.cbl» ], «dialect»: «entcobol», «dependencies-debug»: < «ecblunit»: «*» >.

Как видно, структура очень похожа на манифест в NPM. В свойствах modules перечислены COBOL-модули проекта, свойство dialect определяет целевую платформу. Назначение зависимости ecblunit будет объяснено в следующей главе.

Тестирование

Хорошие проекты обеспечивают разумную степень гарантии качества — каждый модуль должен работать как задумано. В нашем проекте Reader и Parser — это два модуля, которые мы можем изолировать от среды и покрыть тестами на самой ранней стадии разработки.

├── tests ├── tests.cbl └── tests.jcl

Инструменты

Для этого IBM предлагает проприетарную среду модульного тестирования — zUnit. zUnit реализует стандарт xUnit, позволяющий разрабатывать, выполнять и оценивать результаты тестов на любом языке z/OS. Конвейер выглядит так:

  • Test Runner читает файл Test Suite;
  • Test Runner по очереди вызывает Test Cases;
  • ADDTESTS добавляет тестовые программы в Test Case;
  • SETUP выделяет необходимые ресурсы;
  • тестовая программа вызывает модуль и проверяет результат;
  • TEARDOWN высвобождает выделенные ресурсы.

Test Runner — программа z/OS, которая управляет процессом тестирования.
Test Suite — XML-файл, в котором перечислены Test Cases для Test Runner.
Test Case — COBOL программа, вызывающая модуль.
Assertion — COBOL условие, сравнивающее ожидаемые и фактические значения.
Test Fixture — COBOL программы для настройки, запуска и завершения тестов.

Проблема в том, что для одного минимального теста zUnit требуется более 100 строк типового кода, что в простых случаях применения чрезмерно. К счастью, имеется альтернатива с открытым исходным кодом — ECBLUnit. В отличие от zUnit, этот инструмент ориентирован только на элементы Test Runner и Assertion. Написанный на Enterprise COBOL, инструмент полностью совместим с z/OS. Тесты ECBLUnit — это программы на COBOL, намного более простые, чем тесты zUnit. Поскольку ECBLUnit это обычный пакет COBOLget, мы можем добавить его как зависимость:

$ cobolget add —debug ecblunit $ cobolget update $ cobolget install

Мокинг

Кажется, в нашем проекте полностью изолированным элементом является только Parser. Reader требует поддержки z/OS для доступа к CSV-файлу. Тем не менее, мы можем изолировать Reader, создав его alter ego — Мок.

Цель имитации — сосредоточиться на тестируемом коде, а не на поведении или состоянии его окружения. Мок реализует контракт исходного модуля с поддельной реализацией:

IDENTIFICATION DIVISION. PROGRAM-ID. READER. DATA DIVISION. WORKING-STORAGE SECTION.

Читайте также:
Программа zar как пользоваться

COPY SALES. 01 csv-row PIC X(48) VALUE ‘Europe,Germany,10,9.99,99.90’. LINKAGE SECTION. 01 where PIC X(48). 01 total PIC 9(9)V99 VALUE 0. PROCEDURE DIVISION USING where RETURNING total. CALL «PARSER» USING csv-row RETURNING csv-rec. MOVE TotalRevenue to total.

END PROGRAM READER.

Поскольку в процессе тестирования JCL компилирует мок сразу после настоящих модулей, тестовая программа не замечает подмены.

. 01 expected-total PIC 9(9)V99 VALUE 99.90. . CALL «READER» USING where RETURNING total. CALL «ECBLUREQ» USING BY CONTENT ADDRESS OF expected-total BY CONTENT ADDRESS OF total BY CONTENT LENGTH OF expected-total.

Этот простой подход позволяет тестировать бизнес-логику любой сложности, избегая нежелательных зависимостей. Давайте теперь соберем и протестируем наши модули на z/OS:

$ cobolget run build . Modules modules.cpy and modules.cbl updated. $ cobolget run test . OK Tests: 001, Skipped: 000 Assertions: 002, Failures: 000, Exceptions: 000

DevOps

Не отчаивайтесь, если приведенная выше команда не сработала. В scripts манифеста вы найдете все необходимые сценарии для согласования сред разработки и выполнения. Вы можете запускать эти команды отдельно или в группах, указав начальное имя сценария. Замените все в скриптах на свой и попробуйте создать датасеты мэйнфрейма разом:

$ cobolget run setup

Если датасет уже существует, команда завершится ошибкой. Тогда придется создать датасеты по одному, например:

$ cobolget run setup:RES

Если все прошло успешно, то теперь можно развернуть и запустить проект Sales на z/OS:

$ cobolget run build $ cobolget run p . Total: 0033368932.11

Сценарии сборки, развертывания, тестирования и демонстрации запущены и работают. Отлично!

CI

Проект следует практике Непрерывной Интеграции, где каждая модификация кода тестируется в репозитории. Среди файлов проекта вы можете найти два шаблона:

  • nodejs.yml — для GitHub
  • .gitlab-ci.yml — для GitLab

Оба шаблона повторяют шаги, описанные выше, и имеют похожий синтаксис. GitLab и GitHub будут запускать CI процессы автоматически и сообщать о прогрессе во вкладках Pipelines и Actions соответственно. Ненулевой код выхода на любом этапе пометит процесс как сбойный.

Если вы решите опубликовать проект в своем репозитории, не забудьте объявить переменные HOST, PORT, USER и PASS в Settings->CI/CD->Variables в GitLab или в Settings->Actions secrets в GitHub.

Документация

Программисты постоянно читают код. Обычно соотношение времени, потраченного на чтение и на запись, намного превышает 10:1. Говорящие названия переменных, разделов, абзацев, множество комментариев объясняют читателю, что происходит и почему. IBM рекомендует использовать IDENTIFICATION DIVISION для описания программ. Вот фрагмент, вставляемый IBM Z Open Editor:

***************************************************************** IDENTIFICATION DIVISION. PROGRAM-ID. MYPROG. AUTHOR. MYNAME.

INSTALLATION. COBOL DEVELOPMENT CENTER. DATE-WRITTEN. 01/01/08. DATE-COMPILED. 01/01/08. SECURITY. NON-CONFIDENTIAL. *****************************************************************

С точки зрения модульности, такая документация не предоставляет исчерпывающую информацию о контракте модуля без необходимости его тщательного изучения. Поэтому вендоры COBOL добавили в комментарии дополнительные теги, распознаваемые генераторами автодокументации. Внедрение автоматического документирования сокращает объем вмешательства, необходимого для его поддержки, снижает затраты и улучшает качество, делая отражение изменений в кодовой базе более эффективным.

В 2020 году Bruno Pacheco выпустил инструмент с открытым исходным кодом, который генерирует документацию из исходного кода COBOL — coboldoc. Инструмент решает проблему несовместимости стандартов документации между диалектами COBOL. Coboldoc распознает теги Microfocus, MSDN и Free Format и может создавать документацию в форматах HTML и Markdown.

Имея некоторый опыт работы с последователями Javadoc, вы найдете данный фрагмент очевидным. Теперь установим Coboldoc и сгенерируем документацию для модулей:

$ npm i -g coboldoc $ coboldoc -v $ coboldoc generate src/*.cbl -o coboldoc

Заключение

60-летний язык программирования по-прежнему актуален. По оценкам Micro Focus, COBOL используется в 70% глобальных систем обработки транзакций, на нем написаны 220 миллиардов строк кода. Надеюсь, что аспекты, освещенные в этой статье, вдохновят вас на дальнейшее развитие экосистемы.

Спасибо за чтение!

Вы энтузиаст COBOL? Давайте разрабатывать недостающие библиотеки вместе — читайте далее Enterprise COBOL: реализация библиотеки.

  • cobol
  • программирование
  • управление проектом

Источник: habr.com

Современный COBOL: руководство по реализации микросервиса

COBOL

Вы знаете основные принципы, методы и стандарты COBOL. В этом руководстве мы используем GnuCOBOL — бесплатный компилятор COBOL, реализующий значительную часть стандартов COBOL 85, COBOL 2002, COBOL 2014 и X/Open COBOL, а также многие расширения, включённые в другие компиляторы COBOL.

Вы знакомы с протоколом HTTP — форматами запросов и ответов.

У вас установлены:

  • Docker — инструмент виртуализации, работающий из командной строки.
  • NPM — менеджер пакетов для JavaScript.
  • Git — клиент с открытым исходным кодом для управления версиями.

У вас есть аккаунт на GitHub для публикации микросервисов.

Вы можете использовать любой удобный текстовый редактор, но я рекомендую Visual Studio Code (или его версию с открытым исходным кодом VSCodium) с установленным расширением синтаксиса COBOL bitlang.cobol .

TLDR

Полный исходный код этого руководства на GitHub.

Спецификации

Одна из сильных сторон COBOL — это десятичные вычисления. В этом руководстве мы создадим высокоточный микросервис обмена валют, обрабатывающий HTTP API и возвращающий сумму в евро в формате JSON.

Читайте также:
Установить программу 1 с предприятие

Скажем, микросервис ожидает HTTP запрос GET // по порту 8000 и отвечает JSON <«amount»: > , где:

  • — это трёхбуквенный ISO код валюты, например, USD;
  • — это числовое значение, разделённое точкой, например, 999.999

Любые несоответствующие запросы, неподдерживаемые валюты и ошибки вычисления приведут к ответу 404 Not Found .

Обменные курсы — это курсы евро, опубликованные Европейским центральным банком. Ежедневные обновления курса и поддержка многопоточности выходят за рамки этого руководства.

Структура

Нам нужно 3 каталога — src для основной программы, tests для тестовой и resources для статических файлов. Пожалуйста, скачайте CSV (.zip) с ECB и разархивируйте в каталог resources . Файл содержит обменные курсы евро к 32 валютам. Как указано в спецификации, курсы остаются неизменными.

$ ls resources src tests $ ls resources eurofxref.csv

Наконец, создадим пустые файлы microservice.cbl и microservice-test.cbl в каталогах src и tests соответственно. Они понадобятся нам позже.

Зависимости

Наш микросервис зависит от:

  • HTTP-сервера для обработки запросов;
  • парсера ECB для CSV;
  • среды тестирования GCBLUnit.

Все эти компоненты доступны в реестре пакетов COBOL — cobolget.com. Мы с лёгкостью можем интегрировать эти зависимости с помощью инструмента управления пакетами COBOL с открытым исходным кодом cobolget . Вот полный листинг:

$ npm install -g cobolget $ cobolget init Manifest modules.json created. $ cobolget add core-network Dependency ‘core-network’ has been added to the manifest. $ cobolget add core-string Dependency ‘core-string’ has been added to the manifest. $ cobolget add —debug gcblunit Debug dependency ‘gcblunit’ has been added to the manifest. $ cobolget update Lockfile modules-lock.json updated. $ cobolget -t bca12d6c4efed0627c87f2e576b72bdb5ab88e34 install

В последней команде используется Team Token, поскольку core-network является закрытым пакетом, принадлежащим Cobolget ,но свободно распространяемым в сообществе. Вы увидите длинный процесс загрузки, заканчивающийся строкой:

Copybook modules.cpy updated

Этот файл, уже известный как COBOL Copybook, включает в себя все прямые и унаследованные зависимости для микросервиса. Мы используем его внутри нашей программы на следующем этапе.

Программа

По сути наша программа должна:

  • читать CSV-файл;
  • преобразовывать CSV-текст в список пар валюта-курс;
  • запускать локальный TCP/IP сервер на 8000 порту с помощью реализации обратного вызова, который обрабатывает HTTP запросы.

identification division. program-id. microservice. . procedure division. *> чтение CSV-файла в csv-содержимое open input file-csv. if not file-exists display «Error reading file» upon syserr stop run end-if. perform until exit read file-csv at end exit perform end-read end-perform. close file-csv. *> преобразование csv-содержимого в список пар ключ-значение move csv-ecb-rates(csv-content) to dataset. *> запуск HTTP сервера с обратным вызовов http-обработчика call «receive-tcp» using «localhost», 8000, 0, address of entry «http-handler». end program microservice. identification division. program-id. http-handler. . procedure division using l-buffer, l-length returning omitted. *> инициализация обменного курса set address of exchange-rates to dataset-ptr. *> парсинг запроса как «GET //» unstring l-buffer(1:l-length) delimited by all SPACES into request-method, request-path. if not http-get perform response-NOK end-if. *> поиск валюты и расчёт суммы в евро perform varying idx from 1 by 1 until idx > 64 if rate-currency(idx) = get-currency compute eur-amount = numval(get-amount) / rate-value(idx) on size error perform response-NOK end-compute perform response-OK end-if end-perform. *> или ничего perform response-NOK. response-OK section. move HTTP-OK to response-status. move byte-length(response-content) to response-content-length. perform response-any. response-NOK section. move HTTP-NOT-FOUND to response-status. move 0 to response-content-length. perform response-any. response-any section. move 1 to l-length. string response delimited by size into l-buffer with pointer l-length. subtract 1 from l-length. goback. end program http-handler. copy «modules/modules.cpy».

Программа receive-tcp — это сервер, который принимает входящие соединения, считывает содержимое запроса в буфер и делится буфером с программой обратного вызова. Обратный вызов парсит содержимое и заменяет буфер ответом. Сервер отправляет ответ обратно клиенту. Полный листинг программы на GitHub.

Давайте установим среду выполнения GnuCOBOL Docker:

$ docker run -d -i —name gnucobol olegkunitsyn/gnucobol:2.2 $ docker exec -i gnucobol cobc -V cobc (GnuCOBOL) 2.2.0 Copyright (C) 2017 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart Built Jul 26 2020 07:44:23 Packaged Sep 06 2017 18:45:29 UTC C version «9.3.0»

В этом руководстве мы используем GnuCOBOL 2.2, единственный стабильный GnuCOBOL компилятор, доступный в настоящее время в бинарных дистрибутивах. Вы так же можете найти его и установить в исходном формате на свой компьютер.

Тест

Наш микросервис будет следовать практике непрерывной интеграции, когда разработчики интегрируют исходный код в общий репозиторий, где каждая интеграция тестируется автоматически. Для тестирования воспользуемся простой тестовой средой GCBLUnit, уже установленной ранее как зависимость для отладки.

Давайте создадим Dockerfile микросервиса:

FROM olegkunitsyn/gnucobol:2.2 RUN mkdir /microservice WORKDIR /microservice COPY . . EXPOSE 8000 RUN cobc -x -debug modules/gcblunit/gcblunit.cbl tests/* —job=’microservice-test’

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru