5.16. История языка
История языка Cobol
История языка
1. Предыстория: контекст появления бизнес-ориентированных языков программирования
К концу 1950‑х годов вычислительная техника переживала переход от узкоспециализированных научных и военных приложений к широкому использованию в гражданских отраслях — прежде всего в банковской сфере, страховании, логистике, государственном управлении и бухгалтерском учёте. В отличие от научных расчётов (где преобладали численные методы, матричные операции и дифференциальные уравнения), задачи этих сфер имели иную природу: обработка больших объёмов структурированных записей (например, платёжных поручений, страховых полисов, налоговых деклараций), реализация строгих процедур проверки, валидации и агрегации, а также соблюдение нормативных требований и регулярное формирование отчётности.
На тот момент программирование осуществлялось преимущественно на ассемблере, а также с помощью ранних языков высокого уровня — FORTRAN (1957), разработанного IBM под научные вычисления, и FLOW-MATIC (1955–1959), созданного Грейс Хоппер и её командой в Remington Rand для UNIVAC I.
FORTRAN, несмотря на успех в научной среде, оказался плохо приспособлен к задачам обработки текстовых данных, операций над денежными величинами с фиксированной точкой и работе с иерархическими файловыми структурами (вроде последовательных записей с фиксированной длиной). Ассемблер, хотя и позволял добиться максимальной эффективности, требовал высокой квалификации, был трудночитаемым, не обеспечивал переносимости даже между моделями одного производителя и делал сопровождение программ исключительно дорогостоящим.
Именно в этом контексте возникла необходимость в языке, удовлетворяющем трём ключевым требованиям:
- ориентация на бизнес-логику — возможность естественно описывать операции над записями, денежными суммами, датами, иерархическими структурами данных;
- читаемость и близость к естественному языку — с учётом того, что программистами всё чаще становились не физики или математики, а специалисты по управлению, бухгалтеры, экономисты;
- переносимость — возможность писать код, не зависящий от конкретной архитектуры ЭВМ.
Эти требования легли в основу спецификации нового языка, получившего название COBOL — COmmon Business-Oriented Language.
2. Инициатива CODASYL и рождение COBOL (1959)
В апреле 1959 года министерство обороны США, столкнувшееся с растущими затратами на разработку и сопровождение программного обеспечения для военных и гражданских ведомств, инициировало встречу с представителями промышленности, академических кругов и государственных учреждений. На этой встрече, прошедшей в Пентагоне, была сформирована рабочая группа под эгидой Conference on Data Systems Languages (CODASYL), призванная выработать стандарт описания данных и язык программирования, пригодный для широкого применения в бизнесе.
В состав CODASYL вошли представители шести ведущих компаний и организаций: IBM, RCA, Sylvania, Honeywell, Burroughs и Sperry Rand (владелец UNIVAC), а также Национального бюро стандартов (ныне NIST) и ВВС США. Грейс Хоппер, уже имевшая опыт создания FLOW-MATIC и активно продвигавшая идею английского языка как основы программирования, сыграла ключевую роль в формировании философии COBOL. Её принцип — «computer programs should be written in a language that is close to English» — лег в основу синтаксического и семантического дизайна.
К декабрю 1959 года CODASYL представил первую спецификацию, известную как COBOL-60. Хотя формально стандарт ещё не был утверждён, его черновик уже содержал принципиально новую структуру программы, включающую четыре обязательные секции:
IDENTIFICATION DIVISION— метаданные и идентификация программы;ENVIRONMENT DIVISION— описание внешней среды (оборудования, файлов);DATA DIVISION— декларация данных с детальной типизацией (включаяPIC— picture clauses);PROCEDURE DIVISION— собственно логика.
Особое внимание уделялось декларативному описанию данных. В отличие от FORTRAN, где переменные вводились в коде императивно и имели примитивные типы (INTEGER, REAL), COBOL допускал описание сложных иерархических структур — например, записи с вложенными полями, повторяющимися группами (OCCURS), явными ограничениями формата (PIC 9(5)V99 для денежных сумм с двумя знаками после запятой). Такое описание выносилось в отдельную секцию, где данные рассматривались как независимые от логики объекты, что соответствовало практикам бухгалтерского и управленческого учёта.
Синтаксис COBOL намеренно избегал математической символики в пользу словесных конструкций:
ADD A TO B GIVING C,
MOVE ZERO TO TOTAL-COUNT,
PERFORM CALCULATE-TAX UNTIL END-OF-FILE.
Это позволяло неспециалистам (например, аудиторам или руководителям проектов) читать программный код и проверять соответствие бизнес‑правилам без глубокого погружения в технические детали.
В мае 1960 года были проведены первые успешные компиляции COBOL-программ на машинах RCA 501 и UNIVAC II. К ноябрю того же года IBM, не участвовавшая изначально в разработке (её приоритетом оставался FORTRAN), объявила о поддержке COBOL на серии IBM 7000, что стало решающим импульсом для массового распространения языка.
3. Стандартизация и эволюция: от COBOL-60 до COBOL-85 и далее
Ранние реализации COBOL отличались несовместимостью. Производители вносили собственные расширения: IBM добавила операторы для работы с индексированными файлами, RCA — для пакетной обработки, Honeywell — для многозадачности. Эта фрагментация противоречила изначальной цели переносимости.
Первый официальный стандарт был принят Американским национальным институтом стандартов (ANSI) в 1968 году — ANS X3.23-1968, известный как COBOL-68. Он нормировал:
- 48 зарезервированных слов (впоследствии расширено);
- строгую иерархию дивизионов и параграфов;
- правила описания файлов с тремя организациями:
SEQUENTIAL,RELATIVE,INDEXED; - операторы управления потоком (
IF,PERFORM,GO TO), но без поддержки структурного программирования в полной мере.
В 1974 году вышел пересмотренный стандарт — COBOL-74 (ANS X3.23-1974). Он ввёл:
- динамическое управление памятью (
CALL … USING BY REFERENCE/VALUE); - расширенные возможности работы с датами и временем;
- поддержку локализации (альтернативные символы для разных национальных кодировок);
- уточнения семантики
OCCURS DEPENDING ON.
Однако наиболее значимым стал COBOL-85 (ANSI X3.23-1985), который кардинально модернизировал язык:
- строгое структурное программирование: упразднение безусловного
GO TOв пользуEVALUATE(аналогswitch),CONTINUE,EXIT PERFORM; - вложенность параграфов и секций;
- логические операторы
AND,OR,NOTв условиях; - встроенное управление ошибками (
ON SIZE ERROR,ON OVERFLOW); - поддержка вложенных программ (
NESTED PROGRAMS); - расширенная типизация:
COMP-1,COMP-2(плавающая точка),COMP-3(упакованный десятичный формат — critical для финансовых расчётов).
COBOL-85 стал де-факто базой для большинства промышленных систем, эксплуатируемых и по сей день.
Дальнейшие редакции — COBOL 2002 и COBOL 2014 (ISO/IEC 1989:2014) — добавили объектно-ориентированные возможности (CLASS, METHOD, INHERITANCE), поддержку Unicode, работу с XML, интеграцию с Java через JNI, а также модульность (PROGRAM-ID IS COMMON). Тем не менее, эти расширения получили крайне ограниченное распространение: большинство legacy-систем остались на COBOL-85, а новые проекты почти не запускались на COBOL после 1990‑х.
4. Причины долговечности: почему COBOL не исчез
Несмотря на появление десятков более выразительных, компактных и безопасных языков (C, C++, Java, C#, Python), COBOL сохранил значительную долю критически важных систем. Эту устойчивость нельзя объяснить исключительно «инерцией» или «неспособностью мигрировать». Существуют объективные техничко-экономические факторы:
4.1. Объём и стоимость кодовой базы
По оценкам Gartner, CISCO и консалтинговых фирм (например, Reuters, 2020), в мире эксплуатируется более 220 млрд строк COBOL-кода. Только в США федеральные ведомства используют около 43 млрд строк; крупнейшие банки — по 5–15 млрд строк каждая. Стоимость полной переписки такой системы на другой язык оценивается в сотни миллионов долларов, а срок — в 5–10 лет, с высоким риском потери функциональной эквивалентности (особенно для сложных бизнес-правил, накопленных за десятилетия).
4.2. Надёжность и предсказуемость
COBOL-программы, развёрнутые в 1970–1980‑х, работают в режиме 24/7 без перезагрузок годами. Архитектура таких систем (часто построенная на IBM z/OS, CICS, IMS, VSAM) обеспечивает:
- транзакционную целостность на уровне mainframe;
- строгую контрольную проверку формата данных на этапе компиляции (
PICTURE-описания исключают неявные преобразования); - детерминированное поведение при переполнении (
ON SIZE ERROR); - атомарность операций над записями.
Эти свойства критичны для платёжных систем, где ошибка на один цент в миллиарде транзакций приводит к регуляторным санкциям.
4.3. Интеграционная совместимость
Современные mainframe-платформы позволяют вызывать COBOL-подпрограммы из Java (через CICS Program Link), из REST API (через z/OS Connect), из облачных микросервисов (через IBM Z Open Unit Test и Zowe). Это позволяет инкапсулировать COBOL-ядро как «черный ящик» внутри современного стека, не затрагивая его логику.
4.4. Нормативные и регуляторные ограничения
Многие финансовые стандарты (например, SWIFT MT/MX, ISO 20022) и банковские регламенты (Basel III, SOX) ссылаются на конкретные алгоритмы расчёта, реализованные в COBOL-коде. Любое изменение требует не только технической верификации, но и одобрения аудиторов, центральных банков и органов надзора — процесс, который может занять годы.
5. Современное состояние и перспективы
По состоянию на 2025 год COBOL остаётся языком, критически важным, но не развивающимся. Производители mainframe (IBM, Fujitsu, Micro Focus) продолжают поставлять компиляторы, отладчики и инструменты интеграции. Micro Focus Visual COBOL, например, поддерживает разработку в Visual Studio и Eclipse, компиляцию под Windows, Linux и .NET, а также генерацию Docker-образов.
Однако наблюдается острый дефицит кадров: по данным Dice и IEEE Spectrum, средний возраст COBOL-разработчика в США — 58 лет; менее 0,1 % выпускников университетов изучают COBOL в рамках основной программы. В 2020 году, в разгар пандемии, штат Нью-Джерси призвал на помощь ветеранов-программистов, чтобы модернизировать систему выплат по безработице, написанную на COBOL в 1970‑х, — ситуация, ставшая символом системного риска.
В ответ на это появились инициативы:
- OpenCOBOL → GnuCOBOL (свободная реализация, совместимая с COBOL-85, поддержка Unicode и C-библиотек);
- COBOL as a Service — платформы вроде COBOL-Cloud от TmaxSoft, позволяющие запускать legacy-код на VM без mainframe;
- академические курсы (например, в Университете штата Мэриленд, Токийском институте технологий) по «поддержке критических legacy-систем».
Тем не менее, стратегия большинства организаций — не миграция, а эволюционное сопровождение: рефакторинг в рамках COBOL-85, покрытие тестами (с помощью Z Open Unit Test), постепенное вынесение небизнес-логики (UI, routing, logging) в внешние слои, а также автоматическая документация через статический анализ.