YaChudo

BCPL

Переглядів: 0. Оновлено 10.10.2026.

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

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

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

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

Дизайн

BCPL постала як відповідь на труднощі з попередницею — мовою Combined Programming Language (CPL), яку створили на початку 1960-х років. Річардс створив BCPL, «вилучивши ті можливості повної мови, які ускладнюють компіляцію». Першу реалізацію компілятора — для IBM 7090 під керуванням Compatible Time-Sharing System (CTSS) — написали тоді, коли навесні 1967 року Річардс відвідував Project MAC у Массачусетському технологічному інституті (MIT). Уперше мову описано в доповіді, представленій на Весняній об'єднаній комп'ютерній конференції 1969 року.

Мову розробили так, щоб для неї можна було створювати малі й прості компілятори; відомо, що деякі компілятори могли працювати в 16 кілобайтах пам'яті. До того ж компілятор Річардса, написаний власне на BCPL, легко переносився на інші платформи. Тому BCPL була ідеальним вибором для розкрутки компілятора.

Однією з головних причин переносності компілятора була його структура. Він поділявся на дві частини: передня частина розбирала вихідний текст і генерувала O-код для віртуальної машини, а задня приймала O-код і перекладала його в код цільової машини. Щоб підтримати нову машину, треба було переписати лише п'яту частину коду компілятора — завдання, яке зазвичай забирало від 2 до 5 людино-місяців. Згодом такий підхід став загальноприйнятою практикою, наприклад для Pascal чи Java, але компілятор BCPL Річардса першим виокремив віртуальну машину для цього завдання.

Мова незвичайна тим, що має лише один тип даних — машинне слово, фіксовану кількість бітів, яку зазвичай добирають так, щоб вона збігалася з машинним словом архітектури і мала достатню місткість для подання будь-якої дійсної адреси пам'яті. Для багатьох машин того часу цей тип даних був 16-бітовим. Згодом такий вибір виявився серйозною проблемою, коли BCPL використовували на машинах, у яких найменшим адресовним елементом було не слово, а байт, або на машинах з більшими розмірами слова — 32 чи 64 біти.

Інтерпретацію будь-якого значення визначали оператори, якими це значення обробляли. (Наприклад, + додавав два значення, розглядаючи їх як цілі числа; ! виконував непряме звертання за значенням, фактично розглядаючи його як вказівник.) Щоб це працювало, реалізація не передбачала перевірки типів. Угорська нотація постала саме для того, щоб допомогти програмістам уникати випадкових помилок із типами.

Невідповідність між орієнтацією на слова та байт-орієнтованим обладнанням усували кількома способами. Деякі реалізації надавали стандартні бібліотечні процедури для пакування слів у байтові рядки та розпакування. Пізніше додали дві мовні можливості: оператор вибору бітового поля та інфіксний оператор непрямого звертання до байта (позначався символом %).

BCPL по-своєму обробляє зв'язування, що охоплює окремі одиниці компіляції. Глобальних змінних, які оголошує користувач, немає; натомість є глобальний вектор, схожий на «порожній спільний блок» (blank COMMON) у 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 (MUD1) також написали на BCPL.

Кілька операційних систем було написано частково або повністю на BCPL (наприклад, TRIPOS і ранні версії AmigaDOS). BCPL була також першою мовою, яку використали в проєкті Alto компанії PARC — першого сучасного персонального комп'ютера. Серед інших проєктів на BCPL написано систему підготовки документів Bravo.

Ранній компілятор, розкручений 1969 року, починався з паперової стрічки з O-кодом компілятора Atlas 2 Мартіна Річардса і був націлений на серію ICT 1900. Ці дві машини мали різну довжину слова (48 проти 24 бітів), різні кодування символів і різні подання пакованих рядків, тож успішна розкрутка підвищила впевненість у практичності методу.

До кінця 1970 року реалізації існували для GE-600 series, IBM System/360, PDP-10, TX-2, CDC 6400, UNIVAC 1108, PDP-9, KDF 9 та Atlas 2. 1974 року в BBN реалізували діалект BCPL без використання проміжного O-коду. Первісна реалізація була крос-компілятором, розміщеним на PDP-10 з TOPS-20 компанії BBN, і безпосередньо націленим на PDP-11, які BBN використовувала в реалізації IMP другого покоління для ARPANET.

Була також версія для BBC Micro, випущена в середині 1980-х років компанією Richards Computer Products, яку заснував Джон Річардс, брат Мартіна Річардса. Цю мову використали в проєкті BBC Domesday. Версії BCPL для комп'ютерів Amstrad CPC і Amstrad PCW випустила 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

Література

  • Martin Richards, The BCPL Reference Manual [Архівовано 11 червня 2015 у Wayback Machine.] (Memorandum M-352, Project MAC, Cambridge, MA, USA, July, 1967)
  • Martin Richards, BCPL — a tool for compiler writing and systems programming (Proceedings of the Spring Joint Computer Conference, Vol 34, pp 557–566, 1969)
  • Martin Richards, Arthur Evans, Robert F. Mabee, The BCPL Reference Manual [Архівовано 5 березня 2016 у Wayback Machine.] (MAC TR-141, Project MAC, Cambridge, MA, USA, 1974)
  • Martin Richards, C. Whitby-Strevens, BCPL, the language and its compiler (Cambridge University Press, 1980) ISBN 0-521-28681-6

Посилання


Джерело: стаття у Вікіпедії та історія редагувань (автори).