PL / I - PL/I

PL / I
Парадигма Процедурные , императивные , структурированные
Разработано IBM и комитет по развитию языков SHARE
Разработчик IBM
Впервые появился 1964 ; 57 лет назад ( 1964 )
Стабильный выпуск
IBM Enterprise PL / I для z / OS 5.3 / сентябрь 2019 г.
Веб-сайт www .ibm .com / products / pli-compiler-zos
Диалекты
Смотреть диалекты
Под влиянием
КОБОЛ , ФОРТРАН , АЛГОЛ 60
Под влиянием
Язык управления , PL / M , PL / S , PL-6 , PL / 8 , REXX
  • PL / I в Викиучебнике

PL / I ( Язык программирование Один , произносятся / р я ɛ л ж ʌ п / а иногда пишется PL / 1 ) является процедурным , необходимо компьютерным языком программирования , разработанный и опубликованным IBM . Он предназначен для научного, инженерного, бизнес-программирования и системного программирования. Он используется академическими, коммерческими и промышленными организациями с момента его появления в 1960-х годах и используется до сих пор.

Основные области PL / I - обработка данных , числовые вычисления , научные вычисления и системное программирование . Он поддерживает рекурсию , структурное программирование , связанную структуру данных обработки, с фиксированной точкой , с плавающей точкой , сложная , символьная строка обработка, и немного строками обработки. Синтаксис языка похож на английский и подходит для описания сложных форматов данных с широким набором функций, доступных для проверки и управления ими.

История ранних веков

В 1950-х и начале 1960-х годов деловые и научные пользователи программировали для разного компьютерного оборудования с использованием разных языков программирования. Бизнес - пользователи перемещались из Autocoders через COMTRAN на COBOL , в то время как научные пользователи запрограммированы в Fortran , ALGOL , GEORGE , и другие. IBM System / 360 (объявлено в 1964 году и доставлен в 1966 году) был разработан в качестве общей архитектуры машины для обеих групп пользователей, заменяющий все существующие архитектуры IBM. Точно так же IBM хотела иметь единый язык программирования для всех пользователей. Он надеялся, что Fortran может быть расширен для включения функций, необходимых коммерческим программистам. В октябре 1963 года был сформирован комитет, первоначально состоявший из трех сотрудников IBM из Нью-Йорка и трех членов SHARE , группы научных пользователей IBM, чтобы предложить эти расширения для Fortran. Учитывая ограничения Фортрана, они не смогли этого сделать и приступили к разработке нового языка программирования, в значительной степени основанного на АЛГОЛе, обозначенном как NPL . Этот акроним противоречил аббревиатуре Национальной физической лаборатории Великобритании и был ненадолго заменен на MPPL ( многоцелевой язык программирования), а в 1965 году - на PL / Iримской цифрой «I»). Первое определение появилось в апреле 1964 года.

IBM взяла NPL за отправную точку и завершила проектирование до уровня, позволяющего написать первый компилятор: определение NPL было неполным по объему и деталям. Первоначально контроль над языком PL / I осуществлялся Центром программирования в Нью-Йорке, а затем - Лабораторией IBM UK в Хёрсли . Группы пользователей SHARE и GUIDE участвовали в расширении языка и играли роль в процессе IBM по управлению языком через свои проекты PL / I. Опыт определения такого большого языка показал необходимость формального определения PL / I. В 1967 году в Венской лаборатории IBM был создан проект по созданию однозначной и полной спецификации. Это, в свою очередь, привело к появлению одного из первых широкомасштабных формальных методов разработки - VDM .

Фреду Бруксу приписывают обеспечение того, чтобы PL / I имел тип данных CHARACTER.

Впервые этот язык был подробно описан в руководстве «Спецификации языка PL / I. C28-6571», написанном в Нью-Йорке с 1965 года и замененном «Спецификациями языка PL / I. GY33-6003», написанным в Хёрсли с 1967 года. IBM продолжала разработали PL / I в конце шестидесятых - начале семидесятых, опубликовав его в руководстве GY33-6003. Эти руководства использовались группой Multics и другими первыми разработчиками.

Первый компилятор был выпущен в 1966 году. Стандарт для PL / I был утвержден в 1976 году.

Цели и принципы

Цели PL / I возникли на раннем этапе развития языка. Требовалась конкуренция с обработкой записей COBOL и написанием отчетов. Возможности языка расширились и стали включать системное программирование и программирование, управляемое событиями . Дополнительными целями для PL / I были:

  • Производительность скомпилированного кода не уступает Fortran (но этого не удалось достичь)
  • Расширяемость для нового оборудования и новых областей применения
  • Повышение производительности процесса программирования, передача усилий от программиста к компилятору.
  • Независимость от машины для эффективной работы с основным компьютерным оборудованием и операционными системами

Для достижения этих целей PL / I позаимствовал идеи из современных языков, добавив при этом существенные новые возможности и придав им характерный лаконичный и читаемый синтаксис. Многие принципы и возможности в совокупности придали языку его характер и были важны для достижения целей языка:

  • Блочная структура с базовой семантикой (включая рекурсию ) аналогична Algol 60 . Аргументы передаются с использованием вызова по ссылке с использованием фиктивных переменных для значений там, где это необходимо ( вызов по значению ).
  • Широкий спектр типов вычислительных данных, типов данных управления программой и форм структур данных ( строгая типизация ).
  • Динамические экстенты для массивов и строк с наследованием экстентов по параметрам процедуры.
  • Краткий синтаксис выражений, объявлений и операторов с разрешенными сокращениями. Подходит для набора символов из 60 символов и может быть изменено на 48 символов .
  • Обширная структура значений по умолчанию в операторах, параметрах и объявлениях, позволяющая скрыть некоторые сложности и облегчить расширение языка при минимальном количестве нажатий клавиш.
  • Мощная итеративная обработка с хорошей поддержкой структурного программирования .
  • Не должно было быть зарезервированных слов (хотя имена функций DATEи TIMEоказались невозможными для достижения этой цели). Новые атрибуты, операторы и параметры операторов могут быть добавлены в PL / I без аннулирования существующих программ. Даже не были IF, THEN, ELSE, а DOбыли зарезервированы.
  • Ортогональность : каждая способность должна быть независимой от других возможностей и свободно сочетаться с другими возможностями, где бы это ни было значимо. Каждая возможность должна быть доступна во всех контекстах, где это имеет смысл, использовать ее как можно шире и избегать «произвольных ограничений». Ортогональность помогает сделать язык «большим».
  • Возможности обработки исключений для управления и перехвата исключительных условий во время выполнения.
  • Программы, разделенные на отдельно компилируемые разделы, с обширными средствами времени компиляции (также известными как макросы ), не являющиеся частью стандарта, для адаптации и объединения частей исходного кода в полные программы. Внешние имена для связывания отдельно скомпилированных процедур в единую программу.
  • Средства отладки интегрированы в язык.

Резюме языка

Язык предназначен для всех программистов. Резюме взято из стандарта ANSI PL / I и стандарта общего подмножества ANSI PL / I.

Программа PL / I состоит из набора процедур, каждая из которых написана как последовательность операторов. %INCLUDEКонструкция используется для включения текста из других источников во время трансляции программы. Все типы операторов сведены здесь в группы, которые дают общее представление о языке (в Стандарте используется эта организация).

Категория Заявление
Структурные PROCEDURE(или PROC)
ENTRY
BEGIN
DO
END
Декларативная DECLARE(или DCL)
DEFAULT(или DFT)
FORMAT
Поток управления CALL
IF
SELECT
GO TO
RETURN
STOP
Нулевое заявление
Категория Заявление
Обработка прерываний ON
SIGNAL
REVERT
Место хранения ALLOCATE(или ALLOC)
FREE
Заявление о переуступке
Ввод, вывод OPEN
CLOSE
Потоковый ввод / вывод GET
PUT
Запись ввода / вывода READ
WRITE
REWRITE
LOCATE
DELETE

(Такие функции, как многозадачность и препроцессор PL / I отсутствуют в стандарте, но поддерживаются компилятором PL / IF, а некоторые другие реализации обсуждаются в разделе «Развитие языка».)

Имена могут быть объявлены для представления данных следующих типов либо в виде отдельных значений, либо в виде агрегатов в форме массивов с нижней и верхней границей для каждого измерения или структур (включая вложенную структуру, массив и скалярные переменные) :

  • Arithmetic (раскрыто ниже)
  • CHARACTER
  • PICTURE for Arithmetic data
  • PICTURE for Character data
  • AREA
  • BIT
  • ENTRY
  • FILE
  • FORMAT
  • LABEL
  • OFFSET
  • POINTER

arithmeticТип содержит следующие атрибуты:

  • база ( BINARYили DECIMAL), и
  • шкала ( FIXEDили FLOAT), и
  • режим ( REALили COMPLEX), и
  • a PRECISION( number of digits, а для чисел с фиксированной точкой, a scale factor)

Основание, масштаб, точность и масштабный коэффициент по Picture-for-arithmeticтипу кодируется в пределах picture-specification. Режим указывается отдельно и picture specificationприменяется как к действительной, так и к мнимой частям.

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

В PL / I нет зарезервированных слов. Оператор заканчивается точкой с запятой. Максимальная длина оператора определяется реализацией. Комментарий может появляться в любом месте программы, где разрешен пробел, и ему предшествуют символы прямой косой черты, звездочки и заканчиваются символами звездочка, косая черта (т /* This is a comment. */. Е. ). Операторы могут иметь префикс метки, вводящий имя записи ( ENTRYи PROCEDUREоператоров) или имя метки, и префикс условия, разрешающий или запрещающий вычислительное условие - например, (NOSIZE)). Имена записей и меток могут быть отдельными идентификаторами или идентификаторами, за которыми следует нижний индекс констант (как в L(12,2):A=0;).

Последовательность операторов становится группой, если ей предшествует DOинструкция, а за ней следует ENDинструкция. Группы могут включать вложенные группы и блоки начала. IFОператор определяет группу или одного заявления в качестве THENчасти и ELSEчасти (см пример программы). Группа - это единица итерации. Начинает блок ( BEGIN; stmt-list END;) может содержать объявления для имен и внутренних процедур местных к блоку. Процедура начинается с PROCEDUREзаявлением и заканчивается синтаксический посредством ENDзаявления. Тело процедуры представляет собой последовательность блоков, групп и операторов и содержит объявления для имен и процедур, локальных для процедуры или EXTERNALпроцедуры.

ПО-блок представляет собой один оператор или блок операторов , записанных должна быть выполнена , когда один или более из этих условий возникают:

вычислительное состояние ,

  • CONVERSION (CONV)
  • FIXEDOVERFLOW (FOFL)
  • OVERFLOW (OFL)
  • SIZE
  • STRINGRANGE (STRG)
  • STRINGSIZE (STRZ)
  • SUBSCRIPTRANGE (SUBRG)
  • UNDERFLOW (UFL)
  • ZERODIVIDE (ZDIV)

или условие ввода / вывода ,

  • ENDFILE(file)
  • ENDPAGE(file)
  • KEY(file)
  • NAME(file)
  • RECORD(file)
  • TRANSMIT(file)
  • UNDEFINEDFILE(file) (UNDF)

или одно из условий:

  • AREA, CONDITION (identifier), ERROR,FINISH

Объявление идентификатора может содержать один или несколько из следующих атрибутов (но они должны быть взаимно согласованными):

Атрибуты данных Атрибуты ввода / вывода Прочие атрибуты
ALIGNED DIRECT AUTOMATIC or AUTO
AREA[(area-size)] ENVIRONMENT(options) or ENV... BASED[(reference)]
BINARY [(precision)] or BIN... INPUT BUILTIN
BIT [(maximum-length)] KEYED CONDITION or COND
CHARACTER[(maximum-length)] or CHAR... OUTPUT CONSTANT
COMPLEX [(precision)] or CPLX... PRINT CONTROLLED or CTL
DECIMAL [(precision)] or DEC... SEQUENTIAL or SEQL DEFINED[(reference)] or DEF...
(dimension-attribute) STREAM EXTERNAL or EXT
ENTRY[(parameter descriptor list] UPDATE GENERIC(criteria list)
FILE RECORD INITIAL(value-list) or INIT...
FIXED [(precision)] INTERNAL or INT
FLOAT [(number of digits)] LIKE unsubscripted reference
FORMAT LOCAL
LABEL OPTIONS(options)
MEMBER PARAMETER or PARM
NONVARYING or NONVAR POSITION [(expression)] or POS...
OFFSET[(reference)] STATIC
PICTURE picture-specification or PIC... VARIABLE
POINTER or PTR
STRUCTURE
UNALIGNED or UNAL
VARYING or VAR

Текущие компиляторы от Micro Focus , и особенно от IBM, реализуют множество расширений над стандартизованной версией языка. Расширения IBM описаны в подразделе «Реализация» для компилятора позже. Хотя для этих компиляторов есть некоторые общие расширения, отсутствие текущего стандарта означает, что совместимость не гарантируется.

Стандартизация

Стандартизация языков началась в апреле 1966 года в Европе с ECMA TC10. В 1969 году ANSI учредила «Комитет по развитию композитного языка», получивший прозвище «Клудж», позже переименованный в X3J1 PL / I. Стандартизация стала результатом совместных усилий ECMA TC / 10 и ANSI X3J1. Часть документа GY33-6003 была предложена совместными усилиями IBM и стала базовым документом для стандартизации. Основными функциями, опущенными в базовом документе, были многозадачность и атрибуты для оптимизации программы (например, NORMALи ABNORMAL).

Предложения об изменении базового документа были одобрены обоими комитетами. В случае разногласий комитетов председатели, первоначально Майкл Маркотти из General Motors и CAR Hoare, представлявший ICL, должны были разрешить разногласия. Помимо IBM, Honeywell , CDC , Data General , Digital Equipment Corporation , Prime Computer , Burroughs , RCA и Univac обслуживали X3J1 вместе с основными пользователями Eastman Kodak , MITER , Union Carbide , Bell Laboratories и различными представителями правительства и университетов. Дальнейшее развитие языка происходило в органах по стандартизации с постоянным улучшением структурного программирования и внутренней согласованности, а также с упущением наиболее непонятных или спорных функций.

Когда разработка языка подошла к концу, X3J1 / TC10 осознал, что существует ряд проблем с документом, написанным на английском языке. Обсуждение одного вопроса может появиться в нескольких местах, которые могут или не могут прийти к согласию. Было трудно определить, были ли там упущения или несоответствия. Следовательно, Дэвид Бич (IBM), Роберт Фрейбургхаус (Honeywell), Милтон Барбер (CDC), М. Дональд Макларен ( Аргоннская национальная лаборатория ), Крейг Франклин (Data General), Лоис Фрэмптон (Digital Equipment Corporation) и редактор DJ Andrews компании IBM обязались переписать весь документ, в каждой из которых будет одна или несколько полных глав. Стандарт сформулирован как формальное определение с использованием «машины PL / I» для определения семантики. Это был первый и, возможно, единственный стандарт языка программирования, который был написан как полуформальное определение.

Стандарт «Подмножество общего назначения PL / I» («Подмножество-G») был выпущен ANSI в 1981 году, а его версия была опубликована в 1987 году. Подмножество общего назначения было широко принято в качестве ядра для реализаций PL / I.

Реализации

Компиляторы IBM PL / IF и D

PL / I был впервые реализован IBM в ее лабораториях Hursley в Великобритании в рамках разработки System / 360 . Первым производственным компилятором PL / I был компилятор PL / IF для операционной системы OS / 360 , созданный командой Джона Нэша в Хёрсли в Великобритании: командой библиотеки времени выполнения руководил IM (Нобби) Кларк. Компилятор PL / IF был полностью написан на языке ассемблера System / 360. Выпуск 1 выпущен в 1966 году. OS / 360 - это среда с реальной памятью, и компилятор был разработан для систем с объемом реальной памяти всего 64 килобайта - F - это 64 килобайта на языке S / 360. Чтобы вместить большой компилятор в 44 килобайта памяти, доступной на 64-килобайтной машине, компилятор состоит из фазы управления и большого количества фаз компилятора (приближается к 100). Фазы переносятся в память с диска по одной для обработки определенных языковых функций и аспектов компиляции. На каждой фазе выполняется один проход по частично скомпилированной программе, обычно хранящейся в памяти.

Некоторые аспекты языка все еще разрабатывались по мере реализации PL / IF, поэтому некоторые из них были опущены до более поздних выпусков. PL / I RECORD I / O поставлялся с PL / IF Release 2. Функции обработки списков - на основе переменных, указателей, областей и смещений и ввода / вывода в режиме LOCATE  - были впервые представлены в версии 4. В большой попытке ускорить работу. Чтобы код PL / I мог конкурировать с объектным кодом Fortran, PL / IF Release 5 выполняет существенную программную оптимизацию циклов DO, чему способствует опция REORDER для процедур.

Версия PL / IF была выпущена в операционной системе TSS / 360 с разделением времени для System / 360 Model 67 , адаптированной в лаборатории IBM Mohansic Lab. Лаборатория IBM La Gaude во Франции разработала «Программы преобразования языков» для преобразования программ на языке Fortran, Cobol и Algol на уровень PL / IF PL / I.

Компилятор PL / ID, использующий 16 килобайт памяти, был разработан IBM Germany для операционной системы нижнего уровня DOS / 360 . Он реализует подмножество языка PL / I, требующее, чтобы все строки и массивы имели фиксированные экстенты, что упрощает среду выполнения. Отражая базовую операционную систему, ему не хватает динамического распределения памяти и контролируемого класса хранения. Он был отправлен в течение года после PL / I F.

Multics PL / I и производные

Компиляторы были внедрены несколькими группами в начале 1960-х годов. Проект Multics в Массачусетском технологическом институте , один из первых, кто разработал операционную систему на языке высокого уровня, использовал Early PL / I (EPL), подмножество диалекта PL / I, в качестве языка реализации в 1964 году. EPL был разработан в Bell Labs и MIT Дугласа Макилроя , Роберта Морриса и других. Влиятельный компилятор Multics PL / I был источником технологии компиляции, используемой рядом производителей и программных групп. EPL был языком системного программирования и диалектом PL / I, у которого были некоторые возможности, отсутствующие в исходном PL / I (например, строки переменной длины).

Компилятор Honeywell PL / I (для Series 60) представляет собой реализацию полного стандарта ANSI X3J1.

Компиляторы оптимизации и проверки IBM PL / I

Компиляторы PL / I Optimizer и Checkout, созданные в Hursley, поддерживают общий уровень языка PL / I и предназначены для замены компилятора PL / IF. Компилятор checkout представляет собой переписанный PL / IF в BSL, проприетарном языке реализации IBM, подобном PL / I (позже PL / S ). Цели производительности, установленные для компиляторов, показаны в презентации IBM для BCS. Компиляторы должны были дать идентичные результаты - компилятор Checkout используется для отладки программ, которые затем будут отправлены оптимизатору. Учитывая, что компиляторы имели совершенно другой дизайн и работали с полным языком PL / I, эта цель была сложной: она была достигнута.

Оптимизирующий компилятор PL / I пришел на смену компилятору PL / IF и был компилятором рабочей лошадки IBM с 1970-х по 1990-е годы. Как и PL / IF, это многопроходный компилятор с проектной точкой 44 килобайта, но это совершенно новый дизайн. В отличие от компилятора F, он должен выполнять оценку константных выражений во время компиляции с использованием библиотеки времени выполнения, уменьшая максимальный объем памяти для фазы компиляции до 28 килобайт. При повторном проектировании ему удалось устранить раздражающие факторы PL / IF, такие как каскадная диагностика. Он был написан на S / 360 Macro Assembler командой, возглавляемой Тони Бербриджем, большинство из которых работали над PL / I F. Макросы были определены для автоматизации общих служб компилятора и для защиты авторов компилятора от задачи управления реальными задачами. режим хранения, позволяющий легко переносить компилятор на другие модели памяти. Был использован весь спектр методов оптимизации программ, разработанных для современного компилятора IBM Fortran H: Оптимизатор уравнял скорость выполнения Fortran в руках хороших программистов. Анонсированный вместе с IBM S / 370 в 1970 году, он был поставлен сначала для операционной системы DOS / 360 в августе 1971 года, а вскоре после этого для OS / 360 и первых операционных систем IBM с виртуальной памятью OS / VS1 , MVS и VM / CMS . (Разработчики не знали, что в то время как они втиснули код в разделы размером 28 КБ, IBM Poughkeepsie, наконец, была готова предоставить поддержку виртуальной памяти в OS / 360). Он поддерживал среды пакетного программирования и, в рамках TSO и CMS, мог работать в интерактивном режиме. Этот компилятор прошел через множество версий, охватывающих все операционные системы мэйнфреймов, включая операционные системы японских подключаемых машин (PCM).

Компилятор был заменен на "IBM PL / I для OS / 2, AIX, Linux, z / OS" ниже.

Компилятор проверки PL / I (в просторечии «The Checker»), анонсированный в августе 1970 года, был разработан для ускорения и улучшения отладки программ PL / I. Команду возглавил Брайан Маркс. Трехпроходный дизайн сокращает время компиляции программы до 25% от времени, затрачиваемого компилятором F. Его можно запускать с интерактивного терминала, конвертируя программы PL / I во внутренний формат, «H-текст». Этот формат интерпретируется компилятором Checkout во время выполнения, обнаруживая практически все типы ошибок. Указатели представлены в 16 байтах, содержащих целевой адрес и описание элемента, на который имеется ссылка, что позволяет диагностировать «плохое» использование указателя. В диалоговой среде при обнаружении ошибки управление передается пользователю, который может проверять любые переменные, вводить операторы отладки и редактировать исходную программу. Со временем возможности отладки сред программирования мэйнфреймов развили большинство функций, предлагаемых этим компилятором, и они были отозваны (в 1990-х?)

DEC PL / I

Возможно, самой коммерчески успешной реализацией помимо IBM была реализация VAX PL / I от Digital Equipment Corporation, позже известная как DEC PL / I. Реализация является «строгим надмножеством ANSI X3.4-1981 PL / I General Purpose Subset и обеспечивает большинство функций нового ANSI X3.74-1987 PL / I General Purpose Subset» и была впервые выпущена в 1988 году. Первоначально он использовал бэкэнд компилятора под названием VAX Code Generator (VCG), созданный командой под руководством Дэйва Катлера . Интерфейс был разработан Робертом Фрайбургхаусом и перенесен на VAX / VMS от Multics . Он работает на VMS на VAX и Alpha , а также на Tru64 . В течение 1990-х годов Digital продала компилятор компании UniPrise Systems , которая позже продала его компании Kednos. Kednos продавал компилятор как Kednos PL / I до октября 2016 года, когда компания прекратила торговлю.

Обучение составителей подмножеств

В конце 1960-х - начале 1970-х годов многие университеты США и Канады создавали службы разделения времени в кампусах и нуждались в диалоговых компиляторах / интерпретаторах для использования в преподавании естественных наук, математики, инженерии и информатики. Дартмут разрабатывал BASIC , но PL / I был популярным выбором, поскольку он был кратким и легким в обучении. Поскольку предложения IBM были неподходящими, ряд школ создали свои собственные подмножества PL / I и свою собственную интерактивную поддержку. Примеры:

В 1960-х и начале 1970-х годов Аллен-Бэбкок внедрил систему разделения времени удаленных пользователей общего оборудования (RUSH) для IBM System / 360 Model 50 с настраиваемым микрокодом, а затем внедрил IBM CPS , интерактивную систему разделения времени для OS / 360. нацелен на обучение основам информатики, предлагал ограниченный набор языков PL / I в дополнение к BASIC и возможность удаленного ввода вакансий.

PL / C , диалект для обучения, компилятор, разработанный в Корнельском университете , обладал необычной способностью никогда не отказываться от компиляции любой программы за счет использования обширного автоматического исправления многих синтаксических ошибок и преобразования любых оставшихся синтаксических ошибок в операторы вывода. Этот язык почти полностью состоял из PL / I, реализованного IBM. PL / C был очень быстрым компилятором.

SL / 1 (Student Language / 1, Student Language / One or Subset Language / 1) был подмножеством PL / I, первоначально доступным в конце 1960-х годов, который интерпретировался наIBM 1130; его сильной стороной было учебное использование.

PLAGO , созданный в Политехническом институте Бруклина , использует упрощенное подмножество языка PL / I и ориентирован на хорошие диагностические сообщения об ошибках и быстрое время компиляции.

Группа исследования компьютерных систем Университета Торонто разработала компиляторы SP / k, которые поддерживали последовательность подмножеств PL / I, называемых SP / 1, SP / 2, SP / 3, ..., SP / 8 для обучения программированию. Программы, которые выполнялись без ошибок в компиляторах SP / k, давали те же результаты в других современных компиляторах PL / I, таких как компилятор IBM PL / IF, компилятор IBM checkout или компилятор PL / C Корнельского университета.

Другими примерами являются PL0 П. Грауса из Университета Нового Южного Уэльса, PLUM Марвина Зелковица из Университета Мэриленда и PLUTO из Университета Торонто.

IBM PL / I для OS / 2, AIX, Linux, z / OS

В ходе серьезной модернизации PL / I компания IBM Santa Teresa в Калифорнии в 1992 году выпустила совершенно новый компилятор. Первоначальная поставка была для OS / 2 и включала большинство функций ANSI-G и множество новых функций PL / I. В последующих выпусках были предусмотрены дополнительные платформы ( MVS , VM , OS / 390 , AIX и Windows ), но с 2021 года единственными поддерживаемыми платформами являются z / OS и AIX. IBM продолжала добавлять функции, чтобы сделать PL / I полностью конкурентоспособным с другими языками (особенно C и C ++) в тех областях, где он был вытеснен. Соответствующая «IBM Language Environment» поддерживает взаимодействие программ PL / I с системами баз данных и транзакций, а с программами, написанными на C, C ++ и COBOL, компилятор поддерживает все типы данных, необходимые для взаимодействия с этими языками.

Принципы проектирования PL / I были сохранены и выдержали это серьезное расширение, включающее несколько новых типов данных, новые операторы и параметры операторов, новые условия исключения и новую организацию исходного кода программы. Результирующий язык является совместимым супернабором стандарта PL / I и более ранних компиляторов IBM. В PL / I были добавлены следующие основные темы:

  • Новые атрибуты для лучшей поддержки пользовательских типов данных - в DEFINE ALIAS, ORDINALи DEFINE STRUCTUREзаявление , чтобы ввести определенные пользователем типы, в HANDLEтип данных локатора, на TYPEсам тип данных, то UNIONтип данных, а также встроенные функции для работы с новыми типами.
  • Дополнительные типы данных и атрибуты, соответствующие общим типам данных ПК (например UNSIGNED, VARYINGZ).
  • Улучшение читабельности программ - часто явное отображение подразумеваемого использования (например, BYVALUEатрибут для параметров)
  • Дополнительные конструкции структурированного программирования.
  • Дополнения к обработке прерываний.
  • Препроцессор времени компиляции расширен, чтобы предлагать почти все функции обработки строк PL / I и взаимодействовать со средой разработки приложений.

Последняя серия компиляторов PL / I для z / OS, называемая Enterprise PL / I для z / OS, использует генерацию кода для новейших процессоров z / Architecture (z14, z13, zEC12, zBC12, z196, z114) за счет использования ARCHLVL parm control передавался во время компиляции и был вторым языком высокого уровня, поддерживаемым z / OS Language Environment (первым был XL C / C ++, а последним - Enterprise COBOL v5).

Типы данных

ORDINALэто новый вычислительный тип данных. Порядковые средства такие же, как и в Паскале , например, DEFINE ORDINAL Colour (red, yellow, green, blue, violet); но, кроме того, имя и внутренние значения доступны через встроенные функции. Встроенные функции обеспечивают доступ к предшественнику и преемнику порядкового значения.

В DEFINE-statement(см ниже) позволяет дополнительно TYPEs быть объявлен состоит из PL / I встроенный в атрибутах.

Тип HANDLE(data structure)данных локатора аналогичен POINTERтипу данных, но строго типизирован для привязки только к определенной структуре данных. =>Оператор используется для выбора структуры данных , используя ручку.

UNIONАтрибут (эквивалент CELLв ранних спецификациях PL / I) допускает несколько скалярных переменные, массивы или структуры , чтобы один и то же хранение в блоке , который занимает объем памяти , необходимый для самой большой альтернативы.

Конкурентоспособность на ПК и с C

Эти атрибуты были добавлены:

  • Струнные атрибуты VARYINGZ(для нуля строки символов), HEXADEC, WIDECHARи GRAPHIC.
  • Необязательные арифметические атрибуты UNSIGNEDи SIGNED, BIGENDIANи LITTLEENDIAN. UNSIGNEDобусловил необходимость UPTHRUи DOWNTHRUвариант на итеративных группах , позволяющих встречный управляемый цикл будет выполняться без превышения предельного значения (также необходимо для ORDINALс и хорошей для документирования петель).
  • DATE(pattern)Атрибут для управления датой представления и дополнения довести время и дату лучшей текущей практики. Новые функции для управления датами включают - DAYSи DAYSTODATEдля преобразования между датами и количеством дней, а также общую DATETIMEфункцию для изменения форматов даты.

Были добавлены новые строковые-функции обработки - до центра текста для редактирования с помощью формата изображения и обрезки заготовок или выбранных символов из головы или хвоста текста, VERIFYRчтобы VERIFYс правой стороны . и SEARCHи TALLYфункции.

Составные операторы присваивания а - ля C , например +=, &=, -=, ||=были добавлены. A+=1эквивалентно A=A+1.

Для пропущенных аргументов и списков аргументов переменной длины были добавлены дополнительные дескрипторы параметров и атрибуты.

Читаемость программы - явное намерение

VALUEАтрибут объявляет идентификатор в качестве константы (производной от определенного буквенного значения или ограниченно выражением).

Параметры могут иметь атрибуты BYADDR(передача по адресу) или BYVALUE(передача по значению).

ASSIGNABLEИ NONASSIGNABLEатрибуты предотвращение непреднамеренного назначения.

DO FOREVER;устраняет необходимость в надуманной конструкции DO WHILE ( '1'B );.

Он DEFINE-statementвводит указанные пользователем имена (например INTEGER) для комбинаций встроенных атрибутов (например FIXED BINARY(31,0)). Таким образом DEFINE ALIAS INTEGER FIXED BINARY(31.0)создается TYPEимя INTEGERкак псевдоним для набора встроенных атрибутов FIXED BINARY (31.0). DEFINE STRUCTUREотносится к структурам и их членам; он предоставляет TYPEимя для набора атрибутов структуры и соответствующих объявлений элементов подструктуры для использования в объявлении структуры (обобщение LIKEатрибута).

Дополнения к структурированному программированию

LEAVEЗаявление для выхода из цикла, и ITERATEдля продолжения следующей итерации цикла.

UPTHRUи DOWNTHRUварианты итеративных групп.

Конструкция пакета, состоящая из набора процедур и объявлений для использования как единое целое. Переменные , объявленные вне процедуры являются локальными для пакета, и могут использовать STATIC, BASEDили CONTROLLEDхранение. Имена процедур, используемые в пакете, также являются локальными, но могут быть сделаны внешними с помощью EXPORTSпараметра PACKAGE-statement.

Обработка прерываний

RESIGNAL-statementВыполнен в ON-блока прекращает выполнение ON-блока, и снова возникает состояние , в процедуре , которая называется текущим один (таким образом передавая управление к соответствующему ON-блок для этой процедуры).

В INVALIDOPсостоянии ручка недопустимые коды операций обнаружены процессором ПК, а также незаконные арифметические операции , такие как вычитание двух бесконечных значений.

ANYCONDITIONУсловие обеспечиваются условия перехвата , для которых нет конкретного ПО-блока не предусмотрены в текущей процедуре.

STORAGEСостояние возникает , когда ALLOCATEоператор не может получить достаточное хранение.

Другие компиляторы мэйнфреймов и миникомпьютеров

Ряд поставщиков производили компиляторы, чтобы конкурировать с IBM PL / IF или оптимизирующим компилятором на мэйнфреймах и мини-компьютерах в 1970-х годах. В 1980-х целью обычно было появляющееся подмножество ANSI-G.

  • В 1974 г. Burroughs Corporation анонсировала PL / I для B6700 и B7700.
  • UNIVAC выпустил UNIVAC PL / I, а в 1970-х годах также использовал вариант PL / I, PL / I PLUS для системного программирования.
  • С 1978 года компания Data General поставляла PL / I на свои платформы Eclipse и Eclipse MV с операционными системами AOS , AOS / VS и AOS / VS II . На этом языке был написан ряд служебных программ операционной системы.
  • Пол Абрахамс из Института математических наук Куранта при Нью-Йоркском университете написал CIMS PL / I в 1972 году на PL / I, загрузившись через PL / I F. Он поддерживал «около 70%» компиляции PL / I в CDC 6600.
  • CDC предоставила оптимизирующий компилятор PL / I для Cyber ​​70, 170 и 6000 серий.
  • Fujitsu предоставила компилятор PL / I, эквивалентный оптимизатору PL / I.
  • Stratus Technologies PL / I - это реализация ANSI G для операционной системы VOS .
  • IBM Series / 1 PL / I - это расширенное подмножество языка программирования ANSI PL / I (ANSI X3.53-1976) для системы программирования в реальном времени IBM Series / 1.

Компиляторы PL / I для Microsoft .NET

  • В 2011 году Raincode разработала полноценный устаревший компилятор для платформ Microsoft .NET и .NET Core , названный The Raincode PL / I compiler.

Компиляторы PL / I для персональных компьютеров и Unix

  • В 1970-х и 1980-х годах компания Digital Research продала компилятор PL / I для CP / M (PL / I-80), CP / M-86 (PL / I-86) и персональных компьютеров с DOS . Она была основана на подмножества G из PL / I и была написана в PL / M .
  • Micro Focus реализовал Open PL / I для систем Windows и UNIX / Linux, которые они приобрели у Liant.
  • IBM поставила PL / I для OS / 2 в 1994 году и PL / I для AIX в 1995 году.
  • Iron Spring PL / I для OS / 2 и более поздних версий Linux был представлен в 2007 году.

PL / I диалекты

  • PL / S , диалект PL / I, первоначально называвшийся BSL, был разработан в конце 1960-х годов и стал языком системного программирования для мэйнфреймов IBM. Почти все системное программное обеспечение для мэйнфреймов IBM в 1970-х и 1980-х годах было написано на PL / S. Он отличался от PL / I тем, что не было преобразований типов данных, среды выполнения, структуры отображались по-разному, а присваивание было побайтным копированием. Все строки и массивы имели фиксированные экстенты или использовали эту REFERопцию. На смену PL / S пришел PL / AS, а затем PL / X, язык, который в настоящее время используется для внутренней работы в текущих операционных системах, OS / 390 и теперь z / OS . Он также используется для некоторых компонентов z / VSE и z / VM . Db2 для z / OS также написан на PL / X.
  • PL / C - это учебный диалект языка программирования PL / I, разработанный в Корнельском университете в 1970-х годах.
  • Два диалекта PL / I, названные PL / MP (Машинный продукт) и PL / MI (Машинный интерфейс), использовались IBM в системном программном обеспечении платформ System / 38 и AS / 400 . PL / MP использовался для реализации так называемого вертикального микрокода этих операционных систем и нацелился на набор инструкций IMPI. Он был заменен на C ++, когда OS / 400 была перенесена на семейство процессоров IBM RS64 . PL / MI нацелен на машинный интерфейс этих платформ и используется в программе управления и аппаратно-независимых компонентах OS / 400 . Он по-прежнему используется в IBM i.
  • PL / 8 (или PL.8), так называемый, потому что он составлял около 80% от PL / I, был первоначально разработан IBM Research в 1970-х годах для архитектуры IBM 801 . Позже он получил поддержку архитектур Motorola 68000 и System / 370 . Он продолжает использоваться для нескольких задач разработки внутренних систем IBM (например, милликод и микропрограммное обеспечение для систем z / Architecture ) и был модернизирован для использования 64-битной серверной части на основе gcc .
  • Компания Honeywell, Inc. разработала PL-6 для использования при создании операционной системы CP-6 .
  • Prime Компьютер используется два различных PL / I говоров как язык системного программирования из PRIMOS операционной системы : PL / P , начиная с версии 18, а затем SPL, начиная с версии 19.
  • XPL - это диалект языка PL / I, который использовался для написания других компиляторов с использованием методов компилятора XPL. XPL добавил тип данных строки кучи в свое небольшое подмножество PL / I.
  • HAL / S - это язык программирования для аэрокосмической отрасли реального времени, наиболее известный благодаря использованию в программе Space Shuttle. Он был разработан Intermetrics в 1970-х годах для НАСА. HAL / S был реализован в XPL.
  • IBM и различные субподрядчики также разработали другой вариант PL / I в начале 1970-х годов для поддержки обработки сигналов для ВМФ под названием SPL / I.
  • SabreTalk , диалект языка PL / I, работающий в режиме реального времени, используемый для программирования системы бронирования авиабилетов Sabre .

использование

Реализации PL / I были разработаны для мэйнфреймов с конца 1960-х, мини-компьютеров в 1970-х и персональных компьютеров в 1980-х и 1990-х. Хотя в основном он использовался на мэйнфреймах , существуют версии PL / I для DOS , Microsoft Windows , OS / 2 , AIX , OpenVMS и Unix .

Он широко используется при обработке бизнес-данных и в системах для написания операционных систем на определенных платформах. На PL / I построены очень сложные и мощные системы:

  • Система SAS изначально была написана на PL / I; шаг данных SAS по-прежнему смоделирован на синтаксисе PL / I.
  • Новаторская система онлайн-бронирования авиабилетов Sabre изначально была написана для IBM 7090 на ассемблере. Версия S / 360 была в основном написана с использованием SabreTalk , специально созданного компилятора PL / I для специальной управляющей программы.
  • Multics операционная система была в основном написана на PL / I.
  • PL / I использовался для написания исполняемого формального определения для интерпретации сетевой архитектуры системы IBM .

PL / I не оправдал надежд своих сторонников на то, что он вытеснит Fortran и COBOL и станет основным игроком на мэйнфреймах. Это оставалось меньшинством, но значительным игроком. Этому не может быть однозначного объяснения, но некоторые тенденции 1970-х и 1980-х годов препятствовали его успеху, постепенно сокращая территорию, на которой PL / I имела конкурентное преимущество.

Во-первых, изменилась природа программной среды мэйнфрейма. Подсистемы приложений для баз данных и обработки транзакций ( CICS и IMS и Oracle на системе 370) и генераторы приложений стали центром разработки приложений пользователи мейнфреймов. Значительные части языка стали неактуальными из-за необходимости использовать соответствующие собственные функции подсистем (такие как постановка задач и большая часть ввода / вывода). Fortran не использовался в этих областях применения, ограничивая PL / I территорией COBOL; большинство пользователей остались с COBOL. Но когда ПК стал доминирующей средой для разработки программ, Fortran, COBOL и PL / I стали языками меньшинства, уступив место C ++ , Java и тому подобному.

Во-вторых, PL / I обогнали в области системного программирования. Сообщество системного программирования IBM было не готово к использованию PL / I; вместо этого IBM разработала и приняла собственный диалект PL / I для системного программирования. - PL / S . С успехом PL / S внутри IBM и C за пределами IBM уникальные сильные стороны PL / I для системного программирования стали менее ценными.

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

В-четвертых, в COBOL и Fortran были добавлены такие функции, как структурированное программирование, операции с символьными строками и объектная ориентация, что еще больше уменьшило относительные преимущества PL / I.

Что касается мэйнфреймов, то на карту были поставлены и серьезные бизнес-проблемы. Конкуренты IBM в области аппаратного обеспечения мало выиграли и многое потеряли от успеха PL / I. Разработка компиляторов была дорогостоящей, и группы разработчиков компиляторов IBM обладали встроенным конкурентным преимуществом. Многие пользователи IBM хотели избежать привязанности к проприетарным решениям. При отсутствии ранней поддержки PL / I другими поставщиками было лучше избегать PL / I.

Эволюция языка PL / I

В этой статье стандарт PL / I используется в качестве ориентира для языковых функций. Но ряд важных особенностей ранних реализаций не был в Стандарте; а некоторые были предложены компиляторами сторонних производителей. И язык де-факто продолжал развиваться вслед за стандартом, в конечном итоге за счет развития персональных компьютеров.

Важные функции, исключенные из стандарта

Многозадачность

Многозадачность была реализована с помощью PL / IF, Optimizer и более новых компиляторов AIX и Z / OS. Она включала в себя типы данных EVENTи TASK, то TASK-optionна CALL-statement( вилка ), то WAIT-statement( Регистрация ), то DELAY(delay-time), EVENT-optionс на запись I / O заявления а UNLOCKзаявление разблокировать заперта записи на EXCLUSIVEфайлы. Данные события идентифицируют конкретное событие и указывают, является ли оно полным ('1'B) или неполным (' 0'B): элементы данных задачи идентифицируют конкретную задачу (или процесс ) и указывают ее приоритет по отношению к другим задачам.

Препроцессор

Первый препроцессор времени компиляции IBM был создан Бостонским центром программирования IBM в Кембридже, штат Массачусетс, и поставлялся с компилятором PL / IF. %INCLUDEЗаявление было в стандарте, но остальные функции не было. В компиляторах DEC и Kednos PL / I реализован почти тот же набор функций, что и в IBM, с некоторыми собственными дополнениями. IBM продолжает добавлять в свои компиляторы функции препроцессора. Препроцессор обрабатывает написанную исходную программу как последовательность токенов, копируя их в выходной исходный файл или воздействуя на них. Когда встречается% токен, выполняется следующий оператор времени компиляции: когда встречается токен идентификатора и идентификатор был DECLAREd, ACTIVATEd, и ему было присвоено значение времени компиляции, идентификатор заменяется этим значением. Токены добавляются в выходной поток, если они не требуют действий (например +), как и значения выражений времени компиляции ACTIVATEd. Таким образом, переменная времени компиляции PIможет быть объявлена, активирована и назначена с помощью %PI='3.14159265'. Последующие вхождения PIбудут заменены на 3.14159265.

Поддерживаемые типы данных - FIXED DECIMALцелые числа и CHARACTERстроки различной длины без максимальной длины. Утверждения структуры:

  • %[label-list:]DO iteration: statements; %[label-list:]END;
  • %procedure-name: PROCEDURE (parameter list) RETURNS (type); statements...;
  • %[label-list:]END;
  • %[label-list:]IF...%THEN...%ELSE..

и простые инструкции, которые также могут иметь [label-list:]

  • %ACTIVATE(identifier-list) and %DEACTIVATE
  • assignment утверждение
  • %DECLARE identifier-attribute-list
  • %GO TO label
  • %INCLUDE
  • null утверждение

Эта функция позволяла программистам использовать идентификаторы для констант - например, номера деталей продукта или математические константы - и была заменена в стандарте именованными константами для вычислительных данных. Условная компиляция и итеративная генерация исходного кода, возможная с помощью средств компиляции, не поддерживались стандартом. Некоторые производители внедрили эти средства.

Дополнения к структурированному программированию

В ходе стандартизации в PL / I были внесены дополнения структурированного программирования, но они не были приняты в стандарт. Эти особенности были LEAVE-statementдля выхода из итеративных DO, то UNTIL-optionи REPEAT-optionдобавляют к DOи саз общего вида: SELECT (expression) {WHEN (expression) group}... OTHERWISE group
Эти функции были включены в IBM, PL / I Checkout и оптимизирующие компилятор и DEC PL / I.

Средства отладки

PL / IF предлагал некоторые средства отладки, которые не были предложены для стандарта, но были реализованы другими, в частности префикс условия CHECK (список переменных), CHECKусловие и SNAPпараметр. Компиляторы IBM Optimizing и Checkout добавили дополнительные функции, соответствующие диалоговой среде программирования мэйнфреймов (например, ATTENTIONусловие).

Важные функции, разработанные со времени выхода стандарта

Было предпринято несколько попыток разработать тип члена структуры, который мог бы иметь один из нескольких типов данных ( CELLв ранней IBM). С ростом количества классов по теории программирования, подходы к этому стали возможны на основе PL / I - UNIONи TYPEт. Д. Были добавлены несколькими компиляторами.

PL / I был задуман в мире однобайтовых символов. В связи с тем, что поддержка японского и китайского языков становится необходимой, а также с развитием международных кодовых страниц, концепция символьной строки была расширена для включения широких строк, отличных от ASCII / EBCDIC.

Обработка времени и даты была переработана для решения проблемы тысячелетия с введением функции DATETIME, которая возвращала дату и время в одном из примерно 35 различных форматов. Несколько других функций даты имеют дело с преобразованием дней и секунд и обратно.

Критика

Проблемы реализации

Хотя язык прост в изучении и использовании, реализация компилятора PL / I трудна и требует много времени. Такому большому языку, как PL / I, требовались подмножества, которые могли бы создать большинство поставщиков и освоить большинство пользователей. Это не было решено до публикации "ANSI G". Средства времени компиляции, уникальные для PL / I, потребовали дополнительных усилий по реализации и дополнительных проходов компилятора. Компилятор PL / I был в два-четыре раза больше, чем сопоставимые компиляторы Fortran или COBOL, а также был намного медленнее, что предположительно компенсировалось увеличением производительности программистов. Это ожидалось в IBM до того, как были написаны первые компиляторы.

Некоторые утверждают, что анализировать PL / I необычно сложно. Ключевые слова PL / I не зарезервированы, поэтому программисты могут использовать их в качестве имен переменных или процедур в программах. Поскольку исходный компилятор PL / I (F) пытается выполнить автокоррекцию, когда встречает ключевое слово, используемое в неправильном контексте, он часто предполагает, что это имя переменной. Это приводит к «каскадной диагностике» - проблеме, решаемой более поздними компиляторами.

Усилия, необходимые для создания хорошего объектного кода, возможно, были недооценены при первоначальной разработке языка. Оптимизация программы (необходимая для конкуренции с превосходной оптимизацией программы, выполняемой доступными компиляторами Fortran) необычайно сложна из-за побочных эффектов и широко распространенных проблем с псевдонимом переменных. Непредсказуемая модификация может происходить асинхронно в обработчиках исключений , которые могут быть предоставлены «операторами ON» в (невидимых) вызывающих объектах. Вместе они затрудняют надежное предсказание того, когда переменные программы могут быть изменены во время выполнения. Однако при типичном использовании обработчики ошибок, написанные пользователем (the ON-unit), часто не присваивают значения переменным. Несмотря на вышеупомянутые трудности, IBM выпустила оптимизирующий компилятор PL / I в 1971 году.

PL / I содержит много редко используемых функций, таких как поддержка многозадачности (расширение языка IBM), которые увеличивают стоимость и сложность компилятора, а его средства совместной обработки требуют многопрограммной среды с поддержкой неблокирующего множества потоков. для процессов операционной системой . Авторы компилятора могли свободно выбирать, реализовывать ли эти функции.

Необъявленная переменная по умолчанию объявляется первым вхождением, поэтому неправильное написание может привести к непредсказуемым результатам. Это «неявное объявление» ничем не отличается от программ FORTRAN. Однако для PL / I (F) список атрибутов позволяет программисту обнаруживать любую неправильно написанную или необъявленную переменную.

Проблемы программиста

Многие программисты не спешили переходить с COBOL или Fortran из-за кажущейся сложности языка и незрелости компилятора PL / IF. Программисты резко разделились на научных программистов (которые использовали Fortran) и бизнес-программистов (которые использовали COBOL), при этом между группами возникла значительная напряженность и даже неприязнь. Синтаксис PL / I заимствован из синтаксиса COBOL и Fortran. Поэтому вместо того, чтобы замечать особенности, которые облегчили бы их работу, программисты на Фортране того времени обратили внимание на синтаксис COBOL и считали, что это деловой язык, в то время как программисты на COBOL заметили синтаксис Fortran и рассматривали его как научный язык.

Программисты COBOL и Fortran рассматривали его как «большую» версию своего собственного языка, и оба были несколько напуганы языком и не хотели его принимать. Еще одним фактором было псевдоподобие COBOL, Fortran и ALGOL. Это были элементы PL / I, похожие на один из этих языков, но по-разному работавшие в PL / I. Такое разочарование оставило у многих опытных программистов предвзятое отношение к PL / I и часто активную неприязнь к языку. Ранняя версия файла удачи для UNIX содержала следующее шутливое описание языка:

Как человек, который разбирался в тонкостях PL / I, я уверен, что только Настоящие Мужчины могли написать такого всеобъемлющего монстра, увлекающегося машинами, захватывающего велосипеды. Выделить массив и освободить среднюю треть? Конечно! Почему нет? Умножить строку символов на битовую строку и присвоить результат десятичной дроби с плавающей запятой? Вперед, продолжать! Освободить параметр процедуры управляемой переменной и перераспределить его перед передачей обратно? Наложить три разных типа переменных в одну и ту же ячейку памяти? Все, что скажешь! Написать рекурсивный макрос? Ну нет, но настоящие мужчины используют повторное сканирование. Как мог язык, столь явно разработанный и написанный настоящими мужчинами, не предназначаться для использования настоящим мужчиной?

С положительной стороны, полная поддержка указателей на все типы данных (включая указатели на структуры), рекурсия , многозадачность , обработка строк и обширные встроенные функции означали, что PL / I действительно был большим шагом вперед по сравнению с языками программирования его время. Однако этого было недостаточно, чтобы убедить большинство программистов или магазины перейти на PL / I.

Препроцессор времени компиляции компилятора PL / IF был необычным (за пределами мира Lisp ) в использовании синтаксиса и семантики целевого языка ( например, по сравнению с директивами препроцессора C "#").

Специальные темы в PL / I

Классы хранения

PL / I предоставляет несколько «классов хранения», чтобы указать, как следует управлять временем жизни хранилища переменных - STATIC, AUTOMATIC, CONTROLLEDи BASED. Самым простым в реализации является STATICуказание на то, что память выделяется и инициализируется во время загрузки, как это было сделано в COBOL «рабочее хранилище» и раннем Fortran . Это значение по умолчанию для EXTERNALпеременных. Класс хранения по умолчанию в PL / I для INTERNALпеременных AUTOMATICаналогичен классу хранения в других языках с блочной структурой, на который влияет ALGOL , например, класс хранения «auto» в языке C , выделение памяти по умолчанию в Pascal и «local-storage» в IBM COBOL. . Хранилище для AUTOMATICпеременных выделяется при входе в BEGIN-blockпроцедуру или ON-модуль, в котором они объявлены. Компилятор и исполняющая система выделяют память для кадра стека, чтобы содержать их и другую служебную информацию. Если переменная объявлена ​​с помощью INITIAL-attribute, в это время выполняется код для установки ее начального значения. Требуется осторожность, чтобы правильно использовать инициализацию. Каждый раз при входе в область видимости может выполняться большой объем кода для инициализации переменных, особенно если переменная является массивом или структурой. Хранилище для AUTOMATICпеременных освобождается при выходе из блока: STATIC, CONTROLLEDили BASEDпеременные используются для сохранения содержимого переменных между вызовами процедуры или блока. CONTROLLEDхранение также управляется с помощью стека, но подталкивание и выскакивает отчисления на стеке управляется программистом, используя ALLOCATEи FREEзаявление. Хранилище для BASEDпеременных управляется с использованием ALLOCATE/FREE, но вместо стека эти выделения имеют независимое время жизни и адресуются через переменные OFFSETили POINTER.

AREAАтрибут используется для объявления определенных программистом кучи . Данные могут быть выделены и освобождены в определенной области, а область может быть удалена, прочитана и записана как единое целое.

Совместное использование типа хранилища

Есть несколько способов доступа к выделенному хранилищу через различные объявления данных. Некоторые из них четко определены и безопасны, некоторые можно безопасно использовать при тщательном программировании, а некоторые по своей сути небезопасны и / или зависят от машины.

Передача переменной в качестве аргумента параметра по ссылке позволяет ссылаться на выделенное хранилище аргумента с помощью параметра. DEFINEDАтрибут (например DCL A(10,10), B(2:9,2:9) DEFINED A) позволяет часть или все хранений переменных , которые будут использоваться с другой, но последовательной, декларацией. Определение языка включает CELLатрибут (позже переименованный UNION), позволяющий различным определениям данных совместно использовать одно и то же хранилище. Это не поддерживалось многими ранними компиляторами IBM. Эти способы использования безопасны и не зависят от машины.

Обработка ввода-вывода записей и списков создает ситуации, когда программисту необходимо поместить объявление в хранилище следующей записи или элемента, прежде чем он узнает, какой тип структуры данных он имеет. Основанные переменные и указатели являются ключевыми для таких программ. Структуры данных должны быть спроектированы соответствующим образом, обычно с использованием полей в структуре данных для кодирования информации о ее типе и размере. Поля могут храниться в предыдущей структуре или, с некоторыми ограничениями, в текущей. Если кодировка находится в предыдущей структуре, программе необходимо выделить основанную переменную с объявлением, которое соответствует текущему элементу (используя выражения для экстентов, где это необходимо). Если информация о типе и размере должна храниться в текущей структуре («самоопределяющиеся структуры»), поля, определяющие тип, должны располагаться впереди зависимых от типа элементов и в одном и том же месте в каждой версии структуры данных. Параметр REFER-option используется для самоопределяющихся экстентов (например, длина строки, как в DCL 1 A BASED, 2 N BINARY, 2 B CHAR(LENGTH REFER A.N.), etc  - where LENGTH, используется для выделения экземпляров структуры данных. Для самоопределяющихся структур любая типизация и REFERedполя помещаются перед "реальными" данными. записи в наборе данных или элементы в списке структур данных организованы таким образом, чтобы с ними можно было безопасно обрабатывать машинно-независимым способом.

Реализации PL / I (за исключением компилятора PL / I Checkout) не отслеживают структуру данных, используемую при первом выделении памяти. Любое BASEDобъявление может использоваться с указателем на хранилище для доступа к хранилищу - небезопасно по своей сути и зависит от машины. Однако это использование стало важным для «арифметики указателей» (обычно добавление определенной суммы к известному адресу). Это была спорная тема в информатике. Помимо проблемы диких ссылок и переполнения буфера, возникают проблемы из-за выравнивания и длины типов данных, используемых на определенных машинах и компиляторах. Во многих случаях, когда может потребоваться арифметика с указателями, требуется найти указатель на элемент внутри более крупной структуры данных. ADDRФункция вычисляет такие указатели, безопасно и машину самостоятельно.

Арифметика указателя может быть выполнена путем наложения псевдонима на двоичную переменную с помощью указателя, как в.
DCL P POINTER, N FIXED BINARY(31) BASED(ADDR(P)); N=N+255;
Он полагается на указатели той же длины, что и FIXED BINARY(31)целые числа, и выровненные по тем же границам.

Благодаря преобладанию языка C и его свободному и простому отношению к арифметике указателей последние компиляторы IBM PL / I позволяют использовать указатели с операторами сложения и вычитания для получения простейшего синтаксиса (но параметры компилятора могут запретить эти методы, когда безопасность и машинная независимость имеют первостепенное значение).

ON-блоки и обработка исключений

Когда был разработан PL / I, программы выполнялись только в пакетном режиме, без возможного вмешательства программиста на терминале. Исключительное условие, такое как деление на ноль, прервало бы выполнение программы, получив только шестнадцатеричный дамп ядра. Обработка исключений PL / I через блоки ON позволяла программе сохранять контроль перед лицом аппаратных исключений или исключений операционной системы и восстанавливать отладочную информацию перед более изящным завершением работы. По мере того, как программа становилась отлаженной должным образом, большая часть обработки исключений могла быть удалена или отключена: этот уровень контроля стал менее важным, когда диалоговое выполнение стало обычным явлением.

Вычислительная обработка исключений включается и выключается префиксами условий в операторах, блоках (включая блоки ON) и процедурах. - напр (SIZE, NOSUBSCRIPTRANGE): A(I)=B(I)*C; . Исключения операционной системы для управления вводом / выводом и хранением всегда включены.

ON-unit - это отдельный оператор или BEGIN-блок, представленный расширением ON-statement. Выполнение этого оператора ON позволяет состояние указанного, например, ON ZERODIVIDE ON-unit. Когда возникает исключение для этого условия и условие разрешено, выполняется блок включения для этого условия. ON-блоки наследуются по цепочке вызовов. Когда блок, процедура или ON-блок активированы, ON-блоки, установленные при инициировании активации, наследуются новой активацией. Они могут быть заменены другим ON-statementи могут быть восстановлены с помощью REVERT-statement. Исключение можно смоделировать с помощью SIGNAL-statement- например, для помощи в отладке обработчиков исключений. Принцип динамического наследования для ON-модулей позволяет подпрограмме обрабатывать исключения, возникающие в подпрограммах, которые она использует.

Если при возникновении условия не действует ни один блок ON, выполняется стандартное системное действие (часто это повышение ERRORусловия). Системное действие может быть восстановлено с помощью SYSTEMопции ON-statement. При некоторых условиях можно завершить выполнение ON-блока и вернуться в точку прерывания (например, STRINGRANGE, UNDERFLOW, CONVERSION, OVERFLOW, AREA and FILEусловия) и возобновить нормальное выполнение. С другими условиями, такими как (SUBSCRIPTRANGE), ERRORусловие возникает, когда это делается. Блок ON может быть завершен с GO TOпредотвращением возврата к точке прерывания, но с разрешением программе продолжить выполнение в другом месте, как определено программистом.

ON-блок должен быть спроектирован так, чтобы иметь дело с исключениями, которые происходят в самом ON-блоке. Этот ON ERROR SYSTEM;оператор позволяет ловушку вложенных ошибок; если в ON-блоке возникает ошибка, управление может перейти к операционной системе, где может быть создан системный дамп, или, для некоторых вычислительных условий, продолжить выполнение (как упомянуто выше).

Операторы ввода- RECORDвывода PL / I имеют относительно простой синтаксис, поскольку они не предлагают вариантов для многих ситуаций, от конца файла до ошибок передачи записи, которые могут возникнуть при чтении или записи записи. Вместо этого эти сложности обрабатываются в ON-блоках для различных файловых условий. Тот же подход был принят для AREAперераспределения и AREAусловия.

Наличие ON-блоков обработки исключений может повлиять на оптимизацию, потому что переменные могут быть проверены или изменены в ON-блоках. Значения переменных, которые в противном случае могли бы храниться в регистрах между операторами, может потребоваться возвращать в хранилище между операторами. Это обсуждается в разделе «Проблемы реализации» выше.

ПЕРЕЙТИ К с нефиксированной целью

PL / I имеет аналоги для специализированных операторов GO TO COBOL и FORTRAN.

Синтаксис как COBOL, так и FORTRAN существует для кодирования двух специальных типов GO TO, каждый из которых имеет цель, которая не всегда одинакова.

  • АЛЬТЕР (КОБОЛ), НАЗНАЧЕНИЕ (ФОРТРАН):
  • ИЗМЕНИТЬ имя_параграфа_xxx, ЧТОБЫ ПЕРЕЙТИ К para_name_zzz.
Существуют и другие / полезные ограничения для них, особенно «в программах ... в атрибуте RECURSIVE, в методах или в параметре .. THREAD».
  • НАЗНАЧИТЬ 1860 ДЛЯ IGOTTAGO
    ПЕРЕЙТИ НА IGOTTAGO
Одним из усовершенствований, добавляющих встроенную документацию, является
GO TO IGOTTAGO (1860, 1914, 1939).
(что ограничивает значение переменной «одной из меток в списке».)
  • ПЕРЕЙТИ К ... на основе значения переменной.
  • ПЕРЕЙДИТЕ К (1914, 1939, 2140), MYCHOICE
  • ПЕРЕЙДИТЕ К para_One para_Two para_Three В ЗАВИСИМОСТИ ОТ IDECIDE.

PL / I имеет переменные метки оператора (с атрибутом LABEL), которые могут хранить значение метки оператора и позже использоваться в операторе GOTO.

LABL1: ....
.
.
LABL2: ...
.
.
.
MY_DEST = LABL1;
.
GO TO MY_DEST;
GO TO HERE(LUCKY_NUMBER); /* minus 1, zero, or ... */

HERE(-1): PUT LIST ("I O U"); GO TO Lottery;
HERE(0): PUT LIST ("No Cash"); GO TO Lottery;
HERE(1): PUT LIST ("Dollar Bill"); GO TO Lottery;
HERE(2): PUT LIST ("TWO DOLLARS"); GO TO Lottery;

Переменные метки оператора можно передать вызываемым процедурам и использовать для возврата к другому оператору в вызывающей подпрограмме.

Примеры программ

Привет, мир программа

Hello2: proc options(main);
     put list ('Hello, World!');
end Hello2;

Искать строку

/* Read in a line, which contains a string,
/* and then print every subsequent line that contains that string. */

find_strings: procedure options (main);
   declare pattern character (100) varying;
   declare line character (100) varying;
   declare line_no fixed binary;

   on endfile (sysin) stop;

   get edit (pattern) (L);
   line_no = 1;
   do forever;
      get edit (line) (L);
      if index(line, pattern) > 0 then
         put skip list (line_no, line);
      line_no = line_no + 1;
   end;

end find_strings;

Смотрите также

Примечания

использованная литература

Учебники

  • Neuhold, EJ & Lawson, HW (1971). Машина PL / I: Введение в программирование . Эддисон-Уэсли. ISBN 978-0-2010-5275-6.
  • Барнс, РА (1979). PL / I для программистов . Северная Голландия.
  • Хьюз, Джоан К. (1973). Программирование PL / I (1-е изд.). Вайли. ISBN 0-471-42032-8.
  • Хьюз, Джоан К. (1986). Структурированное программирование PL / I (3-е изд.). Вайли. ISBN 0-471-83746-6.
  • Гронер, GF (1971). Программирование PL / I в технологических приложениях . Книги по запросу, Анн-Арбор, Мичиган.
  • Андерсон, Мэн (1973). PL / I для программистов . Прентис-Холл.
  • Stoutemyer, DR (1971). PL / I Программирование для инженерии и науки . Прентис-Холл.
  • Зиглер, Р.Р.и К. (1986). PL / I: Структурированное программирование и решение проблем (1-е изд.). Запад. ISBN 978-0-314-93915-9.
  • Штурм, Э. (2009). Новый PL / I ... для ПК, рабочих станций и мэйнфреймов . Vieweg-Teubner, Висбаден, Германия. ISBN 978-3-8348-0726-7.
  • Гласные, РА (1997). Введение в PL / I, алгоритмы и структурное программирование (3-е изд.). ISBN 978-0-9596384-9-3.
  • Абрахамс, Пол (1979). Язык программирования PL / I (PDF) . Лаборатория математики и вычислений Куранта, Нью-Йоркский университет.

Стандарты

  • ANSI ANSI X3.53-1976 (R1998) Информационные системы - Язык программирования - PL / I
  • ANSI ANSI X3.74-1981 (R1998) Информационные системы - Язык программирования - Подмножество общего назначения PL / I
  • ANSI ANSI X3.74-1987 (R1998) Информационные системы - Язык программирования - Подмножество общего назначения PL / I
  • ECMA 50 Programming Language PL / I , 1-е издание, декабрь 1976 г.
  • ISO 6160: 1979 Языки программирования - PL / I
  • ISO / IEC 6522: 1992 Информационные технологии. Языки программирования. Подмножество PL / I общего назначения.

Справочные руководства

внешние ссылки