PL/I

PL/I (Пи Ел Едно или Пи Ел Уан) (от англ. Programming Language One) е процедурен език за програмиране от трето поколение, подходящ за широка гама приложения, включително системен софтуер, графики, симулации, текстообработка, Интернет- и бизнес приложения. PL/I е създаден от IBM и е въведен в употреба през 1964 г.

PL/I се научава и използва лесно. Той е език със свободна форма, с развита структура и с висока производителност. Притежава множество разнообразни възможности, които правят възможно научно, техническо, бизнес и системно програмиране с него. Предлага надеждност, машинна независимост, конструкции за структурно програмиране, мощни възможности за улавяне и обработване на грешки, управление на динамичната памет, множество типове данни, съвкупности от данни (масиви, структури, обединения и комбинации от тях), множество възможности за входно-изходни операции и вградени функции: за обработка на низове и масиви, за математически и аритметични операции, за управление на точността и паметта, за улавяне и обработване на грешки, за дата и време и др.

Език със свободна форма, лесен за научаване 
За разлика от много други езици, PL/I е с напълно свободна форма и няма запазени ключови думи. PL/I определя значението на ключовите думи от контекста на използване. Програмистът може да се концентрира върху логиката на програмата, като използва значещи имена, вместо постоянно да мисли какви думи използва и дали те нямат специфично значение в езика. Напр., променлива, декларирана с име AREA е напълно валидна, въпреки че има такава ключова дума в PL/I. Осигурени са също и подразбирания, така че не трябва да се мисли за други характеристики (напр. данни от типа COMPLEX).

Машинно независим 
PL/I дефинира своите типове данни много прецизно, без оглед на хардуера. Например, дадено цяло число (integer) се дефинира като имащо вида REAL или COMPLEX, основа BINARY или DECIMAL, плюс точност, каквато пожелае програмистът. Следователно, FIXED BINARY(12) декларира цяло двоично число от 12 бита данни, а FIXED DECIMAL(3) декларира десетично число от три десетични цифри. Получава се точно това, което иска програмистът, дори и машината да не поддържа даден тип данни или точност.

Структура на програмата 
PL/I е блоково ориентиран език, който се състои от пакети, процедури, начални (begin) блокове и команди (statements).

Блоковата структура на PL/I позволява на програмистите да създават приложения с висока модуларност, защото блоковете могат да съдържат декларации, които дефинират имена на променливи и клас памет. По такъв начин програмистите могат да ограничат обхвата на дадена променлива до един-единствен блок или до група блокове, или могат да я направят известна в цялата компилирана програма или в даден зареждащ се модул.

Конструкции за структурно програмиране 
PL/I разполага с множество конструкции (constructs), които позволяват на програмата да бъде силно модуларна и добре структурирана с цел постигане на висока надеждност и лесно разработване, поддържане и разширяване:

 Пакетите (PACKAGE), процедурите (PROCEDURE) и началните (BEGIN) блокове позволяват висока степен на „капсулиране“ на данните и логиката на програмата.
 Конструкцията SELECT... WHEN... OTHERWISE позволява сложна ситуационна логика.
 Командата DO позволява групиране на множество команди в едно цяло, което може да бъде изпълнено безусловно един път, безкраен брой пъти или докато условието е истина или докато условието не стане истина.
 Комбинации от тези конструкции плюс командите за управление на цикли LEAVE и ITERATE, позволяват цялостната логика на циклите да бъде изразявана с прости и понятни средства.

Типове данни 
Характерна черта на PL/I, която допринася за използването му от широка гама приложения, е голямото разнообразие типове данни, които могат да бъдат представени и с които може да се борави:

 Числови данни от типа реални (REAL) или комплексни (COMPLEX) с плаваща (FLOAT) или фиксирана (FIXED) десетична запетая, със знак (SIGNED) или без знак (UNSIGNED) двоични (BINARY) или десетични (DECIMAL), и числови и редактируеми шаблони (PICTURE) с точност, избирана от програмиста.
 Низове (strings) с променлива (VARYING) или фиксирана (NONVARYING) дължина, символни (CHARACTER), битови (BIT) или графични (GRAPHIC), регулируеми по време на изпълнение или с фиксирана дължина по време на компилация.
 Данни за управление на програмата, поддържащи локатори от типа POINTER и OFFSET, масиви с регулируеми или фиксирани размери за групиране на динамично заделена памет, входни данни (пойнтъри на функции); файлови данни, етикети и формати.Масивите могат да се записват върху диск и да се прочитат по-късно от него, като свързаните списъци се запазват.
 Масиви от данни, структури и обединения
В PL/I данните могат да бъдат единични елементи от данни или могат да се групират в съвкупности от данни, към които програмистът може да се обръща колективно или индивидуално. Съвкупностите от данни могат да бъдат масиви, структури, обединения (unions), масиви от структури или обединения, структури от обединения или масиви и комбинации от тях, осигурявайки изключително богат фонд от средства за описание и боравене с всякакви възможни данни.

Например, ако един масив от структури ще се използва за съхраняване на метеорологични данни за всеки месец от 20 и 21 век, той трябва да бъде деклариран по следния начин:

    Declare 1 Year(1901:2100),
              3 Month(12),
                5 Temperature,
                  7 High decimal fixed(4,1),
                  7 Low decimal fixed(4,1),
                5 Wind&us.velocity,
                  7 High decimal fixed(3),
                  7 Low decimal fixed(3),
                5 Precipitation,
                  7 Total decimal fixed(3,1),
                  7 Average decimal fixed(3,1),
              3 * char(0);

Метеорологичните данни за месец юли 1991 г. ще се съдържат в елемента Year(1991,7) на масива от структури Year. Програмистът може да се обръща и към части от тези данни, напр. Temperature(1991,7) или Precipitation(1991,7).

Манипулации с данни 
С данните може да се манипулира или като с индивидуални елементи, или като със съвкупности. Например, едно извикване на вградената функция SQRT може да изведе корен квадратен на данните от цял масив с 15 измерения, като създава идентичен масив, съдържащ стойностите на квадратните корени в съответстващите елементи.

Вградени функции 
PL/I предлага почти 200 вградени функции, псевдопроменливи и подпрограми, които манипулират скаларни и сумарни данни. Ето основните групи функции и някои примери:

 Манипулация със символни, битови и графични низове (напр. INDEX, CENTER)
 Аритметични изчисления (напр. MAX, RANDOM)
 Математически изчисления (напр. ATANH, GAMMA)
 Изследване на променливи с плаваща запетая (напр. HUGE, TINY)
 Манипулация с променливи с плаваща запетая (напр. SUCC, SCALE)
 Манипулация с цели числа (напр. IAND, RAISE2)
 Управление на точността (напр. BINARY, UNSIGNED)
 Манипулация с масиви (напр. HBOUND, SUM)
 Управление на паметта (напр. EMPTY, ADDR)
 Управление на условия (напр. ONCHAR, ONLOC)
 Входно-изходни операции (напр. COUNT, FILEOPEN)
 Манипулация с дата/ време (напр. DATETIME, DATE)

Класове памет, управление и динамично заделяне на паметта 
Осигурени са четири различни класа памет: автоматична (AUTOMATIC), статична (STATIC), управлявана (CONTROLLED) и базирана (BASED). Типът на данните, представянето им, характерът на приложението и т.н., обикновено диктуват избора на класа памет, използван за дадени данни. Програмистите могат динамично да заделят и освобождават базираната и управляваната памет.

За всички класове памет данните могат да се инициализират автоматично, когато паметта бъде заделена.

Управление на условия 
PL/I осигурява средства за управление на различни условия, които могат да възникнат при изпълнение на PL/I програма. Тези условия могат да бъдат очаквани или неочаквани и могат да бъдат откривани от хардуера (напр. ZERODIVIDE) или от PL/I (напр. CONVERSION), или от операционната система, или от друг софтуер. Като използва тези средства, програмистът може да напише приложение на PL/I, което да осигури безпрепятствена работа.

Могат да се управляват дори прекъсвания, инициирани от потребителя, както и нормалното и ненормалното прекратяване на програмата.

Диагностика на програмата 
Могат да бъдат активирани условия по много различни начини, за да се осъществява автоматична диагностика на програмата при:

 Излизане на индексите на масив извън декларирания размер
 Излизане на низове и поднизове извън декларирания размер
 Превишаване на декларираната или поддържаната от машината точност на данните

Вход и изход 
PL/I програмите имат възможност да обработват записи с различни размери и типове, да имат достъп до различни устройства, да редактират и проверяват различни видове входни и изходни данни и лесно да създават файлове с отчети. Поддържат се два типа вход/ изход:

 Записноориентираният вход/ изход борави със съвкупности от данни, наречени записи и логически прехвърля един запис наведнъж, без да извършва каквито и да било преобразования на данни. Файловете, съдържащи записи, могат да бъдат индексирани (INDEXED), относителни (RELATIVE) или последователни (CONSECUTIVE).
 Поточният (STREAM) вход/ изход борави с логически непрекъснат поток от символи (който може да се помества на външен носител, както и записите), като логически прехвърля един елемент данни наведнъж, като извършва преобразования между вътрешната и външната форма. Елементите данни могат да бъдат прехвърляни като списък, редактиран списък, анотиран списък или комбинация от тези видове.

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

 Достигнат край на файл (ENDFILE)
 Достигнат край на страница от отчет (ENDPAGE)
 Ненамерен запис (KEY)
 Съкратен запис (RECORD)
 Входно-изходни грешки (TRANSMIT)
 Файлът не може да бъде на мерен (UNDEFINEDFILE)
 Дали файлът е отворен (FILEOPEN)
 Ключ, по който не е намерен запис (ONKEY)
 Източник, предизвикал грешка при преобразование (ONSOURCE)
 Символ от източник, предизвикал грешка при преобразование (ONCHAR)
 Файл, асоцииран с входно-изходно условие (ONFILE)
 Номер на текуща страница от отчет (PAGENO)
 Номер на текущ ред от текуща страница от отчет (LINENO)

Макроси 
В PL/I има възможност за използване на макроси за условно компилиране и модифициране на сорса преди компилация. Например, програмистът може да включи специфичен код по време на разработката и тестването и да го отстрани при окончателното компилиране на програмата.

Външни препратки 
 Сайт на Робин Вауълс с изчерпателна информация, включително ЧЗВ за PL/I, PL/I Newsletter, препратки и сорсове.
 Сайт на IBM: предлага сваляния, примерни изходни кодове и ръководства за PL/I във формат PDF.
 Проектът PL1GCC на SourceForge разработва фронт-енд на PL/I за софтуера с отворен код Gnu Compiler Collection (gcc).
 Подробно сравнение на PL/I и C от Еберхард Щурм.
 Въведение в компютърното програмиране с използване на PL/I от Ричард Холт 
 Информация за историята и възможностите на компилаторите за PL/I, използвани за изграждане на операционната система Multics.

Езици за програмиране
Софтуер от IBM