Indrekis
Indrekis

Categories

  • retrocomputing
  • cpm
  • CP/M

Tags

  • CP/M
  • retrocomputing
  • COBOL

Огляд

COBOL – мова дуже давня, але асоціюється з великими машинами, тому для мене було великим сюрпризом зустріти її для CP/M і комп’ютерів класу Osborne.

Не врятувала давність та усталеність й від того, що сучасні приклади містили дрібні помилки1, тому створення працездатного коду, який приблизно відповідає стандарту COBOL-742, зайняло певний час. Поміж причин – лапідарні повідомлення про помилки і суворі та жорсткі вимоги до формату, відлуння епохи перфокарт:

Стовпці Назва
1-6 Sequence Number Area, номер рядка чи перфокарти
7 Indicator Area, може містити: * – коментар, / – інший коментар, - – продовження з попереднього рядка, D – код для відлагодження.
8-12 Area A, DIVISION, SECTION та заголовки процедур.
12-72 Area B, весь інший код.
73-80 Program Name Area – ще одне відлуння епохи перфокарт.

Таким чином, код Hello world може виглядати якось так (верхній рядок коду не є частиною файлу, наведений для наочності поділу на зони):

1234567890123456789012345678901234567890 * Номер стовпця, немає в коді
         IDENTIFICATION DIVISION.
         PROGRAM-ID.  HELLO.
      * Now most sections are empty.  		 
         ENVIRONMENT DIVISION.
         DATA DIVISION.
         PROCEDURE DIVISION.
         MAIN-PARAGRAPH. 
           DISPLAY 'HELLO, WORLD'.
           STOP RUN.
   

Далі файл з таким іменем називаю HW1.COB. Експерименти показали, що всі секції, крім ENVIRONMENT DIVISION, є потрібними – без них не компілюється.

Microsoft COBOL

В Інтернеті трапляються дві версії COBOL для CP/M – 4.01 та 4.65.

Також, знайшов два варіанти документації, Xerox_COBOL-80 1980 року та Microsoft_COBOL-80 1978 року. Думаю, варто іноді заглядати на bitsavers, з надією на нові знахідки.

MS COBOL 4.65

Архів із пізнішою версією більш повний, там також є багато додаткових інструментів – детально їх не розглядатиму. Мінімум, виглядає, потрібні наступні файли:

  • Для компіляції: COBOL.COM та чотири оверлеї: COBOL1.OVR, COBOL2.OVR, COBOL3.OVR, COBOL4.OVR.
  • Для лінкування: COBLIB.REL і COBLBX.REL – ймовірно, об’єктні файли стандартної бібліотеки; COBLOC. – заголовок виконавчого файлу; CRTDRV.REL – драйвер терміналу, в його ролі можна використати кілька із наявних файлів3; L80.COM – лінкер;
  • Для завантаження згенерованої лінкером програми потрібна наявність RUNCOB.COM4 – це своєрідний динамічний завантажувач.

На дискету Osborne Executive разом вони не вміщаються так, щоб ще й можна було на ній компілювати, тому створив два диски – для компіляції і для лінкування.

Компілюємо так, вважаючи, що файли із джерельними текстами називається HW1.COB:

COBOL =HW1
L80 HW1/N,HW1/E

Схема знайома за асемблером Мікрософт. Отримуємо HW1.COM, розміром 242 байти, але щоб він міг виконуватися, на поточному диску має бути присутній RUNCOB.COM.

Варіант виклику лінкера, який не зберігає файл на диск, а зразу виконує:

L80 HW1/G
Під RunCMP виглядає так.
I1>COBOL =HW1

Microsoft MS-COBOL
Version 4.65  Copyright 1980,1981,1982 (C) Microsoft

 No Errors or Warnings


RunCPM Version 6.0 (CP/M 60K)

I1>L80 HW1/N,HW1/E

Link-80  3.44  09-Dec-81  Copyright (c) 1981 Microsoft

Data    4C00    4ECE    <  718>

51339 Bytes Free
[4C38   4ECE       78]


RunCPM Version 6.0 (CP/M 60K)

I1>HW1
HELLO, WORLD


RunCPM Version 6.0 (CP/M 60K)

I1>L80 HW1/G

Link-80  3.44  09-Dec-81  Copyright (c) 1981 Microsoft

Data    4C00    4ECE    <  718>

51339 Bytes Free
[4C38   4ECE       78]
[Begin execution]
HELLO, WORLD


RunCPM Version 6.0 (CP/M 60K)

I1>

Аналогічно працює під MAME (Executive та Vixen) та на реальному залізі.

Фото запуску на Osborne Executive. На один диск все необхідне не поміщається, тому розбив на два. Вантажимося з диску A:, компілятор в дисководі B:.
Фото запуску на Osborne Executive. Диск A: замінив на диск із лінкером і бібліотеками для COBOL. Лінкер потребує, щоб цей диск був поточним. Компілює трохи більше за 24 секунди, лінкує 30, разом – 54 секунди(!), запуск – практично миттєво, 1-2 секунди, але потребує наявності RUNCOB.COM на поточному диску. Внизу – результат TYPE HW1.COM, контрольні коди затерли саму команду, але видно цікаві текстові стрічки.

COBOL.COM містить на початку такий текст: Version 4.65 Copyright 1980,1981,1982 (C) Microsoft 20-Oct-82, L80 – Link-80 3.44 09-Dec-81 Copyright (c) 1981 Microsoft та співпадає з L80, що ми використовували для експериментів з асемблером.

MS COBOL 4.01

Архів з цією версією, який поширений Інтернетом, неповний – там є компілятор та стандартна бібліотека (coblib.rel), але немає лінкера та драйвера терміналу. Взявши L80.COM і CRTDRV.REL з 4.65, вдалося скомпілювати. Команди ті ж, що й для версії 4.65.

Під RunCMP виглядає так.
I0>COBOL =HW1

 No Errors or Warnings


RunCPM Version 6.0 (CP/M 60K)

I0>L80 HW1/N,HW1/E

Link-80  3.44  09-Dec-81  Copyright (c) 1981 Microsoft

Data    0103    3505    <13314>

39014 Bytes Free
[012F   3505       53]


RunCPM Version 6.0 (CP/M 60K)

I0>HW1
HELLO, WORLD


RunCPM Version 6.0 (CP/M 60K)

I0>

Отриманий HW1.COM має розмір 13 440 байти, але не потребує додаткових файлів – є standalone.

Аналогічно працює під MAME (Executive та Vixen) та на реальному залізі.

Фото запуску на Osborne Executive. Компілює трохи більше за 19 секунд, лінкує 38, разом – 57 секунд(!), запуск – практично миттєво, 1-2 секунди.

COBOL.COM містить на початку текст COBOL-80 v4.01 30-Sep-80 Copyright 1979,80 (C) Microsoft MICROSOFTOCT-1-80.

Micro Focus COBOL

Найбільше його екземплярів вдалося знайти тут. Що цікаво, компанія досі існує і досі займається COBOL.

Існує в двох варіантах: CIS COBOL – для мікрокомп’ютерів, і Level II COBOL – його варіант для машин із переключенням банків пам’яті, який, на відміну від CIS вміє генерувати нативний код.

Цікаві утиліти, пов’язані із цими компіляторами:

CIS COBOL

Знайшов дві версії, 4.2 і 4.5, оскільки 4.5 запрацювала зразу, не став розбиратися із 4.2.

Компілюємо та запускаємо так (як видно, продуктом компіляції є файл з розширенням .int):

cobol hw2.cbl
runa hw2.int

Мінімальний приклад (HW2.CBL):

       IDENTIFICATION DIVISION.
       PROGRAM-ID.  HELLO.
       WORKING-STORAGE SECTION.
      *
       01  CONSTANTS.
           02 HELLO PIC X(12) VALUE "HELLO, WORLD".
      *
       PROCEDURE DIVISION.
       MAIN-PARAGRAPH.
           DISPLAY HELLO.
           STOP RUN.

В RunCPM це виглядає так:

I3>cobol hw2.cbl
** CIS COBOL V4.5  COPYRIGHT (C) 1978,1982 MICRO FOCUS LTD
**COMPILING HW2.CBL
** ERRORS=00000 DATA=00512 CODE=00128 DICT=00057:27414/27471 GSA FLAGS=  OFF


RunCPM Version 6.0 (CP/M 60K)

I3>runa hw2.int
** CIS COBOL RTS V4.5 REV 001  (C)  1978, 1982  MICRO FOCUS LTD URN MG/0000/BG. HELLO, WORLD



RunCPM Version 6.0 (CP/M 60K)

I3>

В емуляторі чи на залізі спочатку не запустилося із повідомленням FATAL I-O ERROR : HW2.CBL, але якщо за допомогою TE.COM видалити кілька порожні рядки в кінці файлу, працює. Гіпотеза – щось із 0x1A символами, але не досліджував.

COBOL.COM містить стрічку (C) 1978, 1982 MICRO FOCUS LTDMG.

Інструкції: ciscobol-operating-guide-v4.5.pdf, ciscobol-language-reference-v4.5.pdf.

Цікаво, що утиліта CONFIG.COM потребує, щоб імена файлів вводилися великими літерами – інакше не знаходить їх, аналогічно, в ролі Y/N сприймає лише великі.

Фото запуску на Osborne Executive. Компілює 19 секунд, запуск – 5 секунд.

Level II COBOL

В Інтернеті є в двох варіантах, один із яких зразу зависає намертво в RunCMP і скаржиться 5 раз, “Cannot open program-file .” та завершується в MAME. В обох, в COBOL.COM, є стрічка (C) 1981,1982 Micro Focus Ltd. на початку та Level II COBOL V2.1 посередині.

Документація згадує утиліту CGEN для перетворення у нативний (виконавчий?) файл, але знайти її мені поки не вдалося.

Не працює під RunCPM, також відмовився працювати під MAME з Osborne Executive чи Vixen.

I5>cobol hw2.cbl
* Level II COBOL  V2.1  (C) 1981,1982 Micro Focus Ltd.
* Compiling HW2.CBL

COBOL Segment 52 Error 161 at COBOL PC 0006

RunCPM Version 6.0 (CP/M 60K)

I5>cobol pi.cbl
* Level II COBOL  V2.1  (C) 1981,1982 Micro Focus Ltd.
* Compiling PI.CBL

COBOL Segment 52 Error 161 at COBOL PC F508

RunCPM Version 6.0 (CP/M 60K)

В документації ця помилка 161 описана: Illegal intermediate code. Але PI.CBL – офіційний приклад.

Під MAME Osborne Vixen та Executive дає ту ж помилку, хіба що в обох випадках PC 0707. Якщо на диску місце є, але недостатньо, повідомляє помилку із кодом 201, яка в документації не згадується. (Якщо місця немає взагалі, просто про це каже). Те ж – на реальному залізі.

Фото запуску на Osborne Executive.

Nevada COBOL

Цікавий варіант COBOL для мікрокомп’ютерів того часу, ймовірно, від Hisoft5, але підписується Ellis Computing. Натрапляв згадку в тогочасних джерелах, що був відносно дешевим, тому популярним.

Використовує дещо інший формат джерельних тестів – під номер рядка відведено лише 4 стовпця, а не 6, як в стандарті. Це коштувало мені купу часу, оскільки повідомлення про помилку аж ніяк не допомагали, якщо не припустити такої можливості. Вже майже здався, коли натрапив на відповідне місце в документації.

Опис формату з документу Nevada_COBOL_for_the_Commodore_64.pdf, стор. 14. В документації для інших варіантів – не для Commodore, не знайшов такої таблички.

Мінімальний (HW3A.CBL):

     IDENTIFICATION DIVISION.
     PROGRAM-ID. HELLO.
    *  Now most sections are empty.  
    *  Numbers are not necessary too.
     ENVIRONMENT DIVISION.
     INPUT-OUTPUT SECTION.
     FILE-CONTROL.
     DATA DIVISION.
     WORKING-STORAGE SECTION.
     PROCEDURE DIVISION.
     BEGIN.
         DISPLAY "HELLO, WORLD".
         STOP RUN.
     END PROGRAM HELLO.

З номерами рядків та необов’язковим вказанням ISA (HW3.CBL):

0001 IDENTIFICATION DIVISION.
0002 PROGRAM-ID. HELLO.
0003*  Now most sections are empty.  
0004*  Numbers are not necessary too.
0005 ENVIRONMENT DIVISION.
0006*  CONFIGURATION -- not necessary but interesting 
0007*  8080-CPU or Z80 CPU
0008 CONFIGURATION SECTION.
0009 SOURCE-COMPUTER.
0010     Z80-CPU.
0011 OBJECT-COMPUTER.
0012     Z80-CPU.
0013 INPUT-OUTPUT SECTION.
0014 FILE-CONTROL.
0015 DATA DIVISION.
0016 WORKING-STORAGE SECTION.
0017 PROCEDURE DIVISION.
0018 BEGIN.
0019     DISPLAY "HELLO, WORLD".
0020     STOP RUN.
0021 END PROGRAM HELLO.

Компіляцій та запуск:

CC HW3
RUN HW3

На RunCPM це виглядає так:

I7>CC HW3
NEVADA COBOL (C) COPYRIGHT 1979
ELLIS COMPUTING
REV 2.1 COMPILING

 LINE   C SEQ    ERR
  NO.   P NO. COL    LVL TEXT
HW3                   PROGRAM NAME
         52969        MEMORY AVAILABLE
                      * SUCCESSFUL COMPILE

RunCPM Version 6.0 (CP/M 60K)

I7>RUN HW3

HELLO, WORLD

RunCPM Version 6.0 (CP/M 60K)

I7>

Аналогічно працює в MAME, для Executive i Vixen та на реальному залізі.

Фото запуску на Osborne Executive. Компілює трохи більше за 17 секунд, запуск – практично миттєво, 1-2 секунди.

В комплект входить утиліта для перенумерування рядків, але – у формі джерельних текстів, RENUMBER.CBL, її спершу треба скомпілювати.

Кумедне місце з документації, Nevada_COBOL_Dec82.pdf, стор. 86. Файл справді потрібен для компіляції, так що, певне, не зовсім рандомний… Ймовірно, мова про формат файлу – на противагу файлам із записів, характерних для мейнфреймів.

Компіляція генерує файл із розширенням .OBJ, який потім завантажується утилітою RUN. Виглядає, що це примітивна форма динамічного зв’язування (але не виключаю, що воно статичне, а я щось не зрозумів).

Опис OBJ-файлів, Nevada_COBOL_Dec82.pdf, стор. 28.

Підсумок

Сама наявність COBOL для мене була сюрпризом, але кількість варіантів на ринку здивувала подвійно. Одна із ймовірних причин описана в рекламних матеріалах Nevada COBOL – можна було розробляти ПЗ на мікрокомп’ютерах, не смикаючи для цього мейнфрейми, для яких воно призначалося. Тим більше, мейнфрейми, судячи із моєї практики із останніми варіантами OpenVMS для Alpha та книги “The Operating Systems Handbook: Unix, OpenVMS, OS/400, VM, and MVS” by Bob DuCharme, 1994, навряд чи в 1981-му були зручнішими, з точки зору інтерфейсу користувача, за CP/M машинки. Однак, сумісність між різними виробниками аж ніяк не ідеальна, навіть якщо знехтувати нестандартною шириною першого поля для Nevada.

Всі розглянуті компілятори, окрім 4.01 від MS, компілюють у той чи інший байт-код. MS-4.65 дає на виході COM-файл, який сам запускає завантажувач, якщо знайшло, решта потрібно запускати за допомогою відповідного інтерпретатора.

Пакет від Micro Focus включає цікаві додаткові утиліти, однак, наскільки вони були корисними чи зручними – не знаю.

Компілятори від Мікрософт працюють найповільніше – якщо враховувати лінкування, потребує вдвічі більше часу, ніж інші. Наступним є Micro Focus CIS COBOL, але результат його роботи запускається багато довше за інші6. Найшвидше компілює Nevada, але різниця з Micro Focus не принципова.

На цьому із COBOL поки все7.

Додаток – образи дисків, використані в цьому пості

Для зручності створив образи із пакетами COBOL, які тут випробовував. Вони не завжди містять все із архівів, звідки брав – через обмеження на розмір дискет. Також, на них є відповідні приклади – щоб можна було зразу спробувати.

Виноски

  1. Помилки – з точки зору старих компіляторів, сучасні толерантніші до формату і не мають з тим проблем. 

  2. Наступний, COBOL-85 – вже явно запізно. 

  3. В архіві є CDADDS.REL, CDADM3.REL, CDANSI.REL, CDBEE.REL, CDHZ15.REL, CDISB.REL, CDPERK.REL, CDSROC.REL, CDWH19.REL, CDZEPH.REL; до них там є джерельні тексти на асемблері (*.MAC), перший рядок яких називає – якого терміналу це драйвер. Щоб скористатися конкретним драйвером, потрібно скопіювати його файл в CRTDRV.REL. 

  4. Цитата із документації для MS COBOL-80, ймовірно про це: ‘‘Separately compiled COBOL program modules may be combined into a single. executable program.’’ 

  5. Список тогочасних продуктів, див, наприклад, тут 

  6. Для решти запуск співмірний із часом спрацювання секундоміра – 1-2 секунди. 

  7. Але мова все ще залишається актуальною. Після коронавірусної епідемії – менше, але зацитую статтю Is Your Next Language COBOL? від 2008 року: “In 1997 the Gartner Group estimated that there were 240 billion lines of Cobol code in active apps. Something like 90 percent of financial transactions are processed by Cobol code, and 75 percent of all business data processing is Cobol. Merril Lynch reports that 70 percent of its business runs on Cobol apps. Five out of eight companies with an IT manager use Cobol, most of them using it a lot. One estimate puts the value of current running Cobol code at $2 trillion.”