Разумеется, записывать программы в двоичных числах, которые еще называются машинными кодами, неудобно (хотя когда-то это был единственный способ). Потому придумали более «человеческий» метод, когда инструкции записываются в виде буквенных мнемонических (т. е. запоминающихся путем образования искусственных ассоциаций) сокращений. Например, инструкция сложения выглядит как ADD (от англ. add – «прибавлять»), инструкция вычитания – как SUB (от subtract – «вычитать»), инструкция безусловного перехода – как JMP (от jump – «прыжок», «переход») и т. д. Регистры также получили буквенные обозначения, а вместо адреса инструкции в программе перед нужными командами стали ставить метки – произвольные сочетания символов, обычно складывающиеся в понятное по смыслу слово.
В таких обозначениях простая программа может выглядеть так:
MOV АХ, 0 Cycle:
ADD АХ, 1 CMP АХ, 9 JLE Cycle
Эта программа представляет собой цикл, который выполнится ровно десять раз. До его начала в регистр под названием АХ записывается 0 (инструкция MOV от слова move, что значит «перемещать»). Затем стоит метка Cycle, помечающая команду сложения регистра АХ с единицей. После этого полученное значение регистра АХ сравнивается (СМР – от слова compare, т. е. «сравнивать») с числом 9. Инструкция JLE (сокращение от Jump if Less or Equal – «перейти, если меньше или равно») заставит опять начать с инструкции прибавления единицы, если в результате сравнения обнаружится, что еще не достигнуто значение, большее 9. Если такое число достигнуто, то программа закончится. После ее выполнения регистр АХ будет содержать число 10.
Сама по себе такая программа может показаться бессмысленной (проще сразу загрузить в АХ число 10), но внутри цикла мы можем, например, выполнить какие-то другие продуктивные действия, которые нам нужно почему-либо сделать ровно десять раз.
Каждая разновидность микропроцессора в силу своего устройства имеет собственную систему таких мнемонических обозначений, хотя во многом они у разных процессоров совпадают, да и принципы построения программ одни и те же. Язык программирования, оговаривающий мнемонические сокращения для инструкций данного процессора и правила их компоновки в законченные программы, получил название языка ассемблера. Под собственно ассемблером (что переводится как «сборщик») подразумевается специальная программа, которая преобразовывает текст на этом языке в набор машинных кодов. Программа-ассемблер также своя для каждой разновидности процессоров. Результат работы ассемблера и представляет всем знакомые исполняемые файлы – собственно программы, которые запускаются на компьютере (или, например, записываются в память микроконтроллеров, управляющих каким-то устройством). Заметим, что готовые библиотеки подпрограмм, от которых на современном этапе никуда не денешься, могут быть включены в исполняемый файл, а могут быть представлены в виде отдельных файлов.
Языки высокого уровня
Но записывать машинные коды в виде понятных инструкций программистам показалось мало – слишком громоздкие получаются программы на языке ассемблера, слишком много времени занимает их написание, слишком трудно их отлаживать, чтобы быть уверенным в том, что там нет серьезных ошибок. Программы для современных ПК включают десятки, сотни тысяч, а то и миллионы команд. Потому пришлось придумать другие языки, которые упрощают процедуру составления программ, – называются они языками высокого уровня.
Как всякий язык, любой язык программирования имеет семантику (т. е. смысловое содержание операторов) и синтаксис (правила компоновки этих операторов в тексте программы). И семантическое содержание операторов, и правила синтаксиса четко зафиксированы в описании языка и не допускают разночтений. FORTRAN, Algol и их известные потомки – Basic, С, Pascal и др. – отличаются тем, что в них программист оперирует с процедурами и функциями. И то и другое есть модернизированные подпрограммы, уже известные нам по эпохе машинных кодов. Функции отличаются от процедур тем, что первые обычно вычисляют какие-то значения, а процедуры только «указывают» компьютеру на некую последовательность операций, которую нужно выполнить.