Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы вокруг нас.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
13.11 Mб
Скачать

§ 3. Что такое программа

Прежде всего заметим, что алгоритм работы процессора и программа его работы — это разные вещи. Некоторые процессоры (например центральные) при решении каждой задачи имеют свою программу, и алгоритм их работы яв­ляется алгоритмом выполнения программ. В зависимости от их содержания (вида и взаимосвязи команд) такие про­цессоры могут перерабатывать информацию, находящую­ся в ЗУ по-разному. Другие процессоры имеют свой ал­горитм работы, но этот алгоритм работы не является алго­ритмом выполнения программ. Примером является опи­санный в § 2 процессор ввода. Таковы же обычно и пульт управления и процессор выдачи.

В некоторых ЭВМ сложной конструкции процессоры ввода могут быть программными. Что же такое програм­ма? Когда она присутствует и когда ее нет? Эти вопросы тонкие и ответить на них не так-то просто. Все же попы­таемся это сделать. Прежде всего расскажем о том, как воз­никают программы. Особенности программ зависят от осо­бенностей ЭВМ, которая их должна выполнять. Поэтому разъясняя, что такое программа, мы будем ее иллюстри­ровать программами для случая описанной выше структуры программного процессора.

Программы сперва составляют на бумаге и, естествен­но, что в таком виде они существенно отличаются от про­грамм, находящихся в ЗУ процессора. Итак, сперва бу­дем говорить о программах, написанных на бумаге.

Условимся, что адресами ячеек оперативной памяти яв­ляются натуральные числа. Для определенности положим, что каждый' адрес записывается в виде четырехзначного числа. Код операции будем записывать в виде двузначного числа.

Тогда командой назовем строку, содержащую код опе­рации и три адреса19, разделенные пробелами. При этом условимся в каждой команде эти элементы располагать так: сперва код операции, потом первый, второй и третий ад­реса.

Примерами команд могут служить:

01 2425 3274 6153

34 2601 0000 0001

Смысл команд можно описать в виде таблицы, кото­рую обычно называют системой команд. В таких таблицах мы сохраним правила записи формул, о которых услови­лись в § 2. Допустим, что для нашего процессора система команд задана табл. 4.

В табл. 4 команда с кодом 13 фактически означает: от процессора ввода с перфокарт через буферную память по­лучить п чисел. Аналогично команда с кодом 11 означает: ввести в буферную память процессора печати п чисел и заслать соответствующую информацию в его контактные ячейки. Команда с кодом 12 требует выполнения лишь первой части того, что требует команда «13»; ввода п чи­сел с перфокарт в буферную память. Их можно перенести в собственную память программного процессора оттуда по команде «14». Операции «12» и «13» и соответствующие ви­ды команд введены для того, чтобы в тех случаях, когда это допускает решаемая задача, программный процессор, затребовав числа с перфокарт, не ожидал конца работы процессора ввода, а продолжал выполнение программы.

Последние четыре вида команд предусматривают кон­такт (с другими процессорами) и обмен информацией (с ни­ми). Процесс выполнения таких команд будет разъяснен несколько позже (в §4).

Приказом будем называть строку, составленную из ад­реса, скобки и команды, записанных в том порядке, в котором они перечислены. Например, приказом является

3361) 02 0001 0003 0235

Вид команды

Код операции

Описание действий, предписываемых командой

01

i

j

k

01

вычислить zi+zj и записать в zk

02

i

j

k

02

вычислить zi-zj и записать в zk

03

i

j

k

03

вычислить zi*zj и записать в zk

04

i

j

k

04

вычислить zi:zj и записать в zk

05

i

0000

k

05

вычислить и записать в zk

06

i

0000

k

06

число zi записать в ячейке zk

07

i

j

0000

07

условный переход к команде zi, если ω=0, и к команде zi, если ω=1

08

0000

j

0000

08

переход к команде zj

09

0000

0000

0000

09

останов процессора: запись числа 0 в ячейку t

11

i

n

0000

11

n чисел zi, zi+1, …, zi+n-1 выдать на печать

12

0000

n

0000

12

n чисел ввести в буферную память с перфокарт

13

0000

n

k

13

n чисел ввести с перфокарт и записать их в ячейки zk, zk+1, …, zk+n-1

14

0000

n

k

14

n чисел из буферной памяти перенести в ячейки zk, zk+1, …, zk+n-1

Θ

i

j

k

15≤θ≤99 и θ=10 или θ=00

останов процессора: запись числа 0 в ячейку t

Адрес, стоящий в начале приказа, будем называть соб­ственным адресом приказа.

Любой столбец приказов, если хотя бы один из них имеет собственный адрес 0001, будем называть программой, написанной на бумаге.

Хотя это и не имеет теоретического значения, всегда будем приказы размещать в порядке возрастания их собственных адресов. Как читатель сейчас поймет, практичес­кое значение это имеет.

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

Предположим, что нужно составить программу решения произвольного квадратного уравнения

ax2+bx+c=0 (а≠0),

если заданы числа а, b, с. Формула решения этого уравне­ния имеет вид

.

Корни уравнения могут оказаться действительными или комплексными. В первом случае будем печатать каждый из них; во втором случае это неудобно, так как . Тогда, очевидно, достаточно напечатать только α и β. Но как, глядя на два напечатанных числа, узнать, являются ли они числами х1 и х2 или числами α и β? Для того чтобы можно было это узнать, условимся предпосылать им третье число, которое должно быть равно 2, если корни действи­тельные, и 4, если они комплексные.

Алгоритм решения нашей задачи можно записать в сле­дующем виде.

1. Ввести в машину числа20 а, b, с, z=2, y=0 и перейти к п. 2.

2. Вычислить величины 2а, b2—4ас, b. Обозначить их соответственно е, d, g и перейти к п. 3.

3. Если d≥0, перейти к п. 4, иначе перейти к п. 5.

4. Вычислить , и обозначить их соответственно x1 и х2. Перейти к п. 6.

5. Вычислить числа g:e, , обозначить их21 соответственно x1 и х2. Умножить z само на себя и резуль­тат (он равен 4) обозначить через z. Перейти к п. 6.

6. Печатать числа z, х1, х2. Конец.

Составляя приведенный алгоритм, мы уже заранее учи­тывали порядок действий в программе, чего, может быть, читатель еще не умеет. Программу, соответствующую этому алгоритму, можно написать так: 0001) 123 0000 0005 0101

Этот приказ значит: ввести 5 чисел и записать их в ячейки оперативной памяти с номерами 101, 102, 103, 104, 105. Первые три число — это a, b, c, а последние — это z=2, y=0.

Выполняя приказы

0002) 03 0102 0102 0110

0003) 03 0101 0104 0111

0004) 03 0104 0111 0112

0005) 03 0112 0103 0112

0006) 02 0105 0102 0110

0007) 02 0110 0112 0112

последовательно получим

в ячейке №0110 число b2;

в ячейке №0111 число ;

в ячейке №0112 число 4a;

в ячейке №0112 число 4ac;

в ячейке №0110 число — b;

в ячейке №0112 число d=b24ас.

Эта группа приказов соответствует п. 2 алгоритма.

При выполнении последнего приказа в ячейке со ока­жется нуль, если d≥0, и единица, если d<0. Поэтому п. 3 алгоритма решения квадратного уравнения будет реализо­ван, если мы составим приказ условного перехода:

0008) 07 0009 0050 0000

Во втором адресе последней команды мы написали 0050, потому что уверены, что ячеек, которые нам потребуются для записи приказов, соответствующих случаю d1230, не­много, и ячейка 0050 не будет занята. Далее составим при­казы

0009) 05 0112 0000 0112

0010) 02 0110 0112 0113

0011) 01 0110 0112 0114

0012) 04 0013 0111 0201

0013) 04 0114 0111 0202

0014) 06 0104 0000 0200

Эта группа приказов соответствует п. 4 алгоритма ре­шения квадратного уравнения. В соответствии с ними последовательно будет получено

в ячейке № 0112 число ;

в ячейке № 0113 число ;

в ячейке № 0114 число ;

в ячейке № 0201 число x1;

в ячейке № 0202 число х2;

в ячейке № 0200 число 2.

0015) 11 0200 0003 0000

0016) 09 0000 0000 0000

В силу этих приказов числа 2, Xi и х2 будут напечатаны. Затем процессор будет остановлен.

Теперь составим приказы, которые выполнялись бы в случае d<0, т. е. соответствующие п. 5 алгоритма решения квадратного уравнения. Первый из этих приказов имеет собственный адрес 0050.

Выполняя приказы

0050) 04 0110 0111 0201

0051) 02 0105 0112 0112

0052) 05 0112 0000 0112

0053) 04 0112 0111 0202

0054) 03 0104 0104 0200

0055) 08 0000 0015 0000

будем последовательно иметь

в ячейке № 0201 число (—b):(2а);

в ячейке № 0112 число —d;

в ячейке № 0112 число ;

в ячейке № 0202 число ;

в ячейке 0200 число 4.

Наконец, последний приказ означает безусловный пе­реход к приказу, имеющему собственный адрес 0015. На этом программа закончена.

Итак, мы ознакомились с составлением программы. Программисты разработали целый ряд приемов, позволяю­щих облегчить эту очень тяжелую, но и очень важную ра­боту. О некоторых методах мы будем говорить ниже, хотя методика программирования и не составляет предмета дан­ной книги.

Как уже было сказано, для решения задачи программа должна быть введена в машину. При этом в ячейки должны быть записаны только команды (а не полные приказы); собственные адреса, содержащиеся в приказах, указывают, в какие ячейки должны быть помещены команды, входя­щие в состав этих приказов. Ячейки запоминающего уст­ройства представляют собой приборы, устойчиво сохраня­ющие свое состояние и меняющие его только в момент за­писи в них нового кода. Каждое состояние соответствует некоторому содержимому ячейки. Состояния, соответству­ющего ее пустоте, нет. Так устроены ЭВМ (почему так — это вопрос технический; в этой книге ответ на него не мо­жет быть дан). Кроме того, исходные данные и результаты тоже фиксируются в ячейках и физически могут иметь ту же форму, что и команды.

Ни один инженер и ни один математик, анализируя со­вокупность состояний ячеек программного процессора, не может сказать, содержится ли в них программа или нет, или, если хотите, всегда может сказать, что какая-то про­грамма там есть. Конечно, если ему заранее не известно, что в ЭВМ введена такая-то программа.

Иногда приходится слышать афоризм: «Машина без про­граммы — ничто. Машина с программой — все!» Очевидно, этот афоризм неверен. Действительно, чем отличается ма­шина без программы от машины с программой? Только со­стоянием некоторых своих элементов (именно тех, из кото­рых сделаны запоминающие устройства). Образно говоря, различие между машиной в первом и во втором случае та­кое же, как между винтовкой, заряженной и поставленной на предохранитель, и той же винтовкой, заряженной и взведенной. Функционирование винтовки, поставленной на предохранитель и взведенной при нажиме на спусковой крючок будет различным, хотя физически винтовка в обоих случаях одна и та же.

Какова бы ни была программа, введенная в ячейки соб­ственного ЗУ программного процессора, он, будучи при­веденным в действие, выполняет только свой алгоритм, при­мер которого приведен в § 2. Таково же поведение и всех других процессоров. Каждый из них выполняет свой ал­горитм. Но алгоритм программного процессора подобран так, что с точки зрения пользователя, составившего по определенным правилам программу, процессор расчленяет свои исходные данные на «программу в машине» и ее исход­ные данные и выполняет эту программу. Это значит, что ал­горитм процессора — алгоритм выполнения программы. Алгоритмы других процессоров имеют вспомогательное зна­чение.

Если трактовать программы на бумаге и программы в машине как предложения некоторых языков, то наличие алгоритма их выполнения приводит к мысли, что програм­мы в обеих формах являются алгоритмами. Но, конечно, не в смысле классических теорий, а пока что в интуитивном смысле.