Заявление (информатика)
В компьютерном программировании оператор — это синтаксическая единица императивного языка программирования , которая выражает некоторое действие, которое необходимо выполнить. [1] Программа , написанная на таком языке, состоит из последовательности одного или нескольких операторов. Оператор может иметь внутренние компоненты (например, выражения ).
Многие языки программирования (например, Ada , Algol 60 , C , Java , Pascal ) проводят различие между операторами и определениями/объявлениями . Определение или объявление определяет данные, с которыми должна работать программа, а оператор определяет действия, которые необходимо предпринять с этими данными.
Высказывания, которые не могут содержать другие утверждения, являются простыми ; те, которые могут содержать другие утверждения, являются составными . [2]
Внешний вид оператора (да и программы) определяется его синтаксисом или грамматикой. Смысл высказывания определяется его семантикой .
Простые утверждения [ править ]
Простые утверждения полны сами по себе; к ним относятся присваивания, вызовы подпрограмм и несколько операторов, которые могут существенно повлиять на поток управления программой (например, goto , return , stop/halt). В некоторых языках ввод и вывод, утверждения и выходы обрабатываются специальными операторами, в то время как в других языках используются вызовы предопределенных подпрограмм.
- назначение
- Фортран:
variable = expression
- Паскаль, Алгол 60, Ада:
variable := expression;
- C, C#, C++, PHP, Java:
variable = expression;
- Фортран:
- вызов
- Фортран:
CALL subroutine name(parameters)
- C, C++, Java, PHP, Паскаль, Ада:
subroutine name(parameters);
- Фортран:
- утверждение
- С, С++, PHP:
assert(relational expression);
- Ява:
assert relational expression;
- С, С++, PHP:
- перейти к
- Фортран:
GOTO numbered-label
- Алгол 60:
goto label;
- С, С++, PHP, Паскаль:
goto label;
- Фортран:
- возвращаться
- Фортран:
RETURN value
- C, C++, Java, PHP:
return value;
- Фортран:
- стоп/остановка/выход
- Фортран:
STOP number
- С, С++:
exit(expression)
- PHP:
exit number;
- Фортран:
Сложные утверждения [ править ]
Составные операторы могут содержать (последовательности) операторов, вложенных на любую разумную глубину, и обычно включают в себя тесты, позволяющие решить, следует ли подчиняться или повторять эти содержащиеся операторы.
- Обозначения для следующих примеров:
- <оператор> — это любой отдельный оператор (может быть простым или составным).
- <последовательность> — это любая последовательность из нуля или более <операторов>.
- Некоторые языки программирования предоставляют общий способ группировки операторов, так что любой отдельный <оператор> можно заменить группой:
- Обозначения для следующих примеров:
- Алгол 60:
begin <sequence> end
- Паскаль:
begin <sequence> end
- Си, PHP, Ява:
{ <sequence> }
- Алгол 60:
- В других языках программирования для каждого типа составных операторов используется свой специальный терминатор, поэтому один или несколько операторов автоматически обрабатываются как группа:
- Есть:
if test then <sequence> end if;
- Есть:
- В других языках программирования для каждого типа составных операторов используется свой специальный терминатор, поэтому один или несколько операторов автоматически обрабатываются как группа:
Многие составные операторы представляют собой команды цикла или команды выбора. Теоретически требуется только одна команда каждого из этих типов. На практике довольно часто встречаются различные частные случаи; они могут облегчить понимание программы, облегчить программирование и часто могут быть реализованы гораздо эффективнее. Здесь не упомянуто множество тонкостей; подробности см. в связанных статьях.
- цикл, управляемый счетом :
- Алгол 60:
for index := 1 step 1 until limit do <statement> ;
- Паскаль:
for index := 1 to limit do <statement> ;
- С, Ява:
for ( index = 1; index <= limit; index += 1) <statement> ;
- Есть:
for index in 1..limit loop <sequence> end loop
- Фортран 90:
DO index = 1,limit <sequence> END DO
- Алгол 60:
- цикл с условием и проверкой в начале цикла:
- Алгол 60:
for index := expression while test do <statement> ;
- Паскаль:
while test do <statement> ;
- С, Ява:
while (test) <statement> ;
- Есть:
while test loop <sequence> end loop
- Фортран 90:
DO WHILE (test) <sequence> END DO
- Алгол 60:
- цикл, управляемый по условию , с проверкой в конце цикла:
- Паскаль:
repeat <sequence> until test; { note reversed test}
- С, Ява:
do { <sequence> } while (test) ;
- Есть:
loop <sequence> exit when test; end loop;
- Паскаль:
- цикл, управляемый по условию, с проверкой в середине цикла:
- С:
do { <sequence> if (test) break; <sequence> } while (true) ;
- Есть:
loop <sequence> exit when test; <sequence> end loop;
- С:
- Простая ситуация с оператором if :
- Алгол 60:
if test then <unconditional statement> ;
- Паскаль:
if test then <statement> ;
- С, Ява:
if (test) <statement> ;
- Есть:
if test then <sequence> end if;
- Фортран 77+:
IF (test) THEN <sequence> END IF
- Алгол 60:
- оператора if двусторонний выбор :
- Алгол 60:
if test then <unconditional statement> else <statement> ;
- Паскаль:
if test then <statement> else <statement> ;
- С, Ява:
it (test) <statement> else <statement> ;
- Есть:
if test then <sequence> else <sequence> end if;
- Фортран 77+:
IF (test) THEN <sequence> ELSE <sequence> END IF
- Алгол 60:
- Оператор case/switch, многосторонний выбор:
- Паскаль:
case c of 'a': alert(); 'q': quit(); end;
- Есть:
case c is when 'a' => alert(); when 'q' => quit(); end case;
- С, Ява:
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
- Паскаль:
- Обработка исключений :
- Есть:
begin protected code except when exception specification => exception handler
- Ява:
try { protected code } catch (exception specification) { exception handler } finally { cleanup }
- Питон:
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
- Есть:
Синтаксис [ править ]
Помимо присваиваний и вызовов подпрограмм, в большинстве языков каждый оператор начинается со специального слова (например, goto, if, while и т. д.), как показано в приведенных выше примерах. Для описания формы высказываний на разных языках использовались различные методы; более формальные методы имеют тенденцию быть более точными:
- В Алголе 60 использовалась форма Бэкуса-Наура (BNF), которая установила новый уровень спецификации грамматики языка. [3]
- Вплоть до Фортрана 77 язык описывался английской прозой с примерами: [4] Начиная с Фортрана 90, язык описывался с использованием варианта BNF. [5]
- Кобол использовал двумерный метаязык. [6]
- Паскаль использовал как синтаксические диаграммы , так и эквивалентный BNF. [7]
BNF использует рекурсию для выражения повторения, поэтому различные расширения, были предложены позволяющие прямо указывать повторение.
Заявления и ключевые слова [ править ]
Некоторые грамматики языков программирования резервируют ключевые слова или помечают их особым образом и не позволяют использовать их в качестве идентификаторов . Это часто приводит к тому, что грамматики легче анализировать и требуют меньшего просмотра .
Нет выделенных ключевых слов [ править ]
Фортран и PL/1 не имеют зарезервированных ключевых слов, что позволяет использовать такие выражения, как:
- в ПЛ/1:
IF IF = THEN THEN ...
(второйIF
и первыйTHEN
являются переменными).
- на Фортране:
IF (A) X = 10...
условный оператор (с другими вариантами)IF (A) = 2
присвоение индексной переменной с именемIF
- Поскольку до Фортрана 95 пробелы были необязательными, опечатка могла полностью изменить смысл оператора:
DO 10 I = 1,5
начало цикла, где I работает от 1 до 5DO 10 I = 1.5
присвоение значения 1,5 переменнойDO10I
Помеченные слова [ править ]
В Алголе 60 и Алголе 68 специальные токены выделялись явно: для публикации жирным шрифтом, например begin
; для программирования, с какой-то специальной маркировкой, например, флагом ( 'begin
), кавычки ( 'begin'
) или подчеркнутый ( begin
на Эллиотте 503 ). Это называется «строппинг».
Таким образом, токены, являющиеся частью синтаксиса языка, не конфликтуют с именами, определенными программистом.
Зарезервированные ключевые слова [ править ]
Некоторые имена зарезервированы как часть языка программирования и не могут использоваться в качестве имен, определяемых программистом. Большинство самых популярных языков программирования используют зарезервированные ключевые слова. Ранние примеры включают FLOW-MATIC (1953) и COBOL (1959). С 1970 года другие примеры включают Ada, C, C++, Java и Pascal. Количество зарезервированных слов зависит от языка: в C их около 30, а в COBOL — около 400.
Семантика [ править ]
Семантика связана со значением программы. В документах стандартов для многих языков программирования используется BNF или какой-либо его эквивалент для выражения синтаксиса/грамматики довольно формальным и точным способом, но семантика/значение программы обычно описывается с использованием примеров и английской прозы. Это может привести к двусмысленности. [8] В некоторых описаниях языков значение составных операторов определяется использованием «более простых» конструкций, например, цикл while может быть определен комбинацией тестов, переходов и меток , используя if
и goto
.
В статье о семантике описываются несколько математических/логических формализмов, которые использовались для точного определения семантики; они, как правило, более сложны, чем BNF, и ни один подход не является общепринятым. Некоторые подходы эффективно определяют интерпретатор языка, некоторые используют формальную логику для рассуждения о программе, некоторые присоединяют аффиксы к синтаксическим объектам для обеспечения согласованности и т. д.
Выражения [ править ]
Часто проводят различие между операторами, которые выполняются, и выражениями , которые оцениваются. Выражения всегда возвращают значение, а операторы - нет. Однако выражения часто используются как часть более крупного утверждения.
В большинстве языков программирования оператор может состоять не более чем из выражения, обычно после выражения следует знак завершения оператора (точка с запятой). В таком случае, хотя выражение и оценивает значение, полный оператор — нет (значение выражения отбрасывается). Например, в C, C++, C# и многих подобных языках x = y + 1
— это выражение, которое присваивает x значение y плюс один, а само выражение в целом будет иметь то же значение, что и x. Однако, x = y + 1;
(обратите внимание на точку с запятой в конце) — это оператор, который по-прежнему присваивает x значение y плюс один, поскольку выражение внутри оператора все еще вычисляется, но результат выражения отбрасывается, а сам оператор не оценивается как любое значение. [9]
Выражения также могут содержаться внутри других выражений. Например, выражение x = y + 1
содержит выражение y + 1
, который, в свою очередь, содержит значения y
и 1
, которые также технически являются выражениями.
Хотя в предыдущих примерах показаны выражения присваивания, некоторые языки реализуют присваивание не как выражение, а как оператор. Ярким примером этого является Python , где = — это не оператор, а просто разделитель в операторе присваивания. Хотя Python допускает множественные присваивания, поскольку каждое присваивание является выражением, это просто частный случай оператора присваивания, встроенного в грамматику языка, а не истинное выражение. [10]
Расширяемость [ править ]
Большинство языков имеют фиксированный набор операторов, определенный языком, но были эксперименты с расширяемыми языками , которые позволяют программисту определять новые операторы.
См. также [ править ]
Ссылки [ править ]
- ^ "заявление" . вебопедия. Сентябрь 1996 года . Проверено 3 марта 2015 г.
- ^ Бэкус, Дж.В.; Бауэр, Флорида; Грин, Дж.; Кац, К.; Маккарти, Дж.; Наур, П.; Перлис, AJ; Рутисхаузер, Х.; Самуэльсон, К.; Вокуа, Б.; Вегштейн, Дж. Х.; ван Вейнгаарден, А.; Вуджер, М. Наур, Питер (ред.). «Пересмотренный отчет об алгоритмическом языке Алгол 60» . масса:верк . Раздел «4.1» . Проверено 23 января 2021 г.
- ^ Бэкус, Дж.В.; Бауэр, Флорида; Грин, Дж.; Кац, К.; Маккарти, Дж.; Наур, П.; Перлис, AJ; Рутисхаузер, Х.; Самуэльсон, К.; Вокуа, Б.; Вегштейн, Дж. Х.; ван Вейнгаарден, А.; Вуджер, М. Наур, Питер (ред.). «Пересмотренный отчет об алгоритмическом языке Алгол 60» . масса:верк . Раздел «1.1» . Проверено 23 января 2021 г.
- ^ «ФОРТРАН» (PDF) . Институт стандартов США. 1966 год . Получено 19 февраля 2021 г. - через WG5 Fortran Standards.
- ^ «Рабочий проект J3/04-007» (PDF) . J3 Фортран. 10 мая 2004 года . Проверено 19 февраля 2021 г.
- ^ «Справочное руководство по программированию ASCII COBOL» (PDF) . унисис. Июнь 2010 года . Проверено 23 января 2021 г.
- ^ Дженсен, Кэтлин; Вирт, Никлаус (1974). Гус, Г.; Хартманис, Дж. (ред.). «Руководство пользователя и отчет PASCAL» (PDF) . Конспекты лекций по информатике . Приложение Д. Проверено 19 февраля 2021 г.
- ^ Кнут, Делавэр (июль 1967 г.). «Остающиеся проблемные места в Алголе 60» (PDF) . Семейство Алгол . Проверено 24 февраля 2021 г.
- ^ «ISO/IEC 9899:1999 (E)» (PDF) . ИСО/МЭК . Архивировано (PDF) из оригинала 7 февраля 2024 г.
- ^ «7. Простые высказывания» . Документация Python 3.10.8 .