Сложить или перемножить число-гигант для машины — дело даже не одной секунды, а одной сотой, тысячной, сто тысячной доли секунды. Сто тысяч арифметических операций в секунду могут делать современные машины. И даже такая фантастическая скорость действия для них не предел.
А человек? За секунду нервный импульс проходит два, три, десять, самое лучшее — немногим больше ста метров в секунду. Ничтожная скорость по сравнению с электрическим током!
Нервную клетку нельзя использовать больше, чем сто раз в секунду. А за эту же секунду «нервная клетка» вычислительной машины — электронная лампа — может переключиться, «сработать» миллион и даже больше раз!
Несоответствие в скорости явное. И оно было ясно видно, когда «тихоход»-оператор управлял машиной. Выполнив со сказочной быстротой одну часть программы, машина ждала своего медлительного хозяина, когда он укажет, что делать дальше. То, что экономилось на быстроте машинной работы, тратилось человеком-оператором.
Как же быть? Выход был найден благодаря идее одного из крупнейших математиков мира Джона фон Неймана. И эта простая и гениальная идея состояла в том, чтобы передать управление машиной самой же машине!
Теперь машина должна стать самоуправляющейся, не зависящей от оператора. Она будет знать, что ей делать, в каком порядке производить арифметические действия.
И не только порядок действия должна знать машина. Прежде она имела дело лишь с заданными числами, с условием задачи. Теперь же она должна иметь дело и с самими правилами решения этой задачи, с самой программой.
Программа, порядок действий хранился раньше в памяти человека. По мысли фон Неймана, программу нужно поместить в «память» машины. И вычислительная машина с молниеносной быстротой должна сама справляться в своей «памяти», что и как ей делать, чтобы выполнить задание до конца.
Но откуда у машин «память»? Если иметь в виду нашу, человеческую, живую память, то ее, конечно, у машины нет. Но сделать «механическую память» очень легко. Магнитофонные ленты, кинопленки, книги, записные книжки, «узелки на память», дневники, школьный журнал с отметками — все это виды «механической памяти», нужной человеку.
«Нуль пишем, один в уме»… Как часто приходится делать эта, решая задачи и примеры с вычислениями. Примерно так же поступает и вычислительная машина, «запоминая» предварительные результаты вычислений.
Но ведь программу действий машин можно записать в виде чисел, в виде набора единиц и нулей, И тогда мы получаем возможность предоставить машине «самостоятельность» в решении любой вычислительной или логической задачи. Конечно, «самостоятельность» эта условная.
Программу действий составляет человек, он заранее продумывает, что должна делать машина.
Программирование требует кропотливого и тщательного труда. Нужно продумать, как разложить на простые, элементарные действия сложнейшие математические задачи, как лучше использовать машинную «память» — какую часть «памяти» отвести для запоминания программы, какую для хранения предварительных результатов вычислений. Наконец, требуется необычайная аккуратность и тщательность в записи программы. Одна малейшая ошибка или описка — и программа не годна.
Приведем один любопытный пример. Кандидат физико-математических наук Р. X. Зарипов составил программу для электронной вычислительной машины, по которой машина должна была сочинять музыку. Разумеется, все исходные данные и все команды были записаны в виде чисел.
Вычислительная машина «Урал» начала свое «творчество». Она успешно «сочиняла» вальсы, но, как только дело доходило до маршей, получалась заминка. Марши «Урал» отказывался «сочинять»! Оказывается, в программе вместо числа 01 по ошибке было поставлено 011. И как только описка была исправлена, «Урал» начал «сочинять» марши столь же успешно, как и вальсы.
ПОИСКИ «САМОСТОЯТЕЛЬНОСТИ»
Нельзя ли сделать так, чтобы и при составлении программы использовать работу машины? Сделать так, чтобы не человек, а сама машина «обдумывала» свои действия? Или хотя бы проверяла составленную человеком программу — нет ли в ней ошибок?
Оказалось, что проверку программы машина делать может (ее называют «отладка программы»). На первом этапе пробуют, не «заблокируется» ли машина. Если мы неправильно написали какую-либо операцию, машина не сможет выполнить программу от начала до конца.
Затем проверяется порядок выполнения операций: не перепутано ли в программе сложение и деление, и т. п. Наконец, с большим вниманием проверяется полученный результат. Не потому, что если мы зададим машине сложить 3 и 2, то может получиться 1; машина производит арифметические действия с большой точностью. Но ведь может случиться, что программист по ошибке написал не 3 + 2, а 3 — 2. И тогда, разумеется, машина выдаст ответ: 3 — 2= 1.
Вот почему перед отладкой программы вычисляется либо вручную, либо на арифмометре какой-нибудь числовой пример. А затем его поручают решать машине — совпадет ли ее решение с нужным? Если нет, тогда ищут ошибку в программе.
Так, шаг за шагом, с помощью самой же машины, идет исправление ошибок, пока не получится правильная программа.
Ну, а как быть с составлением программы самой машиной? Этот вопрос решают сейчас ученые разных стран мира.
Для автоматического составления программы в машину вводится особая программа. Она называется программирующей. Используя ее, машина может самостоятельно составлять большое число различных программ.
Машинам пробуют поручать и более творческие задачи. Вот, например, какой эксперимент был проделан в Гарвардском университете (США). В машину ИБМ-704 было введено много различных программ, осмысленных и бессмысленных. И, кроме них, задача: обработать четырнадцатизначное число с помощью 63 последовательных операций.
Вычислительная машина перебирала, разумеется наугад, всевозможные программы. Первое время правильный результат получался примерно один раз из четырех сотен попыток. Перепробовав несколько сотен тысяч «попыток», машина сумела найти «самостоятельное» суждение о правильном методе решения. И затем она неуклонно следовала найденному ею методу. Если же задача менялась, то и машина, не отходя от правильного метода, несколько видоизменяла его.
В настоящее время возникло даже целое направление, называемое «Эвристическое программирование» (от греческого слова «эврика» — «открытие», «находка»). Главная задача такого программирования — найти принципы действия мозга, или, как говорят математики, алгоритмы, а затем заставить машину работать по этим «алгоритмам мозга» и даже улучшать их.
УНИВЕРСАЛЬНЫЙ ЯЗЫК МАШИНЫ
Программа — основной язык машины. Записанная в ячейках «памяти» машины, она заставляет электрический ток производить все те «кибернетические чудеса», о которых часто сообщают газеты и журналы.
Отдельная программа — особый язык. К тому же вычислительные машины различных типов имеют разные программы. Конечно, это создает большие трудности. Приобрел вычислительный центр новую машину — нужно разрабатывать новый язык: кропотливо составлять программу, проверять ее, делать отладку. А новая машина все это время стоит без «языка», без программы.
То же самое получается и со старыми машинами, если они различных типов; для них надо составлять программы на разных языках. Общение людей друг с другом сильно затруднено тем, что нет всеобщего языка, понятного всем людям. Неужели даже для машин нельзя создать универсальный язык? Ведь машинная «память» — не живая память людей. Да и нет у них национальных традиций, многовековой литературы и других причин, из-за которых нельзя ввести всемирный язык для всего человечества.