Есть ли причина, по которой точка с запятой была выбрана в качестве ограничителя строки вместо другого символа?
Я хочу знать историю этого решения и надеюсь, что ответы приведут к пониманию, которое может повлиять на будущие решения.
Есть ли причина, по которой точка с запятой была выбрана в качестве ограничителя строки вместо другого символа?
Я хочу знать историю этого решения и надеюсь, что ответы приведут к пониманию, которое может повлиять на будущие решения.
Ответы:
В английском языке точка с запятой используется для разделения элементов в списке операторов, например
Она увидела трех мужчин: Джейми, который приехал из Новой Зеландии; Джон, сын молочника; и Джордж, изможденный человек.
При программировании вы разделяете несколько операторов и можете использовать точку с запятой в качестве десятичной точки. Использование точки с запятой обеспечивает удобный способ анализа отдельных операторов программы, оставаясь при этом близким к обычной английской пунктуации.
Изменить, чтобы добавить
В первые дни, когда память была дорогой, медленная обработка и разрабатывались первые языки программирования, было необходимо разделить программу на отдельные операторы для обработки. Некоторые языки требовали, чтобы каждый оператор был помещен в строку, чтобы возврат каретки мог действовать как разделитель операторов. Другие языки допускали более свободный формат для текстового макета и поэтому требовали определенного символа-разделителя. Этот символ был выбран в качестве точки с запятой, скорее всего из-за сходства с его использованием в английском языке (это должно быть предположение; меня там не было), и поскольку он не вызывал конфликта с другой пунктуацией знаки и символы, которые были необходимы для математических или других синтаксических целей.
Отредактируйте снова
Потребность в некотором символе-терминаторе восходит к требованиям для синтаксического анализа текста на языке. Ранние компиляторы были написаны на ассемблере или, в некоторых случаях, непосредственно в ручных двоичных машинных инструкциях. Наличие специального символа, идентифицирующего конец оператора и ограничивающего часть обрабатываемого текста, значительно упрощает обработку. Как я уже говорил выше, в других языках используются возврат каретки или скобки. Алгол, Паскаль, Ада, BCPL, B, C, PL / M и другие семейства языков используют точку с запятой. Что касается того, кто первым использовал этот конкретный персонаж, я не вернусь достаточно далеко в истории, чтобы помнить. Его выбор и принятие имеет смысл как
В заключение, я думаю, что на эти ответы и комментарии было потрачено больше времени, чем на решение использовать точку с запятой для завершения утверждения при разработке первого языка, который использовал его таким образом.
Многие языки используют синтаксис, который смоделирован после C (который был смоделирован после B - спасибо @Crollster). Как видно из комментариев, существует длинная цепочка таких языков ... B был вдохновлен PL / I, которому предшествовал ALGOL при использовании в ;
качестве разделителя.
Поскольку в С оператором является терминатор ;
, эти языки следуют его примеру.
Что касается того, почему он был выбран как терминатор оператора в C - возможно, из-за его использования на английском языке «для обозначения взаимозависимых операторов» .
C был также изобретен на PDP-11 в то время, когда для наборов символов было ограниченное количество памяти, поэтому изобретатели языков должны были работать в рамках этих ограничений.
ФОРТРАН использовал возврат каретки, чтобы очертить заявления. Кобол использовал период. LISP ничего не использовал, полагаясь на круглые скобки для всего. ALGOL был первым языком, который использовал точку с запятой для разделения операторов. Паскаль последовал примеру Алгола, используя точку с запятой для разделения утверждений.
PL / I использовал точку с запятой для завершения операторов. Есть разница, и это легко увидеть в PASCAL. Ада следовала примеру PL / I по этому одному пункту, а не Алголу.
Точка с запятой в качестве разделителя или терминатора операторов была быстро принята сообществом компьютерных наук как полезная нотация, и, насколько мне известно, каждый последующий блочно-структурированный язык следовал примеру ALGOL и использовал точку с запятой для разделения или завершения операторов.
Много лет назад мне сказали, что BCPL использует как точку с запятой, так и возврат каретки в качестве разделителей / терминаторов операторов, но я никогда не использовал этот язык сам и не могу это проверить. В какой-то момент использование возврата каретки для отдельных или прекращения операторов было исключено из потомков BCPL. BCPL родил B, B родил C, C родил C ++, Java, D и целый ряд вещей, значительно менее продуманных, чем PASCAL и Ada.
Почему не любой другой символ?
Несколько языков использовали другие символы - старые версии BASIC вместо этого использовали двоеточие, например.
Игнорируя несколько исключений, я думаю, что есть две основные причины. Во-первых, вы просто ищете что-то однозначное. В типичном синтаксическом анализаторе, если вы столкнулись с достаточно серьезной ошибкой, которая не может продолжить анализ текущего оператора, вы обычно пытаетесь вернуть синтаксический анализатор обратно в синхронизацию, просто перейдя к разделителю оператора и перезапустив анализатор из начало следующего высказывания. Для этого вам нужно что-то, что обычно не встречается где-либо еще в коде, и точка с запятой оказывается символом с небольшим другим вложенным значением, поэтому довольно легко выделить это для этой цели.
Вторая причина несколько похожа, но больше ориентирована на людей, читающих / использующих код. Опять же, речь идет о том, что используемый вами символ не имеет большого значения. Есть существенное преимущество в удобочитаемости, которое можно получить от использования символа, который ваш читатель привык видеть для определенной цели, когда и если возможно. Это не означает, что C является единственным совершенным синтаксисом, и все остальное должно следовать ему по-рабски, но это означает, что достаточно людей знакомы с этим стилем синтаксиса, что смутно похожий язык получает много (и очень мало), следуя примерно тот же синтаксис, где это возможно.
Я хотел бы отметить, что это очень похоже на разработку практически любой другой программы. Если я напишу программу, которая использует какие-то окна, я постараюсь просто использовать нативные функции целевой платформы (платформ). Многие из решений, которые воплощают, будут в значительной степени произвольными и могут быть приняты по-другому без какой-либо существенной потери функциональности - но в равной степени их изменение без существенного усиления функциональности просто сбивает с толку пользователей, не делая ничего полезного. Те же основные принципы применяются к тому, «что должно прекратить (или разделять) утверждения на языке?» как «как должна выглядеть полоса прокрутки» или «как должен работать элемент управления деревом?» Во всех этих случаях решение является в основном произвольным, и единообразие само по себе обеспечивает существенную выгоду.
Я бы добавил, что во многих языках происходит то же самое, просто так, что большинство из нас так привыкли до программирования, что мало кто задумывается об этом. Почему все используют «+» для обозначения сложения или «-» для обозначения вычитания? Потому что форма символа не имеет большого значения, но каждый, кто согласен применять одно и то же значение к каждому символу, имеет большое значение.
Точка с запятой была первоначально предложена в Алголе 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, решил сделать точку с запятой заявление терминатор , а не разделителем. Программисты были довольны этим выбором. Большинство языков программирования последовало их примеру. (Паскаль сопротивлялся этой тенденции, но ее преемник Ада отказался от нее.)
[Примечание добавлено: в статье Википедии о сравнениях языков программирования есть хорошая таблица, в которой обобщено, как обрабатывается точка с запятой в различных языках программирования.]
Это довольно простая догадка, но, глядя на стандартную клавиатуру QWERTY, ограниченную значениями ASCII, естественными символами для завершения / разделения будут.!?,:; и возврат каретки. из них!?: должны быть немедленно дисквалифицированы за получение нескольких ключей, и завершение оператора будет очень распространенным явлением. Периоды будут дисквалифицированы, потому что их легко спутать с десятичными точками, что сделает их излишне сложными, чтобы быть ограничителем, учитывая ограниченное пространство начальных компьютеров. возврат каретки будет дисквалифицирован после того, как строки кода могут быть длиннее, чем те, которые могут быть показаны в одной строке на экране, поэтому будет сложнее читать программу, когда строки должны быть прокручены горизонтально, или требовать дополнительные символы, чтобы создать продолжение на следующей строке, что снова добавляет сложности. это оставляет, и; как варианты, из них, используется гораздо чаще в письменной форме по сравнению с; поэтому точка с запятой выбрана потому, что ее легче набирать, она менее запутана, потому что она добавляет значение к символу с ограниченным значением и менее сложна, потому что особых случаев на самом деле не существует с его использованием.
Точка с запятой была выбрана, потому что это был лучший персонаж, основанный на лени и простоте.
Это в основном произвольный выбор. Некоторые языки сделали другой выбор. 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.
Но ;
имеет грамматику английского на своей стороне; это может использоваться, чтобы отделить пункты в предложении.
Вместо того, чтобы пытаться ответить на ваш главный вопрос, я думаю, что лучше сосредоточиться на вашем скрытом вопросе:
Я хочу знать историю этого решения и надеюсь, что ответы приведут к выводам, которые могут повлиять на будущие решения при разработке и реализации языков программирования.
Если вы хотите узнать о дизайне языков программирования и истории реализации, а также получить более глубокое представление о процессе, то материалы конференций по истории языков программирования - отличное место для начала. (Я думаю, что вам понадобится членство в ACM, чтобы получить доступ к процессу.)
Почему операторы во многих языках программирования заканчиваются точкой с запятой? Есть ли причина, по которой точка с запятой была выбрана в качестве ограничителя строки вместо другого символа?
Взяв ваш главный вопрос в качестве примера вопроса, на который вы, возможно, захотите ответить, прочитав материалы HOPL, я хотел бы предложить следующее: люди, разрабатывающие новый язык программирования, обычно делают это, потому что считают, что те, о которых они знают, являются сломан / дефицит как-то. Их новый язык, с одной стороны, предназначен для устранения этого недостатка. С другой стороны, разработчики языка также будут копировать элементы дизайна из других языков, которые они считают хорошими, или они просто не изменяют те элементы, с которыми у них не было проблем.
Особенно важна эта последняя часть: вместо того, чтобы пытаться выяснить, какой язык программирования когда-либо был первым, кто использовал точки с запятой в качестве терминаторов, и почему многие другие языки программирования это скопировали, вы, вероятно, узнаете больше, посмотрев на языки, которые не копируются. Это. Например, в то время как Smalltalk черпал много вдохновения у Симулы, он нескопировать его синтаксис и, в частности, использовать точки с запятой в качестве разделителей операторов. Он изменил терминаторы (на самом деле разделители) до полной остановки и использует точку с запятой для чего-то другого. И наоборот, первый язык, который когда-либо использовал точку с запятой в качестве терминатора оператора, мог иметь причину изменить это значение по сравнению с тем, что использовалось в языках, которые были до него. Также возможно, что это был первый язык, который ввел всю концепцию терминатора оператора (или сделал это независимо от других языков), и что точка с запятой использовалась по какой-то причине, которая теперь потеряна во времени. (Я подозреваю, что последний случай здесь, так как ни один из других ответчиков не смог найти цитату из человека, который ввел точку с запятой, вместо того, чтобы предлагать модифицированные предположения о том, почему точка с запятой была хорошим выбором.) точка, Я думаю, вы узнаете больше, посмотрев, почему языковые дизайнеры изменили вещи, а не почему они их скопировали / сохранили. Когда люди меняют то, что они обычно хотят или должны объяснить, в то время как они не делают этого, когда копируют или сохраняют то же самое, потому что «почему мы изменили бы это? это так, как это сделано! »
Это о видимости.
Ранние разделители операторов были "." как в COBOL и новой строке, возврат каретки в FORTRAN.
CR оказался ограничивающим в том, что он затрудняет передачу заявления в несколько строк.
Полная остановка вызвала более интересную проблему. Когда вы читаете текст на английском языке, ваш мозг обрабатывает точки остановки на подсознательном уровне, вы осознаете, что предложение закончилось, и вы можете сделать паузу, но не замечаете этого. это сигнализировало это. Также во многих шрифтах '.' это наименьший возможный символ, иногда отображаемый как один пиксель. Пропущенные или лишние периоды стали единственной наиболее распространенной причиной ошибок в программах на языке COBOL.
Поэтому, учась на ранних ошибках, ALGOL выбрал определенный терминатор, который позволял бы утверждению проходить по нескольким строкам, и выбрал тот, который был видим и легко читался читателями. Точка с запятой является достаточно большой и необычной для обычного английского, чтобы ее не обрабатывали подсознательно.
Насколько я понимаю, это было выбрано потому, что был нужен явный оператор-терминатор, отличный от возврата каретки / новой строки. В те времена, когда на экранах с 80 столбцами существовала только одна строка переноса кода по нескольким строкам, было достаточно распространенным явлением, поэтому использование \ r или \ n для терминатора оператора не работало.
Точки с запятой были просто удобны, потому что они не используются в логических / математических выражениях. Как таковые, они не вступают в противоречие с фактическим содержанием заявлений в какой-либо значительной степени.
Лично я считаю, что продолжающееся использование точки с запятой вместе с требованиями к стилю, чтобы строки не превышали 80 символов, откровенно глупо и анахронично. Такие языки, как python, продемонстрировали, что вы можете без труда писать простой для понимания и более понятный код. Кроме того, если у вас есть проблемы со строками, длина которых превышает 80 символов, вам необходим монитор большего размера.
Вот два вопроса: почему у ALGOL точка с запятой и почему другие языки идут после нее.
На первый вопрос уже дан ответ во многих отношениях.
В качестве второго, ALGOL очень широко использовался в качестве языка псевдокодов для написания алгоритмов. Итак, точки с запятой вскоре стали естественными для пользователей разных языков. И, естественно, они были приняты для младших языков.
Я могу ошибаться, но я думаю, что это как-то связано с тем фактом, что во многих ассемблерах точка с запятой использовалась для начала комментария, обычно ставимого после инструкции. Все после a ;
было комментарием, а не частью самой инструкции.
Затем необходимо прекратить выполнение инструкций при вводе их в интерпретаторе. Короткие инструкции (например, математические выражения) можно завершить, просто нажав клавишу Enter, сообщая интерпретатору, что выражение готово для вычисления и оно дало результат. Но иногда нужно было ввести несколько строк кода для инструкции, поэтому одним из способов добиться этого было использование какого-то специального символа в качестве ограничителя инструкции вместо зависимости от только клавиши Enter. Таким образом, пользователь может ввести больше строк кода одновременно, потому что Enter еще не отправил его интерпретатору. Только когда интерпретатор обнаружит завершающий символ в строке, введенной с помощью Enter, он, наконец, выполнит его и вычислит его результат.
Теперь объедините эти две вещи вместе, и точка с запятой, по-видимому, является очевидным выбором для завершающего символа: он сообщает, где заканчивается часть инструкции и начинается часть комментария, поэтому, когда интерпретатор встречает его в строке, он знает, что может сбрасываться все строки выражения, которое оно буферизовало до сих пор и выполняет его, потому что инструкция только что закончилась, теперь мы в комментарии (ну, по крайней мере, до конца этой строки, потому что следующая строка начнется в коде режим снова, начиная новое выражение / инструкцию).
Это предполагает, конечно, что это была действительно точка с запятой, которая использовалась для комментариев человеком, который выдвинул эту идею его повторного использования в качестве разделителей инструкций. Если бы это был любой другой символ, мы могли бы получить другой терминатор инструкций.
Inb4: Нет, это не исторический отчет. У меня нет никаких доказательств того, что именно так и возникли точки с запятой. Просто я представляю, как это могло произойти.
Большинство языков использовали точку с запятой, потому что она уже широко использовалась для этой цели, и изменение не имело смысла.
И, учитывая первые языки, которые сделают этот выбор, вам придется рассмотреть, какие есть альтернативы. При разработке языка вы хотите, чтобы необходимые символы были доступны, и наборы символов в это время были закодированы в 6 битах, часто с некоторыми зарезервированными шаблонами, часто с некоторыми символами, которые не определены четко (для более позднего появления этого, подумайте о национальные варианты ISO-646 - американский вариант хорошо известен под названием ASCII - который повторно использует коды для «общих» символов, таких как [
, #
или $
, и видит эффект в контексте, где есть только вдвое меньше позиций кода доступны и буквы и цифры, резервирующие более половины из них).
Вероятно, не было другого символа, который можно было бы использовать в качестве разделителя операторов настолько интуитивно ( .
вероятно, уже является единственным серьезным претендентом на этот критерий) и без введения лексизации или трудностей с синтаксическим анализом в то время, когда теория синтаксического анализа и лексирования еще находилась в разработке ( .
сейчас из-за его использования в реальных числах).
Другая причина, по которой стоит использовать точку с запятой, заключается в том, что это один из символов, который нам не требуется или используется чаще.
Предположим, мы используем его чаще в качестве имени переменной или чего-то другого, и если бы точка с запятой использовалась бы в качестве ключевого слова или в качестве оператора, это было бы конфликтом символов для компилятора, поэтому было важно использовать символ, который не является часто используется в кодировании.
Я считаю, что языки программирования в стиле C сделали его популярным, и тогда авторы новых языков программирования не хотели изобретать велосипед, и они продолжали использовать его до сих пор.