Чаще всего в императивном языке общего назначения точки с запятой в качестве разделителей операторов либо обязательны, либо полностью запрещены (например, C и Python).
Однако некоторые языки, такие как JavaScript, позволяют отказаться от разделения ваших операторов точкой с запятой в пользу других разделителей (например, новой строки).
Какие дизайнерские решения стоят за этим? Я понимаю, что точки с запятой необходимы при написании нескольких операторов в одной строке, но есть ли еще одна причина сделать их обязательными (за исключением следующего C)?
programming-languages
syntax
Абер Клед
источник
источник
I understand that semicolons are essential when writing multiple statements on the same line
- Зависит от языка. Мой любимый не имеет таких разделителей вообще, следующий оператор начинается, когда все аргументы функции были использованы.}
или в конце файла).Ответы:
Сделав их обязательными (или полностью запретив их), вы уменьшите количество угловых случаев, устраните потенциальный источник неясных ошибок и упростите конструкцию компилятора / интерпретатора.
Разработчики языка, которые решили сделать их необязательными, решили жить с неоднозначностью в обмен на большую синтаксическую гибкость.
источник
JavaScript показал нам, что это очень плохая идея. Например:
В C это возвращает значение 0. В JavaScript это возвращается,
undefined
потому что точка с запятой вставляется после оператора return, и не сразу понятно, почему ваш код ломается, если вы случайно не узнали о деталях автоматической вставки точки с запятой.источник
return
- это один из немногих случаев, когда JavaScript вставляет точку с запятой, даже если программа будет работать без нее. (Но, конечно, это подрывает точку зрения Мейсона Уилера. Проблема не в том, что точки с запятой необязательны, а в том, что правила несовместимы.)Это несколько упрощает вашу грамматику и синтаксический анализатор, чтобы сделать точку с запятой обязательной. По сути, он позволяет лексеру сбрасывать все пробелы, включая переводы строк, и анализатору вообще не нужно об этом беспокоиться.
С другой стороны, как только вы захотите сообщить парсеру о пробелах, сделать точки с запятой необязательно. Часто вы можете просто сложить их вместе с
whitespace
токеном, и ваш парсер справится с этим просто отлично.Например, попробуйте вставить точку с запятой в следующую серию операторов C.
Хотя есть некоторые странные вещи, которые вы больше не можете делать, например
while(1);
, по большей части, с помощью современных методов синтаксического анализа относительно легко определить, где заканчиваются операторы без определенного разделителя. Даже если вы все еще хотите разрешить странные вещи, не так сложно сделатьnewline_or_semicolon
нетерминал.источник
Точки с запятой полезны в грамматике по двум причинам. Во-первых, он позволяет разбивать длинные операторы на несколько строк без чертовых символов продолжения (я говорю о вас, Fortran и Basic). Во-вторых, это дает парсеру возможность «отказаться» от синтаксического анализа, когда синтаксис становится действительно запутанным из-за опечатки. Кража по примеру Карла Билефельда,
представьте, что вы набрали еще одного открытого парена:
теперь где ошибка? Если у вас были точки с запятой, парсеру легче отказаться от первой точки с запятой. Он может даже продолжить разбор после точки с запятой, если захочет.
Теперь синтаксическому анализатору легче сообщать об ошибке и легче найти строку / столбец, где она произошла.
источник
Точки с запятой не всегда полностью или ничего, как вы упоминаете в своем вопросе. Например, грамматика Lua тщательно разработана, чтобы иметь произвольную форму (все пробелы, включая символы новой строки, могут быть проигнорированы), но также без необходимости использовать любые точки с запятой. Например, следующие программы эквивалентны:
источник
Не считая всего дизайна и конструкции, я считаю, что многие программисты происходят из разных областей, некоторые научились использовать точку с запятой, а некоторые нет. Многие новые языки, которые появляются, не требуют точки с запятой, но все же позволяют ей существовать. Я думаю, что это может быть просто способ заставить больше программистов учиться кодировать на этих новых языках, не отказываясь от своих привычек с самого начала.
источник