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

Вместо этого я нырнул в мир COBOL, проведя трехчасовую прямую трансляцию своих первых впечатлений и в основном пытаясь что-то сделать.

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

Давайте сначала представим самого почетного гостя:

COBOL, что означает «Общий бизнес-ориентированный язык», является одним из старейших языков программирования, которые все еще используются. Первоначально созданный контр-адмиралом ВМС США Грейс Хоппер в 1959 году, он был одним из первых когда-либо выпущенных языков высокого уровня. С тех пор он много раз пересматривался, последняя версия вышла в 2014 году.

При этом код COBOL — это не то, что вы обычно найдете в дикой природе. Беглый взгляд на GitHub Topics показывает, что в общей сложности 375 репозиториев COBOL. Напротив, Perl имеет 4 289 репозиториев, а Javascript — более 450 000. Часто, когда в разговоре упоминается COBOL, это либо историческая справка, либо предмет для шутки.

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

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-YEAR PIC  9(4).

Это выглядит немного пугающе, но давайте разберемся.

Программы COBOL разбиты на разделы и секции. Для них нет хорошего современного аналога, но по сути это необходимый шаблон для объявления глобальной переменной.

Это подводит нас к начальному числу 01. Предполагается, что COBOL в первую очередь будет работать со структурированными данными, которые располагаются в числовом порядке. Для справки, вот более сложная структура студенческой записи.

01 student-file.
  05 student-id pic 9(5).
  05 student-name pic a(25).
  05 student-dob.
    10 student-day pic 9(2).
    10 student-month pic 9(2).
    10 student-year pic 9(4).

После того, как вы к нему привыкнете, он не сильно отличается от более современных языков программирования. Однако самая интересная часть — это типизация переменных. Это часть PIC 9(4). PIC, сокращение от PICTURE, является основным типом данных COBOL и представляет собой строку символов.

В приведенном выше примере переменная «имя-ученика» имеет место для хранения 25 нечисловых символов (обозначается A (25). Если вам нужны символы и цифры, вы должны использовать X (25).

Это относится и к числовым данным. Вместо того, чтобы обозначаться битами, как в большинстве современных языков программирования, числовые операции обрабатываются с помощью двоично-десятичных операций.

Это имеет смысл, если вспомнить, что программы на языке COBOL изначально были написаны на таких перфокартах.

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

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

Самое большое препятствие, с которым я столкнулся, пытаясь описать COBOL другим, заключается в том, что он не похож ни на что похожее на более распространенные языки программирования.

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

> Writing a record out in COBOL
environment division.
input-output section.
file-control.
  select optional student assign "students.db"
    organization is indexed
    access is random
    record key is student-id.
{...}

procedure division.
OPEN i-o student.

> Variable assignments are done with MOVE
move "10001" to ws-student-id.
move "Test" to ws-student-name.

> This writes out the 
write student-file from ws-student
  INVALID KEY DISPLAY 'Invalid Key'
  NOT INVALID KEY DISPLAY 'Record Inserted'
end-write.

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

screen section.
01 data-entry-screen.
  05 id-section.
    10  value "DATA ENTRY SCREEN"      blank screen
    10  value "ID #: "             LINE 05 COL 05.
    10  value "Name: "             LINE 06 COL 05.
    10  ID-ON-SCR-IN               LINE 05 COL 15
           PIC x(5)                FROM ws-student-id.
    10  NAME-ON-SCR-IN               LINE 06 COL 15
           PIC x(30)                FROM ws-student-name.
    10 value "(C)reate, (R)ead, (U)pdate, (D)elete?" LINE 08 COL 01

COBOL позволяет очень легко создавать собственные интерфейсы и формы.

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

Например, чтобы создать эквивалентный текстовый пользовательский интерфейс на C, который также является переносимым, мне, вероятно, потребуется использовать ncurses или другую библиотеку для работы с терминалом.

Во всяком случае, современными преемниками COBOL являются такие инструменты, как Oracle Forms, SAP и другие инструменты для обработки и хранения данных. Это, вероятно, очевидно для любого, кто программирует на COBOL или знаком с основными преимуществами COBOL: большими железными мейнфреймами.

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

Я полагаю, что это похоже на общее впечатление, которое у меня сложилось о мейнфреймах: они по-своему элегантны и логичны, но совершенно чужды тем, кто вырос в эпоху персональных компьютеров.

Если позволяет время, я обнаруживаю, что несколько заинтересован в написании большего количества кода на языке COBOL и особенно в обсуждении взаимодействия между системами COBOL и ошибкой 2000 года. Хотя на бумаге расширение столбца года с двух цифр до четырех звучит тривиально, дьявол кроется в деталях. Тем не менее, я не уверен, что смогу должным образом отдать должное истории со слепленными примерами.

Тем не менее, это проект для другого дня. Если вам понравилась эта статья, подумайте о том, чтобы подписаться и оставить чаевые. Я также создаю видео и веду прямые трансляции на YouTube. Не стесняйтесь заглядывать и в Дискорд.

До следующего раза, это NCommander, подписываюсь и желаю вам всем приятного дня.