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

Язык программирования B

B (также известный как BCPL после модификации, но чаще под названием B) — это язык программирования, разработанный в 1969 году в Bell Labs (США) Кеном Томпсоном и Деннисом Ритчи. Он представляет собой ранний, процедурный, компилируемый язык общего назначения, который был предшественником языка C и оказал значительное влияние на развитие системного программирования. B был создан для работы на операционной системе Unix, которая также разрабатывалась в Bell Labs, и предназначался для написания системного программного обеспечения, включая ядро Unix.

История

Происхождение и контекст

Разработка языка B началась в 1969 году, когда Кен Томпсон, работая над операционной системой Unix на компьютере PDP-7 (Digital Equipment Corporation), столкнулся с ограничениями существующих инструментов. Изначально Unix была написана на ассемблере, что делало её перенос на другие архитектуры крайне трудоёмким. Томпсон решил создать язык более высокого уровня, который позволил бы писать системный код быстрее и с большей переносимостью, чем на ассемблере, но при этом оставался бы достаточно низкоуровневым для работы с памятью и оборудованием.

Основой для B послужил язык BCPL (Basic Combined Programming Language), разработанный Мартином Ричардсом в 1966 году. BCPL был простым, бестиповым языком, ориентированным на системное программирование. Томпсон упростил BCPL, адаптировав его под архитектуру PDP-7, и назвал получившийся язык B (возможно, как сокращение от BCPL или как следующая буква после A — языка, который существовал ранее в Bell Labs).

Развитие и переход к C

Первая реализация B была создана для PDP-7. В 1970 году, когда Unix была перенесена на более мощный компьютер PDP-11, язык B был адаптирован под новую архитектуру. Однако вскоре выявились ограничения B: он был бестиповым (все переменные были машинными словами), что затрудняло работу с разными типами данных, такими как символы и числа с плавающей запятой. Кроме того, B не поддерживал структуры данных и имел ограниченные возможности для адресной арифметики.

В 1971–1972 годах Деннис Ритчи, работая вместе с Томпсоном, начал разрабатывать расширенную версию B, которая получила название NB (New B). Позже он переработал язык полностью, добавив типы данных, структуры и более мощные средства управления памятью. Результатом этой работы стал язык C, который впервые был реализован в 1972 году. К 1973 году ядро Unix было полностью переписано на C, что сделало операционную систему переносимой на разные платформы. После этого язык B практически перестал использоваться, уступив место C.

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

Типизация

B был бестиповым языком. Все переменные, независимо от их содержимого, представляли собой машинные слова (обычно 16 или 32 бита в зависимости от архитектуры). Это означало, что программист сам отвечал за интерпретацию данных: одно и то же слово могло быть целым числом, адресом памяти или символом. Отсутствие типов упрощало компилятор, но делало код менее безопасным и более подверженным ошибкам.

Синтаксис

Синтаксис B был близок к BCPL, но с некоторыми упрощениями. Основные элементы:

  • Операторы: +, -, *, /, % (остаток от деления), & (логическое И), | (логическое ИЛИ), ~ (отрицание).
  • Условные операторы: if, while, for (в ранних версиях for отсутствовал, вместо него использовался while).
  • Блоки кода: обозначались фигурными скобками { }, как в C.
  • Функции: объявлялись с помощью ключевого слова auto (для локальных переменных) и extrn (для внешних). Например:

`` main() { auto a; a = 10; extrn printf; printf("Hello, world!*n"); } ``

  • Комментарии: начинались с / и заканчивались /.

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

B не имел встроенной поддержки указателей в современном понимании. Вместо этого использовались адреса машинных слов, которые можно было передавать в функции и модифицировать. Это было ближе к ассемблеру, чем к языкам высокого уровня. Память выделялась статически или через системные вызовы, но без автоматического управления.

Библиотеки

B имел минимальную стандартную библиотеку. Основные функции, такие как ввод-вывод, были реализованы через внешние процедуры, написанные на ассемблере или на самом B. Например, функция printf для вывода текста существовала, но её реализация была примитивной.

Пример кода

Пример программы на B, выводящей «Hello, world!»: `` main() { extrn printf; printf("Hello, world!n"); } ` Здесь n обозначает символ новой строки (аналог \n в C). Отсутствие точки с запятой после printf` — особенность синтаксиса B, где некоторые операторы могли не завершаться точкой с запятой.

Применение и значение

Роль в развитии Unix

Основное применение B было связано с операционной системой Unix. На B были написаны первые версии ядра Unix и некоторые утилиты, такие как простые текстовые редакторы и компиляторы. Однако уже к 1973 году, когда ядро было переписано на C, B перестал использоваться для системного программирования.

Влияние на языки программирования

B оказал прямое влияние на язык C, который стал одним из самых популярных языков системного программирования. Многие синтаксические конструкции C, такие как фигурные скобки для блоков кода, ключевые слова if, while, for, а также операторы инкремента ++ и декремента --, были заимствованы из B. Кроме того, бестиповый подход B повлиял на более поздние языки, такие как Go (разработанный в Google, в том числе Кеном Томпсоном), где типизация более гибкая, чем в C.

Недостатки и критика

Основные недостатки B:

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

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

  • Название «B» не имеет официальной расшифровки. По одной версии, оно происходит от BCPL, по другой — от того, что язык был вторым после языка A (который существовал в Bell Labs, но не получил распространения).
  • Кен Томпсон написал компилятор B на ассемблере PDP-7 за несколько недель.
  • Язык B никогда не был стандартизирован. Его спецификация существовала только в виде документации Bell Labs.
  • Несмотря на то, что B устарел, его синтаксис и идеи повлияли на множество языков, включая C++, Java, JavaScript и Python.

Источники

  • Керниган Б., Ритчи Д. «Язык программирования C» (1978) — содержит упоминания о B как предшественнике.
  • Деннис Ритчи. «The Development of the C Language» (1993) — статья, описывающая эволюцию от B к C.
  • Мартин Ричардс. «The BCPL Reference Manual» (1967) — документация, на основе которой создавался B.
  • Кен Томпсон. «The Unix Time-Sharing System» (1974) — статья, описывающая ранние версии Unix, написанные на B.

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

На главную BFOmetr →