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

130

Есть ли причина, по которой точка с запятой была выбрана в качестве ограничителя строки вместо другого символа?

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

Кодер
источник
6
Эрланг и пролог используют fullstops.
Дэйв Кларк
13
Интересно, сколько языков программирования вы знаете? Есть много языков, которые не используют точки с запятой.
knivil
50
Могу поспорить, что ответ окажется чем-то вроде «ASCII-значение точки с запятой особенно долговечно, когда используется как последний символ на перфокарте из 80 символов».
Райан Томпсон
22
Ваш вопрос не зашел достаточно далеко. Реальный вопрос заключается в том, «зачем вообще нужен какой-либо символ?»
Конрад Рудольф,
5
Потому что он находится в домашнем ряду qwerty-клавиатуры?
Вим

Ответы:

132

В английском языке точка с запятой используется для разделения элементов в списке операторов, например

Она увидела трех мужчин: Джейми, который приехал из Новой Зеландии; Джон, сын молочника; и Джордж, изможденный человек.

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

Изменить, чтобы добавить
В первые дни, когда память была дорогой, медленная обработка и разрабатывались первые языки программирования, было необходимо разделить программу на отдельные операторы для обработки. Некоторые языки требовали, чтобы каждый оператор был помещен в строку, чтобы возврат каретки мог действовать как разделитель операторов. Другие языки допускали более свободный формат для текстового макета и поэтому требовали определенного символа-разделителя. Этот символ был выбран в качестве точки с запятой, скорее всего из-за сходства с его использованием в английском языке (это должно быть предположение; меня там не было), и поскольку он не вызывал конфликта с другой пунктуацией знаки и символы, которые были необходимы для математических или других синтаксических целей.

Отредактируйте снова
Потребность в некотором символе-терминаторе восходит к требованиям для синтаксического анализа текста на языке. Ранние компиляторы были написаны на ассемблере или, в некоторых случаях, непосредственно в ручных двоичных машинных инструкциях. Наличие специального символа, идентифицирующего конец оператора и ограничивающего часть обрабатываемого текста, значительно упрощает обработку. Как я уже говорил выше, в других языках используются возврат каретки или скобки. Алгол, Паскаль, Ада, BCPL, B, C, PL / M и другие семейства языков используют точку с запятой. Что касается того, кто первым использовал этот конкретный персонаж, я не вернусь достаточно далеко в истории, чтобы помнить. Его выбор и принятие имеет смысл как

  • Его использование отражает использование в обычной английской пунктуации.
  • Другие символы (например, точка остановки) могут вводить в заблуждение, поскольку они уже имеют общее использование (точка остановки также используется в качестве десятичной точки).
  • Видимый знак пунктуации позволяет макет кода в произвольном формате.
  • Использование аналогичного символа-разделителя в производных или более поздних языках основывается на знакомстве, приобретенном всеми программистами, которые использовали более ранний язык.

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

uɐɪ
источник
19
Не совсем правильно. Точка с запятой разделяет предложения на блоки: каждый блок должен быть рабочим предложением, но мы используем точку с запятой для обозначения сильной связи между двумя предложениями. Он находится на полпути между запятой и точкой остановки, так что это действительно точка остановки, но он связывает одно предложение с другим. Приведенное выше предложение будет таким: «Она видела трех мужчин; Джейми: из Новой Зеландии, Джон: сын молочника и Джордж: изможденный человек». Использование точки с запятой может быть заменено запятой. Немного не по теме, но суть по сути та же; это разбивает заявления.
alex.p
40
@ alex.p на самом деле допустимое использование точки с запятой вместо запятой, когда это может привести к путанице в предложении, что делает это правильным.
Ryathal
13
Критическая информация о точках с
Эд Джеймс
7
@ alex.p: Похоже, вы говорите, что Иан неправильно использует, но, возможно, вы просто говорите, что его объяснение того, как мы используем точки с запятой, является неполным. Если вы говорите, что он неправ, значит, вы чертовски неправы. Его использование точек с запятой совершенно обычное, и я думаю, что оно гораздо более распространено, чем пример, который вы приводите. Если вы просто говорите, что он не дает исчерпывающего объяснения, то я не уверен, почему это действительно стоит упомянуть.
иконоборчество
17
@Ian "это должно быть предположение, я не был там в то время" Вы упустили прекрасную возможность (правильно) использовать точку с запятой там :)
Travis Christian
70

Многие языки используют синтаксис, который смоделирован после C (который был смоделирован после B - спасибо @Crollster). Как видно из комментариев, существует длинная цепочка таких языков ... B был вдохновлен PL / I, которому предшествовал ALGOL при использовании в ;качестве разделителя.

Поскольку в С оператором является терминатор ;, эти языки следуют его примеру.

Что касается того, почему он был выбран как терминатор оператора в C - возможно, из-за его использования на английском языке «для обозначения взаимозависимых операторов» .

C был также изобретен на PDP-11 в то время, когда для наборов символов было ограниченное количество памяти, поэтому изобретатели языков должны были работать в рамках этих ограничений.

Одед
источник
8
C просто следовал соглашению об использовании точек с запятой, которые использовались его предшественником 'B'
Crollster
8
B просто следовал соглашению об использовании точек с запятой, используемом его предшественником 'PL / I' :)
Skomski
15
@Skomski - Что последовало за чем? Я жду, когда эта последняя черепаха войдет;)
Одед
26
-1; Давай, ребята, мы все забыли чрезвычайно влиятельный Алгол? У него были точки с запятой в качестве разделителей операторов перед всем, что вы упоминаете. (Я не знаю, взяла ли она идею откуда-то еще)
hugomg
13
@ Одед - я думаю, ты найдешь, что это Черепахи . * 8 ')
Марк Бут
54

ФОРТРАН использовал возврат каретки, чтобы очертить заявления. Кобол использовал период. LISP ничего не использовал, полагаясь на круглые скобки для всего. ALGOL был первым языком, который использовал точку с запятой для разделения операторов. Паскаль последовал примеру Алгола, используя точку с запятой для разделения утверждений.

PL / I использовал точку с запятой для завершения операторов. Есть разница, и это легко увидеть в PASCAL. Ада следовала примеру PL / I по этому одному пункту, а не Алголу.

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

Много лет назад мне сказали, что BCPL использует как точку с запятой, так и возврат каретки в качестве разделителей / терминаторов операторов, но я никогда не использовал этот язык сам и не могу это проверить. В какой-то момент использование возврата каретки для отдельных или прекращения операторов было исключено из потомков BCPL. BCPL родил B, B родил C, C родил C ++, Java, D и целый ряд вещей, значительно менее продуманных, чем PASCAL и Ada.

Джон Р. Штром
источник
2
Следует отметить, что использование точки с запятой или новой строки появляется в последнее время. Javascript, Lua, Go и Haskell имеют неявную точку с запятой на новой строке, если это синтаксически допустимо там. И, конечно, некоторые языки, которые сохранили символ новой строки в качестве разделителя. Shell и Python приходят на ум здесь.
Ян Худек
2
+1 за "значительно менее продуманный, чем PASCAL и Ada"
Aditya
2
Алгол 58 , предшественник Алгола 60, использовал точки с запятой. Обратите внимание, что в то время часто делали различие между формой публикации языка и формой фактического ввода, потому что устройства ввода были весьма ограничены: только заглавными буквами и т. Д. Эта дихотомия на самом деле не была верной для FORTRAN, но была верной для ряд других языков.
Дэн Халберт,
5
@kevincline: Считаете ли вы, что Boeing 777 находится в общем пользовании? Каждая строка программного обеспечения авионики, которое летит на этом самолете, написана на языке Ада.
Джон Р. Штром
2
@kevincline Skype: написано на Delphi (Паскаль). Microsoft пыталась изменить это после того, как приобрела его, но не смогла успешно его портировать, поэтому теперь они покупают лицензии Delphi. Когда-нибудь смотрели телевизор в США? Станция, вероятно, работает на программном обеспечении WideOrbit, написанном на Delphi; они лидеры рынка с огромным отрывом. Ты когда-нибудь был в тематическом парке? Есть большая вероятность, что система продажи билетов была написана на Delphi. Паскаль повсюду; просто это обеспечивает такое сильное конкурентное преимущество, что многие люди стараются молчать об этом, чтобы их конкуренты не узнали.
Мейсон Уилер
14

Почему не любой другой символ?

Несколько языков использовали другие символы - старые версии BASIC вместо этого использовали двоеточие, например.

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

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

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

Я бы добавил, что во многих языках происходит то же самое, просто так, что большинство из нас так привыкли до программирования, что мало кто задумывается об этом. Почему все используют «+» для обозначения сложения или «-» для обозначения вычитания? Потому что форма символа не имеет большого значения, но каждый, кто согласен применять одно и то же значение к каждому символу, имеет большое значение.

Джерри Гроб
источник
Очень хорошие очки (+1), хотя я не совсем согласен с «в основном произвольной» частью. Я думаю, что есть некоторые вещи, которые являются более интуитивными, а другие менее интуитивными. В использовании Windows X для закрытия окон существует некоторая (возможно, только смутно связанная) предсуществующая символика, на которой он рисует. И определенно в использовании цветов в OS X есть сильный символизм, который он рисует. (Я игнорирую на данный момент, что M $ Windows, возможно, украла X из X Windows, так как я не помню, что это использовало.)
iconoclast
3
@ Брэндон: Я, конечно, не собирался говорить, что все части дизайна графического интерфейса являются произвольными - возможно, я должен был сказать «некоторые» вместо «большинство», хотя. Не было бы X, который определил бы какую-либо конкретную форму для значка «закрыть окно» - это было бы до отдельного оконного менеджера.
Джерри Коффин
Насколько я помню, оригинальный Dartmouth BASIC использовал только возврат каретки для завершения операторов (то есть, один оператор на строку). Я думаю, что несколько операторов в строке, разделенных двоеточиями, были расширением Microsoft.
Джон Р. Стром
7

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

До Algol 60 единственным существующим языком программирования высокого уровня был Фортран, который требовал, чтобы каждое утверждение было в отдельной строке. Утверждения, охватывающие несколько строк, такие как циклы do, считались странностью и считались «блоками операторов».

Разработчики Algol 60 поняли, что операторам нужна иерархическая структура (if-then-else, do-loop, операторы case и т. Д.), И они могут быть вложены друг в друга. Таким образом, идея каждого утверждения, расположенного на отдельной строке, больше не имела смысла. Последовательная композиция выписок формы S1; S2; ...; Sn , возможно , заключенные в начать - конец скобка были названы сложными заявления , и вписываться в иерархическую структуру отчетности , предусмотренный Algol 60. Итак, точка с запятой явно констатация разделитель , а не терминатор.

Это породило проблемы на практике. У Алгола 60 также было «пустое утверждение», которое обозначалось как «ничего не писать». Таким образом, можно написать « начало S1; конец », где точка с запятой появляется так, как если бы она заканчивалась символом S1. Но компилятор Algol 60 действительно рассматривал его как разделитель между S1 и невидимым пустым оператором, следующим за ним. Эти тонкости были немного важны для практических программистов. Будучи привыкшими к линейно-ориентированным языкам, таким как Assembly и Fortran, они действительно думали о точке с запятой как о терминаторе для операторов. Когда программы были написаны, обычно в конце операторов ставится точка с запятой, например:

    a [i]: = 0;
    я: = я + 1

и точка с запятой действительно выглядела как терминатор для первого утверждения. Если бы программисты рассматривали точку с запятой как терминатор, то такое утверждение приводило бы к синтаксической ошибке:

    если я> 0, то
      a [i]: = 0;
    еще
      a [i]: = 1;

потому что точка с запятой завершает «если» и, таким образом, «остальное» становится висящим. Программисты были полностью сбиты с толку.

Так, PL / I, который был преемником IBM на строковый Fortran, решил сделать точку с запятой заявление терминатор , а не разделителем. Программисты были довольны этим выбором. Большинство языков программирования последовало их примеру. (Паскаль сопротивлялся этой тенденции, но ее преемник Ада отказался от нее.)

[Примечание добавлено: в статье Википедии о сравнениях языков программирования есть хорошая таблица, в которой обобщено, как обрабатывается точка с запятой в различных языках программирования.]

Удай Редди
источник
6

Это довольно простая догадка, но, глядя на стандартную клавиатуру QWERTY, ограниченную значениями ASCII, естественными символами для завершения / разделения будут.!?,:; и возврат каретки. из них!?: должны быть немедленно дисквалифицированы за получение нескольких ключей, и завершение оператора будет очень распространенным явлением. Периоды будут дисквалифицированы, потому что их легко спутать с десятичными точками, что сделает их излишне сложными, чтобы быть ограничителем, учитывая ограниченное пространство начальных компьютеров. возврат каретки будет дисквалифицирован после того, как строки кода могут быть длиннее, чем те, которые могут быть показаны в одной строке на экране, поэтому будет сложнее читать программу, когда строки должны быть прокручены горизонтально, или требовать дополнительные символы, чтобы создать продолжение на следующей строке, что снова добавляет сложности. это оставляет, и; как варианты, из них, используется гораздо чаще в письменной форме по сравнению с; поэтому точка с запятой выбрана потому, что ее легче набирать, она менее запутана, потому что она добавляет значение к символу с ограниченным значением и менее сложна, потому что особых случаев на самом деле не существует с его использованием.

Точка с запятой была выбрана, потому что это был лучший персонаж, основанный на лени и простоте.

Ryathal
источник
у вас есть хорошая точка зрения здесь; Я бы только переименовал слово «выбранный» (что трудно доказать) в нечто вроде «... Точка с запятой победила, потому что это был лучший персонаж, основанный на лени и простоте»
комнат
2
Едва. Точка с запятой как разделитель / разделитель операторов началась в ALGOL (1958), предшествовавшей ASCII (работа началась в 1960 году, первый выпуск 1963, основной выпуск 1967, последний обновленный 1986).
Джон Р. Штром
@ JohnR.Strohm хорошо, это новость для меня, но все это в значительной степени древняя история для меня
Ryathal
6
Это отличная теория, но реальность такова, что при нажатии клавиш все равно требовалась клавиша Shift, чтобы добраться до точки с запятой до тех пор, пока в 70-х годах не появилось современное устройство ввода с клавиатуры. (В нижней части вики-статьи есть несколько хороших фотографий: en.wikipedia.org/wiki/Keypunch ) Скорее всего, это просто правила естественного английского языка, причуды, которые были особенно популярны в то же время. (Я бы включил все языки конца 50-х годов: ALGOL, FORTRAN, COBOL и SQL, за исключением LISP.) Точка с запятой в ALGOL является лишь одним из многих используемых англоязычных соглашений, которые позже были расширены на BASIC.
SilverbackNet
@SilverbackNet, поэтому «работа с догадками», вероятно, не должна быть основой ответа здесь.
user1717828
6

Это в основном произвольный выбор. Некоторые языки сделали другой выбор. COBOL завершает операторы .символом. FORTRAN, BASIC и Python обычно завершают операторы символами новой строки (со специальным синтаксисом для многострочных операторов). И Лисп заключает свои утверждения в скобки.

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

вместо другого символа?

Какой еще символ вы можете выбрать?

Символы ASCII # $ @ [] ^ _ `{|} ~ не всегда присутствовали в ранних кодировках, таких как ISO 646 .

Символы, ()*+-/<=>как правило, используются в качестве математических операторов и могут привести к неоднозначности синтаксического анализа, если используются как терминаторы операторов.

product = a * b *  // If '*' were a statement terminator,
c * d *            // Are there two factors, or four?

Аналогичные проблемы будут применяться к 'и ", которые обычно используются в качестве разделителей строк; ,, который обычно используется для разделения аргументов функции, и ., который обычно используется в качестве десятичной точки (или в качестве разделителя в конструкциях, подобных some_struct.some_field).

Это оставляет !%&:;?.

Выбор !или, ?возможно, не вызовет технических трудностей, но их значение на английском языке придаст программе неверное настроение.

print(x)?  # Yes, you should.
           # It's an IMPERATIVE language; stop questioning my commands.
print(x)!  # OK!  You don't have to shout!

Было &бы более разумным выбором в качестве разделителя операторов (не терминатор), потому что

do_thing_a() &
do_thing_b()

может читаться как команда для выполнения операции A, а затем для выполнения операции B. Но большинство языков с &оператором используют ее как логическое или побитовое И вместо этого.

%Знак может вызвать путаницу в заявлениях , как interest_rate = 2.99%(что бы установить переменную 2.99вместо ожидаемого 0.0299). Конечно, хорошо известное математическое значение %не помешало С использовать его как оператор остатка.

Так что листья :и ;.

: является разумным выбором, и действительно используется в качестве разделителя внутристрочных операторов в большинстве диалектов BASIC.

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

dan04
источник
3

Вместо того, чтобы пытаться ответить на ваш главный вопрос, я думаю, что лучше сосредоточиться на вашем скрытом вопросе:

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

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

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

Взяв ваш главный вопрос в качестве примера вопроса, на который вы, возможно, захотите ответить, прочитав материалы HOPL, я хотел бы предложить следующее: люди, разрабатывающие новый язык программирования, обычно делают это, потому что считают, что те, о которых они знают, являются сломан / дефицит как-то. Их новый язык, с одной стороны, предназначен для устранения этого недостатка. С другой стороны, разработчики языка также будут копировать элементы дизайна из других языков, которые они считают хорошими, или они просто не изменяют те элементы, с которыми у них не было проблем.

Особенно важна эта последняя часть: вместо того, чтобы пытаться выяснить, какой язык программирования когда-либо был первым, кто использовал точки с запятой в качестве терминаторов, и почему многие другие языки программирования это скопировали, вы, вероятно, узнаете больше, посмотрев на языки, которые не копируются. Это. Например, в то время как Smalltalk черпал много вдохновения у Симулы, он нескопировать его синтаксис и, в частности, использовать точки с запятой в качестве разделителей операторов. Он изменил терминаторы (на самом деле разделители) до полной остановки и использует точку с запятой для чего-то другого. И наоборот, первый язык, который когда-либо использовал точку с запятой в качестве терминатора оператора, мог иметь причину изменить это значение по сравнению с тем, что использовалось в языках, которые были до него. Также возможно, что это был первый язык, который ввел всю концепцию терминатора оператора (или сделал это независимо от других языков), и что точка с запятой использовалась по какой-то причине, которая теперь потеряна во времени. (Я подозреваю, что последний случай здесь, так как ни один из других ответчиков не смог найти цитату из человека, который ввел точку с запятой, вместо того, чтобы предлагать модифицированные предположения о том, почему точка с запятой была хорошим выбором.) точка, Я думаю, вы узнаете больше, посмотрев, почему языковые дизайнеры изменили вещи, а не почему они их скопировали / сохранили. Когда люди меняют то, что они обычно хотят или должны объяснить, в то время как они не делают этого, когда копируют или сохраняют то же самое, потому что «почему мы изменили бы это? это так, как это сделано! »

Rinzwind
источник
2

Это о видимости.

Ранние разделители операторов были "." как в COBOL и новой строке, возврат каретки в FORTRAN.

CR оказался ограничивающим в том, что он затрудняет передачу заявления в несколько строк.

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

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

Джеймс Андерсон
источник
1

Насколько я понимаю, это было выбрано потому, что был нужен явный оператор-терминатор, отличный от возврата каретки / новой строки. В те времена, когда на экранах с 80 столбцами существовала только одна строка переноса кода по нескольким строкам, было достаточно распространенным явлением, поэтому использование \ r или \ n для терминатора оператора не работало.

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


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

Поддельное имя
источник
3
Еще в темные века не было «80-колонных экранов». Были перфокарты с 80 столбцами, и были принтеры с различным количеством столбцов. (Около 130 или около того было обычным явлением.) FORTRAN завершил операторы в конце карты, но разрешил картам продолжения продолжить оператор. Карты продолжения были отмечены символом, пробитым в столбце 6 карты. (Подойдет любой символ. В зависимости от местного соглашения, вы обычно видите либо знак +, либо одну цифру, причем цифры считаются для нескольких карточек продолжения.)
Джон Р. Стром
1
Такой язык, как Python, был бы невозможен для компьютеров, которые существовали в первые годы C. Использование символа завершения оператора упрощает синтаксический анализ, и очень важно было уменьшить нагрузку на память и ЦП компиляторов десятилетия назад. Особенно на тех компьютерах, где вы платили за процессорное время с точностью до секунды.
Gigatron
@Gigatron - я имел в виду только использование возврата каретки для завершения оператора, а не какой-либо из аспектов Python более высокого уровня.
Фальшивое имя
1
@Gigatron, вы, возможно, захотите взглянуть на LISP, и особенно его раннюю историю на IBM 704. Вы можете быть удивлены тем, что могли делать Древние, даже работая с каменными ножами и медвежьими шкурами.
Джон Р. Штром
1
@Gigatron: FORTRAN работал на тех же компьютерах и использует новые строки для разделения операторов (со специальным синтаксисом для многострочных операторов).
Ден04
0

Вот два вопроса: почему у ALGOL точка с запятой и почему другие языки идут после нее.

На первый вопрос уже дан ответ во многих отношениях.

В качестве второго, ALGOL очень широко использовался в качестве языка псевдокодов для написания алгоритмов. Итак, точки с запятой вскоре стали естественными для пользователей разных языков. И, естественно, они были приняты для младших языков.

Гангнус
источник
0

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

Затем необходимо прекратить выполнение инструкций при вводе их в интерпретаторе. Короткие инструкции (например, математические выражения) можно завершить, просто нажав клавишу Enter, сообщая интерпретатору, что выражение готово для вычисления и оно дало результат. Но иногда нужно было ввести несколько строк кода для инструкции, поэтому одним из способов добиться этого было использование какого-то специального символа в качестве ограничителя инструкции вместо зависимости от только клавиши Enter. Таким образом, пользователь может ввести больше строк кода одновременно, потому что Enter еще не отправил его интерпретатору. Только когда интерпретатор обнаружит завершающий символ в строке, введенной с помощью Enter, он, наконец, выполнит его и вычислит его результат.

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

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

Inb4: Нет, это не исторический отчет. У меня нет никаких доказательств того, что именно так и возникли точки с запятой. Просто я представляю, как это могло произойти.

BarbaraKwarc
источник
-1

Большинство языков использовали точку с запятой, потому что она уже широко использовалась для этой цели, и изменение не имело смысла.

И, учитывая первые языки, которые сделают этот выбор, вам придется рассмотреть, какие есть альтернативы. При разработке языка вы хотите, чтобы необходимые символы были доступны, и наборы символов в это время были закодированы в 6 битах, часто с некоторыми зарезервированными шаблонами, часто с некоторыми символами, которые не определены четко (для более позднего появления этого, подумайте о национальные варианты ISO-646 - американский вариант хорошо известен под названием ASCII - который повторно использует коды для «общих» символов, таких как [, #или $, и видит эффект в контексте, где есть только вдвое меньше позиций кода доступны и буквы и цифры, резервирующие более половины из них).

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

AProgrammer
источник
-1

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

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

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

Basav
источник