Следующую группу языковых единиц составляли операторы. Что они представляют собой? Лучше всего показать это на примере простейшего из них — оператора присваивания. Смысл оператора присваивания состоит в том, что данному идентификатору присваивается некоторое значение, например, значение какого-то арифметического выражения. Все это опять-таки говоря высоким «штилем», а по-простому означает, что нужное значение записывается в ячейку памяти, обозначаемую данным идентификатором.
Кроме оператора присваивания, практически в каждом языке (общее число их, мы забыли об этом сказать раньше, давно перевалило за тысячу) встречаются еще три оператора. Оператор перехода просто предписывает, начиная с определенного момента, переходить к выполнению фрагмента программы, помеченного меткой, входящей в состав этого оператора.
Оператор цикла заслуживает того, чтобы остановиться на нем подробнее. С небольшими изменениями грамматическая форма оператора цикла имеет вид:
FOR C STEP D UNTIL E DO.
Здесь: FOR — это слово, говорящее о том, что мы имеем дело с оператором цикла. Далее (мы обозначили этот фрагмент буквой C) перечисляется условие входа в цикл. Это может быть простейшая запись x = 1. Она означает, что программа начинает выполняться при значении переменной x, равном единице. Затем следует слово STEP, указывающее на то, что за ним в той или иной форме заданы условия модификации (у нас эти условия обозначены как D). В простейшем случае запись STEP 1 означает, что после очередного возврата к началу цикла значение переменной x увеличивается на единицу.
Наконец, слово UNTIL указывает на то, что за ним формулируются условия окончания. Например, UNTIL x < 100 означает, что обходы циклов продолжаются до тех пор, пока значение переменной x остается меньше ста. Само тело программы записывается после только что разобранной строки.
Снова, в который раз, хочется задать вопрос: только и всего? Но все усугубляется еще одним интересным обстоятельством. Сравните нашу строку с рисунком 8. Конечно, это одно и то же. Только на рисунке надо заполнить содержанием пустые геометрические фигуры (прямоугольники и ромб), а в языковой конструкции — заполнить тем же самым содержанием пробелы между словами FOR и STEP, UNTIL и DO. Оператор цикла представляет собой некий формализм. Чем заставлять программистов заучивать правила его образования, можно было сразу поручить все это делать ЭВМ.
Последний из упомянутых трех операторов — условный — имеет вид:
IF C THEN A ELSE B,
что читается (в том числе и ЭВМ) так: если условие C удовлетворяется, переходи к выполнению фрагмента программы A, в противном случае переходи к выполнению фрагмента программы B.
Человек, хорошо усвоивший все сказанное, с полным основанием может считать, что он овладел соответствующим языком программирования. Не сомневаемся, что подобное утверждение встретит яростное возражение со стороны профессионалов-программистов, но тем не менее это так. С помощью выражений и перечисленных операторов можно составить любую, без каких-либо исключений, программу. Это не частное мнение авторов данной книги, а строго доказанный факт, представляющий собой содержание знаменитой теоремы академика В. Глушкова.
Иное дело, что каждый конкретный язык предоставляет программисту некоторые дополнительные удобства. Как правило, имеются средства, позволяющие систематизировать операнды, оформив их в виде своего рода таблиц (их называют массивами). Язык содержит определенное количество функций, например, функцию синус можно вычислить, просто записав SIN(x), где x — значение.
Хватит подробностей. Наша беседа ни в коей мере не претендует на роль руководства по программированию. Позволили языки уменьшить трудоемкость программирования? Несомненно, да. Прежде всего человек получил возможность не корпеть над бесконечными последовательностями нулей и единиц, перейдя вместо этого к более привычным ему строчкам букв и цифр. Во-вторых, отпала необходимость держать в голове или вырисовывать на листе бумаги все ячейки памяти. При реальном программировании приходится иметь дело с десятками и сотнями тысяч таких ячеек. Отпала необходимость выполнять рутинную работу, например, по оформлению циклов.
Вместе с языками, естественно, появились средства перевода с этих языков на язык машины, так называемые трансляторы. Одновременно с основной функцией перевода трансляторы выполняют также функцию строжайшего контроля соблюдения грамматических правил. Это совершенно необходимо. Как, к примеру, машина отличает адрес операнда (идентификатор) от адреса команды (метки)? Способ единственный: если после строчки букв и цифр следует двоеточие (так не во всех языках, а только в языке Алгол), значит, это метка. В противном случае — идентификатор.