[Перевод] COBOL: все еще в строю спустя столько лет
Он появился еще в 1959 году и, возможно, выглядит странно по сравнению с современными языками, но COBOL по-прежнему способствует развитию бизнеса, сообщает Майк Бедфорд.
Вслед за недавним обзором нескольких классических языков программирования, большинство из которых в значительной степени забыты или выглядят несколько странными, в прошлом месяце мы погружались в особенности языка Fortran. Несмотря на свой возраст, этот язык по-прежнему хорошо знаком программистам, и, хотя в своем первоначальном виде он был примитивным, назвать его необычным было бы неправильно. На самом деле, он оказал влияние на разработку некоторых наиболее популярных сегодня языков. Мало того, он и сегодня играет важную роль. Однако Fortran не одинок в этом отношении.
На этот раз мы рассмотрим еще один древний язык, продолжающий играть ключевую роль во многих областях. И чтобы проиллюстрировать что он действительно принадлежит к давно ушедшей эпохе, достаточно назвать имена производителей компьютеров, участвовавших в его совместной разработке. Конечно, свою роль сыграла компания IBM, но и Burroughs, Minneapolis-Honeywell, RCA, Sperry-Rand, Sylvania — все эти компании сейчас уже мало кто помнит. Этот язык называется COBOL — COmmon Business Oriented Language, и хотя он всего на два года моложе Fortran, впервые увидевший свет в 1959 году, в большинстве других аспектов он не может сильно отличаться.
COBOLим вместе
Контр-адмирал ВМС США Грейс Хоппер, которую иногда называют бабушкой COBOL, входила в группу разработчиков этого языка в конце 50-х годов.
При опросе людей, создающих аппаратные и программные продукты, определившие современную жизнь, обычно можно встретить такие должностные определения как инженер, физик, академик, математик, компьютерщик или предприниматель. Мы крайне редко сталкиваемся в описании с контр-адмиралом ВМС Соединенных Штатов, но все изменится, когда представим Грейс Хоппер. Конечно, надо признать, что она была также ученым-компьютерщиком и математиком, но Грейс Хоппер считается ключевой фигурой в разработке COBOL — совместного проекта ВМС США, ВВС США, Бюро стандартов и ряда производителей компьютеров. Целью проекта была разработка языка для бизнес-приложений, который при этом был бы переносимым на разные платформы. Это резко контрастировало с научными, техническими, инженерными и математическими приложениями, для которых предназначался Fortran. По замыслу Хоппер, который, несмотря на противодействие некоторых кругов, действительно был воплощен в COBOL, программы должны были быть написаны на английском языке, а не в краткой математической нотации. Так, например, оператор, который в Fortran выглядел бы как TD = GP * TR
, превратился бы в MULTIPLY GROSS-PAY BY TAX-RATE GIVING TAX-DEDUCTED.
в COBOL. Да, мы могли бы использовать более осмысленные имена переменных в коде на Fortran, и тогда оба кода выглядели бы более похожими, но, несмотря на это, в Fortran было принято использовать краткие имена переменных, а в COBOL поощрялись более длинные.
Грейс Хоппер утверждала, что для большинства людей проще написать английское выражение, чем использовать символы. Однако, через несколько лет мы стали слышать что польза от этого была не столько для программистов, сколько для непрограммистов, которым может понадобиться читать и понимать код. Например, было высказано предположение, что в некоторых случаях бухгалтерам, аудиторам и финансовым директорам будет необходимо понимать программы, на которых работают системы их организаций. Но также есть мнение, что эти рассуждения ошибочны. Конечно, показанный нами оператор COBOL несколько проще для понимания, чем эквивалент на языке Fortran, но нематематику и непрограммисту, наверняка не потребуется много времени, чтобы разобраться в отдельных операторах. Гораздо более сложной задачей, которую COBOL не решал, является понимание структуры и работы программы в целом. Действительно, с этим сталкиваются даже программисты при попытке сопровождения или улучшения программы, написанной их коллегой. А бывает и хуже. Англоязычные формулировки приводят к тому, что код получается многословным, а это, как правило, затрудняет интерпретацию. А поскольку на написание длинных высказываний уходит больше времени, чем на короткие, то возникает вопрос, не снижает ли подход COBOL производительность труда программистов.
Таким образом, вопрос о пользе или вреде замены символов на английские слова может быть спорным, и тот факт, что немногие, если вообще какие-либо, более современные языки последовали этому примеру, может быть показательным. Однако, другие особенности COBOL, не разделяемые Fortran и большинством других ранних языков, определенно благоприятствовали финансовым и бизнес-приложениям. На первом месте в списке стоит поддержка иерархических структур данных, которая имеет некоторое сходство со структурами языка C, но до появления этого языка пройдет еще 13 лет. Они обычно использовались при чтении данных фиксированного формата, например, с перфокарт или дисковых файлов фиксированного формата, и определяли способ представления данных в каждой записи. Так, например, клиент может быть определен именем, адресом, датой последней покупки и т.д., а некоторые из этих переменных могут быть разделены на подразделы. Например, любые даты могут быть разделены на день, месяц и год. И эти подразделы могут содержать дальнейшие подразделы. Все самые нижние уровни будут определяться типом данных (например, числовые или текстовые) и их длиной. Рассмотрим на примере, как возможность ссылаться на любой уровень в структуре данных повышает эффективность. Классическим примером COBOL является проверка данных, при которой данные считываются из стопки перфокарт — данные на тех картах, которые признаны достоверными, записываются в файл для последующего использования, а сообщения об ошибках, выявляющих недействительные карты, выводятся на печать. Так, например, проверка даты включает в себя проверку того, что месяц имеет значение от 1 до 12, что предполагает обращение к записи нижнего уровня в структуре данных. Однако запись валидных данных в файл может быть осуществлена с помощью одной инструкции, которая обращается к записи верхнего уровня.
Один из двух компьютеров, на которых впервые был запущен COBOL, Sperry-Rand UNIVAC I, вошел в учебники истории, но язык продолжает жить.
Практическая работа
Первоначально код COBOL должен был придерживаться фиксированного формата, причем различные типы операторов начинались в разных колонках. Формы кодирования помогали программистам использовать правильные колонки.
Мы предполагаем, что большинство из вас не решит заниматься серьезным кодингом на COBOL, но можно попробовать его на скорую руку, чтобы лучше оценить его уникальность, поэтому мы приводим лишь тривиально простой пример. Вы можете попробовать и, возможно, улучшить код, воспользовавшись онлайн-средством Try it Online (https://tio.run), но не забудьте сначала заглянуть в примечания, следующие за кодом. Учитывая нишевую природу этого языка, во всяком случае для непрофессионалов, вы, скорее всего, не захотите устанавливать компилятор локально, но если все же решите, то мы рекомендуем GnuCOBOL, который как раз и является компилятором, размещенным на сайте Try it Online.
IDENTIFICATION DIVISION.
PROGRAM-ID. TAX001.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INPUT-DATA.
02 GROSS-PAY PIC 999999.
02 TAX-RATE PIC V999.
01 TAX-DEDUCTED PIC 999999.
PROCEDURE DIVISION.
ACCEPT INPUT-DATA.
MULTIPLY GROSS-PAY BY TAX-RATE GIVING TAX-DEDUCTED.
DISPLAY TAX-DEDUCTED.
STOP RUN.
Ввиду необычности кода, особенно для программистов XXI века, следующие примечания помогут вам лучше понять его.
Оригинальный COBOL накладывал строгие ограничения на то, какие столбцы использовать. В последнее время эти ограничения были смягчены, но все же не начинайте строку раньше 8 столбца.
Программа на языке COBOL разбивается на разделы, первоначально это разделы IDENTIFICATION, ENVIRONMENT, DATA и PROCEDURE DIVISION, хотя большинство современных компиляторов требуют только первый и последний из них. IDENTIFICATION DIVISION содержит обязательный PROGRAM-ID, но могут быть представлены и дополнительные виды информации. Раздел ENVIRONMENT DIVISION, который мы опустили, содержит информацию, относящуюся к конкретному аппаратному обеспечению, поэтому, теоретически, при переносе кода может потребоваться изменение только этого раздела. Сюда, например, включаются сведения об устройствах ввода-вывода. DATA DIVISION, который, несмотря на свою необязательность, необходим практически во всех приложениях, содержит эквивалент объявления переменных, хотя и приспособленный для поддержки иерархических структур данных. А в PROCEDURE DIVISION содержатся исполняемые операторы.
Если бы наш код содержал дисковый ввод-вывод, то DATA DIVISION включал бы в себя INPUT-OUTPUT SECTION. Однако, поскольку для ввода-вывода мы используем только операторы ACCEPT и DISPLAY (см. п. 5), в этом нет необходимости, поэтому у нас есть только раздел WORKING-STORAGE, в котором определяются «обычные» переменные. У нас всего две переменные верхнего уровня (01), а именно INPUT-DATA и TAX-DEDUCTED. Для переменной TAX-DEDUCTED имеется PIC 999999, что определяет переменную как шестизначное число. Для INPUT-DATA такого определения нет, поскольку она разделена на две переменные нижнего уровня (02). Первая из них определяется как шестизначное число, а вторая — как числовое значение, состоящее из трехзначного числа с подразумеваемой десятичной точкой в начале.
Высказывания завершаются точками, что еще раз подчеркивает англоязычный характер языка COBOL.
Для упрощения мы используем ACCEPT и DISPLAY для ввода/вывода. В ранние времена они могли считывать или записывать данные с консоли оператора, но обычно не использовались. Однако, в отличие от других форм ввода/вывода, таких как READ или WRITE, нам не нужно предоставлять информацию в ENVIRONMENT DIVISION или INPUT-OUTPUT SECTION для DATA DIVISION. ACCEPT может принимать значение только для одной переменной, так что в этом отношении он аналогичен чтению с перфокарты. Этой переменной является INPUT-DATA, которая делится на GROSS-PAY и TAX RATE, причем последняя не является процентом, а представляет собой значение в диапазоне от 0 до 0,999. Эти два значения вводятся сразу друг за другом, и их следует набирать в области INPUT до выполнения кода, если вы используете Try it Online. Так, для зарплаты в размере 40 000 и налоговой ставки 0,250 следует ввести
040000250
.
COBOL И ОШИБКА Y2K
В 1999 году наиболее сенсационные новостные издания сообщали о том, что с наступлением нового тысячелетия наступит конец цивилизации. В некоторых из них появились сообщения о том, что люди планируют спастись от Армагеддона, запасаясь провизией и оружием и покидая города ради безопасности, в пустыне.Это было связано с «ошибкой Y2K», которая, как предполагалось, приведет к отказу компьютерных систем по всему миру в полночь в канун нового тысячелетия. Сбои были зафиксированы, но массовых разрушений удалось избежать. Проблема заключалась в том, что в старом коде COBOL даты хранились с двузначным годом вместо четырех, поэтому 2000 год интерпретировался как 1900 — такова была необходимость экономить два байта при хранении даты в те времена, когда стоимость хранения данных была очень высока. Многие компании упредили эту проблему, наняв целые армии программистов COBOL, большая часть из которых уже пребывали на пенсии, для поиска и исправления кода, не соответствующего требованиям тысячелетия. История свидетельствует о том, что их поиски увенчались успехом, но, оглядываясь назад, можно смело сказать, что не все так думали. Для некоторых вздох облегчения, когда конец света не наступил, вскоре сменился мнением, что все это было обманом. Попробуйте сказать это Уэйну Хорскрофту, одному из программистов на языке COBOL, который в конце 90-х годов занимался этой проблемой, возглавляя проект »2000 год» в компании Utah Power & Light. В интервью газете Los Angeles Times Хорскрофт признался, что стресс и напряженный темп работы заставили его досрочно выйти на пенсию.
Эволюция
Как язык, который продолжает использоваться уже более 60 лет, неудивительно, что, подобно языку Fortran, COBOL пережил множество изменений, последним из которых является COBOL 2014. Новые версии появлялись вслед за оригиналом; уже в 1961 году вышла версия, в которой появились функции, которые, по всей видимости, должны были присутствовать в первоначальной версии. Похоже, что возможности начальной версии COBOL были ограничены из-за амбициозных сроков разработки. Несмотря на это, новые инструкции в первом обновлении были инновационными. За исключением иерархической структуры данных, функции оригинального COBOL во многом совпадали с функциями других современных языков, хотя и отличались необычным англоязычным синтаксисом. Однако COBOL 61 содержал инструкции, которые, вероятно, даже не рассматривались бы для языков, предназначенных для научных или технических приложений. Первой из таких специфических для бизнеса инструкций стал оператор SORT. Его назначение — сортировка несортированного входного файла с записью результата в файл вывода. Оператор определяет один или несколько ключей — переменных более низкого уровня, каждый из которых может быть отсортирован как по возрастанию, так и по убыванию. Без оператора SORT пришлось бы писать немалый объем кода, либо использовать внешние библиотечные функции, что может негативно сказаться на переносимости. Далее следует оператор MERGE считывающий данные из двух или более ранее отсортированных файлов, записывая объединенный файл в соответствии со спецификацией сортировки. Затем появились различные инструкции, упрощающие составление отчетов.
Как и Fortran, COBOL также выиграл от модернизаций, которые ввели соглашения и парадигмы программирования, появившиеся после его разработки. Требование использования только верхнего регистра — навязанное из-за ограничений перфокарт и линейных принтеров — было смягчено в пользу использования прописных и строчных букв. Был введен блочно-структурный подход. И наконец, начиная с COBOL 2002, он мог похвастаться объектной ориентацией.
ПЕРЕВОДЫ КОБОЛА
Поскольку одна из целей COBOL заключалась в том, что код должен быть англоподобным, чтобы его могли читать непрограммисты, интересно рассмотреть, существовали ли варианты, на основе других естественных языков. В конце концов, французскому бухгалтеру обычная программа на COBOL не покажется такой уж простой, как британскому или американскому. Оказалось, что переводы COBOL действительно существуют.Нам хотелось бы сообщить, что нашли нечто столь же причудливо выглядящее, как греческий или арабский код COBOL, но мы не уверены, что такое вообще существовало, и даже не можем представить себе китайскую версию. Однако мы знаем, что COBOL переводился на русский язык, и для него, конечно же, использовалась кириллица. Однако, как и в большинстве случаев, связанных с бывшим Советским Союзом, подробностей найти практически невозможно. Однако еще в 1965 году Европейская ассоциация производителей компьютеров опубликовала отчет, определяющий перевод COBOL на французский, немецкий и итальянский языки. Впоследствии эти документы были опубликованы в качестве национальных стандартов. Так что, если вам показалось, что оригинальный COBOL был странным, то вас могут заинтересовать эти эквиваленты нашей ранее цитированной инструкции
MULTIPLY GROSS-PAY BY TAX-RATE GIVING TAX-DEDUCTED.
. На французском языке COBOL это будетMULTIPLIER SALAIRE-BRUT PAR TAUX-DIMPOSITION RESULTANT TAXE-DEDUIT.
(да, мы также взяли на себя смелость перевести имена переменных), а на немецком языке —MULTIPLIZIERE BRUTTOLOHN MIT STEUEERSATZ ERGIBT STEUERABZUG.
, а итальянский эквивалент —MOLTIPLICA RETRIBUZIONE-LORDA PER ALIQUOTA-FISCAL DANDO IMPOSTA-DETRATTA.
.
COBOL сегодня
Учитывая возраст COBOL, можно было бы предположить, что его использование сильно сократилось с момента расцвета, но факты говорят о другом. Еще в 2022 году поставщик основных средств разработки на языке COBOL компания Micro Focus, ныне входящая в состав OpenText, провела исследование, выявившее несколько поразительных фактов. Более 800 млрд. строк COBOL поддерживают современные основные бизнес-системы, и 52% респондентов прогнозируют, что COBOL будет существовать в течение следующего десятилетия и далее, 83% считают, что он будет существовать и после их выхода на пенсию, а 54% ожидают увеличения использования COBOL в ближайшие 12 месяцев. Не менее 92% заявили, что их COBOL-приложения носят стратегический характер.
Эта статистика не говорит о том, что код статичен и не отвечает современным требованиям. Огромные стопки старинного кода, большая часть которого относится к доинтернетным временам, не просто поддерживаются в рабочем состоянии; более того, по результатам опроса 72% респондентов предпочли модернизацию в качестве общей бизнес-стратегии, а двое из трех заявили, что намерены модернизировать свои COBOL-приложения, а не заменить их, поскольку это стратегически лучший вариант для предприятия, не склонного к риску. Но COBOL не только остается критически важным для бизнеса, он также обеспечивает потребителей, на которых мы полагаемся, как объяснил интернет-изданию TechBeacon Эд Эйри (Ed Airey) из компании OpenText. «Большинство вещей, которые мы каждый день воспринимаем как должное, например, возможность снять деньги в банке с помощью банкомата, заказать билет на самолет в отпуск или получить страховое предложение, зависят от COBOL, спокойно работающего в фоновом режиме, — сказал он. Это, конечно, зависит от модернизации, от внедрения технологий, которые были неслыханны, когда код был впервые написан, как пояснил Айри в интервью ITPro Today.» Общая кодовая база COBOL продолжает развиваться и изменяться по мере того, как новые возможности ИТ-компаний, такие как веб- и мобильный доступ, развертывание облаков, интеграция API и контейнеризация, используются для поддержки новых требований заказчиков». Результаты опроса свидетельствуют о том, что COBOL не стоит на месте и не находится в режиме технического обслуживания, а, скорее, принимает новые изменения в поддержку новой цифровой эры». Последнее слово мы предоставим Скоту Нейлсону из компании OpenText, который в беседе с ITPro Today также высказался о месте COBOL в современном мире. «Он все еще здесь, потому что все то, что люди создали несколько десятилетий назад, может работать и сегодня. Вам не нужно выбрасывать его и начинать все сначала. Можно строить на его основе».
Даже сегодня код COBOL часто выполняется на мэйнфреймах, таких как этот IBM Z.
Может быть, еще через 60 лет мир будет петь дифирамбы COBOL? Возможно, и нет, если разработка, недавно анонсированная компанией IBM, оправдает свой потенциал. По словам представителей IBM, этот продукт с поддержкой искусственного интеллекта, получивший название WatsonX Code Assistant for Z, поможет ускорить трансляции COBOL в Java на своих мэйнфреймах Z и повысит производительность разработчиков на этой платформе. Итак, возможно, COBOL уже не спасти, но готовы ли вы делать на это ставку? Или, может быть, эксперты в конце концов процитируют Марка Твена, который, услышав сообщение о том, что он испустил последний вздох, сказал: «Сообщения о моей смерти сильно преувеличены»?