Откуда вообще взялось использование точки с запятой?

В этой статье я собираюсь рассказать краткую историю использования точки с запятой (проклятие многих начинающих студентов-информатиков) в языках программирования. Мы увидим, что точки с запятой имеют два использования: как разделители операторов и как терминаторы операторов, и мы увидим, как использование точек с запятой изменилось за последние 60 лет истории языков программирования.

Однако прежде чем я начну, позвольте мне указать цитату, которая составляет подзаголовок этой статьи. Эта цитата приписывается одному из истинных пионеров информатики Алану Перлису. Я нашел эту цитату в одном из величайших учебников по информатике всех времен «Структура и интерпретация компьютерных программ» Хэла Абельсона и Джеральда Джея Сассмана.

Цитата находится в сноске на странице 11 книги. В сноске авторы обсуждают отсутствие специальных синтаксических форм, которые встречаются во многих языках программирования, но не встречаются в Lisp-подобных языках, таких как Scheme (целевой язык книги).

Термин синтаксический сахар был первоначально введен Питером Лэндином для обозначения удобных синтаксических функций, которые могут быть написаны более единообразными способами, например, использование круглых скобок в Лиспе, а не всех различных синтаксических функций языка. , такие как C и другие C-подобные языки, в которых есть фигурные скобки, квадратные скобки, точки с запятой, двоеточия и т. д.

Почему в языках программирования используются точки с запятой

Точка с запятой используется в языках программирования для двух вещей: разделителей операторов и терминаторов операторов. Когда в языке используются точки с запятой в качестве разделителей операторов, это позволяет вам писать более одного оператора в одной строке, при этом точка с запятой используется для обозначения разделения операторов, чтобы компилятор или интерпретатор мог определить, где заканчивается один оператор и начинается другой. .

На языке, где точка с запятой является разделителем, точки с запятой рассматриваются как необязательные и обычно не записываются, когда всего одна строка кода состоит из одного оператора.

Точки с запятой в качестве терминаторов операторов не являются необязательными и используются для окончательной пометки конца оператора. Языки программирования, использующие точку с запятой в качестве терминатора, будут сигнализировать об ошибке, если точка с запятой не найдена в ожидаемом месте. Многие эксперты по программированию утверждают, что операторы, завершаемые точкой с запятой, ускоряют выполнение программ, поскольку компилятор может работать более эффективно - хотя я оспорю это утверждение в конце этой статьи.

Ранние языки высокого уровня и использование точки с запятой

Предыстория языков программирования закончилась, когда в середине 1950-х годов был представлен Фортран как язык программирования высокого уровня. В Фортране точки с запятой не использовались ни в качестве разделителей, ни в качестве завершающих. Операторы в Фортране можно было писать только по одному в каждой строке, а новая строка была символом конца оператора.

Первое использование точки с запятой в современном языке программирования было с АЛГОЛОМ 58. Однако эта версия не была реализована в значительной степени и быстро трансформировалась в АЛГОЛ 60. В этой ранней версии АЛГОЛА точка с запятой использовалась в качестве разделителя, хотя часто это было используется излишне как терминатор оператора (хотя это и не требовалось).

Такое смешанное использование точек с запятой могло привести к очень запутанным программам, в которых точки с запятой часто ставились в конце одних строк, а не других, как показано в этом фрагменте кода Алгола 60, который я позаимствовал с веб-сайта Стива Маурера:

COMMENT advance to the next un-crossed out number. ; 
COMMENT this number must be a prime ; 
FOR i := i WHILE i<1000 AND candidates[i] = 0 DO 
  BEGIN 
      i := i+1; 
  END; 
  COMMENT insure against running off end of the data structure ; 
  IF i<1000 THEN
      BEGIN
         COMMENT cross out all multiples, starting with 2*p.; 
         j := 2; 
         k := j*i;
        FOR k := k WHILE k < 1000 DO 
             BEGIN 
                  candidates[k] := 0; 
                  j := j + 1; 
                  k := j*i; 
             END; 
             COMMENT advance to the next candidate ; 
             i := i+1; 
      END 
 END;

Algol 60 привел к появлению других версий Algol… до Algol 68. Многие, многие языки были основаны на Algol, но версия, которая оказала наибольшее влияние на языки сегодня, была Basic Combined Programming Language (BCPL).

BCPL - это язык программирования, разработанный Мартином Ричардсом в Кембриджском университете в 1967 году. BCPL был разработан с учетом многих концепций, которые позже повлияли на развитие языка C, как мы сейчас увидим. BCPL также использовал точки с запятой в качестве разделителей операторов, и многие программисты, пишущие BCPL, также использовали точки с запятой для обозначения конца строки - хотя, как и в случае с Algol, это использование было излишним. Символ конца строки был истинным разделителем операторов в BCPL.

Другим языком, который повлиял на текущее использование точек с запятой, был язык программирования IBM PL / I. PL / I был разработан в середине 1960-х годов и был языком C ++ своего времени, поскольку разработчики языка пытались включить все функции любого другого популярного языка программирования, чтобы этот язык мог заменить Fortran для научных вычислений и COBOL для бизнес-вычисления.

PL / I использовал точки с запятой для обозначения терминаторов операторов, и это дизайнерское решение повлияло на разработчиков других языков, таких как Кен Томпсон и Деннис Ритчи, разработчики C.

B, NB, C и точка с запятой

Примерно в 1968 году, когда Bell Labs свернула свое участие в проекте Multics, Кен Томпсон начал разработку нового языка на основе BCPL, который он назвал B. история языка Си, найденная здесь.

Томпсон разработал B как язык системного программирования для разработки тогда еще зарождающейся операционной системы Unix. Томпсон внес много изменений в BCPL в своем дизайне языка программирования B, и одно из изменений, которые он внес, заключалось в том, чтобы сделать точки с запятой обязательными в качестве терминаторов операторов. Как я упоминал выше, точки с запятой в качестве терминаторов операторов были необязательными в BCPL, но это произошло только потому, что компилятор использовал хитроумные правила, разрешающие отсутствие точек с запятой. Томпсон хотел, чтобы B был более эффективным языком, поэтому возникла необходимость в точках с запятой в качестве терминаторов операторов.

Когда Томпсон и Ричи пытались построить Unix на B, они поняли, что даже новый язык Томпсона не совсем подходит в качестве языка системного программирования, поэтому Ричи разработал новую версию B, названную NB, для решения некоторых из этих проблем. NB не просуществовал долго как язык, так как они решили, что им нужно просто выбросить B. Из этих записок появился язык C.

Состояние точки с запятой сегодня

Как мы знаем, точка с запятой стала предпочтительным указателем конца оператора во многих языках - C, C ++, Java, C # и JavaScript, просто чтобы упомянуть некоторые из самых популярных языков. JavaScript - интересный пример, поскольку новейшая версия JavaScript позволяет вам опускать точки с запятой в конце большинства операторов, которые заканчиваются новой строкой.

Не во всех языках программирования точки с запятой используются в качестве терминаторов операторов. Python использует символ новой строки в качестве признака завершения оператора, как и Visual Basic и Visual Basic.NET. Ruby - еще один популярный язык, в котором точка с запятой не используется.

В одном новом языке, Go, также не используется точка с запятой в качестве признака завершения оператора, хотя он используется в качестве разделителя операторов. Другой новый язык системного программирования, Rust, с другой стороны, использует точки с запятой в качестве терминаторов операторов.

Чтобы увидеть список языков, которые используют символы или символы в качестве разделителей операторов и разделителей операторов, перейдите сюда.

; // Терминатор;

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

Если вам понравилась эта статья, следите за обновлениями, так как я скоро напишу краткую историю фигурных скобок.

Спасибо за прочтение.