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