BCPL (Basic Combined Programming Language) — процедурна, імперативна і структурна комп'ютерна мова програмування розроблена Мартіном Річардсоном[en], вченим з Кембриджського університету в 1966.

BCPL
Парадигма Процедурне програмування, Імперативне програмування, Структурне програмування
Дата появи 1966; 58 років тому (1966)
Творці Мартін Річардс[en]
Система типізації typeless (everything is a Машинне слово)
Під впливом від CPL[en]
Вплинула на B, C, Go[1]

Мова призначалася для написання компіляторів для інших мов, і зараз не використовується. Проте її вплив як і раніше відчувається, тому що усічена і синтаксично змінена версія BCPL, названа B, була мовою, на якій базувалася мова програмування C. Це змусило багатьох програмістів C дати BCPL гумористичний бекронім Before C Programming Language.[2]

BCPL була першою мовою програмування з фігурними дужками. На практиці в коді часто використовують послідовності $( та $) замість символів { і }. Однорядковий символ //, який використовується для коментарів у BCPL, не прижився в C, проте знову з'явився в C++, а пізніше і в C99.

Дизайн ред.

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 була також першоджерельною мовою, використовуваною в проекті PARC Alto, першого сучасного персонального комп'ютера. Серед інших проектів, система підготовки документів 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], the KDF 9[en] і Atlas 2[en]. У 1974 році діалект BCPL був реалізований в BBN[en] без використання проміжного O-коду. Первісна реалізація була крос-компілятором розміщеним на PDP-10 BBN TOPS-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 DO
		WRITEF("%N! = %I4*N", I, FACT(I))
	RESULTIS 0
$)

AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)

Рішення задачі про N ферзів:

GET "LIBHDR"

GLOBAL $(
	COUNT: 200
	ALL: 201
$)

LET TRY(LD, ROW, RD) BE
	TEST ROW = ALL THEN
		COUNT := COUNT + 1
	ELSE $(
		LET POSS = ALL & ~(LD | ROW | RD)
		UNTIL POSS = 0 DO $(
			LET P = POSS & -POSS
			POSS := POSS - P
			TRY(LD + P << 1, ROW + P, RD + P >> 1)
		$)
	$)

LET START() = VALOF $(
	ALL := 1
	FOR I = 1 TO 12 DO $(
		COUNT := 0
		TRY(0, 0, 0)
		WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT)
		ALL := 2 * ALL + 1
	$)
	RESULTIS 0
$)

Посилання ред.

  1. Pike, Rob (24 квітня 2014). Hello Gophers. Архів оригіналу за 10 жовтня 2016. Процитовано 11 березня 2016.
  2. Expert C Programming: Deep C Secrets by Peter Van Der Linden (Prentice Hall, 1994)
  3. BCPL [Архівовано 3 квітня 2018 у Wayback Machine.], Jargon File

Література ред.

Посилання ред.