Jump to content

ПЛ/Я

(Перенаправлено с PL/MI )
ПЛ/Я
Парадигма Процедурный , императивный , структурированный.
Разработано IBM , Комитет по развитию языков SHARE и ISO
Впервые появился 1964 год ; 60 лет назад ( 1964 )
Веб-сайт www .ibm /продукты /more-compiler-zos
Диалекты
См. диалекты
Под влиянием
КОБОЛ , Фортран , АЛГОЛ 60
Под влиянием
Язык управления , PL/M , PL/S , PL-6 , PL.8 , REXX , SAS

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

Стандарт PL/1 ANSI , X3.53-1976, был опубликован в 1976 году.

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

Ранняя история

[ редактировать ]

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

IBM взяла NPL за отправную точку и довела проект до уровня, на котором можно было написать первый компилятор: определение NPL было неполным по объему и деталям. [9] Управление языком PL/I [10] первоначально принадлежал Нью-Йоркскому центру программирования, а затем британской лаборатории IBM в Херсли . Группы пользователей SHARE и GUIDE участвовали в расширении языка и сыграли роль в процессе IBM по управлению языком через свои проекты PL/I. Опыт определения такого большого языка показал необходимость формального определения PL/I. был начат проект В 1967 году в лаборатории IBM в Вене по созданию однозначной и полной спецификации. [11] Это, в свою очередь, привело к появлению одного из первых крупномасштабных формальных методов разработки — VDM .

Фреду Бруксу приписывают обеспечение PL/I типа данных CHARACTER. [12]

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

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

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

[ редактировать ]

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

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

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

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

Краткое описание языка

[ редактировать ]

Язык спроектирован так, чтобы быть всем для всех программистов. [ нечеткий ] [15] Краткое изложение взято из стандарта ANSI PL/I. [16] и стандарт подмножества общего назначения ANSI PL/I. [17]

Программа 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

The arithmetic type включает в себя следующие атрибуты:

  • база ( BINARY или DECIMAL), и
  • масштаб ( FIXED или FLOAT), и
  • режим ( REAL или COMPLEX), и
  • а 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 к процедуре.

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

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

  • 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. [18] Стандартизация стала результатом совместных усилий ECMA TC/10 и ANSI X3J1. Подмножество GY33-6003 [19] документ был предложен совместным усилиям IBM и стал базовым документом для стандартизации. Основными функциями, опущенными в базовом документе, были многозадачность и атрибуты оптимизации программы (например, NORMAL и ABNORMAL).

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

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

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

Реализации

[ редактировать ]

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

[ редактировать ]

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

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

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

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

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

[ редактировать ]

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

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

Оптимизирующие и проверяющие компиляторы IBM PL/I

[ редактировать ]

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

IBM представила новые атрибуты и синтаксис, включая BUILTIN , операторы случая ( ВЫБИРАТЬ / КОГДА / ИНАЧЕ ), элементы управления циклом ( ИТЕРАЦИЯ и LEAVE ) и списки нулевых аргументов для устранения неоднозначности, например: DATE().

Оптимизирующий компилятор PL/I пришел на смену компилятору PL/IF и был рабочей лошадкой IBM с 1970-х по 1990-е годы. Как и PL/IF, это многопроходный компилятор с расчетной точкой размером 44 килобайта, но это совершенно новый дизайн. В отличие от компилятора F, он должен выполнять оценку константных выражений во время компиляции с использованием библиотеки времени выполнения, сокращая максимальный объем памяти для фазы компиляции до 28 килобайт. При втором проектировании удалось устранить неудобства PL/IF, такие как каскадная диагностика. [31] Он был написан на S/360 Macro Assembler командой под руководством Тони Бербриджа, большинство из которых работали над PL/I F. Макросы были созданы для автоматизации общих служб компилятора и защиты авторов компиляторов от задач управления реальными данными. режим хранения, позволяющий легко переносить компилятор на другие модели памяти. Был использован целый ряд методов оптимизации программ, разработанных для современного компилятора IBM Fortran H: Optimizer равнялся скорости выполнения Fortran в руках хороших программистов. Анонсированный вместе с IBM S/370 в 1970 году, он был выпущен сначала для операционной системы DOS/360 в августе 1971 года, а вскоре после этого и для OS/360. [32] и первые операционные системы 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, [33] [34] (в просторечии «The Checker»), анонсированный в августе 1970 года, был разработан для ускорения и улучшения отладки программ PL/I. Команду возглавил Брайан Маркс. Трехпроходная конструкция сократила время компиляции программы до 25% от времени, затрачиваемого F-компилятором. Его можно запускать с интерактивного терминала, преобразуя программы PL/I во внутренний формат «H-текст». Этот формат интерпретируется компилятором Checkout во время выполнения, обнаруживая практически все типы ошибок. Указатели представлены 16 байтами, содержащими целевой адрес и описание элемента, на который ссылаются, что позволяет диагностировать «неправильное» использование указателя. В диалоговой среде при обнаружении ошибки управление передается пользователю, который может проверять любые переменные, вводить операторы отладки и редактировать исходную программу. Со временем возможности отладки сред программирования мэйнфреймов расширили большинство функций, предлагаемых этим компилятором, и он был отозван (в 1990-х годах?)

Декабрь PL/I

[ редактировать ]

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

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

[ редактировать ]

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

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

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

SL/1 (Студенческий язык/1, Студенческий язык/Один или подмножество языков/1) [43] [44] представлял собой подмножество PL/I, первоначально доступное в конце 1960-х годов и работавшее интерпретативно на IBM 1130 ; Учебное использование было его сильной стороной.

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

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

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

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

[ редактировать ]

В рамках серьезной модернизации PL/I компания IBM Santa Teresa в Калифорнии выпустила в 1992 году совершенно новый компилятор. Первоначальная партия предназначалась для OS/2 и включала большинство функций ANSI-G и множество новых функций PL/I. [48] Последующие выпуски предоставили дополнительные платформы ( MVS , VM , OS/390 , AIX и Windows ), но по состоянию на 2021 год единственными поддерживаемыми платформами являются z/OS и AIX. [49] IBM продолжала добавлять функции, чтобы сделать PL/I полностью конкурентоспособным по сравнению с другими языками (особенно C и C++) в тех областях, где он уступал. Соответствующая «Языковая среда IBM» поддерживает взаимодействие программ 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 for z/OS, использует генерацию кода для новейших процессоров z/Architecture (z14, z13, zEC12, zBC12, z196, z114) с помощью Управление параметрами ARCHLVL передавалось во время компиляции и было вторым языком высокого уровня, поддерживаемым языковой средой z/OS (XL C/C++ был первым, а Enterprise COBOL v5 последним).

Типы данных

[ редактировать ]

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

The Оператор DEFINE (см. ниже) позволяет доп. TYPE должны быть объявлены как составленные из встроенных атрибутов PL/I.

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

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

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

[ редактировать ]

Были добавлены следующие атрибуты:

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

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

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

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

Читабельность программы – четкое определение намерений

[ редактировать ]

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

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

The НАЗНАЧАЕМЫЕ и Атрибуты NONASSIGNABLE предотвращают непреднамеренное присвоение.

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

The Оператор DEFINE вводит имена, указанные пользователем (например, INTEGER ) для комбинаций встроенных атрибутов (например, FIXED BINARY(31,0)). Таким образом DEFINE ALIAS INTEGER FIXED BINARY(31.0) создает ТИПА Название INTEGER как псевдоним для набора встроенных атрибутов FIXED BINARY(31.0). DEFINE STRUCTURE применяется к структурам и их членам; это обеспечивает Имя TYPE для набора атрибутов структуры и соответствующих объявлений членов подструктуры для использования в объявлении структуры (обобщение НРАВИТСЯ атрибут).

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

[ редактировать ]

А LEAVE для выхода из цикла и ITERATE , чтобы продолжить следующую итерацию цикла.

UPTHRU и Опции DOWNTHRU для итеративных групп.

Конструкция пакета, состоящая из набора процедур и объявлений для использования как единое целое. Переменные, объявленные вне процедур, являются локальными для пакета и могут использовать СТАТИЧЕСКИЙ , НА ОСНОВЕ или КОНТРОЛИРУЕМОЕ хранение. Имена процедур, используемые в пакете, также являются локальными, но их можно сделать внешними с помощью команды ЭКСПОРТ вариант ПАКЕТ -заявление.

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

[ редактировать ]

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

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

The Условие ANYCONDITION предназначено для перехвата условий, для которых в текущей процедуре не указан конкретный блок включения.

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

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

[ редактировать ]

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

  • В 1974 году корпорация Burroughs анонсировала PL/I для B6700 и B7700. [50]
  • UNIVAC выпустила UNIVAC PL/I, [51] а в 1970-х годах также использовался вариант PL/I, PL/I PLUS, для системного программирования.
  • С 1978 года компания Data General предоставляла PL/I на своих Eclipse и Eclipse MV платформах под управлением операционных систем AOS , AOS/VS и AOS/VS II . [52] На этом языке был написан ряд служебных программ операционной системы.
  • Пол Абрахамс из Института математических наук Куранта Нью-Йоркского университета написал CIMS PL/I в 1972 году на PL/I, загрузив его через PL/I F. Он поддерживал «около 70%» PL/I, компилируемого в CDC 6600. [53]
  • CDC предоставила оптимизирующее подмножество PL/I-компилятора для серий Cyber ​​70, 170 и 6000. [54]
  • Fujitsu предоставила компилятор PL/I, эквивалентный PL/I Optimizer.
  • Stratus Technologies PL/I — это реализация ANSI G для операционной системы VOS . [55]
  • IBM серии/1 PL/I [56] [57] представляет собой расширенное подмножество языка программирования 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 . [58] Он был основан на подмножестве G PL/I. [58] и был написан на PL/M .
  • Micro Focus внедрила Open PL/I для Windows [59] и системы UNIX/Linux, [60] который они приобрели у Лианта.
  • IBM представила PL/I для OS/2 [48] в 1994 году и PL/I для AIX в 1995 году. [61]
  • Iron Spring PL/I для OS/2 и более поздних версий Linux был представлен в 2007 году. [62]

PL/I диалекты

[ редактировать ]

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

[ редактировать ]

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

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

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

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

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

Во-вторых, PL/I обогнали в области системного программирования. Сообщество системного программирования IBM не было готово использовать PL/I; вместо этого IBM разработала и приняла собственный диалект PL/I для системного программирования. – ПЛ/С . [76] С успехом 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 используется в качестве отправной точки для возможностей языка. Но ряд важных особенностей ранних реализаций отсутствовал в Стандарте; а некоторые предлагались компиляторами, не принадлежащими IBM. И язык де-факто продолжал развиваться после стандарта, в конечном итоге благодаря развитию персональных компьютеров.

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

[ редактировать ]

Многопоточность

[ редактировать ]

Многопоточность под названием «многозадачность» была реализована в PL/IF. [77] компиляторы PL/I Checkout и Optimizing, [78] и новые компиляторы AIX и Z/OS. В него вошли типы данных СОБЫТИЕ и ЗАДАЧА , ЗАДАЧА - опция на CALL -оператор ( вилка ), WAIT -оператор ( Join ), DELAY(delay-time), EVENT - параметры записи операторов ввода-вывода и Оператор UNLOCK для разблокировки заблокированных записей ЭКСКЛЮЗИВНЫЕ файлы. Данные о событии идентифицируют конкретное событие и указывают, является ли оно завершенным ('1'B) или неполным ('0'B): элементы данных задачи идентифицируют конкретную задачу (или процесс ) и указывают ее приоритет относительно других задач.

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

[ редактировать ]

Первый времени компиляции препроцессор IBM был создан Бостонским центром перспективного программирования IBM, расположенным в Кембридже, штат Массачусетс, и поставлялся с компилятором PL/IF. %INCLUDE заявление было в Стандарте, но остальных функций не было. DEC и Кеднос [40] Компиляторы PL/I реализовали практически тот же набор функций, что и IBM, с некоторыми собственными дополнениями. IBM продолжает добавлять в свои компиляторы функции препроцессора. Препроцессор обрабатывает написанную исходную программу как последовательность токенов, копируя их в выходной исходный файл или воздействуя на них. При обнаружении токена % выполняется следующий оператор времени компиляции: когда встречается токен идентификатора и идентификатор был ОБЪЯВЛЯЕМ d, ACTIVATE d и присвоено значение времени компиляции, идентификатор заменяется этим значением. Токены добавляются в выходной поток, если они не требуют действий (например, +), как и значения 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) и %DEACTIVATE
  • присваивания оператор
  • %DECLARE identifier_attribute_list
  • %GO TO label
  • %INCLUDE
  • пустое заявление

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

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

[ редактировать ]

Дополнения к структурированному программированию были внесены в PL/I во время стандартизации, но не были приняты в стандарт. Эти особенности были LEAVE -оператор выхода из итерации ДЕЛАЙТЕ , ДО тех пор, пока -опция и ПОВТОРИТЬ - добавлена ​​опция DO и оператор случая общего вида:

SELECT (expression) {WHEN (expression) group}... OTHERWISE group

Все эти функции были включены в компиляторы IBM PL/I Checkout и Optimizing. [30] и в DEC PL/I. [79]

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

[ редактировать ]

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 еще до того, как были написаны первые компиляторы. [9]

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

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

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

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

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

[ редактировать ]

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

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

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

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

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

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

[ редактировать ]

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

[ редактировать ]

PL/I предоставляет несколько «классов хранения», чтобы указать, как следует управлять сроком хранения переменных: STATIC, AUTOMATIC, CONTROLLED, и BASED, и AREA.

STATIC данные выделяются и инициализируются во время загрузки, как это делается в COBOL «рабочем хранилище» и ранних версиях Fortran . Это значение по умолчанию для EXTERNAL переменные (аналогично C «extern» или Fortran «named common»),

AUTOMATIC — это класс хранения PL/I по умолчанию для INTERNAL переменные, аналогичные переменным других языков с блочной структурой, находящихся под влиянием ALGOL , таких как класс хранения «auto» в языке C , распределение памяти по умолчанию в Pascal и «local-storage» в IBM COBOL. Хранение для AUTOMATIC переменные выделяются при входе в процедуру, BEGIN-блокировать или ON-единица, в которой они объявлены. Компилятор и система выполнения выделяют память для кадра стека , чтобы содержать их и другую служебную информацию. Если переменная объявлена ​​с INITIAL-attribute, в этот момент выполняется код для установки его начального значения. Требуется осторожность, чтобы правильно управлять использованием инициализации. Большие объемы кода могут выполняться для инициализации переменных каждый раз при входе в область, особенно если переменная представляет собой массив или структуру. Хранение для AUTOMATIC переменные освобождаются при выходе из блока.

STATIC, CONTROLLED, или BASED переменные используются для сохранения содержимого переменных между вызовами процедуры или блока.

CONTROLLED хранилище управляется с помощью стека, но перемещением и извлечением выделений в стеке управляет программист, используя ALLOCATE и FREE заявления.

Хранение для BASED переменные также управляются с помощью ALLOCATE/ FREE, но вместо стека эти выделения имеют независимое время жизни и адресуются через OFFSET или POINTER переменные. BASED переменные также можно использовать для адресации произвольных областей хранения, устанавливая связанные с ними POINTER переменная, например, следующая за связанным списком .

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

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

[ редактировать ]

Существует несколько способов доступа к выделенному хранилищу с помощью различных объявлений данных. Некоторые из них четко определены и безопасны, некоторые можно безопасно использовать при тщательном программировании, а некоторые по своей сути небезопасны или зависят от машины. [82] : стр. 262–267, 178–180.

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

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

Реализации 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 -единицы позволяли программе сохранять контроль над исключениями оборудования или операционной системы и восстанавливать отладочную информацию перед более корректным закрытием. Когда программа была должным образом отлажена, большая часть обработки исключений могла быть удалена или отключена: этот уровень контроля стал менее важным, когда диалоговое выполнение стало обычным явлением.

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

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

Если нет ON - блок действует, когда возникает условие, выполняется стандартное системное действие (часто это повышение состояние ОШИБКИ ). Действие системы можно восстановить с помощью СИСТЕМНАЯ опция ON -заявление. При некоторых условиях можно завершить выполнение ВКЛ-блока и вернуться к точке прерывания (например, СТРИНГРЕЙНДЖ , ПОДТОК , КОНВЕРСИЯ , ПЕРЕПОЛНЕНИЕ , ОБЛАСТЬ и FILE ) и возобновить нормальное выполнение. При других условиях, таких как (SUBSCRIPTRANGE), ОШИБКА При такой попытке возникает состояние . ON-блок может быть завершен с помощью GO TO предотвращение возврата к точке прерывания, но разрешение программе продолжить выполнение в другом месте, как определено программистом.

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

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

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

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

[ редактировать ]

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

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

  • ИЗМЕНИТЬ (КОБОЛ), НАЗНАЧИТЬ (ФОРТРАН):
    • ALTER paragraph_name_xxx TO PROCEED TO para_name_zzz («измененный переход»). [83]
      Существуют и другие/полезные ограничения, особенно «в программах... Атрибут RECURSIVE в методах или .. РЕЗЬБА [83]
    • ASSIGN 1860 TO IGOTTAGO («назначено перейти») [84]
      GO TO IGOTTAGO
      Одно из улучшений, добавляющее встроенную документацию, —
      GO TO IGOTTAGO (1860, 1914, 1939)
      (что ограничивает значение переменной «одной из меток в списке».) [84]
  • GO TO ... на основе значения, подобного индексу переменной.
    • GO TO (1914, 1939, 2140), MYCHOICE («вычисляемый переход») [85]
    • GO TO para_One para_Two para_Three DEPENDING ON IDECIDE («перейти в зависимости от»). [86]

PL/I имеет переменные меток операторов (с LABEL ), который может хранить значение метки оператора и позже использоваться в Оператор GOTO . [87] [30] : 54  [30] : 23 

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;

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ «Изменения в IBM» The New York Times . 20 июня 1984 года.
  2. ^ Штурм, Эберхард (2009). Новый PL/I . Вьюег+Тойбнер. ISBN  978-3-8348-0726-7 .
  3. ^ Jump up to: а б Пью, Эмерсон В.; Джонсон, Лайл Р.; Палмер, Джон Х. (1991). Системы IBM 360 и ранние версии 370 . Кембридж, Массачусетс: MIT Press . ISBN  978-0-262-16123-7 .
  4. На момент публикации отчета в комитете на самом деле было 8 членов. Они были: [ нужна ссылка ]
  5. ^ «Данные в бизнесе и науке MPPL IN FOR NPL» (PDF) . Датаматизация . Том. 11, нет. 4. ФРЭНК Д. ТОМПСОН. Апрель 1965 г. с. 17.
  6. ^ «Данные в бизнесе и науке. ЕЩЕ НОВОЕ ИМЯ, БОЛЬШЕ КОМПИЛЯТОРОВ ДЛЯ NPL» (PDF) . Датаматизация . Том. 11, нет. 6. ФРЭНК Д. ТОМПСОН. Июнь 1965 г. с. 17.
  7. Отчет II Комитета по развитию языков SHARE, 25 июня 1964 г.
  8. ^ Радин, Г .; Х. Пол Рогоуэй (январь 1965 г.). «Основные особенности нового языка программирования» . Коммуникации АКМ . 8 (1): 9–17. дои : 10.1145/363707.363708 . S2CID   17133703 .
  9. ^ Jump up to: а б Радин, Г. (август 1978 г.). «Ранняя история и характеристики PL/I» . Уведомления ACM SIGPLAN . 13 (8): 227–241. дои : 10.1145/960118.808389 . S2CID   13925251 .
  10. ^ Контроль над языком был возложен на специальную группу языкового контроля и Совет по языковому контролю, в который входили представители групп-составителей (6 к 1973 году) в трех странах. Ежедневно связь была по телексу . Изменения и расширения вносились через языковой журнал, в котором было зарегистрировано несколько тысяч подробных пунктов. Совет по проверке языка на уровне руководства решал вопросы, переданные ему Контрольным советом.
  11. ^ Универсальный языковой документ (ULD). Технические отчеты TR25.081, TR25.082, TR25.083, TR25.0S4, TR25.085, TR25.086 и TR25.087, IBM Corp, Вена, Австрия, июнь 1968 г.
  12. ^ «Фредерик П. Брукс-младший - Компьютерное общество IEEE» . Компьютерное общество IEEE . 1989.
  13. ^ «Глава 1: Введение» (PDF) . Технический отчет NPL (PDF) (Отчет). ИБМ . Декабрь 1964 г. с. 11 . Проверено 1 января 2024 г. NPL предназначен для удовлетворения потребностей необычайно большой группы программистов, включая научных, деловых программистов, программистов реального времени и системных программистов.
  14. ^ Некоторые составители предпочли зарезервировать эти идентификаторы или выдать предупреждения, если обнаружили, что они используются в качестве идентификаторов. Но последующее введение случая показывает ценность этого принципа.
  15. ^ Гласные, Робин (2001). Введение в PL/I . РА Гласные. п. х. ISBN  978-0-9596384-9-3 . «PL/I — это первый язык, предоставляющий адекватные возможности для научных вычислений, обработки бизнес-данных и системного программирования на одном языке» — Жан Саммет , «Некоторые подходы и иллюстрации к истории языков программирования».
  16. ^ Jump up to: а б Язык программирования ANS PL/I. X3.53-1976
  17. ^ Jump up to: а б ANSI X3.74-1981 (R1998) Информационные системы. Язык программирования. Подмножество общего назначения PL/I.
  18. ^ Реагируя на участие IBM, ряд производителей не хотели поддерживать работу над стандартом. Первоначальной задачей CLDG/X3J1 было выяснить, является ли PL/I подходящим кандидатом для стандартизации. Совместными усилиями было обработано более 3500 предложений по языковым и текстовым изменениям.
  19. ^ «Спецификации языка PL/I. GY33-6003»
  20. ^ Машина PL/I, определенная в стандарте, описана в разделе « Механизм определения стандартного PL/I» . Майкл Маркотти, Фредерик Дж. Сэйворд.
  21. ^ 1987 Подмножество общего назначения PL/I (ANSI X3.74-1987)
  22. ^ Jump up to: а б с Красун, Энди. «Первые 35 с лишним лет программного обеспечения Hursley, 1958–1993 годы, не считая некоторого оборудования, личный аккаунт» (PDF) . Проверено 5 мая 2020 г.
  23. ^ Руководство по логике программы компилятора операционной системы IBM System/360 PL/I (F) (PDF) . ИБМ. Декабрь 1966 г. РАЗДЕЛ 2: ФАЗЫ КОМПИЛЯТОРА. Y28-6800-1.
  24. ^ Они были разработаны в 1966 году для раннего оптимизирующего компилятора, написанного на PL/I и предназначенного для начальной загрузки, начиная с компилятора PL/IF.
  25. Было много задержек с доставкой, поэтому распространенной шуткой PL/I в то время было то, что генерал де Голль запретил Ла Году отправлять их до тех пор, пока «Конкорд» не совершит свой первый полет.
  26. ^ Справочное руководство по подмножеству IBM System/360 PL/I (PDF) . ИБМ. 1967. С28-8202-0.
  27. ^ Jump up to: а б РА Фрибургхаус. «Компилятор Multics PL/1» . Multicians.org .
  28. ^ Том Ван Флек (ред.). «Выбор ПЛ/И» . Multicians.org .
  29. ^ Справочное руководство PL/I Series 60 (Level 66)/6000 . Ханивелл . 1976 г. Приказ № ДЭ05.
  30. ^ Jump up to: а б с д OS PL/I Checkout и Optimizing Compilers: Справочное руководство по языку (PDF) . ИБМ. Октябрь 1976 г. GC33-0009-04.
  31. ^ Jump up to: а б «Microsoft.CodeAnalysis.CSharp A Binder преобразует имена» . [ постоянная мертвая ссылка ]
  32. ^ Jump up to: а б А. Эндрес (2013). «Ранние разработки языков и компиляторов в IBM Europe» .
  33. ^ Р.Н. Манжета (май 1972 г.). «Диалоговый компилятор для полного PL/I» . Компьютерный журнал . 15 (2): 99–104. дои : 10.1093/comjnl/15.2.99 .
  34. ^ Б.Л. Маркс (1973). «Проектирование кассового компилятора». IBM Systems Journal . 12 (3): 315–327. дои : 10.1147/sj.123.0315 .
  35. ^ «VAX-11 PL/I, версия 1.0» (PDF) . Цифровой. Октябрь 1980 года . Проверено 31 октября 2023 г.
  36. ^ Справочное руководство Uniprise PL/I для UNIX, Uniprise Systems, Inc., Ирвин, Калифорния, 1995, стр. XXI.
  37. ^ Том Линден (21 мая 2004 г.). «RE: Дэйв Катлер и VMS №2» . Группа новостей : comp.os.vms . Архивировано из оригинала 14 июня 2021 года . Проверено 26 февраля 2021 г.
  38. ^ Катлер, Дэйв (25 февраля 2016 г.). «Устная история Дэйва Катлера» . youtube.com (Интервью). Беседовал Грант Сэвирс. Музей истории компьютеров. Архивировано из оригинала 11 декабря 2021 г. Проверено 26 февраля 2021 г.
  39. ^ Робин Вауэлс (01 апреля 2010 г.). «Часто задаваемые вопросы PL/I (FAQ)» . Группа новостей : comp.ответы .
  40. ^ Jump up to: а б «Kednos PL/I для OpenVMS и Tru64» . kednos.com . 02.11.2016. Архивировано из оригинала 14 марта 2021 г. Проверено 30 марта 2021 г.
  41. ^ Ричард К. Холт (5 ноября 1972 г.). «Обучение смертельной болезни (или) вводному компьютерному программированию с использованием PL/I» . Архивировано из оригинала 15 апреля 2011 года . Проверено 30 мая 2010 г.
  42. ^ Департамент компьютерных наук, Руководство пользователя по PL/C - Корнеллский компилятор для PL/I, Корнельский университет, Итака, 1977.
  43. ^ «SL/1 (Студенческий язык/Один)» .
  44. ^ «ИБМ 1130» . BobsPixels.com .
  45. ^ Руководство пользователя PLAGO/360, Политехнический институт Бруклина.
  46. ^ JNP Hume и RC Holt, Структурное программирование с использованием PL/I и SP/k, Рестон, Рестон, 1975.
  47. ^ Марвин Виктор Зелковиц , Программирование PL/I с PLUM, 2-е изд., Paladin House, Женева (Иллинойс), 1978.
  48. ^ Jump up to: а б Робин А. Гласные (март 1996 г.). «PL/I для OS/2» . Уведомления ACM SIGPLAN . 31 (3). Ассоциация вычислительной техники : 22–27. дои : 10.1145/227717.227724 . S2CID   24441291 .
  49. ^ «Семейство компиляторов IBM PL/I» . ИБМ . Проверено 5 июля 2021 г.
  50. ^ Burroughs Corporation, B 6700/B 7700: Справочное руководство по языку PL/I, ссылка 5001530, Детройт, 1977.
  51. ^ Sperry-Univac Computer Systems, Справочник по программисту PL/I серии SPERRY UNIVAC 1100, Справочник UP-8277, 1976.
  52. ^ Data General Corporation, Справочное руководство AOS PL/I, номер заказа 093-000204, c. 1978.
  53. ^ Пол В. Абрахамс. Компилятор CIMS PL/I . 1979 Симпозиум SIGPLAN по построению компилятора. стр. 107–116. дои : 10.1145/800229.806960 . ISBN  0-89791-002-8 .
  54. ^ Control Data Corporation, Справочное руководство PL/I, 1978, публикация № 60388100A.
  55. ^ Руководство по языку OpenVOS PL/I (R009) . Мальборо, Массачусетс : Stratus Computer, Inc., 1995. OpenVOS PL/I.
  56. ^ Вводные программы IBM Series/1 PL/I 5719-PL1 5719-PL3 (PDF) (Первое издание). ИБМ. Февраль 1977 г. GC34-0084-0.
  57. ^ IBM Series/1 PL/I: Справочное руководство по языку . ИБМ. GC34-0085-0.
  58. ^ Jump up to: а б с Питер Нортон (15 мая 1984 г.). «Хроники Нортона» . Журнал ПК . Архивировано из оригинала 6 июля 2011 года . Проверено 25 января 2010 г.
  59. ^ «Что нового в Studio and Server Enterprise Edition 6.0 Service Pack 2 — Wrap Pack 1» (PDF) . Микро Фокус . п. 1. Архивировано из оригинала (PDF) 7 ноября 2017 г.
  60. ^ «Предприятие > Micro Focus Studio Enterprise Edition для UNIX > Добро пожаловать > Информация о продукте > Установка Studio Enterprise Edition для UNIX > Системные требования» . Микро Фокус . Архивировано из оригинала 07.11.2017 . Проверено 5 ноября 2017 г.
  61. ^ «Набор IBM PL/I для AIX версии 1» . 19 сентября 1995 года . Проверено 13 мая 2019 г.
  62. ^ «Компилятор Iron Spring PL/I — Руководство по программированию» . Ironspring.com . 15 сентября 2020 г. Проверено 26 февраля 2021 г.
  63. ^ Фрэнк Г. Солтис (1997). Внутри AS/400, второе издание . Дьюк Пресс. ISBN  978-1-882419-66-1 .
  64. ^ Берг, Уильям; Клайн, Маршалл; Жиру, Майк (октябрь 1995 г.). «Уроки, извлеченные из проекта OS/400 OO» . Коммуникации АКМ . 38 (10): 54–64. дои : 10.1145/226239.226253 . S2CID   7492851 .
  65. ^ Пиготт, Диармайд. «ПЛ/МП» . Интернет-историческая энциклопедия языков программирования . Архивировано из оригинала 2 августа 2020 года . Проверено 24 февраля 2021 г.
  66. ^ Лейф Свальгаард (08 октября 2003 г.). "Re:Re:Эмулятор MI" . MI400 (список рассылки) . Проверено 26 февраля 2021 г.
  67. ^ Дэйв Маккензи (1 сентября 2004 г.). «RE: Утилита UNDELete Дэйва Маккензи — спасатель жизни!» . Архив средних частот MI400 . Проверено 24 мая 2021 г.
  68. ^ Дэн Хикс (21 августа 1998 г.). «UNIX против AS/400?» . Группа новостей : comp.sys.ibm.as400.misc .
  69. ^ Кок, Джон; Маркштейн, Виктория (январь 1990 г.). «Эволюция технологии RISC в IBM» (PDF) . Журнал исследований и разработок IBM . 34 (1): 4–11. дои : 10.1147/rd.341.0004 . Проверено 5 октября 2022 г. Результатом стал язык PL.8, цифра «.8» подразумевала, что он обладал примерно 80 процентами богатства PL/I.
  70. ^ Jump up to: а б В. Геллерих; Т. Хендель; Р. Лэнд; Х. Леманн; М. Мюллер; ПХ Оден; Х. Пеннер (май 2004 г.). «64-битный компилятор GNU PL8: на пути к открытой стандартной среде для разработки встроенного ПО» (PDF) . Журнал исследований и разработок IBM . 48 (3,4). ИБМ: 543–556. дои : 10.1147/rd.483.0543 . S2CID   19020943 . Архивировано из оригинала (PDF) 24 января 2021 г. Проверено 26 февраля 2021 г.
  71. ^ Марк Ауслендер; Мартин Хопкинс (июнь 1982 г.). Обзор компилятора PL.8 (PDF) . SIGPLAN '82 Материалы симпозиума SIGPLAN 1982 года по построению компилятора. АКМ. стр. 22–31. дои : 10.1145/872726.806977 . Проверено 26 февраля 2021 г.
  72. ^ Дж. фон Буттлар; Х. Бом; Р. Эрнст; А. Хорш; А. Колер; Х. Шейн; М. Стеттер; К. Тойрих (июль 2002 г.). «z/CECSIM: эффективный и комплексный симулятор микрокода для IBM eServer z900» (PDF) . Журнал исследований и разработок IBM . 46 (4,5). ИБМ: 607–615. дои : 10.1147/rd.464.0607 . S2CID   12745372 . Архивировано из оригинала (PDF) 11 февраля 2020 г. Проверено 26 февраля 2021 г.
  73. ^ Пиркинс, Джон Э. (1 декабря 1995 г.). «Открытый PL/I: Liant обращается к устаревшим приложениям PL/I» . Журнал корпоративных систем . Архивировано из оригинала 3 ноября 2012 года . Проверено 3 февраля 2010 г. По оценкам Open PL/I, в 1995 году 20% устаревших приложений для мэйнфреймов были на PL/I, а 60% - на COBOL: во всем мире было 300 000 программистов PL/I.
  74. ^ Шульц, Г.; Д.Роуз; К. Вест; Дж. Грей (апрель 1980 г.). «Исполняемое описание и проверка СНС». Транзакции IEEE в области коммуникаций . 28 (4): 661–677. дои : 10.1109/TCOM.1980.1094695 .
  75. ^ Клэр Грант (июнь 2005 г.). «Портирование OpenVMS на серверы HP Integrity» (PDF) . Технический журнал OpenVMS . 6 .
  76. ^ В своих слайдах, посвященных IBM Operating System/360, Фред Брукс говорит, что OS/360 следовало писать на PL/I, а не на PL/S и ассемблере. Эта статья представляет собой отличный обзор программы OS/360. «Архитектура /360 и ее операционная система». Архивировано 28 июля 2020 г. в Wayback Machine , 2001 г.
  77. ^ Справочное руководство по языку операционной системы IBM System/360 PL/I (F) (PDF) (пятое изд.). Декабрь 1972 года. Глава 15: Многозадачность. GC28-8201-4.
  78. ^ OS PL/I Checkout и Optimizing Compilers: Справочное руководство по языку (PDF) (Пятое изд.). Октябрь 1976 года. Глава 17: Многозадачность. GC33-0009-4.
  79. ^ «Глава 8: Программное управление» . Справочное руководство Kednos PL/I для систем OpenVMS . Январь 2007 г. Архивировано из оригинала 18 августа 2016 г. Проверено 5 ноября 2017 г.
  80. ^ Компилятор не может определить, является ли оператор объявлением или оператором множественного присваивания, пока не встретит знак "=" присваивания или ";" DECLARE, который может быть несколькими строками позже. Тот факт, что DECLARE/DCL не были зарезервированы, является непосредственной причиной в этом примере – рассмотрим фрагмент DECLARE(I,J,K),L= против DECLARE(I,J,K),L;.
  81. ^ Харт, Тимоти П. (октябрь 1963 г.). «Определения МАКРО для LISP». Памятки по искусственному интеллекту . № 57. hdl : 1721.1/6111 .
  82. ^ Jump up to: а б с Enterprise PL/I для z/OS PL/I для AIX Rational Developer для System z PL/I для Windows: Справочник по языку (PDF) (Третье изд.). ИБМ. Сентябрь 2012 г. SC14-7285-02 . Проверено 9 июля 2023 г.
  83. ^ Jump up to: а б «оператор ALTER» . ИБМ . 24 сентября 2021 г.
  84. ^ Jump up to: а б «ПЕРЕЙТИ К (Назначено)» .
  85. ^ «ПЕРЕЙТИ К (Рассчитано)» .
  86. ^ «Оператор GO TO в COBOL» .
  87. ^ Руководство программиста на языке Digital Research PL/I . п. 103.

Учебники

[ редактировать ]
  • Нойхольд, Э.Дж. и Лоусон, Х.В. (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 .
  • Гронер, Г. Ф. (1971). PL/I-программирование в технологических приложениях . Книги по запросу, Анн-Арбор, Мичиган.
  • Андерсон, Мэн (1973). PL/I для программистов . Прентис-Холл.
  • Стаутемайер, доктор медицинских наук (1971). PL/I-программирование для техники и науки . Прентис-Холл.
  • Зиглер, RR & C. (1986). PL/I: Структурированное программирование и решение проблем (1-е изд.). Запад. ISBN  978-0-314-93915-9 .
  • Штурм, Э. (2009). Новый PL/I... для ПК, рабочих станций и мейнфреймов . Вьюег-Тойбнер, Висбаден, Германия. 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 PL/I , 1-е издание, декабрь 1976 г.
  • ISO 6160:1979 Языки программирования — PL/I.
  • ISO/IEC 6522:1992 Информационные технологии. Языки программирования. Подмножество PL/I общего назначения.

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 41dccb55d2e551724e6e2e1adfd22a0a__1723108800
URL1:https://arc.ask3.ru/arc/aa/41/0a/41dccb55d2e551724e6e2e1adfd22a0a.html
Заголовок, (Title) документа по адресу, URL1:
PL/I - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)