Почему некоторым языкам нужна точка с запятой?
Я понимаю, что точки с запятой указывают конец строки на таких языках, как Java, но почему?
Меня часто спрашивают другие люди, и я не могу думать о хорошем способе объяснить, как это работает лучше, чем просто использовать разрывы строк или пробелы.
Ответы
Ответ 1
Они не сигнализируют о конце строки, они сигнализируют конец инструкции.
Есть несколько языков, которые их не требуют, но эти языки не позволяют нескольким операторам в одной строке или одному оператору распространять многострочные строки (без какого-либо другого сигнала, такого как сигнал VB _).
Почему некоторые языки допускают несколько операторов в строке? Философия заключается в том, что пробелы не имеют значения (символ конца строки - это пробел). Это обеспечивает гибкость в том, как форматировать код, поскольку форматирование не является частью семантического значения.
Ответ 2
Прежде всего, точка с запятой является разделителем операторов, а не разделителем строк. Некоторые языки используют новый символ строки как разделитель операторов, но языки, которые игнорируют все пробелы, обычно используют точку с запятой.
Почему языки игнорируют пробелы?
Язык игнорирует пробелы, чтобы программист мог форматировать исходный код по своему усмотрению. Например, в Java нет разницы между
if (welcome)
System.out.println("hello world");
и
if (welcome) System.out.println("hello world");
Это не потому, что для каждого из них в грамматике языка есть один отдельный случай, но поскольку пробел просто игнорируется.
Почему языку программирования нужен разделитель операторов?
В этом суть вопроса. Чтобы понять это, рассмотрим небольшой язык без разделителя операторов. Он содержит следующие типы операторов:
var x = foo()
y[0, 1] = x
bar()
Здесь y
- двумерный массив, а x
записывается в одну из записей y
.
Теперь давайте посмотрим на эти утверждения, как увидит их компилятор:
var x = foo() y[0, 1] = x bar()
Поскольку нет разделителя операторов, компилятор должен сам распознать конец каждого из них, чтобы понять ввод. Может ли компилятор сделать это? Я думаю, в приведенном выше примере компилятор может это сделать.
Теперь давайте добавим другой тип выражения в язык:
[x, y] = ["hello", "world"]
Многозначное задание позволяет программисту сразу назначать сразу несколько значений. После этой строки переменная x
будет содержать значение "hello"
, в то время как переменная y
содержит "world"
. Это может быть очень удобно, чтобы разрешить несколько возвращаемых значений из функции. Как это работает вместе с остальными типами операторов?
Рассмотрим следующую последовательность утверждений:
foo()
[x, y] = [1, 2]
Сначала назовем метод foo
. Затем мы назначаем 1
на x
и 2
на y
. По крайней мере, это то, что мы хотели сделать. Вот что видит компилятор:
foo() [x, y] = [1, 2]
Может ли компилятор распознать каждое утверждение? Нет. Есть как минимум две возможные интерпретации. Первое - это то, что мы намеревались. Вот второй:
foo()[x, y] = [1, 2]
Что это значит? Сначала назовем метод foo
. Предполагается, что этот метод возвращает двумерный массив. Теперь мы напишем массив [1, 2]
в позиции [x, y]
в возвращаемом массиве.
Компилятор не может распознать утверждения, поскольку существует как минимум две допустимые интерпретации данного ввода. Конечно, это никогда не должно происходить на реальном языке программирования. В данном примере это может быть легко разрешено, но дело в том, что сложно разработать язык программирования без разделителя операторов, чтобы он не был двусмысленным. Это сложно, потому что разработчик языка должен учитывать все возможные перестановки типов операторов, чтобы убедиться, что язык не является двусмысленным.
Таким образом, разделитель операторов помогает дизайнеру языка изначально разрабатывать язык, но что более важно, он позволяет разработчику языка легко расширять язык в будущем, например, добавив новые типы операторов. Это очень важно, поскольку, как только код написан на вашем языке, вы не можете просто изменить грамматику для существующих типов операторов, потому что это приведет к тому, что весь существующий код больше не будет компилироваться.
TL; DR
Суммируя все это, точка с запятой была введена как разделитель операторов в пробелы, игнорируя языки, потому что легче создавать и расширять язык, на котором есть разделитель операторов.
Ответ 3
Многие языки позволяют разместить столько интервалов, сколько захотите. Это позволяет вам контролировать, как выглядит код.
Рассмотрим:
String result = "asdfsasdfs"
+ "asdfs"
+ "asdfsdf";
Поскольку вам разрешено вставлять дополнительные строки, вы можете разделить эту строку на несколько строк без проблем. Язык все еще должен знать, что линия закончена, поэтому вам нужна точка с запятой.
Ответ 4
Некоторые языки программирования используют его, чтобы обозначить конец оператора, тем самым делая язык не обратным к белому пространству с точки зрения утверждения. Одно дело в середине: если во время компиляции вы проверяете либо новую строку, либо точку с запятой, а затем вы должны оспаривать несколько разных "ситуаций", компилятор может получить то, что вы хотели сделать неправильно, и потребовалось бы более долго искать эти ситуации, а не просто искать точку с запятой в конце инструкции. Некоторые языки более высокого уровня стараются сократить использование точки с запятой или полностью удалить ее, чтобы сэкономить несколько нажатий клавиш, эти языки более ориентированы на комфорт программиста и, как правило, поставляются со всяким синтаксическим сахаром; можно утверждать, что не использование точек с запятой является своего рода синтаксическим сахаром.
Использование точки с запятой на языке должно быть в соответствии с тем, что пытается выполнить язык. Языки, такие как C и С++, в основном касаются производительности, Java и С# немного выше в смысле абстракции, чем C и С++, а затем у нас есть такие вещи, как Scala, Python и Ruby, которые сделаны в основном для того, чтобы сделать программирование более комфортным - стоимость исполнения (Ruby открыто признает это, и это очень заметно на Python).
Итак, почему некоторые "нужны" точки с запятой?
- упрощает компиляцию
- Дизайнер языка считает его более последовательным
- Исторические причины (например, Java, С# и С++) являются детьми C)
и последнее, что Javascript фактически добавляет точки с запятой во время компиляции или перед IIRC, поэтому на самом деле это не точка с запятой.
Ответ 5
Короткий ответ:
Потому что все это делают.
В теории формулировка языка - это то, что разработчик языка может синтаксически интерпретировать при анализе файла. Поэтому, если разработчик языка не хотел иметь точки с запятой, у них могут быть периоды, тире, пробелы, символы новой строки или что-то еще, чтобы обозначить разделение оператора.
Разработчики языка часто упрощают понимание синтаксиса, чтобы он стал популярным.
Википедия: использование точки с запятой в компьютерных Языки
Итак, если какой-либо разработчик языка создал язык, который использовал ":-)", чтобы обозначить конец выражения, он будет: 1) трудно читать; 2) не пользуются популярностью у людей, которые уже привыкли использовать ';'.
echo "Take Care": -)
Ответ 6
Языки делают это, поскольку это означает конец statement
, а не конец line
, что означает, что вы можете сжимать код, уменьшать его и занимать меньше места.
Возьмите код С++ (#include <iostream>
):
for(int i = 0; i < 5; ++i){
std::cout << "did you know?" << std::endl;
std::cout << "; signifies **end of statement**" << std::endl;
std::cout << "**not the end of the line**" << std::endl;
}
Его также можно записать
for(int i = 0; i < 5; ++i){std::cout << "did you know?" << std::endl; std::cout << "; signifies **end of statement**" << std::endl; std::cout << "**not the end of the line**" << std::endl;}
Ответ 7
Короткий ответ:
Потому что все это делают.
Не, и не все. Кроме того, многие популярные языки, такие как Python, Ruby или Visual Basic, не используют точку с запятой как конец оператора, а разрывы строк. Многие, а не "все", по-прежнему используют точку с запятой, потому что исторические причины, а не рациональные аргументы: точка с запятой была важна для замены формата перфокарт в первом возрасте вычислений, но сегодня его можно полностью отбросить.
На самом деле есть два популярных способа указать конец инструкции:
- Использование точки с запятой.
- Оставляем как есть. Это заставляет компилятор читать разрыв строки в конце инструкции. Если вы хотите расширить свой оператор до более одной строки, вы просто используете специальный символ (например,
\
в Python), чтобы сказать, что инструкция еще не закончена.
Чтобы сделать код более читаемым, использование специального символа для указания конца оператора должно быть исключением, а не правилом.