Главная > Разное > Математика в биологии и медицине
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

5.4. ПРОГРАММИРОВАНИЕ

После того как установлено, к какому общему типу относится задача, которую требуется решить, и выбран подходящий метод анализа (идет ли речь об обработке данных, численном анализе или же некоторой комбинации того и другого), вычислительная машина должна получить инструкцию, в какой последовательности должны выполняться вычисления. Как уже указывалось в разд. 5.1, это делается с помощью надлежащим образом составленной программы, т. е. последовательности команд. Таким образом, программирование составляет существенный элемент исследования, связанного с использованием электронных вычислительных машин. Обычно составлением новых программ или переделкой существующих занимаются специально подготовленные программисты (так же как при широком использовании настольных счетных машин целесообразно иметь квалифицированных операторов). В обоих случаях важно, однако, чтобы составитель задачи имел определенные сведения о типе машины, которая будет производить вычисления, так как это может оказать решающее влияние на выбор метода анализа. Этого вопроса мы коснемся в разд. 5.5. Здесь же для тех, кто, возможно, не знаком с этим вопросом, будут рассмотрены основные аспекты программирования.

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

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

Рассмотрим, например, машинный код ЭВМ «Эллиотт-803». В этой машине все отдельные ячейки запоминающего устройства пронумерованы и каждая ячейка может содержать одно число или две команды. Допустим, что два числа х и у хранятся в определенной численной форме в ячейках 251 и 252. Требуется найти сумму х + у и поместить ее в ячейку 253, сохранив х и у в их первоначальном месте. Допустим, что команда для записи числа в накапливающий регистр кодируется числом 30, за которым следует номер, или адрес, ячейки, где хранится это число. Таким образом, первая команда, согласно которой число х передается в накапливающий регистр, имеет вид 30 251. Теперь к х нужно прибавить у. Команда на сложение кодируется числом 04, и, следовательно, вторая команда имеет вид 04 252. Наконец, необходимо перенести сумму х + у, находящуюся в накапливающем регистре, в ячейку 253. Операция такого рода выполняется по команде 20; следовательно, третья команда кодируется числом 20 253. Итак, окончательная последовательность команд записывается на бланке программы следующим образом:

Операции заканчиваются тем, что число х, как и вначале, оказывается в ячейке 251, число у — в ячейке 252, а в ячейке 253 появляется новая величина х + у. Разумеется, это очень простой пример, однако он ясно иллюстрирует принцип, на котором основана передача команд вычислительной машине.

Хотя имеется всего четыре основных арифметических действия — сложение, вычитание, умножение и деление, — удобно задавать более широкий круг комбинированных операций. Так, может потребоваться перенести некоторое число в накапливающий регистр и освободить ячейку, из которой оно взято; прибавить некоторое число к другому числу, которое уже находится в накапливающем регистре, и перенести это второе число в ячейку, из которой было взято первое. В коде ЭВМ «Эллиотт» насчитывается 30—40 различных комбинаций такого рода, и он очень прост, гибок и легко запоминается (во всяком случае, если пользоваться им постоянно).

Так как все вычисления построены на элементах такого рода, ясно, что с помощью машинного кода можно составить программу для выполнения любой последовательности арифметических действий. Все операции, которые можно выполнять на настольной счетной машине, в том числе запись чисел, передачу их или воспроизведение, имеют соответствующие эквиваленты в машинном коде. Разумеется, при большой последовательности вычислений составление программы для вычислительной машины — весьма утомительное занятие, поглощающее много времени; однако хорошо составленная программа позволяет эффективно использовать возможности вычислительной машины по быстродействию. Программисты с большим опытом работы составляют хорошие программы для ЭВМ довольно быстро. Но для тех лиц, которым приходится пользоваться вычислительной техникой и у которых нет времени или, возможно, способностей приобрести эти навыки, необходимы некоторые более простые средства общения с машиной. Для этой цели разработаны различные виды автоматического программирования, или автокоды, в которых команды записываются в обычной словесной или алгебраической форме, а затем машина сама переводит их в эквивалентные варианты машинного кода.

Так, рассмотренный здесь пример машинного кода для ЭВМ «Эллиотт» в варианте автокода записывается просто через х, у и третье число, которое можно обозначить через в следующем виде:

(в этом автокоде используются только заглавные буквы). Здесь X, Y и Z обозначают три ячейки, а выражение представляет собой не уравнение, а команду «заменить содержимое ячейки Z суммой чисел из ячеек X и Y». Если эту сумму нужно хранить в ячейке, первоначально занятой числом X, то команда записывается в виде Это выражение более наглядно показывает, что мы имеем дело с командами, алгебраическими по своей форме, хотя это и не настоящая алгебра в истинно математическом смысле.

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

Таким путем можно записать все основные арифметические действия, но с одним ограничением: одновременно можно выполнять действия только над двумя числами. Если требуется сложить три числа А, В и С и поместить результат в ячейку D, то это запишется примерно в таком виде:

т. е. сумма вначале помещается в ячейку D, а затем к этому числу прибавляется С. Автокод ЭВМ «Эллиотт» предусматривает также возможность выполнения операций над простейшими алгебраическими и тригонометрическими функциями (логарифмическими, показательными, квадратными корнями, синусами, косинусами и т. д.), а также позволяет легко считывать данные и печатать выходные данные.

В качестве простого примера полной программы, записанной через значения выдачей на печать результата можно выбрать следующий:

Мы не предполагаем рассматривать здесь этот вопрос более детально. Однако заметим, что операция умножения обозначается звездочкой, а в начале программы мы «объявляем» названия переменных X, Y и Z и название функции, которую мы собираемся вычислять: КВАДРАТНЫЙ КОРЕНЬ.

Такие программы можно легко составить для выполнения довольно сложных вычислений. Как уже подчеркивалось, при этом необходимо предусмотреть обеспечение точности работы и применять специальные приемы для проверки вычислений.

Одна из самых важных особенностей автоматического программирования состоит в том, что оно позволяет очень просто и компактно записывать команды для выполнения продолжительного цикла повторных операций. Допустим, например, что на магнитной ленте записаны N чисел и требуется найти их сумму S. В автокоде ЭВМ «Эллиотт» эти операции выражаются следующей последовательностью команд (которая может составлять небольшую часть значительно большей программы):

Часть программы между ИЗМЕНЯТЬ и ВЕРНУТЬСЯ К 1 выполняется многократно для Каждый раз, когда подается команда СЧИТАТЬ X, с магнитной ленты считывается новое число, а в следующей строке оно прибавляется к числу, уже имеющемуся в ячейке S. Чтобы вычисления начинались с перед переходом к циклу программы устанавливают (в противном случае прибавлялось бы к числу, которое осталось в ячейке S после выполнения некоторых предыдущих вычислений). Когда данный цикл программы завершен, вычислительная машина переходит к выполнению следующей части программы. Существует несколько различных способов обозначения таких циклов. Возможен также переход назад или вперед в определенные пункты программы при подаче команды перехода.

Существуют самые различные типы автокодов, но обычно каждый из них применим лишь для машин определенного типа или близких по типу машин. Поэтому были созданы более универсальные языки программирования, которые могут применяться в ЭВМ различного типа. Записанная на таком языке программа, разработанная для одной машины, пригодна для управления вычислениями на любой другой машине, которая может перевести универсальный язык в собственный машинный код. В Европе широко используется язык программирования АЛГОЛ (акроним, образованный из начальных букв выражения ALGOrithmic Language — алгоритмический язык). Во-первых, это более мощный и изящный язык для записи порядка вычислений, чем любой автокод.

Во-вторых, в настоящее время электронные вычислительные машины самых различных типов имеют трансляторы (компилирующие устройства) для перевода с языка АЛГОЛ, хотя нередко машины несколько отличаются друг от друга по своим характеристикам. Для многих машин наиболее общая форма языка АЛГОЛ (часто обозначаемая АЛГОЛ-60) неприменима, а входные и выходные устройства машин различного типа обычно отличаются друг от друга. Тем не менее благодаря применению языка АЛГОЛ достигается большая универсальность и взаимозаменяемость.

Мы не будем подробно рассматривать здесь язык АЛГОЛ, а ограничимся лишь двумя простыми примерами. Полное изложение этого вопроса можно найти в книгах Дийкстра [18], Мак-Кра-кена [42] и Наура [46]. Одна из важных особенностей языка АЛГОЛ состоит в том, что алгебраические формулы почти любой сложности могут быть включены в программу в более или менее первоначальном виде, без расчленения их на простые этапы, как в автокоде ЭВМ «Эллиотт». Так, элементы рассмотренной выше программы в автокоде для вычисления на языке АЛГОЛ для ЭВМ «Эллиотт-803» имеют вид 1

а пример программы вычисления суммы, содержащей цикл, принимает вид 2

Заметим, что теперь вместо знака = используется := , что отдельные утверждения отделяются друг от друга точкой с запятой и что слова begin и end рассматриваются как скобки с тем, чтобы слово do относилось к обоим последующим утверждениям.

Другим важным машинным языком, широко используемым в США, а также в Европе и других частях мира, является язык ФОРТРАН (акроним, составленный из начальных букв слов FORmula TRANslator — преобразователь формул), используемый в вычислительных машинах IBM. Между сторонниками языков ФОРТРАН и АЛГОЛ идет большая полемика по поводу относительных достоинств каждого из них.

В нашу задачу не входит обсуждение этого вопроса, хотя ради справедливости следует отметить, что оба языка очень удобны для научных вычислений и применяются с большим успехом. Обработка данных представляет собой более сложную задачу; в этом случае выбор языка зависит от объема данных, подлежащих обработке, и от требуемого объема численного анализа. Для решения торгово-промышленных задач очень удобен язык КОБОЛ (COBOL — акроним, составленный из начальных букв выражения COmmon Business Oriented Language — общий язык для коммерческих расчетов). Он составлен главным образом из слов и выражений английского языка, но содержит также некоторые элементарные арифметические операции.

Научиться кодировать вычисления в автокоде или на каком-либо другом символическом языке, например АЛГОЛ или ФОРТРАН, относительно несложно. Чтобы стать квалифицированным программистом, необходимы достаточная практика и опыт, однако научиться составлять простые программы можно за несколько часов. Более трудной задачей является составление эффективного алгоритма вычислений, или программирование в узком смысле слова. Некоторые вычисления, абсолютно правильные с математической точки зрения, на практике могут оказаться неудовлетворительными вследствие ограничений, свойственных программирующему языку (и ограничений, присущих используемой вычислительной машине). Часто для облегчения выбора методики вычислений крайне важно знать порядок кодирования последовательности арифметических действий. Многие научные работники предпочитают по возможности использовать для кодирования своих задач специально обученный персонал, однако ответственность за общую структуру вычислений все же лежит на них. Поэтому особенно большую роль играет программист, который может разработать общую схему и составить последовательность вычислений, а также обеспечить наиболее эффективное использование средств соответствующего машинного языка.

<< Предыдущий параграф Следующий параграф >>
Оглавление