Открыть сервис

Язык BCPL

BCPL (Basic Combined Programming Language) — это процедурный язык программирования, разработанный в середине 1960-х годов английским учёным Мартином Ричардсом. Он относится к классу языков системного программирования и считается одним из первых языков, предназначенных для написания компиляторов и операционных систем. BCPL оказал значительное влияние на развитие языков C и B, а также на ранние этапы становления операционной системы Unix.

История

BCPL был создан в 1966 году в Кембриджском университете (Великобритания) как часть исследовательской работы по разработке портативного компилятора. Мартин Ричардс, работавший в Кембриджской лаборатории компьютерных исследований, стремился создать язык, который был бы достаточно низкоуровневым для эффективного системного программирования, но при этом обладал бы переносимостью между разными аппаратными платформами.

Первоначально BCPL предназначался для написания компилятора для языка CPL (Combined Programming Language), который разрабатывался совместно Кембриджским университетом и Лондонским университетом. CPL был сложным и громоздким, и его реализация требовала упрощённого промежуточного языка. BCPL стал таким языком: он сохранил ключевые идеи CPL, но был значительно проще и компактнее.

В 1967 году Ричардс реализовал первый компилятор BCPL, который генерировал промежуточный код для виртуальной машины (так называемый O-code). Это сделало BCPL одним из первых языков с переносимым компилятором: для запуска на новой платформе требовалось лишь написать интерпретатор O-code. В 1969 году BCPL был использован для написания ранних версий операционной системы Multics, а затем — для разработки языка B (предшественника C) в Bell Labs.

В 1970-х годах BCPL активно применялся в университетах и исследовательских центрах, особенно в Великобритании и США. С появлением языка C, который был более удобен и эффективен, популярность BCPL постепенно снизилась. Однако его влияние на архитектуру современных языков программирования остаётся значительным.

Характеристики языка

Типы данных и структуры

BCPL является бестиповым языком в том смысле, что все данные обрабатываются как последовательности бит (машинные слова). Единственный встроенный тип данных — это машинное слово (обычно 16, 32 или 64 бита в зависимости от архитектуры). Программист может интерпретировать слово как целое число, указатель, символ или логическое значение, но язык не предоставляет автоматической проверки типов.

Язык поддерживает:

  • Целые числа (беззнаковые и знаковые, но без явного разделения).
  • Логические значения (0 — ложь, любое ненулевое значение — истина).
  • Символы (коды ASCII, хранящиеся в одном слове).
  • Указатели (адреса памяти).

Отсутствие строгой типизации делало BCPL гибким, но также приводило к ошибкам, связанным с неправильной интерпретацией данных.

Управляющие конструкции

BCPL предоставляет стандартный набор управляющих конструкций, характерных для процедурных языков:

  • IF ... THEN ... ELSE
  • WHILE ... DO ...
  • UNTIL ... DO ... (цикл с проверкой условия в конце)
  • FOR ... TO ... BY ... DO ...
  • SWITCHON ... CASE ... DEFAULT ...
  • GOTO (с метками)

Примечательно, что в BCPL отсутствовал оператор ELSE IF — вместо него использовались вложенные IF. Также язык не поддерживал рекурсию в полном объёме из-за ограничений на стек вызовов в ранних реализациях.

Функции и процедуры

Все подпрограммы в BCPL являются функциями, возвращающими значение (по умолчанию — машинное слово). Функции определяются с помощью ключевого слова LET, а вызов — с помощью CALL. Параметры передаются по значению, но из-за того, что указатели являются обычными словами, можно эмулировать передачу по ссылке.

Пример определения функции: `` LET square(x) = x * x ``

Работа с памятью

BCPL предоставляет прямой доступ к памяти через указатели. Оператор ! (восклицательный знак) используется для разыменования указателя, а @ — для получения адреса переменной. Это позволяло эффективно работать с массивами, строками и структурами данных, но требовало от программиста внимательности.

Язык не имел встроенной сборки мусора; управление памятью полностью возлагалось на программиста.

Компилятор и виртуальная машина

Одной из ключевых особенностей BCPL была его портативность. Компилятор BCPL генерировал не машинный код, а промежуточный код для виртуальной машины, называемый O-code (от «object code»). O-code представлял собой последовательность инструкций для стековой машины, которая затем интерпретировалась на целевой платформе.

Такой подход позволял переносить BCPL на новую архитектуру, написав всего лишь небольшой интерпретатор O-code (около 1000 строк ассемблера). Это сделало BCPL одним из первых языков с «переносимым компилятором» — концепцией, которая позже была использована в языках Pascal (через P-код) и Java (через байт-код).

Первая реализация компилятора была выполнена на IBM 7094, а затем портирована на множество других машин, включая PDP-7, PDP-11, IBM System/360, Honeywell 6000 и другие.

Пример кода

Пример программы на BCPL, выводящей «Hello, World!»: ``` GET "LIBHDR"

LET START() BE $( WRITES("Hello, World!*N") $) ```

Здесь:

  • GET "LIBHDR" — подключение стандартной библиотеки.
  • LET START() BEопределение главной функции.
  • WRITES — функция вывода строки.
  • *N — символ новой строки.

Влияние на другие языки

BCPL оказал прямое влияние на разработку языка B, созданного Кеном Томпсоном в 1969 году в Bell Labs. B был упрощённой версией BCPL, адаптированной для PDP-7. В свою очередь, язык B стал основой для языка C, разработанного Деннисом Ритчи в 1972 году. Многие синтаксические конструкции C (например, операторы ++, --, +=, * для указателей) были заимствованы из BCPL.

Кроме того, BCPL повлиял на:

  • Язык BLISS (разработанный в DEC).
  • Язык ALGOL 68 (через концепцию виртуальной машины).
  • Язык Java (через идею переносимого байт-кода).

Применение

BCPL использовался в основном для:

  • Написания компиляторов (включая ранние версии компиляторов для C и Pascal).
  • Разработки операционных систем (например, ранние версии Multics, а также экспериментальные ОС для PDP-7).
  • Системного программирования (драйверы, утилиты, загрузчики).
  • Обучения (в университетах как язык для изучения системного программирования).

В 1970-х годах BCPL применялся в проектах по созданию текстовых редакторов, компиляторов и интерпретаторов, но с появлением C его использование резко сократилось.

Критика

BCPL подвергался критике за:

  • Отсутствие типизации, что приводило к трудноуловимым ошибкам.
  • Ограниченные возможности работы со строками (строки представлялись как массивы символов, и все операции с ними требовали ручного управления).
  • Отсутствие рекурсии в ранних реализациях (хотя в более поздних версиях она была добавлена).
  • Неудобный синтаксис (например, использование $( и $) для блоков, что отличалось от более привычных фигурных скобок в C).

Тем не менее, BCPL считается важным этапом в эволюции языков программирования, продемонстрировавшим концепцию переносимого компилятора и оказавшим влияние на создание C и Unix.

Интересные факты

  • Название BCPL расшифровывается как «Basic Combined Programming Language», но изначально оно означало «Bootstrap Combined Programming Language», так как язык использовался для «загрузки» (bootstrap) компилятора CPL.
  • Первый компилятор BCPL был написан на самом BCPL, что сделало его одним из первых самодостаточных компиляторов.
  • В 1979 году BCPL был портирован на микрокомпьютер BBC Micro, где использовался для обучения программированию.
  • Код на BCPL до сих пор можно найти в некоторых устаревших системах, например, в старых версиях операционной системы TRIPOS.

Источники

  • Richards, M. "The BCPL Reference Manual". Cambridge University, 1967.
  • Richards, M., Whitby-Strevens, C. "BCPL: The Language and Its Compiler". Cambridge University Press, 1979.
  • Kernighan, B. W., Ritchie, D. M. "The C Programming Language". Prentice Hall, 1978.
  • Ritchie, D. M. "The Development of the C Language". ACM SIGPLAN Notices, 1993.
  • Wikipedia: BCPL (язык программирования).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →