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

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

Я знаю из этой статьи Вы рекомендуете использовать точку с запятой после каждого оператора в JavaScript?, что рекомендуется использовать точки с запятой, и существуют сценарии, которые могут создавать нежелательные неоднозначности (такие как зависание в C ++, когда фигурные скобки не используются).

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

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

Фон: я начинающий программист и только недавно начал изучать JavaScript.

РЕДАКТИРОВАТЬ: На комментарии, которые говорят, что это плохо в JavaScript, я знаю. Я спрашиваю, почему это вообще допускается, если большинство людей считают это плохой практикой.

3

Решение

Что касается JavaScript, Дуглас Крокфорд объясняет происхождение идеи в это видео. (Это отличный разговор, и он действительно стоит вашего времени, чтобы посмотреть его, если вы намерены продолжать использовать JavaScript.)

Это прямая цитата из выступления:

Вставка точки с запятой была предназначена для облегчения синтаксиса языка C для начинающих.

Насколько это выгодно пользователям языка, Крокфорд подробно объясняет несколько причин, почему не выгодно, но, скорее, как это вносит очень серьезные неясности и ошибки в синтаксис. Один из наиболее заметных случаев — попытка вернуть литерал объекта, используя стиль кодирования «фигурные скобки слева» (источник из видео):

return
{
ok: false
};

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

return;
{
ok: false;
}

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

4

Другие решения

Автор языка JavaScript, Брендан Эйх, имеет блог на эту тему под названием Адская точка с запятой на тему автоматической вставки точек с запятой (ASI).

Соответствующие цитаты:

ASI — это (формально говоря) процедура исправления синтаксической ошибки.


Хотелось бы, чтобы в эти десять дней в мае 1995 года новые строки стали более значимыми в JS. Тогда вместо ASI мы бы проклинали необходимость использовать инфиксные операторы в концах непрерывных строк или, возможно, или в скобках с использованием грубой силы, заставить продолжение на последовательной линии. Но этот корабль проплыл почти 17 лет назад.


Мои два цента: будьте осторожны, чтобы не использовать ASI, как если бы он дал JS значительные переводы строк.

2

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

Чтобы попытаться бороться с этим, некоторые компиляторы того времени пытался чтобы угадать ваше предполагаемое значение, поэтому, если опечатка была достаточно незначительной (для некоторого определения «достаточно незначительный»), она бы предположила, что знает, что вы действительно хотели, и продолжит компиляцию (и, возможно, даже выполнение), несмотря на ошибку.

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

1

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

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

в C ++ это означает, что синтаксис является последовательным

если ты пишешь

int x=0;
x++;

если вы затем сожмете до одной строки, его общий синтаксис:

int x = 0;  x++;

в JavaScript, если вы пишете

var x=0
x++

тогда если вы сжали до одной строки

var x=0 x++

будет проблемой

вам нужно сделать var x=0; x++

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

1
По вопросам рекламы [email protected]