В компьютерном программировании , утверждение является синтаксической единицей на императивном языке программирования , который выражает некоторое действие , которое будет проводиться. [1] программа написана на таком языке формируется последовательность из одного или нескольких операторов. Утверждение может иметь внутренние компоненты (например, выражения ).
Многие языки программирования (например, Ada , Algol 60 , C , Java , Pascal ) проводят различие между операторами и определениями / объявлениями . В определении или объявлении указываются данные, с которыми должна работать программа, а в инструкции указываются действия, которые необходимо выполнить с этими данными.
Утверждения, которые не могут содержать других утверждений, просты ; те, которые могут содержать другие утверждения, являются составными . [2]
Внешний вид оператора (и программы) определяется его синтаксисом или грамматикой. Значение утверждения определяется его семантикой .
Простые утверждения
Простые утверждения полны сами по себе; к ним относятся присваивания, вызовы подпрограмм и несколько операторов, которые могут существенно повлиять на поток управления программой (например, goto , return , stop / halt). В некоторых языках ввод и вывод, утверждения и выходы обрабатываются специальными операторами, в то время как в других языках используются вызовы предопределенных подпрограмм.
- назначение
- Фортран:
variable = expression
- Паскаль, Алгол 60, Ада:
variable := expression;
- C, C ++, PHP, Java:
variable = expression;
- Фортран:
- вызов
- Фортран:
CALL subroutine name(parameters)
- C, C ++, Java, PHP, Паскаль, Ада:
subroutine name(parameters);
- Фортран:
- утверждение
- C, C ++, PHP:
assert(relational expression);
- Ява:
assert relational expression;
- C, C ++, PHP:
- перейти к
- Фортран:
GOTO numbered-label
- Алгол 60:
goto label;
- C, C ++, PHP, Паскаль:
goto label;
- Фортран:
- возвращаться
- Фортран:
RETURN value
- C, C ++, Java, PHP:
return value;
- Фортран:
- стоп / остановка / выход
- Фортран:
STOP number
- C, C ++:
exit(expression)
- PHP:
exit number;
- Фортран:
Составные заявления
Составные операторы могут содержать (последовательности) операторов, могут быть вложены до любой разумной глубины и обычно включают тесты, чтобы решить, следует ли подчиняться или повторять эти содержащиеся операторы.
- Обозначения для следующих примеров:
- это любой отдельный оператор (может быть простым или составным). - <последовательность> - любая последовательность из нуля или более <операторов>
- Некоторые языки программирования предоставляют общий способ группировки операторов вместе, так что любой отдельный
может быть заменен группой:
- Обозначения для следующих примеров:
- Алгол 60:
begin
end - Паскаль:
begin
end - C, PHP, Java:
{
}
- Алгол 60:
- В других языках программирования для каждого типа составного оператора есть свой специальный терминатор, поэтому один или несколько операторов автоматически обрабатываются как группа:
- Ада:
if test then
end if;
- Ада:
- В других языках программирования для каждого типа составного оператора есть свой специальный терминатор, поэтому один или несколько операторов автоматически обрабатываются как группа:
Многие составные операторы являются командами цикла или командами выбора. Теоретически требуется только одна команда каждого из этих типов. На практике довольно часто встречаются различные частные случаи; они могут упростить понимание программы, могут упростить программирование и часто могут быть реализованы гораздо более эффективно. Есть много тонкостей, не упомянутых здесь; подробности см. в связанных статьях.
- счетно-управляемый цикл :
- Алгол 60:
for index := 1 step 1 until limit do
; - Паскаль:
for index := 1 to limit do
; - C, Java:
for ( index = 1; index <= limit; index += 1)
; - Ада:
for index in 1..limit loop
end loop - Фортран 90:
- Алгол 60:
- DO index = 1, предел
- <последовательность>
- КОНЕЦ ДЕЛАТЬ
- DO index = 1, предел
- Цикл, управляемый условием, с тестом в начале цикла:
- Алгол 60:
for index := expression while test do
; - Паскаль:
while test do
; - C, Java:
while (test)
; - Ада:
while test loop
end loop - Фортран 90:
- Алгол 60:
- ДЕЛАЙТЕ ПОКА (тест)
- <последовательность>
- КОНЕЦ ДЕЛАТЬ
- ДЕЛАЙТЕ ПОКА (тест)
- Цикл, управляемый условием, с тестом в конце цикла:
- Паскаль:
repeat
until test; { note reversed test} - C, Java:
do {
} while (test) ; - Ада:
loop
exit when test; end loop;
- Паскаль:
- Цикл, управляемый условием, с тестом в середине цикла:
- C:
do {
if (test) break; } while (true) ; - Ада:
loop
exit when test; end loop;
- C:
- if-statement простая ситуация:
- Алгол 60:
if test then
; - Паскаль:
if test then
; - C, Java:
if (test)
; - Ада:
if test then
end if; - Фортран 77+:
- Алгол 60:
- ЕСЛИ (тест) ТО
- <последовательность>
- КОНЕЦ ЕСЛИ
- ЕСЛИ (тест) ТО
- двусторонний выбор if-statement :
- Алгол 60:
if test then
else ; - Паскаль:
if test then
else ; - C, Java:
it (test)
else ; - Ада:
if test then
else end if; - Фортран 77+:
- Алгол 60:
- ЕСЛИ (тест) ТО
- <последовательность>
- ЕЩЕ
- <последовательность>
- КОНЕЦ ЕСЛИ
- ЕСЛИ (тест) ТО
- Оператор case / switch многосторонний выбор:
- Паскаль:
case c of 'a': alert(); 'q': quit(); end;
- Ада:
case c is when 'a' => alert(); when 'q' => quit(); end case;
- C, Java:
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 }
- Python:
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
- Ада:
Синтаксис
Помимо присваиваний и вызовов подпрограмм, в большинстве языков каждый оператор начинается со специального слова (например, goto, if, while и т. Д.), Как показано в приведенных выше примерах. Для описания формы утверждений на разных языках использовались различные методы; более формальные методы имеют тенденцию быть более точными:
- Алгол 60 использовал форму Бэкуса – Наура (BNF), которая установила новый уровень спецификации языковой грамматики. [3]
- Вплоть до Fortran 77 язык описывался в английской прозе с примерами [4]. Начиная с Fortran 90, язык описывался с использованием варианта BNF. [5]
- Кобол использовал двумерный метаязык. [6]
- Паскаль использовал как синтаксические диаграммы, так и эквивалентный BNF. [7]
BNF использует рекурсию для выражения повторения, поэтому были предложены различные расширения , позволяющие напрямую указывать на повторение.
Заявления и ключевые слова
Некоторые грамматики языков программирования резервируют ключевые слова или помечают их специально и не позволяют использовать их в качестве идентификаторов . Это часто приводит к грамматике, которую легче анализировать , требуя меньше времени на просмотр .
Нет выдающихся ключевых слов
Fortran и PL / 1 не имеют зарезервированных ключевых слов, что позволяет использовать такие операторы, как:
- в PL / 1:
IF IF = THEN THEN ...
(втораяIF
и перваяTHEN
- переменные).
- в Фортране:
IF (A) X = 10...
условная выписка (с другими вариантами)IF (A) = 2
присвоение переменной с индексом с именемIF
- Поскольку до Fortran 95 пробелы были необязательными, опечатка могла полностью изменить смысл выражения:
DO 10 I = 1,5
начало цикла с I, бегущим от 1 до 5DO 10 I = 1.5
присвоение переменной значения 1.5DO10I
Помеченные слова
В Algol 60 и Algol 68 специальные токены выделялись явно: для публикации - жирным шрифтом, например begin
; для программирования с некоторыми специальными обозначениями, например, флажком ( 'begin
), кавычками ( 'begin'
) или подчеркиванием ( begin
на Elliott 503 ). Это называется «строппинг».
Таким образом, токены, являющиеся частью синтаксиса языка, не конфликтуют с именами, определяемыми программистом.
Зарезервированные ключевые слова
Некоторые имена зарезервированы как часть языка программирования и не могут использоваться в качестве имен, определенных программистом. В большинстве наиболее популярных языков программирования используются зарезервированные ключевые слова. Ранние примеры включают FLOW-MATIC (1953) и COBOL (1959). С 1970 года другие примеры включают Ada, C, C ++, Java и Pascal. Количество зарезервированных слов зависит от языка: в C их около 30, а в COBOL - около 400.
Семантика
Семантика связана со значением программы. В документах стандартов для многих языков программирования используется BNF или какой-либо эквивалент, чтобы выразить синтаксис / грамматику довольно формальным и точным способом, но семантика / значение программы обычно описывается с помощью примеров и английской прозы. Это может привести к двусмысленности. [8] В некоторых языковых описаниях значение составных операторов определяется использованием «более простых» конструкций, например, цикл while может быть определен комбинацией тестов, переходов и меток с использованием if
и goto
.
В статье о семантике описывается несколько математических / логических формализмов, которые использовались для точного определения семантики; они, как правило, сложнее, чем BNF, и ни один из подходов не является общепринятым. Некоторые подходы эффективно определяют интерпретатор для языка, некоторые используют формальную логику для рассуждений о программе, некоторые прикрепляют аффиксы к синтаксическим объектам для обеспечения согласованности и т. Д.
Выражения
Часто делается различие между операторами, которые выполняются, и выражениями , которые оцениваются. Значение, полученное из выражения, часто используется как часть оператора, например присваивания. variable := expression;
Некоторые языки программирования (например, C, C ++) позволяют некоторым операторам предоставлять результат (технически все операторы обеспечивают результат, но этот результат часто имеет тип void и не может быть использован ни для чего). Самый полезный оператор, который дает результат, - это присваивание, результатом которого является только что присвоенное значение.
Это может быть полезно для множественной инициализации:
i = j = 0;
который рассматривается какi = (j = 0);
Это также может привести к простой проблеме с пальцами, полностью меняющей смысл некоторого кода:
if (i == j) {. . . };
тесты, чтобы увидеть,i
равно лиj
if (i = j) { . . . };
присваивает значениеj
для ,i
а затем проверяет , чтобы увидеть , если это значение не равно нулю.
Некоторые языки (Algol 60, Pascal) допускают множественное присваивание, но не допускают появления присваиваний в выражениях.
Расширяемость
Большинство языков имеют фиксированный набор операторов, определенных языком, но были эксперименты с расширяемыми языками, которые позволяют программисту определять новые операторы.
Смотрите также
- Сравнение языков программирования - утверждения
- Поток управления
- Выражение (контраст)
Рекомендации
- ^ "заявление" . вебопедия . Проверено 3 марта 2015 .
- ^ Пересмотренный раздел отчета АЛГОЛ 60. 4.1. «АЛГОЛ 60» . Проверено 23 января 2021 года .
- ^ Пересмотренный раздел 1.1 отчета Алгола 60. «АЛГОЛ 60» . Проверено 23 января 2021 года .
- ^ Стандарт ANSI FORTRAN 66 «ФОРТРАН 66» (PDF) . Проверено 19 февраля 2021 года .
- ^ Стандарт ANSI FORTRAN 95 «Фортран95» (PDF) . Проверено 19 февраля 2021 года .
- ^ Руководство Cobol. "КОБОЛ" (PDF) . Проверено 23 января 2021 года .
- ^ Руководство пользователя Pascal и приложение к отчету D. «Паскаль» (PDF) . Проверено 19 февраля 2021 года .
- ^ Проблемные места в Алголе 60 «Неприятные места» (PDF) . Проверено 24 февраля 2021 года .
Внешние ссылки
- ЭНЦИКЛОПЕДИЯ ПК: Определение: программный оператор