1626435694-d107b4090667f8488e7fa1ea1b3d0faa (844295), страница 3
Текст из файла (страница 3)
а всю остальную работу по освоению программы машина с помощью транслятора берет на себя. Таким образом, аадача программирования как научно-технической дисциплины состоит в том, чтобы разрабатывать «языки программирования» — способы выражения программ, удобные для человека, и методы трансляции, перевода с языков программирования на то, что можно назвать языком машины или машин- НЫЛ«ЯЗЫКОА». Символическая программа. Простейшая помощь программисту состоит в том, чтобы предоставить ему Возмоя«ность составлять вместо машинной так называемую символическую программу.
Символическую программу программист придумывает, тоже держа в голове систему команд ЭВМ. Он по-прежнему должен написать список команд и список величин программы так, чтобы каждая позиция в этих списках соответствовала одной ячейке памяти машины.
Однако способ записи этих списков более удобен для программиста. Вместо адресов ячеек памяти для величин программы он может использовать те естественные обозначения, которые эти величины имели в условии задачи, или те, которые он сам придумает для большей наглядности. Вместо числового кода операции, изображаемого в машинной команде комбинацией двоичных цифр, программист может испольэовать так называемый ГЛ. Ь СОДЕРЖАТЕЛЬНЫЙ АНАЛИЗ ЗАДАЧЕ мнемонический код <мнемокод), который своим видом подсказывает ему содержательный смысл команды: например, + для команды сложения, ( для команды сравнения чисел, или слово СТОП для команды остановки машины. Если программисту нужно употребить адрес команды, он помещает в символической программе против этой команды любое подходящее по смыслу слово или букву, которая называется меткой команды, и употребляет в адресной части эту метку в качестве адреса команды.
Для обозначений величин, мнемокодов и меток программист может использовать любые символы, буквы и цифры, лишь бы получающийся текст символической программы годился для ввода в ЭВМ. В первом приближении достаточно сказать, что в ЭВМ можно ввести любой текст, который может быть напечатан на пишущей машинке без особых ухищрений, т. е. без выхода аа основную строку, беа подчеркиваний и надпечаток. Преобразование нлн, как принято говорить, трансляция символической программы в машинную происходит следующим образом.
Сначала ЭВМ под управлением транслятора воспринимает символическую программу. Затем машина составляет таблицу обозначений и меток, испольаованных в программе. Таблицу мнемокодов машине составлять не надо, так как она одна и та ясе для всех символических программ и хранится в трансляторе постоянно. После этого происходит распределение памяти, т. е.
сопоставление каждой величине и каждой команде программы той ячейки памяти, в которой эта величина или команда будет находиться. Заметим, что память можно распределять тривиально: а) для команд: размещать команды машинной программы в точности так, как опи размещены в символической программе. Тогда достаточно посчитать число команд в программе, отметить в памяти машины такое я<е количество ячеек, начинающихся с некоторого адреса А, и сопоставить п-й по порядку команде ячейку с адресом А + и — 1; б) для величин: каждую величину помещать в отдельную ячейку; всего будет занято столько ячеек памяти, сколько обозначений величин использовано в символической программе.
После распределения памяти остается систематически в каждой команде символической программы заменить мнемокод операции на двоичный код, а обозначения величин и метки команд в адресных частях команд — на сопоставленные им адреса ячеек. Алгоритмический язык. Следующим серьезным шагом в сторону облегчения работы программиста является программирование на алгоритмических языках. Программа на алгоритмическом языке тоже состоит иа списка команд и списка величин программы. Однако эти команды на- » 1.1. КРАТКОЕ ПОВТОРЕНИЕ ПРОГРАММИРОВАНИЯ ~з столько не похожи на команды машины, что они даже и называются по-другому — операторами.
Величины программы тоже могут не иметь прямого отношения к ячейкам памяти машины. Например, программист»южет испольаовать в программе комплексные числа и не заставлять себя каждый раа вспоминать, как они изображаются в памяти машины. Основным оператором алгоритмических языков является вычисление по формуле. Вычисленное значение может быть присвоено переменной величине или использовано каким-либо другим обрааом, раарешаемым правилами языка. Операции, используемые в формулах, являются либо общеиавестными математическими операциями и функциями, либо объясняются правилами языка, либо придумываются самим программистом.
Естественно, что в последнем случае программист должен с помощью подходящей вычислительной процедуры «описать», как выполняется соответствующая операция или функция. Формулы в алгоритмических языках называются выражениями, а соответствующие операторы — операторами присваивания, или арифметическими операторами. Кроме укаэанных операторов, в алгоритмических языках используются своего рода «органиаующие» операторы, которые не столько вычисляют, сколько определяют порядок вычислений.
К ним относятся условные операторы, которые выбирают тот или иной вариант вычислений, в зависимости от проверки некоторого условия, и операторы цик.ла, которые организуют повторение некоторых вычислений нужное число раз. Наконец, программы на алгоритмических языках не записываются в жестком табличном формате, как машинные и символические программы, а имеют фраэовую структуру, к тому же использующую, правда, в сравнительно ограниченных пределах, такие общепонятные слова (или их сокращения), как начало, конец, целый, вещественный, цикл, процедура, если, то, иначе и т. п. Все это вместе взятое приближает алгоритмические языки как к естественным человеческим языкам, так и к общепринятой математической символике. Алгол.
В нашей книге мы будем повсеместно испольаовать один иа наиболее распространенных алгоритмических языков— алгол-60: Для начинающих читателей можно мимоходом заметить, что говорить «алгоритмический язык алгол» вЂ” это, примерно, то же самое, что говорить «черные чернила», так как оригинальное название языка А1 001. есть сокращение от А1 СОТ11Ьш1с Еапяпаяе, что является английским эквивалентом «алгоритмического языка».
Если же укаэанную категорию читателей больше беспокоит то, что им еще не представился случай поанакомиться с этим языком, то. им автор рекомендует для предварительного чтения книгу А. Л. Брудно, Алгол, М., «Наука», 1971. гл, ь содкгяс«твльнын лнллиз злдлчп Трансляция программ, составленных на алгоритмическом языке, в машинные уже существенно более слон«на, чем в случае символических программ. Ыинимальнал работа состоит в следующем. Транслятор тоже начинает с того, что составляет таблицу символических имен, использованных в программе для величин программы, меток операторов и функций, придуманных программистом.
После этого формулы, использованные в записи программы, расчленяются на отдельные операции и функции. При этом в программе появляются новые промен;уточпые величины. Обозначения функций, введенных программного»«, заменяются ссылками на вычисляющие их процедуры. После этого каждая элементарная операция или функция, упоминаемая в программе, заменяется последовательностью машинных команд, которые, как принято говорить, реализуют эту операцию или функцию. Это же происходит и с «организационными» условными операторами и операторами цикла. Соответствие между элементарными действиями, функциями и операторами алгоритмического языка и реализующими их «кусочками» машинной программы является постоянным и закладывается в транслятор.
В результате сборки этих «кусочков» получается символическая программа, для которой затем производится уже упоминавшееся нами распределение па»тяти. Именно этот процесс распределения памяти и будет для нас главным предметом обсуждения в первой части книги. Прежде чем приступить к делу, сделаем, однако, одно техническое замечание.
Пусть программа на алгоритмическом языке написана так, что каждый оператор в ней содержит только одну операцию. Тогда, если операция алгоритмического языка может быть выполнена одной командой ЭВЫ, а каждая величина программы может поместиться в одной ячейке памяти, то соответствие между программой на алгоритмическом языке и реалиаующей ее символической программой становится буквальным: отличие между ними только в способе записи.
Это позволит нам в книге пользоваться только алголом, даже если мы будем работать с примерами, по своей детальности приближающимся к символическим программам. $1.2. Накопление фактов. Линейные программы Простой»пие примеры. Вообразим себя начинающими програм-. мистами, которым надо вычислить на ЭВЫ у = к', не используя операцию возведения в степень. Прочитав повторительный параграф по программированию, воспользовавшись нужными правилами алгола и мобилизовав школьный опыт решения задач по вопросам, »1ы можем написать следующую программу: $ ез. 22Акоплеегие ФАктОВ.
л$гненные пРОРРАммы аз П р и и е р 1. Вычислить х'. начало вещ х, у, х2, хЗ, х4, х5, хб; ввод (х); х22=х Х х; х32=х2 Х х; х4:=хЗ Х х; х5:=х4 х х; хб: х5хх; у:=хб Х х; вывод (у) конец Однако не менее вероятно, что программа будет выглядеть также и следующим образом: П р и не р 2. Вычислить х'. начало вещ х, у; ввод (х); у:=хХ х; у:=уХх; у:= у Х х; У!=УХ х; У:=УХх; у:=у Хх; вывод (У) конец Эти два простейших примера уя!е дают нам пищу для размышления.
Во-первых, мы видим, что обе программы решают нашу задачу. Во-вторых, вторая программа гораздо лучше первой: она требует только двух ячеек памяти, в ней пять последних команд одинаковы, и зто наталкивает нас па еще большее сокращение программы, если заставить (с помощью оператора цикла) один оператор у: = у Х х повториться пить раз: П р и м е р 3. Вычислить х'. начало вещ х, у; цел й ввод (х); у: =х Х х; для $ != 1 шаг 1 до 5 цикл у:= у Х х; вывод (у) конец П е р в ы й в ы в о д. Задача может быть запрограммирована разны!!и способами: одни способы лучше, другие хуже. 16 гл.