| BCPL | |
|---|---|
| Парадигма | Процедурне програмування,Імперативне програмування,Структурне програмування |
| Дата появи | 1966; 60 років тому (1966) |
| Творці | Мартін Річардс[en] |
| Система типізації | typeless (everything is aМашинне слово) |
| Під впливом від | CPL[en] |
| Вплинула на | B,C,Go[1] |
BCPL (Basic Combined Programming Language) —процедурна,імперативна іструктурнакомп'ютернамова програмування розробленаМартіном Річардсоном[en], вченим зКембриджського університету в 1966.
Мова призначалася для написаннякомпіляторів для інших мов, і зараз не використовується. Проте її вплив як і раніше відчувається, тому що усічена і синтаксично змінена версія BCPL, названаB, була мовою, на якій базувалася мова програмуванняC. Це змусило багатьох програмістів C дати BCPL гумористичнийбекронімBefore C Programming Language.[2]
BCPL була першою мовою програмування з фігурними дужками. На практиці в коді часто використовують послідовності$( та$) замість символів{ і}.Однорядковий символ//, який використовується длякоментарів у BCPL, не прижився вC, проте знову з'явився вC++, а пізніше і вC99.
Ця статтяміститьправописні,лексичні,граматичні,стилістичні або інші мовні помилки, які треба виправити. Ви можете допомогтивдосконалити цю статтю, погодивши її із чиннимимовними стандартами.(лютий 2019) |
BCPL була відповіддю на труднощі з попередньоюCombined Programming Language[en] (CPL), яка була створена на початку 1960-х років. Річардс створив BCPL, «виключивши ті функції мови, які ускладнюють компіляцію». Перша реалізація компілятора дляIBM 7090 підCompatible Time-Sharing System (CTSS) була написана в той час, як Річардс відвідував Project MACМассачусетського технологічного інституту (MIT) навесні 1967 року. Мова була вперше описана в документі, представленому на Весняній Об'єднаній комп'ютерній конференції 1969 року.
Мова була розроблена таким чином, що для неї можна було створити малі і прості компілятори; відомо, що деякі компілятори можуть бути запущені на 16кілобайтах. Крім того, компілятор Richards, сам написаний на BCPL, був легко портованим. Таким чином, BCPL була ідеальним вибором длярозкрутки компілятора.
Одна з основних причин перенесеності компілятора полягає в його структурі. Він був розділений на дві частини: фронтальна частина аналізувала джерело і генерувала O-код длявіртуальної машини, а внутрішня частина приймала O-код і перекладала його в код для цільової машини. Тільки одна п'ята частина коду компілятора повинна була бути переписана для підтримки нової машини, це завдання, яке зазвичай займає від 2 до 5людино-місяців. Цей підхід став загальноприйнятою практикою пізніше, наприклад, дляPascal абоJava, але компілятор Richards BCPL був першим, що виокремив віртуальну машину для цієї задачи.
Мова незвичайна тим, що у неї є тільки одинтип даних:Машинне слово, фіксоване число біт, зазвичай вибирається для вирівнювання з машинним словом архітектури та достатньої ємності, для подання будь-якої дійсної адреси зберігання. Для багатьох машин того часу цей тип даних був 16-бітовим. Цей вибір пізніше виявився серйозною проблемою, коли BCPL використовувався на машинах, у яких найменший адресований елемент був не словом, абайтом, або на машинах з великими розмірами слів, з розмірністю 32-біт або 64-біт.
Інтерпретація будь-якого значення визначалася операторами, використовуваними для обробки значень. (Наприклад, + додає два значення, розглядаючи їх якцілі числа; ! побічно через значення, ефективно розглядаючи його як покажчик.) Для того, щоб це працювало, реалізація не надалаперевірки типів.Угорська нотація була розроблена, щоб допомогти програмістам уникнути випадкових помилок типу.
Невідповідність між орієнтацією наслова і обладнанням, орієнтованим на байти, було розглянуто декількома способами. Деякі надавали стандартні бібліотечні процедури для упакування і розпаковування слів в байтові рядка. Пізніше були додані дві мовні функції: оператор вибору бітового поля і оператор непрямого привласнення інфіксного байта (позначається символом '%').
BCPL обробляє прив'язки, що охоплюють окреміодиниці компіляції унікальним способом. Глобальних змінних, які декларуються користувачем, немає; Замість цього є глобальний вектор, який схожий на «порожню загальну» вFortran. Всі дані, що розділяються між різними одиницями компіляції, містять скаляри і покажчики на вектори, що зберігаються в заздалегідь визначеному місці в глобальному векторі. Таким чином, файли заголовків (файли, включені під час компіляції за допомогоюдирективи GET) стають основним засобом синхронізації глобальних даних між модулями компіляції, що містять директиви «GLOBAL», які представляють списки символічних імен, кожен з яких з'єднаний з номером, який пов'язує це ім'я з відповідною числовою адресою слова в глобальному векторі. Як і змінні, глобальний вектор також містить прив'язки для зовнішніх процедур. Це робить динамічне завантаження блоків компіляції дуже простою. Замість того, щоб покладатися на завантажувач посилань базової реалізації, BCPL дає програмісту контроль над процесом зв'язування.
Глобальний вектор також спростив заміну або розширення стандартних бібліотечних процедур. Програма могла б зберегти покажчик від глобального вектора до вихідної підпрограми і замінити його покажчиком на альтернативну версію. Альтернатива могла б назвати оригінал, як частину його обробки. Це можна використовувати, як швидке спеціальне налаштування.
КнигаBCPL: Мова і його компілятор описує філософію BCPL наступним чином:
«Філософія BCPL — не один з тиранів, який думає, що він знає краще за все, і встановлює закон про те, що дозволено і не дозволено; Швидше, BCPL діє скоріше як слуга, що пропонує свої послуги в міру своїх здібностей, без претензій, навіть коли стикається з безперечною нісенітницею. Програміст завжди передбачає, що він знає, що робить, і не обмежений дрібними обмеженнями.»
І дизайн і філософія BCPL сильно вплинули наB, яка, в свою чергу вплинула наC. Програмісти в той час обговорювали, чи буде можливий наступник C називатися D (наступна буква в алфавіті) або «P» (наступна буква в імені батьківської мови). Як виявилося, фактичне ім'я виявилося «C++» (оператор інкременту мови C).
З чуток, BCPL спочатку стояв за назву «Bootstrap Cambridge Programming Language», але CPL ніколи не оновлювався з тих пір, як розвиток зупинився в BCPL, а акронім був пізніше переосмислений для книги BCPL.
BCPL — це мова, на якій була написана оригінальна програмаhello world.[3] ПершаMUD була також написана на BCPL.(MUD1[en]).Кількаопераційних систем були написані частково або повністю на BCPL (наприклад,TRIPOS[en] і ранні версіїAmigaDOS[en]). BCPL була також першоджерельною мовою, використовуваною в проєктіPARCAlto, першого сучасногоперсонального комп'ютера. Серед інших проєктів, система підготовки документівBravo[en] була написана на BCPL.
Ранній компілятор, розроблений в 1969 році, починався з паперової стрічки O-коду, компілятораAtlas 2[en] Мартіна Річардса, плануючиICT 1900[en] серію. Ці дві машини мали різні довжини слів (48 проти 24 біт), різні кодування символів і різні уявлення упакованих рядків, а успішне самоналаштування підвищило впевненість в практичності методу.
До кінця 1970 року були реалізовані:GE-600 series[en],IBM System/360,PDP-10,TX-2[en],CDC 6400[en],UNIVAC 1108[en],PDP-9[en], theKDF 9[en] іAtlas 2[en]. У 1974 році діалект BCPL був реалізований вBBN[en] без використання проміжного O-коду. Первісна реалізація булакрос-компілятором розміщеним наPDP-10 BBNTOPS-20, і безпосередньо націлена наPDP-11, що використовуються в реалізації BBN другого поколінняIMP[en], використовуваних вArpanet.
Була також версія, випущена дляBBC Micro[en] в середині 1980-х, компанією Richards Computer Products, створеною Джоном Річардсом, братом доктора Мартіна Річардса. ПроєктBBC Domesday використовував цю мову. Версії BCPL для комп'ютерівAmstrad CPC іAmstrad PCW[en] були також випущені в 1986 році британським програмним будинком Arnor Ltd. MacBCPL був випущений дляApple Macintosh в 1985 році компанією Top Express Ltd,Кенсінгтон,Англія.
У 1979 році, існувало щонайменше 25 архітектур для реалізації BCPL; Мова поступово вийшла з моди, так якC став популярним в системах, відмінних відUnix.
Ці повні і відкомпільовані приклади взяті з дистрибутиву BCPL Мартіна Річардса.
Друкфакторіалів:
GET "LIBHDR"LET START() = VALOF $(FOR I = 1 TO 5 DOWRITEF("%N! = %I4*N", I, FACT(I))RESULTIS 0$)AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)Рішення задачі проN ферзів:
GET "LIBHDR"GLOBAL $(COUNT: 200ALL: 201$)LET TRY(LD, ROW, RD) BETEST ROW = ALL THENCOUNT := COUNT + 1ELSE $(LET POSS = ALL & ~(LD | ROW | RD)UNTIL POSS = 0 DO $(LET P = POSS & -POSSPOSS := POSS - PTRY(LD + P << 1, ROW + P, RD + P >> 1)$)$)LET START() = VALOF $(ALL := 1FOR I = 1 TO 12 DO $(COUNT := 0TRY(0, 0, 0)WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT)ALL := 2 * ALL + 1$)RESULTIS 0$)Ця статтяпотребує додатковихпосилань на джерела для поліпшення їїперевірності. Будь ласка, допоможітьудосконалити цю статтю, додавши посилання нанадійні (авторитетні) джерела. Зверніться насторінку обговорення за поясненнями та допоможіть виправити недоліки. Матеріал без джерел може бутипіддано сумніву та вилучено.(травень 2017) |
| Це незавершена стаття промови програмування. Ви можетедопомогти проєкту,виправивши або дописавши її. |