Інструкція (програмування)

У комп'ютерному програмуванні інструкція (вказівка, англ. statement) — синтаксична одиниця імперативної мови програмування, яка вказує на певну дію, яку потрібно виконати[1][2]. Програма, написана такою мовою, є послідовністю інструкцій. Інструкція може мати внутрішні компоненти (наприклад, вирази).

Багато мов програмування (наприклад, Ada, Algol 60, C, Java, Pascal ) роблять різницю між інструкціями та визначеннями/деклараціями. Визначення або оголошення визначає дані, з якими має працювати програма, тоді як інструкція визначає дії, які мають бути виконані з цими даними.

Інструкції, які не можуть містити інших тверджень, є простими; ті, які можуть містити інші інструкції, є складеними[2].

Зовнішній вигляд інструкції (і, власне, програми) визначається її синтаксисом або граматикою мови програмування. Значення інструкції визначається її семантикою .

Прості інструкції

Прості інструкції повні самі по собі; вони включають присвоювання значень, виклики підпрограм та вказівки, які можуть суттєво впливати на процес виконання програми (наприклад, goto, return, stop/halt). У деяких мовах процеси введення та виведення даних, інструкції та виходи обробляються спеціальними інструкціями, тоді як інші мови використовують виклики попередньо визначених підпрограм.

  • C, C++, PHP: assert(relational expression);
  • Java: assert relational expression;

Зупинка/вихід

Складені інструкції

Складені інструкції можуть містити послідовності інструкцій, вкладених на будь-яку достатньо розумну глибину, і, як правило, передбачають перевірки, щоб вирішити, чи слід виконувати чи повторювати вказівки, що містяться в них.

Позначення:

  • <інструкція> – це будь-який окрема інструкція (може бути простим або складеним).
  • <послідовність інструкцій> — це будь-яка послідовність із нуля чи більше <інструкцій>

Деякі мови програмування забезпечують загальний спосіб групування інструкцій разом, так що будь-яку окрему <інструкцію> можна замінити групою:

  • Алгол 60: begin <послідовність інструкцій> end
  • Паскаль: begin <послідовність інструкцій> end
  • C, PHP, Java: { <послідовність інструкцій> }

Інші мови програмування мають різні спеціальні термінатори для кожного типу складених інструкцій, тому одна або кілька інструкцій автоматично розглядаються як група:

  • Ada: if <умова> then <послідовність інструкцій> end if;

Багато складених інструкцій є вказівками циклу або вказівками вибору. Теоретично потрібна лише одна з цих типів вказівок, але на практиці існують різні особливі випадки, в яких використання подібних може зробити програму легшою для розуміння, вони можуть полегшити програмування та часто можуть бути реалізовані набагато ефективніше:

  • Алгол 60: for index := 1 step 1 until limit do <інструкція>;
  • Pascal: for index := 1 to limit do <інструкція>;
  • C, Java: for ( index = 1; index <= limit; index += 1) <інструкція>;
  • Ada: for index in 1..limit loop <послідовність інструкцій> end loop
  • Fortran 90: DO index = 1,limit <послідовність інструкцій> END DO
  • Алгол 60: for index := expression while умова do <інструкція>;
  • Pascal: while умова do <інструкція>;
  • C, Java: while (умова) <інструкція>;
  • Ada: while умова loop <послідовність інструкцій> end loop
  • Fortran 90: DO WHILE (умова) <послідовність інструкцій> END DO
  • Pascal: repeat <послідовність інструкцій> until умова; { note reversed test}
  • C, Java: do { <послідовність інструкцій> } while (умова);
  • Ada: loop <послідовність інструкцій> exit when умова; end loop;

Цикл з контролем за умовами в середині циклу

  • C: do { <послідовність інструкцій> if (умова) break; <послідовність інструкцій> } while (true);
  • Ada: loop <послідовність інструкцій> exit when умова; <послідовність інструкцій> end loop;
  • Алгол 60: if умова then <unconditional інструкція>;
  • Pascal: if умова then <інструкція>;
  • C, Java: if (умова) <інструкція>;
  • Ada: if умова then <послідовність інструкцій> end if;
  • Fortran 77+: IF (умова) THEN <послідовність інструкцій> END IF
  • Алгол 60: if умова then <unconditional інструкція> else <інструкція>;
  • Pascal: if умова then <інструкція> else <інструкція>;
  • C, Java: if (умова) <інструкція> else <інструкція>;
  • Ada: if умова then <послідовність інструкцій> else <послідовність інструкцій> end if;
  • Fortran 77+: IF (умова) THEN <послідовність інструкцій> ELSE <послідовність інструкцій> END IF
  • Pascal: case c of 'a': alert(); 'q': quit(); end;
  • Ada: case c is when 'a' => alert(); when 'q' => quit(); end case;
  • C, Java: switch (c) { case 'a': alert(); break; case 'q': quit(); break; }

Опрацьовування винятків

  • Ada:  begin protected code except when exception specification => exception handler
  • Java: 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 тощо), як показано у наведених вище прикладах. Для опису форми тверджень різними мовами використовувалися різні методи; більш формальні методи, як правило, більш точні:

BNF використовує рекурсію для вираження повторення, тому були запропоновані різні розширення, щоб дозволити пряму індикацію циклів.

Інструкції та службові слова

Деякі граматики мов програмування резервують службові слова або спеціально позначають їх і не дозволяють використовувати їх як ідентифікатори. Це надає можливість створювати граматики мов програмування, які легше аналізувати, вимагаючи менше перегляду вперед .

Мови без зарезервованих службових слів

Fortran і PL/1 не мають зарезервованих службових слів, що дозволяє такі інструкціями, як:

PL/1:

  • IF IF = THEN THEN ... (другий IF і перший THEN– змінні).

Fortran:

  • IF (A) X = 10... умовна вказівка (з іншими варіантами)
  • IF (A) = 2 - присвоєння змінній з іменем IF

Оскільки пропуски були необов’язковими до Fortran 95, друкарська помилка могла повністю змінити значення інструкції:

  • DO 10 I = 1,5 початок циклу з I, що працює від 1 до 5
  • DO 10 I = 1.5 присвоєння змінній DO10Iзначення 1,5

Виділені слова

Основна стаття: Стропінг (синтаксис)

В 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 або подібний еквівалент для вираження синтаксису/граматики досить формальним і точним способом, але семантика/значення інструкцій зазвичай описується з використанням прикладів і правил англійської мови, що може призвести до неоднозначності..

Вирази

У мовах програмування розрізняють інструкції, які виконуються, та вирази, які обчислюються. Вирази завжди мають значення, а інструкції – ні. Однак вирази часто використовуються як частина складеної інструкції.

У більшості мов програмування інструкція може складатися лише з виразу, зазвичай після виразу ставиться термінатор (крапка з комою).

Вирази також можуть міститися в інших виразах. Наприклад, вираз x = y + 1 містить вираз y + 1, який, у свою чергу, містить значення y та 1, які також технічно теж є технічними виразами.

Хоча попередні приклади показують вирази присвоєння, деякі мови реалізують присвоєння не як вираз, а як інструкцію. Яскравим прикладом цього є Python , де = не є інструкцією, а просто роздільником у вказівці присвоєння. Хоча Python допускає кілька присвоювань, оскільки кожне присвоювання є виразом, це просто окремий випадок інструкції присвоєння, вбудованої в граматику мови, а не справжній вираз.

Проблеми термінології

На теренах колишнього СРСР є певна плутанина щодо перекладу англійського "statement" - досить часто зустрічається термін "оператор", який з'явився у 1965 році, під час перекладу перекладаючи "Revised Report on the Algorithmic Language Algol 60". А.П.Єршов та М.Р.Шура-Бура переклали англійське "operator" як "знак операції", а "statement" - як "оператор", хоча в англійській термінології operator (+, -, % тощо) слугує для позначення операцій над операндами (див. детальніше: Оператор (програмування)), що породило чимало неузгодженостей у вітчизняній інформатиці. Так в українських та російських джерелах можна зустріти, наприклад, переклад if-statement як інструкція if[7] і як оператор if[8]. У ряді перекладів книг де англ. statement перекладають як оператор, замість англ. operator вживають термін операція. Також для позначення решти інструкцій (присвоєння, виклик тощо), що також позначається як англ. statement у вітчизняній літературі ряд перекладачів вживають інколи оператор, інколи вираз, інколи команда. Для позначення складених інструкцій (if, if-else, while та ін.) у вітчизняних джерелах зустрічається термін конструкція (наприклад, "конструкція while")[9].

Примітки

  1. Staff, Webopedia (1 вересня 1996). What is Statement?. Webopedia (амер.). Процитовано 29 жовтня 2022.
  2. а б в Revised Report on the Algorithmic Language Algol 60. www.masswerk.at. Процитовано 29 жовтня 2022.
  3. ANSI FORTRAN 66 standard"FORTRAN 66" (PDF) (PDF). Retrieved February 19, 2021.
  4. ANSI FORTRAN 95 standard"Fortran95" (PDF). Retrieved February 19, 2021.
  5. Cobol manual."COBOL" (PDF) (PDF). Retrieved January 23, 2021.
  6. Pascal User Manual and Report Appendix D."Pascal" (PDF) (PDF). Retrieved February 19, 2021.
  7. Оператори розгалуження та цикли у C#. [Архівовано 9 червня 2011 у Wayback Machine.] (укр.)
  8. [1] [Архівовано 17 листопада 2011 у Wayback Machine.](укр.)
  9. Конструкція if(). ua-admin.com. Архів оригіналу за 7 червня 2010. Процитовано 21 червня 2011.