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

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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

return
{
    ok: false
};

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

return;
{
    ok: false;
}

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

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

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

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


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


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

В 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 он смешанный, поэтому при использовании остается немного двусмысленности;

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

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

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

Другие вопросы по тегам