ПЛ/1

ПЛ/1 (PL/I, Programming Language I — «язык программирования номер один», в русском языке произносится «пи-э́ль оди́н») — разработанный в 1964 году язык программирования, созданный для научных, инженерных и бизнес-ориентированных вычислений. Содержит настолько широкий набор синтаксических конструкций и встроенных функций, что, вероятно, не существует ни одного компилятора, поддерживающего все предусмотренные в спецификации языка возможности. Поддерживает рекурсию и структурное программирование, широко применялся в обработке данных. Настоящее международное название языка PL/I (из латинских литер, как и PL/M, PL/S) в СССР не прижилось.

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

Основные свойства 
В отличие от других языков программирования, у ПЛ/1 - свободный синтаксис: ключевые слова в зависимости от контекста могут быть идентификаторами. Это даёт возможность развивать язык, пополняя его новыми ключевыми словами, которые бы не вступали в конфликт с идентификаторами в старых программах. Ключевые слова и идентификаторы нечувствительны к регистру. Язык предусматривает очень обобщённые операторы со многими вариантами синтаксиса.

В языке весьма развита система встроенных типов данных, при этом имеется возможность неявных преобразований между большинством из них. Поддерживаются сложные структуры с объединениями (в терминологии Паскаля — записи с вариантами). Реализовано множество операций с массивами.

Язык стал первым, использовавшим термин «статический» для переменных, хранящих не в стеке, а в статической памяти. Предусмотрено несколько видов динамического выделения памяти. По умолчанию (в классических версиях для мейнфреймов — всегда) используется передача параметров по ссылке.
 
Для управляющих конструкций заложена строго определённая семантика, например, оператор цикла определён через эквивалентные присваивания и go to и так далее.

Впервые в истории языков программирования в языке был реализован развитый механизм исключительных состояний.

На уровне языка реализована поддержка многозадачности и асинхронного ввода-вывода, сложных методов доступа для ввода-вывода.

В язык встроен развитый препроцессор, фактически сам являющийся подмножеством ПЛ/1.

Из синтаксических особенностей, появившихся впервые в языке — символика /* */ для комментариев и нотация «->» для указателей.

Алфавит 
Первоначальный алфавит ПЛ/1 включал 60 символов: $ @ # A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + — * / () , . ' % ; : ¬ & | > < _ ? и пробел.

Была предусмотрена возможность работы и с более ограниченным 48-символьным алфавитом, в который не входили символы @ # ; : ¬ & | > < _ ? — вместо отсутствующих символов использовались дополнительные ключевые слова:

В современных версиях языка разрешено использовать также строчные латинские буквы, а в компиляторе PL/1-KT — русские строчные и прописные буквы. Везде, кроме значений строк символов, строчные буквы эквивалентны прописным. Вместо символа ¬ (отрицание), отсутствующего в переносимом наборе символов, используют ~.

История 
ПЛ/1 был разработан в IBM как часть системы System/360. До того IBM разработала несколько несовместимых компьютеров для разных целей: одни для научных, другие — для бухгалтерских приложений. Целью System/360 была разработка единой системы совместимых компьютеров, которые заменили бы все предыдущие модели и могли бы с успехом использоваться для любых задач.

Научные и бухгалтерские программы не только использовали разные компьютеры, но ещё и писались на разных языках: научные — на Фортране, бухгалтерские — в основном на Коболе. Целью ПЛ/1 было создание языка, подходящего для обоих типов приложений. Другой целью было добавление конструкций для структурного программирования, взятых из Алгола-60, не поддерживавшихся в то время ни Коболом, ни Фортраном.

Для разработки языка был сформирован комитет, состоявший из программистов IBM и пользователей со всех концов США. Работа комитета длилась несколько месяцев. Изначально планировалось, что ПЛ/1 будет готов к использованию к моменту запуска System/360, но это не было выполнено.

Язык изначально был назван NPL (New Programming Language — «новый язык программирования»), но эта аббревиатура уже использовалось британской Национальной физической лабораторией (National Physics Laboratory), поэтому название изменили на ПЛ/1.

Поначалу ПЛ/1 вызвал большой энтузиазм, но оказался не так успешен, как планировалось, по ряду причин. Основная причина — большая сложность языка, язык был разработан комитетом, пытавшимся согласовать и удовлетворить нужды совершенно разных пользователей (научных и банковских), в результате язык оказался как сложен для освоения, так и труден для реализации компиляторов. Следствием сложности компиляторов стало их низкое качество, неоптимальность генерируемого исполняемного кода и большое количество сбоев и ошибок на этапе исполнения. В частности, возможность асинхронной модификации (например, в результате конструкции on error) делает оптимизацию на этапе компиляции крайне затруднительной. Особенно критичной неоптимальность оказалась для математических расчётов, из-за чего язык не смог заменить Фортран для этого класса задач. При этом значительная часть пользователей не использовала многие встроенные возможности, например, практически невостребованной осталась поддержка многозадачности. Кроме того, компиляторы языка ПЛ/1 реализовывали различные подмножества языка, что приводило к непереносимости программ.

Со временем ситуация изменилась: сложным язык был относительно существовавших тогда Фортрана, Кобола, Алгола, в сравнении с более современными языками ПЛ/1 стал не так сложен, и со временем было реализовано множество различных компиляторов, генерирующих качественный код. Хотя ПЛ/1 и не смог вытеснить Фортран и Кобол (или даже сравниться с ними по популярности — во всём мире, но не в СССР и странах СЭВ), тем не менее, он активно использовался во второй половине 1960-х и в 1970-х годах, особенно для бухгалтерских приложений, в основном из-за отсутствия в то время лучшей альтернативы. Наибольшую популярность он завоевал в СССР и странах СЭВ, так как его компилятор входил в комплект поставки ЕС ЭВМ. Также в СССР было издано большое количество учебной литературы по языку. Как Фортран, так и КОБОЛ были бедны по своим возможностям даже для задач того времени. ПЛ/1, напротив, представлял богатый набор средств.

Так, проект Multics, одна из первых попыток написать ОС на языке высокого уровня, использовал EPL (Early PL) — диалект ПЛ/1, разработанный в МТИ в 1964 году. Впоследствии для Multics был реализован «настоящий» ПЛ/1. Диалект XPL был использован для создания языка HAL/S, на котором программировались компьютеры космических кораблей проекта «Шаттл». Для ещё одного подмножества — PL/C — в Корнеллском университете был создан уникальный компилятор CORC, который мог скомпилировать программу с любыми синтаксическими ошибками, путём исправления многих ошибок и преобразования оставшихся в объектный код (это свойство в значительной степени присуще также компиляторам IBM для мейнфреймов). Первая система резервирования авиабилетов, SABRE, была написана (по крайней мере, её предполагалось написать) на ПЛ/1. Ещё одним диалектом ПЛ/1 был PL/S, на котором фирма IBM написала в начале 1970-х годах операционную систему MVS. IBM до сих пор использует усовершенствованный PL/S (который ныне известен как PL/X) для работы над системами семейства z/OS для IBM System z.

В СССР ПЛ/1 также был популярен в 1970-х и до первой половины 1990-х годов благодаря широкой распространённости ЕС ЭВМ, совместимых с мейнфреймами IBM. Кроме того, ПЛ/1 был реализован на БЭСМ-6 и Эльбрусе.

В 1972 году Гари Килдалл из Intel разработал на базе ПЛ/1 язык PL/M для операционной системы CP/M — приблизительный аналог языка Си с синтаксисом, близким к подмножеству ПЛ/1. Впоследствии Килдалл основал фирму Digital Research, которая реализовала подмножество ПЛ/1 общего назначения «G» (международный стандарт ISO/IEC 6522:1992) для процессоров (8080) Intel, а затем для Intel 8086 и MS-DOS.

Реализации 
Хотя ПЛ/1 использовался в основном на мейнфреймах различных производителей, были также версии для операционных систем AIX, OS/2, OS/400, Windows, Unix и ряда других.

Одной из примечательных реализаций стал советский компилятор PL/1-KT для MS DOS, созданный на основе реализации Digital Resarch; среди его расширений — поддержка в системе типов единиц СИ (метр, килограмм, секунда, Кельвин, ампер, кандела, моль, а также радиана и стерадиана)), использование русских идентификаторов и ключевых слов, применение символов псевдографики в качестве пробелов, сокращённые формы записи операций, операторы обнуления.

По состоянию на 2020-е годы существуют следующие компиляторы ПЛ/1:
 фирмы IBM — для платформ z/OS, MVS, VM, VSE, AIX, Windows,
 фирмы Micro Focus — для платформ HP-UX, AIX, Windows, Solaris, Linux (SuSE, RedHat),
 фирмы Fujitsu-Siemens — для платформы BS2000/OSD,
 фирмы Kednos — для платформ OpenVMS и Tru64,
 фирмы Stratus Technologies — для платформы VOS,
 фирмы Raincode — для платформы .NET,
 фирмы Iron Spring — для платформ OS/2 и Linux.
 свободный компилятор PL/1-KT для платформы Wintel.

Первый компилятор PL/I (F) от IBM (как и вся OS/360) и компилятор PL/C CORC имеют статус свободно распространяемого программного обеспечения.

Пример программы 
Test: procedure options(main);
   declare My_String char(20) varying initialize('Hello, world!');
   put skip list(My_String);
end Test;
То же самое можно написать гораздо короче:
Test: proc options (main);
  put list ('Hello, world!');
end;

Примечания

Литература 
 ANSI X3.53-1976 (R1998) Information Systems — Programming Language — PL/I
 ANSI X3.74-1987 (R1998) Information Systems — Programming Language — PL/I General-Purpose Subset
 ISO 6160:1979 Programming languages — PL/1 
 ISO/IEC 6522:1992 Information technology — Programming languages — PL/1 general purpose subset 
 Сборник задач по программированию на языке ПЛ/1: учебное пособие для вузов / Бухтияров А. М., Фролов Г. Д., Олюнин В. Ю.; Под ред. Н. А. Криницкого. — 3-е изд., испр. — : Наука, 1988. — 320 с. ISBN 5-02-013795-2.

Ссылки 
 
 FAQ по ПЛ/1
 Официальный сайт на сервере IBM
 Компилятор Open PL/I
 pl1gcc.sourceforge.net  — фронтэнд PL/1 для GNU Compiler Collection

Языки программирования по алфавиту
Появились в 1964 году в США