PL/I
PL/I — это язык программирования общего назначения, разработанный в середине 1960-х годов корпорацией IBM. Название является аббревиатурой от «Programming Language One» (Язык программирования номер один). PL/I был создан как попытка объединить возможности языков для научных (FORTRAN), коммерческих (COBOL) и системных (ассемблер) задач в одном универсальном инструменте. Язык отличался исключительно богатой стандартной библиотекой, поддержкой структурного и модульного программирования, а также сложным синтаксисом, что делало его мощным, но трудным для изучения.
История
Предпосылки создания
В начале 1960-х годов в вычислительной технике существовал «языковой разрыв». Для научных и инженерных расчётов использовался Fortran, для бизнес-приложений — COBOL, а для системного программирования — ассемблеры. Организациям, особенно крупным корпорациям и государственным учреждениям, приходилось поддерживать несколько языков и специалистов. В 1963 году комитет SHARE, объединяющий пользователей мейнфреймов IBM, выдвинул инициативу создания единого языка, который бы покрыл все эти области.
Разработка и анонс
Разработка была поручена компании IBM. Первая версия компилятора была выпущена в 1966 году для операционной системы OS/360. Изначально язык назывался просто «NPL» (New Programming Language), но это название вызвало конфликт с британской National Physical Laboratory. В итоге, в 1965 году было официально принято название PL/I. IBM вложила значительные ресурсы в продвижение языка, позиционируя его как будущее программирования.
Версии и стандартизация
В 1976 году была опубликована версия PL/I (F), которая стала первой официальной стандартизацией. Она включала, среди прочего, поддержку структур данных, многозадачности и обработки исключений. В 1981 году вышел стандарт ANSI X3.53-1981, а затем в 1984 году — ISO 6160:1984. Последняя крупная версия стандарта — ANSI/IEEE X3.74-1987, принятая в 1987 году. Несмотря на стандартизацию, IBM продолжала выпускать свои расширения для конкретных систем (например, PL/I for MVS, PL/I for OS/390, Enterprise PL/I for z/OS). Эти реализации отличались от стандарта в деталях.
Спад популярности
К 1970-м годам стало очевидно, что обещания PL/I не оправдались в полной мере. Язык оказался слишком сложным для обучения, его компиляторы требовали больших ресурсов, а программы часто были менее эффективными по сравнению с написанными на специализированных языках. Кроме того, появление более простых и эффективных языков (C, Pascal) сделало PL/I нишевым решением. К концу 1980-х годов он использовался в основном для сопровождения старых систем (legacy code) на мейнфреймах IBM.
Современное состояние (на 2025 год)
PL/I по-прежнему применяется, хотя и в крайне ограниченной сфере — в основном для поддержки мейнфреймов IBM Z в крупных банках, страховых компаниях и государственных учреждениях. Тысячи приложений на PL/I продолжают работать. В 2016 году компания IBM выпустила Enterprise PL/I 5.1 для z/OS, который поддерживает современные стандарты (Unicode, XML, 64-разрядную адресацию). Несмотря на это, рынок труда для PL/I-программистов крайне узок и преимущественно связан с обслуживанием старых систем. Свободных (бесплатных) реализаций полного стандарта не существует; все коммерческие компиляторы (IBM, Micro Focus) являются платными.
Классификация и парадигмы
PL/I относится к императивным, процедурным и в общем случае — к языкам высокого уровня. В рамках одного языка он поддерживает множество парадигм:
- Структурное программирование: Язык допускает написание кода с использованием блоков
DO ... END,IF-THEN-ELSE,SELECT(аналог switch), цикловDO WHILE,DO UNTIL,DO ... TO ... BY. - Модульное программирование: Поддерживаются процедуры (функции), а также концепция «задач» (tasks) для параллельного выполнения.
- Объектно-ориентированное программирование (ограниченно): В реализации IBM (Enterprise PL/I) появилась поддержка классов и наследования, но она не является частью стандарта.
- Обработка исключений: Встроенный механизм
ON unitsдля перехвата ошибок ввода-вывода, арифметических переполнений и других исключительных ситуаций. - Параллельное программирование: Язык изначально включал средства многозадачности (parallel tasks), что было редкостью для 1960-х годов.
Характеристики и особенности
Синтаксис
Синтаксис PL/I — его самая знаменитая (и, по мнению критиков, ужасная) особенность. Он построен на свободном формате (игнорирование пробелов) и использует ключевые слова для управления структурой программы. Например, блоки кода всегда обрамляются парами PROCEDURE/END, DO/END. Комментарии заключаются в пару символов / ... /. Язык является регистронезависимым.
Типы данных
PL/I имеет богатую систему встроенных типов данных:
- Числовые:
FIXED BINARY(целые),FIXED DECIMAL(дробные с фиксированной точкой),FLOAT BINARY/DECIMAL(вещественные с плавающей точкой),COMPLEX(комплексные). - Строковые:
CHARACTER VARYING(строки переменной длины),CHARACTER(строки фиксированной длины),BIT(битовые строки). - Структуры (структурные типы): Определяются ключевым словом
STRUCTUREили через объявление переменных в блокахDECLARE ... BASED. Позволяют объединять разные типы данных (например, для работы с записями файлов). - Указатели:
POINTERдля адресной арифметики. - Массивы: Однородные и неоднородные, с произвольным числом размерностей.
Переменные и объявления
Объявление переменных выполняется с помощью ключевого слова DECLARE. Оно может быть явным или неявным (по умолчанию). PL/I поддерживает динамические массивы, размер которых может изменяться во время выполнения, что активно использовалось.
Управляющие конструкции
- Условные операторы:
IF condition THEN ... ELSE ... - Циклы:
DO WHILE (condition); ... END;,DO UNTIL (condition); ... END;,DO variable = start TO finish BY step; ... END; - Выбор:
SELECT (expression);WHEN (value1) ...OTHERWISE ...END;
Обработка исключений
Одно из новшеств PL/I — концепция ON units. Например: ``pl/i ON OVERFLOW BEGIN; PUT LIST('Арифметическое переполнение!'); CALL ERROR_HANDLER; END; `` Такие блоки позволяют перехватывать и обрабатывать ошибки, не прерывая выполнение программы.
Многозадачность
PL/I позволяет создавать параллельные задачи (tasks). Программа может запускать дочерние задачи с помощью CALL TASK, а затем синхронизировать их. Это одна из ранних реализаций многопоточности.
Основные области применения
- Системное программирование: В 1960-70-х годах на PL/I была написана часть компонентов операционной системы OS/360 (например, подсистема управления базами данных IMS).
- Бизнес-приложения (Мейнфреймы): Огромное количество приложений для обработки транзакций, банковских систем, расчета заработной платы. Большая часть этого кода до сих пор работает на мейнфреймах.
- Научные расчеты: Меньше, чем в Fortran, но PL/I поддерживал числа с плавающей точкой и комплексные числа.
- Текстообработка: Строковые типы и функции делали PL/I популярным для задач по обработке текстов в крупных системах.
Критика
PL/I подвергался суровой критике на протяжении всей своей истории:
- Чрезмерная сложность: Язык был признан одним из самых сложных для изучения. Сотни ключевых слов, неоднозначный синтаксис (например, неявное объявление переменных) и сложная система правил делали разработку на нём дорогостоящей и подверженной ошибкам.
- Несовместимость: Компиляторы разных производителей (IBM, Micro Focus) часто по-разному трактовали стандарт, что вело к проблемам переносимости кода.
- Непрозрачность: Код на PL/I часто труднее читать и поддерживать по сравнению с языками с более строгим синтаксисом (например, Pascal).
- Ресурсоёмкость: Компиляторы PL/I были медленными, а сгенерированный код — менее эффективным по сравнению с нативным кодом на C или ассемблере.
- Негибкость: Язык пытался покрыть слишком много областей сразу, но в каждой из них он уступал специализированному языку (Fortran — научные; COBOL — бизнес; C — системное).
Литература и документация
- IBM Enterprise PL/I for z/OS User’s Guide — официальная документация от производителя.
- PL/I Language Reference Manual (GC33-0006-0) — оригинальная документация IBM (1966 год).
- «PL/I Programming» by E. H. P. (Englebert) B. — книги по изучению языка**.
- S. P. (Steven) M. — «A Guide to PL/I» — учебное пособие.
- Стандарты: ANSI X3.53-1981, ISO 6160:1984, ANSI/IEEE X3.74-1987.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →