ПЛ/1
ПЛ/1 (PL/I, Programming Language I — «язык программирования номер один», в русском языке произносится «пи-э́ль оди́н») — разработанный в 1964 году язык программирования, созданный для научных, инженерных и бизнес-ориентированных вычислений. Содержит настолько широкий набор синтаксических конструкций и встроенных функций, что, вероятно, не существует ни одного компилятора, поддерживающего все предусмотренные в спецификации языка возможности. Поддерживает рекурсию и структурное программирование, широко применялся в обработке данных. Настоящее международное название языка PL/I (из латинских литер, как и PL/M, PL/S) в СССР не прижилось. Разрабатывался IBM как универсальный язык, превосходящий по возможностям предшественников, но получил лишь ограниченное распространение из-за сложности самого языка и его реализаций. Основные свойстваВ отличие от других языков программирования, у ПЛ/1 - свободный синтаксис: ключевые слова в зависимости от контекста могут быть идентификаторами. Это даёт возможность развивать язык, пополняя его новыми ключевыми словами, которые бы не вступали в конфликт с идентификаторами в старых программах[2]. Ключевые слова и идентификаторы нечувствительны к регистру. Язык предусматривает очень обобщённые операторы со многими вариантами синтаксиса. В языке весьма развита система встроенных типов данных, при этом имеется возможность неявных преобразований между большинством из них. Поддерживаются сложные структуры с объединениями (в терминологии Паскаля — записи с вариантами). Реализовано множество операций с массивами. Язык стал первым, использовавшим термин «статический» для переменных, хранящих не в стеке, а в статической памяти. Предусмотрено несколько видов динамического выделения памяти. По умолчанию (в классических версиях для мейнфреймов — всегда) используется передача параметров по ссылке. Для управляющих конструкций заложена строго определённая семантика, например, оператор цикла определён через эквивалентные присваивания и go to и так далее. Впервые в истории языков программирования в языке был реализован развитый механизм исключительных состояний. На уровне языка реализована поддержка многозадачности и асинхронного ввода-вывода, сложных методов доступа для ввода-вывода. В язык встроен развитый препроцессор, фактически сам являющийся подмножеством ПЛ/1. Из синтаксических особенностей, появившихся впервые в языке — символика АлфавитПервоначальный алфавит ПЛ/1 включал 60 символов: Была предусмотрена возможность работы и с более ограниченным 48-символьным алфавитом, в который не входили символы
В современных версиях языка разрешено использовать также строчные латинские буквы, а в компиляторе PL/1-KT[4] — русские строчные и прописные буквы. Везде, кроме значений строк символов, строчные буквы эквивалентны прописным. Вместо символа ИсторияПЛ/1 был разработан в IBM как часть системы System/360. До того IBM разработала несколько несовместимых компьютеров для разных целей: одни для научных, другие — для бухгалтерских приложений. Целью System/360 была разработка единой системы совместимых компьютеров, которые заменили бы все предыдущие модели и могли бы с успехом использоваться для любых задач. Научные и бухгалтерские программы не только использовали разные компьютеры, но ещё и писались на разных языках: научные — на Фортране, бухгалтерские — в основном на Коболе. Целью ПЛ/1 было создание языка, подходящего для обоих типов приложений. Другой целью было добавление конструкций для структурного программирования, взятых из Алгола-60, не поддерживавшихся в то время ни Коболом, ни Фортраном. Для разработки языка был сформирован комитет, состоявший из программистов IBM и пользователей со всех концов США. Работа комитета длилась несколько месяцев. Изначально планировалось, что ПЛ/1 будет готов к использованию к моменту запуска System/360, но это не было выполнено. Язык изначально был назван NPL (New Programming Language — «новый язык программирования»), но эта аббревиатура уже использовалось британской Национальной физической лабораторией (National Physics Laboratory), поэтому название изменили на ПЛ/1. Поначалу ПЛ/1 вызвал большой энтузиазм, но оказался не так успешен, как планировалось, по ряду причин. Основная причина — большая сложность языка, язык был разработан комитетом, пытавшимся согласовать и удовлетворить нужды совершенно разных пользователей (научных и банковских), в результате язык оказался как сложен для освоения, так и труден для реализации компиляторов. Следствием сложности компиляторов стало их низкое качество, неоптимальность генерируемого исполняемого кода и большое количество сбоев и ошибок на этапе исполнения. В частности, возможность асинхронной модификации (например, в результате конструкции Со временем ситуация изменилась: сложным язык был относительно существовавших тогда Фортрана, Кобола, Алгола, в сравнении с более современными языками ПЛ/1 стал не так сложен, и со временем было реализовано множество различных компиляторов[5], генерирующих качественный код. Хотя ПЛ/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; среди его расширений[6] — поддержка в системе типов единиц СИ (метр, килограмм, секунда, Кельвин, ампер, кандела, моль, а также радиана и стерадиана)[7]), использование русских идентификаторов и ключевых слов, применение символов псевдографики в качестве пробелов, сокращённые формы записи операций, операторы обнуления. По состоянию на 2020-е годы существуют следующие компиляторы ПЛ/1:
Первый компилятор 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; Примечания
Литература
Ссылки
Information related to ПЛ/1 |