Почему некоторые языки программирования позволяют автоматически включать точки с запятой?
Такие языки, как 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 (или что-то еще) из-за какой-то глупой опечатки.
Чтобы попытаться бороться с этим, некоторые компиляторы того времени пытались угадать ваш предполагаемый смысл, поэтому, если опечатка была достаточно незначительной (для некоторого определения "достаточно незначительный"), она бы предположила, что знает, что вы действительно хотели, и продолжит компиляцию (и, возможно, даже выполняется), несмотря на ошибку.
Те, кто не в состоянии изучать историю, обречены ее повторять. Несколько таких, кто слишком высокомерен, чтобы учиться у истории, тоже это повторяют. Вероятно, есть место для значительных дискуссий о точном типе дефектов символов, которые могут привести к тому, что разработчик языка сделает эту ошибку в настоящее время. Гораздо меньше места (вообще-то, вообще нет) для споров о том, является ли это ошибкой, хотя - она, безусловно, и непростительная.