МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ
С. ЛАВРОВ, ЧЛ.-КОРР. АН СССР
Математик составил уравнения, описывающие сложный процесс. Но решить их на электронно-вычислительной машине нельзя, покуда программист не переведет их с языка формул и символов, понятных человеку, на язык цифровых команд, понятных машине. Комплекс программ, облегчающих труд программиста, и называется математическим обеспечением.
Член-корреспондент АН СССР С. ЛАВРОВ.
Роль электронных вычислительных машин (ЭВМ) в современной науке и технике общеизвестна. Машины были задуманы, и созданы, как средство механизации громоздких вычислений, и именно в этом направлении они применяются особенно успешно. Появление ЭВМ способствовало развитию приложений математики. Именно благодаря ЭВМ математика добилась успехов во многих новых областях своего применения. Это дало основание говорить о математизации различных отраслей науки, дало повод для радужных прогнозов о продолжении этого процесса. Хотя принципиально эти прогнозы верны, дело обстоит далеко не просто.
Для того, чтобы можно было рассчитать интересующее нас явление, подвергнуть его математическому анализу, должны быть выполнены некоторые условия. Должна существовать математическая теория явления, описывающая его закономерности в виде формул. Такой набор формул называют математической моделью явления. Лишь в очень простых, и редких случаях модель является в то же время и расчетной схемой, то есть позволяет по имеющимся исходным данным получить требуемые результаты. Как правило, модель определяет искомые величины неявно, в виде системы зависимостей, которым они должны удовлетворять. В проектировании, когда исследуемое явление - это машина, которую надо построить, сооружение, которое надо возвести, такая система зависимостей обычно неполна, она оставляет проектанту большую или меньшую свободу выбора. Выбор надо произвести так, чтобы получить наилучшее значение некоторого критерия. Назначение этого критерия также входит в математическую модель.
Когда критерий назначен или написана полная система зависимостей (уравнений), определяющих исследуемое явление, задача становится уже чисто математической. («Задача поставлена», - говорят в таком случае математики.)
От постановки математической задачи до ее решения лежит долгий, и трудный путь. Современная математика способна решить далеко не все задачи, уже обладающие четкой постановкой. Многие из них еще ждут своего решения. В ожидании практики вынуждены огрублять и упрощать постановки задач, чтобы суметь воспользоваться тем, что может им предложить современная математика.
Следующий этап - это реализация выбранного метода на вычислительной машине. На первый взгляд может показаться, что этот этап не заслуживает внимания, поскольку на нем никаких принципиальных трудностей возникнуть не может. Ведь конечный результат предыдущего («постановочного») этапа - метод решения задачи - описан математическим языком, то есть достаточно формально. Программа для ЭВМ - это также формальное описание того же метода. Казалось бы, превратить одно формальное описание в другое - дело несложное, и тоже формальное, то есть может быть выполнено механически. Это верно, но лишь до некоторой степени. Программист хорошо чувствует, как отрывочно, приблизительно и и неполно описывают математики методы решения задач, даже чисто вычислительных. Это, и понятно математик, как любой автор, рассчитывает на известный уровень знаний, опыта и интуиции своего читателя. Все эти качества присущи лишь человеку. Машина если, и обладает, каким-то подобием знаний и опыта, то лишь на зачаточном уровне, и в совсем иной форме, чем человек. Она вовсе лишена интуиции. Для разговора с машиной человек вынужден пользоваться или её собственным языком, или в лучшем случае языком, значительно более формализованным, а, следовательно, и более бедным, чем «человеческий» язык, которым пользуются математики.
С другой стороны, язык вычислительной машины хотя, и формален, но далеко не абстрактен, а весьма конкретен. Например, математик на каждом шагу пользуется такими понятиями, как бесконечное множество вещественных чисел. Эти понятия основываются на идее непрерывности, безграничной делимости числовой прямой. Ничего подобного в машине нет. В машине все конечно, ограничено и дискретно. Так называемые «арифметические операции» в вычислительной машине, строго говоря, не имеют ничего общего с математическими операциями над вещественными числами. Машина выполняет приближенные операции над приближенными представлениями вещественных чисел. Так же поступает, и человек-вычислитель, но в машине действуют дополнительные ограничения, связанные с тем, что определенные способы приближенного представления чисел и действий с ними встроены в ее конструкцию.
Итак, решение задачи на машине распадается на несколько этапов построение математической модели явления, исследование этой модели, и переход от нее к расчетной схеме, собственно программирование - перевод схемы на язык машины - и, наконец, контроль за выполнением программы машиной.
В этой статье речь пойдет о том, как облегчить и упростить два последних этапа. Хотя на первый взгляд они проще предыдущих, на самом деле это зачастую далеко не так. Не надо забывать, что современная математика, механика, и другие математические дисциплины развивались веками, а история программирования едва насчитывает два-три десятилетия.
Комплекс программ, облегчающих труд программиста, называют математическим обеспечением. В истории его развития, так же, как и в истории развития самих ЭВМ, можно выделить три поколения.
ПЕРВОЕ ПОКОЛЕНИЕ - ЭПОХА МАШИННЫХ ЯЗЫКОВ
Первой разновидностью математического обеспечения в современном смысле этого слова были стандартные подпрограммы.
Программисты, обслуживавшие самые первые электронные машины, заметили, что существует целый ряд таких стандартных операций, которые приходится включать почти в каждую программу вычислительного характера. Среди них можно назвать операцию перевода чисел из десятичной системы счисления, привычной для человека, в двоичную, в которой работают машины, вычисление элементарных функций (синус, арктангенс, логарифм, и т. д.). Было решено составить раз и навсегда программы для выполнения этих стандартных вспомогательных операций, и использовать такие стандартные подпрограммы без изменений при решении более общих задач. Часто стандартные подпрограммы «впаивались» в постоянную память машины, расширяя набор ее операций; это значит, что конструкторы машин хорошо понимали в то время, что математическое обеспечение - неотъемлемая принадлежность ЭВМ. Затем появились подпрограммы ввода информации и вывода результатов, без которых вскоре не мог уже обходиться ни один программист, так, как любая программа составлялась для обработки, каких-то исходных данных, которые вместе с самой программой нужно было вводить в машину, и для получения результатов, которые нужно было выводить, затрачивая на это, как можно меньше человеческого труда и используя форму представления, наиболее удобную для человека. Со временем появлялись все новые, все более разнообразные стандартные подпрограммы аппроксимация функций, интерполяция, решение систем линейных уравнений, решение нелинейных алгебраических, и трансцендентных уравнений и их систем, вычисление определенных интегралов, численное решение обыкновенных дифференциальных уравнений, вычисление специальных функций, отыскание экстремумов функций одной, и многих переменных, обработка статистических данных, моделирование на машине случайных величин и процессов.
Пока число стандартных подпрограмм было невелико, они размещались каждая на своем месте в оперативной памяти. Место, не занятое стандартными подпрограммами, нужными в данной задаче, оставалось в распоряжении программиста. Но скоро подпрограмм стало так много, что уже нельзя было для каждой из них выбрать свое постоянное’ место, да, и разбросанность их по всей оперативной памяти причиняла неудобства. Надо было научиться двигать подпрограммы с места на место.
Чтобы механизировать эту работу, были созданы так называемые компилирующие и интерпретирующие системы использования стандартных подпрограмм, хранящихся во внешней памяти машины или даже на перфокартах. В случае компиляции подпрограммы вводятся в оперативную память однократно; в режиме интерпретации подпрограмма вызывается каждый раз, когда основная программа должна к ней обратиться. Компилирующие, и интерпретирующие системы позволяли довольно легко включать в программу не только стандартные подпрограммы, но и любые куски, написанные любым программистом в стандартной для данной машины форме.
Стандартные подпрограммы, и системы их использования, родившиеся на первом этапе развития математического обеспечения, не утратили своего значения до сих пор, и было бы большой ошибкой при создании любой современной системы программирования пренебрегать библиотекой стандартных подпрограмм.
Составление стандартных подпрограмм, как, и все программирование, велось вначале исключительно на машинном языке. Программирование было новым и довольно увлекательным занятием, своего рода искусством. Программистов на первых порах требовалось не очень много, и ими обычно становились довольно квалифицированные математики. Овладеть тонкостями программирования на машинном языке для них не представляло большого труда. Составление, как можно более коротких и быстро работающих программ вызывало спортивный азарт. Единственной досадной вещью было то, что машинные команды требовалось писать в понятном для машины числовом виде например 001 1706 3425 7730. (Даже эта запись является сокращением истинного вида команды, представляющей собой такую последовательность нулей, и единиц:
ООО 000 001 001 111 000 110 011 100
010 101 111 111 011 0001.)
Написанная команда является машинным эквивалентом формулы, которая в обычных буквенных обозначениях имеет, допустим, вид:
х = a + Ь,
если, распределяя память, программист отвел для величины, а ячейку с адресом 1 706, для b - ячейку 3 425 и для х - ячейку 7 730, а код «001» обозначает сложение. Конечно, программисту хотелось бы написать «числовую» команду в привычном «буквенном» виде. Так, и стало поступать большинство программистов. Машинные команды они записывали в «буквенном» виде, затем составляли таблицу распределения памяти, которая выглядела так:
а 1 706
b 3 425
х 7 730
После этого перекодировка программы от букв к числам становилась чисто механической работой и могла быть поручена лаборанту. Наиболее сообразительные программисты поняли, что эту работу быстрее, и аккуратнее лаборанта может выполнить сама машина. Так родились языки символического кодирования и «автокоды 1:1» - программы, осуществляющие перевод с языка символического кодирования в машинный язык. Языки символического кодирования оставались машинными языками, но с использованием буквенных обозначений адресов вместо цифровых. Символ «1:1» в названии автокода подчеркивал взаимно-однозначное соответствие между командами в языке символического кодирования, и в машинном языке.
Далее было замечено, что подавляющее большинство программ составляется с использованием небольшого числа правил, гарантирующих приемлемое качество программирования. Так, например, для вычислений по формуле с у =, а + х + c/z
любой программист напишет (для трехадресной машины) три команды:
r =, а + х
r1 = c/z
y = r + r1
Но те же три команды может составить и автокод, если его дополнить некоторыми новыми разделами, устанавливающими по обычным правилам порядок действий в арифметических формулах. Другие дополнительные разделы автокода могли включать в программу команды, обеспечивающие в нужных случаях разветвление вычислительного процесса, циклическое повторение участков программы, и другие операции, вытекающие из структуры задачи.
Так постепенно автокоды утратили приставку «1:1», а их входные языки стали не чисто машинными, а машинно-ориентированными. Машинная ориентированность означает, что в основе этих языков продолжала лежать система команд, какой-либо конкретной вычислительной машины.
Таким образом, первое поколение системы математического обеспечения было тесно связано с программированием на языке машины. В силу особенностей машинных языков, далеких от традиционной символики, и в связи с трудоемкостью самого процесса программирования редкую программу удавалось написать без ошибки. Ошибки появлялись, и в результате простых описок, и при перфорации программ, и потому, что программист писал не те команды, которые он хотел написать, то есть не соответствующие выбранному им алгоритму - методу решения задачи, и потому, что сам выбранный метод не соответствовал поставленной задаче, не давал ее решения. Все ошибки надо было найти, и исправить. Эта работа называется отладкой программ. Часто на отладку уходило больше времени, чем на решение задачи по отлаженной программе.
Отладку обычно вел сам программист за пультом машины. При этом применялись следующие основные приемы. Выполнялась часть программы до того места, где подозревалось появление ошибки. Просматривалось содержимое некоторых ячеек памяти. Выполнялась часть программы в однотакг-ном режиме - операция за операцией, - при этом надо было следить за содержимым регистров машины, в которых содержатся адрес команды, сама выполняемая команда и величины, над которыми производится данная операция (операнты). По мере необходимости отпечатывалось содержимое тех или иных ячеек или группы ячеек, и т. д.
Все это требовало больших затрат машинного времени. За время раздумий и манипуляций программиста машина, даже не очень быстродействующая, успела бы выполнить сотни тысяч, если не миллионы команд. Ясно, что эту работу необходимо было механизировать, и ускорить.
Были созданы различные программы отладки. Они позволяли значительно сократить потери времени. Однако многие программисты отказывались от их применения.
Их можно легко понять. За пультом программист ведет отладку активно, то и дело меняя план своих действий в зависимости от получаемых сведений. Сам процесс общения со своей программой, наблюдение за ее жизнью доставляют массу впечатлений, не всегда приятных («Вот шляпа-то!» - типичная реакция на обнаруженную ошибку), но всегда волнующих. Программиста охватывает азарт, он исправляет одну ошибку (делая при этом новую), другую, пытаясь заставить программу наконец-то работать правильно. Отладка за пультом - это одно из самых эмоционально насыщенных занятий, требующее от программиста максимальной внимательности, сообразительности, быстрой реакции. Далеко не каждый программист обладает требуемыми качествами, чтобы быстро добиваться успеха в отладке.
Шло время. В работу на машинах вовлекалось все больше лиц, далеких от математики. Машины находили все более разнообразное применение, спрос на них обгонял рост их выпуска. Машинное время стало цениться дороже. Большинство машин использовалось круглосуточно, а заниматься отладкой по ночам соглашались лишь немногие энтузиасты. Надо было находить другие приемы программирования, облегчающие этот процесс, уменьшающие вероятность ошибок в программах, и другие методы организации работы на машинах. Создание таких приемов и методов означало приход второго поколения систем математического обеспечения.
ВТОРОЕ ПОКОЛЕНИЕ - ЭПОХА АЛГОРИТМИЧЕСКИХ ЯЗЫКОВ
Это поколение проникнуто духом коллективной работы на машинах. Математики, без которых на первых порах трудно было бы обойтись, начали решать задачи совместно с экономистами, биологами, лингвистами, и представителями других специальностей, прежде далеких от использования математических методов. Сами задачи становились сложнее; труднее и не посильнее для памяти одного человека становились программы их решения. Если раньше обмен программами, совместная работа над ними были редки, то теперь стали появляться большие программы, пользоваться которыми должны были сотни, и тысячи человек. Разрабатывались такие программы коллективами, объединявшими десятки программистов.
Коллективный дух поколения сказался и на организации счета. Программистов перестали пускать за пульт. От них стали требовать, чтобы они писали инструкции к своим программам, описывая последовательность действий по запуску программы, отладочные операции, объем, и характер материала, выводимого на печать, признаки нормальной или, наоборот, неправильной работы программы, ожидаемое время счета и т. д. За пультом стали работать лаборанты-операторы, от которых требовалось лишь точно выполнять требования инструкции, не вникая в смысл программы. Дисциплина программирования (и поведения в машинном зале) укрепилась, но радость живого общения со своей программой была утрачена.
Разумеется, возможность такой организации работы была обусловлена развитием тех средств математического обеспечения, о которых говорилось выше, и в первую очередь программ отладки, позволявших обойтись без автора программы во время ее работы.
Символом второго поколения стали проблемно-ориентированные языки программирования (алгоритмические языки) - прямые потомки входных языков автокодов. Их развитие все в большей степени определялось спецификой задач, а не особенностями машин. На первый план выступило то общее, что было в различных задачах, а это сближало разные языки, развивавшиеся в эпоху господства вычислительных задач.
Появление языков, целиком ориентированных на специфику задач и не зависящих от конкретной машины, стало тем более неизбежным, что машины разных марок быстро сменяли одна другую или использовались совместно. Обучать армию программистов каждому новому машинному языку стало трудно, и нерентабельно.
Одним из первых и наиболее удачных языков такого рода стал ФОРТРАН - детище фирмы ИБМ (США). Он не только просуществовал до наших дней, но, и уверенно удерживает первое место в мире по распространенности, особенно в западных странах. Среди причин такого долголетия можно отметить простую структуру, как самого ФОРТРАНа, так и предназначенных для него трансляторов (так стали называться программы перевода с машинно-независимых языков на машинные языки, а потом, и вообще программы перевода с одного искусственного языка на другой). С их помощью получались машинные программы (результат трансляции) хорошего качества, лишь немного уступающие программам, составленным для решения таких же задач вручную программистами средней квалификации.
Через несколько лет после ФОРТРАНа появился язык АЛГОЛ-60, созданный на основе широкого международного сотрудничества. Ему не удалось превзойти ФОРТРАН по совокупности своих качеств, но он повсеместно признан, как весьма удобное средство для публикации алгоритмов и для обучения основам программирования.
В основе обоих языков лежит понятие выражения, практически совпадающее с понятием математического выражения, использующего лишь алгебраические операции, и элементарные функции. Простейшие объекты, с которыми можно иметь дело, - это целые и приближенные вещественные числа.
С помощью выражений можно записывать формулы, позволяющие присваивать значения выражений переменным. Для связи формул друг с другом в языках рассматриваемого класса применяется небольшой набор стандартных конструкций типа «если...то.» или «для i от 1 до N вычислить.», и т. п. Наконец, эти языки дают возможность описывать часто повторяющиеся части программ в виде более или менее самостоятельных кусков (процедур). К процедуре можно многократно обратиться из одной и той же программы, но, что более важно, ее можно без изменений или почти без изменений включить в любую другую программу. Это чрезвычайно облегчает обмен результатами труда программистов.
И ФОРТРАН, и АЛГОЛ-60 до недавнего времени по праву заслуживали название универсальных языков, так, как обеспечивали программирование основной массы научно-технических задач (преимущественно вычислительных) Но ни один из этих языков, конечно, не позволял описать все без исключения возникавшие задачи. Поэтому примерно в то же время появились алгоритмические языки с другой ориентацией, отвечавшие нуждам тех новых направлений, которые стали интенсивно развиваться в последующие годы.
Ради примера среди них можно отметить экономические задачи. Это главным образом задачи учета материальных ценностей, выпущенной продукции, выполненных работ, личного состава и в конечном счете финансов предприятия, фирмы или отрасли. К ним примыкают задачи управления производством, и планирования. Для большинства этих задач характерен большой объем исходной и результирующей информации, и относительно очень небольшое количество вычислений. Типичный ход решения таких задач заключается во вводе информации с внешнего запоминающего устройства в оперативную память (обычно отдельными порциями), несложной ее обработке (простые вычисления, сортировка по, какому-нибудь признаку) и выводе на внешний носитель (магнитную ленту, диски, реже - на перфокарты). Для описания действий такого рода той же фирмой ИБМ был предложен язык КОБОЛ, также имевший, и сохранивший заслуженный успех среди пользователей. Существует много других языков для той же цели.
Задачи обработки символьной информации возникают преимущественно в области научных исследований. Это, например, преобразование формул, решение уравнений (не численное, а в аналитическом виде), анализ, и синтез текстов на искусственном или естественном языке (в частности, автоматическое программирование, и машинный перевод), и т. п. Упомянем два языка, предназначенных для описания подобных задач.
В языке ЛИСП вся находящаяся в обработке информация, в том числе, и сама программа, организуется в так называемые списки - последовательности элементов. Элемент может быть первичным (буквенным обозначением или числом) или, в свою очередь, списком. Так могут возникать сколь угодно сложные структуры. Примером может служить алгебраическое выражение, в котором всегда можно выделить главный знак операции-той операции, которая должна выполняться последней в этом выражении. Этот знак, и два соответствующих операнта образуют список из трех элементов. Операнты, если они не являются первичными элементами, могут быть подвергнуты такому же анализу, и т. д. С выражением, в котором таким способом выделена его структура, легко производить различные действия. Язык ЛИСП сейчас очень популярен, преимущественно среди представителей наук физико-математического цикла, так, как его применение требует известной математической культуры.
Язык СНОБОЛ, наоборот, пользуется успехом у гуманитариев. (Он применяется, например, для машинного анализа текстов, написанных на естественных языках.), в нем основным понятием является строка - произвольная последовательность букв, цифр, и других знаков. Главная операция - поиск в строке части строки, построенной по заданному образцу, и замена этой части другой строкой. Как образец, так, и замена составляются из отдельных элементов простого вида. Исход поиска определяет последовательность дальнейших действий. Язык крайне прост для изучения.
Основное достоинство проблемно-ориентированных, машинно-независимых алгоритмических языков в том, что они были построены с максимальным учетом представлений человека если не о существе, то о форме решаемой задачи, с максимальным приближением к той форме, в которой человек привык описывать эти задачи, и с учетом тех логических связей, которые он привык выделять в исследуемых явлениях.
Для АЛГОЛа, например, характерно приближение к привычной математической символике (но, конечно, и лучшее, чем у его предшественников, отражение структуры вычислительной задачи). Для ЛИСПа - использование аппарата так называемых рекурсивных описаний, широко применяемого в математической логике, в исследованиях по основаниям математики, и т. п.
Благодаря этим свойствам проблемно-ориентированных языков овладевать ими было гораздо легче, чем машинными языками. Ошибки в программах стали появляться гораздо реже, упростилась, и ускорилась отладка. Программы, которые правильно работали с первого же запуска, перестали быть редкостью. И хотя использование алгоритмических языков связано с потерями времени на трансляцию, да, и транслированные программы работают медленнее, чем составленные вручную, общие затраты машинного времени на решение задачи - от начала программирования до получения результатов - сильно сократились.
ТРЕТЬЕ ПОКОЛЕНИЕ - ЭПОХА МУЛЬТИПРОГРАММИРОВАНИЯ
С ростом производительности машин усложнялась работа операторов за пультом. Встал вопрос о механизации их труда. Потребовалось внести некоторые изменения в конструкцию машин, чтобы каждая аварийная ситуация, а также окончание счета приводили не к останову машины, как раньше, а к так называемому прерыванию решения задачи. Чем одно отличается от другого? После останова требуется вмешательство человека, чтобы машина возобновила работу. При прерывании начинает работать специальная программа. Она разбирается в причине прерывания, и в зависимости от ситуации либо предпринимает стандартные действия (например, при делении на нуль производит аварийную выдачу отладочной информации, по окончании задачи очищает память, и вводит следующую задачу, может быть, печатая протокольные сведения о закончившейся), либо выполняет действия, указанные * в программе-инструкции, составленной в дополнение к основной программе. Лишь в крайнем случае, например, при неправдоподобных для исправной машины явлениях, машина останавливается, и для ее повторного запуска необходимо участие человека. Но в этом случае предварительно может быть вызван тест - программа, проверяющая работу машины, обнаруживающая характер, и причину возможной неисправности.
Во всех других случаях решение задач осуществляется непрерывным потоком. Такой режим получил название режима пакетной обработки задач. Роль оператора, работающего при исправной машине, свелась лишь к смене бумаги на печатающем устройстве, подкладыванию на читающее устройство новых пакетов программ, и т. п. Человек почти перестал тормозить, и нарушать работу машины.
Основные устройства машины получили возможность работать параллельно. При этом оказалось даже необходимым для равномерной загрузки всех устройств пропускать на машине сразу несколько программ. Пока, к примеру, для одной задачи считывается очередная порция данных с магнитной ленты, для другой задачи можно подготовить вывод результатов на печать, а пока идет печать, точнее, пока арифметическое устройство свободно от подготовки очередной строки для печати, его можно загрузить вычислениями для третьей задачи. Как только закончится чтение с ленты или печать строки, эти вычисления будут прерваны, и продолжено решение первой задачи или соответственно подготовка новой печатной строки для второй задачи, и т. д. Такой режим работы назван многопрограммным режимом, или мультипрограммированием.
Организация многопрограммной работы потребовала создания сложных управляющих программ. Одна из них (супервизор) реагирует на сигналы прерывания, идущие от различных устройств самой машины, и координирует работу этих устройств; другая (монитор) планирует, и организует прохождение нескольких задач, учитывая их приоритет (срочность), ожидаемую продолжительность работы, характер загрузки ими внешних устройств, их потребность в тех или иных ресурсах машины (оперативной памяти, устройствах ввода-вывода, и внешних запоминающих устройствах).
Кроме того, в состав операционной системы (так стали называть весь комплекс управляющих, и обслуживающих программ) входят уже упоминавшиеся библиотеки стандартных подпрограмм, трансляторы с алгоритмических языков, архивы для более или менее длительного хранения информации, нужной отдельным пользователям, и их группам» тесты, и диагностические программы для обнаружения, и локализации неисправностей машины. Операционная система должна организовать четкое взаимодействие всех этих «служебных» программ по запросам, поступающим от программ различных пользователей, с учетом степени загрузки устройств машины.
На многопрограммных машинах появились новые виды внешних устройств - выносные пульты. Такой пульт оборудован телетайпом, клавиатура которого позволяет одновременно с печатью вводить информацию в машину. На то же печатающее устройство может выводиться информация из машины. Кроме телетайпа, на пульте могут быть читающие, и перфорирующие устройства (обычно для бумажной перфоленты), а также экран с лучевой трубкой, на котором по сигналам от машины может высвечиваться разнообразная информация текст, графики, и другие изображения.
С помощью таких пультов к машине могут быть подключены одновременно несколько человек. Сигналы с пультов поступают по меркам современных машин в очень медленном темпе. На одновременный прием, и передачу данных с нескольких десятков пультов машина расходует относительно небольшую часть своего времени. Но ведь поступающая с каждого пульта информация - программа решения некоторой задачи - должна обрабатываться. Все потребные для этого ресурсы - в первую очередь оперативная память, и центральное устройство - выделяются для выполнения программ, вводимых с пультов, на очень короткое время, и притом небольшими порциями (квантами) - по порции на очередную задачу. Отсюда, и название такого режима работы - система разделения времени. Человек, работающий за выносным пультом, как бы получает в свое распоряжение однопрограммную машину с большой памятью, разнообразными внешними устройствами, и неплохой скоростью работы. То, что эта скорость много меньше истинного быстродействия машины, обслуживающей пульты, человек не ощущает.
НА ПУТИ К УНИВЕРСАЛЬНОМУ ЯЗЫКУ ПРОГРАММИРОВАНИЯ
Обилие алгоритмических языков, появившихся в период второго поколения, во многом объясняется модой. Но имелись, и более существенные причины для создания новых языков, и вариантов старых, как уже отмечалось, ни один из предложенных языков не позволял удобно описывать все возникавшие задачи.
Третье поколение поставило на повестку дня выработку нового подхода к созданию действительно универсального алгоритмического языка.
Одной из попыток такого рода был язык ПЛ1, предложенный опять-таки фирмой ИБМ. В его основе лежали языки ФОРТРАН, и КОБОЛ, ряд изобразительных средств, и понятий был почерпнут из АЛГОЛа, и других языков, в частности языков для обработки символьной информации. Однако этот язык в основном построен на базе понятий второго поколения, и в его традициях.
Другое направление связано с деятельностью Рабочей группы 2. I Международной федерации по обработке информации, взявшей на себя ответственность за дальнейшее развитие АЛГОЛа. Члены группы пошли по линии обобщения, и углубления основных понятий в области обработки информации. Они стремились свести число этих понятий к разумному минимуму, и добиться высокой изобразительной силы языка, обеспечив свободу сочетания, и взаимодействия этих понятий между собой. Большинство этих идей в той или иной степени отражено в проекте языка АЛГОЛ-68.
Но, и АЛГОЛ-68, который, как кажется на первый взгляд, обеспечивает все нужды программистов, все еще слишком традиционен. Эта традиционность проявляется именно в стремлении обеспечить всех пользователей готовыми средствами для описания их алгоритмов. До сих пор этот подход не мог предотвратить появления все новых специализированных языков. Но, может быть, и не нужно бояться обилия этих языков? Может быть, следует попытаться сконструировать язык, не предназначенный непосредственно для программирования, а служащий основой для создания специализированных языков-диалектов?
Опыт показывает, что без таких диалектов в программировании не обойтись. Они возникали, и будут возникать по той же причине, по, какой в различных отраслях науки, и техники складывается своя терминология, создается свое оборудование, по той причине, наконец, по, какой вообще возникают отдельные науки, и их отрасли.
Но научная терминология складывается на основе повседневного языка, научные приборы создаются на базе общей промышленной технологии, да, и сами разнообразные научные направления, и дисциплины представляют собой развитие, и применение сравнительно небольшого числа фундаментальных законов к специфическим условиям, и объектам исследования. Так, и программистские «диалекты» при всем их разнообразии имеют много общего, и могут строиться на общей основе.
Такая основа - расширяемый универсальный язык - пока еще не создана, хотя попытки в этом направлении в последние годы предпринимались. Сейчас рано говорить, к чему они приведут, но уже можно отметить некоторые характерные черты будущего расширяемого языка. Он должен располагать средствами для грамматического разбора текстов любого из расширений - для того, чтобы выяснять, какие тексты являются грамматически правильными для данного диалекта, и, какой структурой они обладают. Расширяемый язык должен дать будущим его потребителям целый ряд важных возможностей например строить семантические модели (то есть вводить новые термины, и описывать выражаемые ими понятия, их взаимосвязь с некоторыми основными, исходными понятиями, и с понятиями, введенными ранее), и описывать реализацию расширений - способы их наиболее целесообразного представления с помощью средств, которыми располагают современные ЭВМ,
Читайте в любое время

