Найти в Дзене
Журнал «Код»

Зачем нужна точка с запятой в программировании

И всегда ли она нужна? Продолжаем разбирать неочевидные моменты в программировании. В прошлый раз мы рассказали про разницу между табами и пробелами. Теперь — о точках с запятой: зачем они нужны и когда не нужны. Зачем нужна точка с запятой В большинстве языков программирования точка с запятой разделяет команды. Компьютер сам этого сделать не может, ему нужно явно сказать: «Всё, вот это — вся команда, выполняй её в таком виде». В некоторых языках вместо точки с запятой используют перенос на новую строку; иногда интерпретатор языка умеет угадывать, где вы имели в виду точку с запятой; но в базе точка с запятой — самый популярный разделитель. На примере: почему важно разделять команды В большинстве случаев, если не разделить команды, компилятор или интерпретатор просто сообщат об ошибке: мол, ожидали конец команды, а ты нам ерунду какую-то подсунул. Но иногда ошибки не будет, хотя программа будет работать совсем не так, как имел в виду разработчик. Это похоже на расстановку запятых в 
Оглавление

И всегда ли она нужна?

Продолжаем разбирать неочевидные моменты в программировании. В прошлый раз мы рассказали про разницу между табами и пробелами. Теперь — о точках с запятой: зачем они нужны и когда не нужны.

Зачем нужна точка с запятой

В большинстве языков программирования точка с запятой разделяет команды. Компьютер сам этого сделать не может, ему нужно явно сказать: «Всё, вот это — вся команда, выполняй её в таком виде».

В некоторых языках вместо точки с запятой используют перенос на новую строку; иногда интерпретатор языка умеет угадывать, где вы имели в виду точку с запятой; но в базе точка с запятой — самый популярный разделитель.

На примере: почему важно разделять команды

В большинстве случаев, если не разделить команды, компилятор или интерпретатор просто сообщат об ошибке: мол, ожидали конец команды, а ты нам ерунду какую-то подсунул. Но иногда ошибки не будет, хотя программа будет работать совсем не так, как имел в виду разработчик. Это похоже на расстановку запятых в предложении «Казнить нельзя помиловать». Вот пример.

В C++ есть команда автоинкремента после обращения. Она выглядит как два плюса подряд, и её можно поставить до или после переменной. Место расположения переменной важно: в зависимости от него алгоритм автоинкремента будет работать по-разному.

Вот пример: j = i++. Предположим, что в переменной i находится число 2. Работать будет так:

  1. Компьютер берёт значение переменной i и отправляет его в переменную j.
  2. После присваивания компьютер увеличивает значение переменной i на единицу.
  3. По итогу в переменной j число 2, в переменной i число 3.

Обратный пример: j = ++i (то есть переместили автоинкремент до переменной). Теперь он работает так:

  1. Компьютер сначала увеличивает i на единицу.
  2. После увеличения он присваивает новое значение в J.
  3. По итогу в переменных i и j число 3.

Теперь представьте, что у нас вот такой кусок кода:

z = x
++y -= 2

Для компьютера этот кусок выглядит так, потому что в этом языке ему плевать на переносы строк и пробелы:

z=x++y-=2

Из этого кода не очевидно, к какой переменной относится оператор ++. Компьютер либо выполнит какое-то стандартное действие для таких случаев, либо выбросит ошибку.

Чтобы стало очевидно, нужно просто разделить команды точкой с запятой:

z=x++;y-=2

На самом деле, вместо точки с запятой мог бы быть любой другой символ, например знак параграфа — §. Но разработчикам языков программирования было удобнее ставить то, что есть на любой клавиатуре, и то, что несложно набрать одним пальцем.

Точка с запятой в JavaScript

Чаще всего в проектах мы используем JavaScript, в котором точка с запятой тоже разделяет команды:

-2

-3

Но если мы возьмём тот же код, уберём оттуда точки с запятой и выполним его в браузере, то ошибки почему-то тоже не будет:

-4

Дело в том, что в JavaScript есть встроенный механизм автоматической вставки точек с запятой, который называется ASI. Он распознаёт команды и сам добавляет разделители в нужных местах. Этот механизм справляется с большинством случаев, но иногда он тоже не понимает, где ставить точку с запятой.

Например, с этим алгоритм точно не справится:

a = b + c
(d + e).print()

Дело в том, что это необязательно сложение и вызов какого-то метода второй командой — ещё это может быть вызовом метода print() функции c с аргументом (d + e):

a = b + c(d + e).print()

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

Механизм ASI не значит, что в JavaScript не нужны точки с запятой. Скорее это значит, что разработчики JavaScript позаботились о вашем комфорте и постарались защитить от некоторых ошибок. Так-то точки с запятой нужны.

В каких ещё языках есть точка с запятой

Точка с запятой есть в большинстве современных языков программирования, на которые повлияли C и C++:

  • Java,
  • Perl,
  • PHP,
  • C#,
  • Scala,
  • Pascal,
  • TypeScript.

Также она используется в языке запросов SQL. Иногда её используют для разделения данных внутри CSV-файлов — в них Excel может сохранять свои таблицы с данными (хотя CSV расшифровывается как comma-separated values, то есть «значения, разделённые запятой»).

Когда точка с запятой не нужна

Точка с запятой не нужна в тех языках, в которых явно задаются границы команд — так компьютер сразу определяет начало и конец команды без точки с запятой. Например, в Python для этого используют отступы и переносы строк — с ними интерпретатор понимает, что начинается новая команда и к чему она относится.

Когда Python только появлялся, многие программисты по привычке ставили в нём точку с запятой. Разработчики решили научить язык не воспринимать это как ошибку, а просто игнорировать этот символ. При этом редактор кода подсветит точки с запятой красным, чтобы программист обратил на это внимание и убрал их из кода:

-5

Комментарии

В совсем старых языках программирования, например в ассемблерах и Лиспе, точка с запятой используется для обозначения комментария в коде:

MOV AL, 61h ; Отправляем в AL десятичное число 97 (61 в шестнадцатеричной системе)

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