Текст
                    ЯЗЫК КОМПЬЮТЕРА
Издательство <Мир>

ЯЗЫК КОМПЬЮТЕРА
UNDERSTANDING COMPUTERS SOFTWARE COMPUTER LANGUAGES By the editors of Time-Life Books Time-Life Books, Alexandria, Virginia 1986, 1987
язык КОМПЬЮТЕРА Перевод с английского канд. физ.-мат. наук С. Е. Морковина и В. М. Ходукина под редакцией канд. физ.-мат. наук В. М. Курочкина Москва «Мир» 1989
ББК 32.973.2 Я41 УДК 681.3.066(0.062) Язык компьютера. Пер. с англ. Под ред. и с предисл. Я41 В. М. Курочкина. — М.: Мир, 1989.— 240 с., ил. ISBN 5-03-001148-Х Вторая книга из серии, выпущенной американским издательством «Тайм-Лайф» (в русском перево- де вышла книга «Знакомьтесь: компьютер» и планируется к изданию — «Компьютер обретает разум»), посвящена важнейшей проблеме вычислительной техники — программному обеспечению, без которого немыслима работа компьютеров. Доступно и увлекательно рассказывается о методах и задачах про- граммирования, о многочисленных языках программирования — интернациональном средстве общения человека с машиной. Богатый иллюстративный материал повышает наглядность изложения, помогая восприятию. Адресована всем, кто интересуется развитием и применением вычислительной техники. я 2404000000—284 041(01)—89 ББК 32.973.2 132—89, ч. 1 Редакция научно-популярной и научно-фантастической литературы ISBN 5-03-001148-Х (русск.) © 1985, 1986 Time-Life Books Inc. ISBN 0-8094-5658-3 (англ.) © состав, перевод на русский язык, Морковин С. Е., Ходукин В. М., 1989 ISBN 7054 0916 3 (англ.)
Предисловие редактора перевода Мы предлагаем вниманию читателя вторую книгу из науч- но-популярной серии, посвященной современным вычисли- тельным машинам, которую выпускает американское из- дательство «Тайм-Лайф». Ранее в русском переводе вышла книга «Знакомьтесь: компьютер» (возможно, вы уже успе- ли ее приобрести!), повествующая об истории создания компьютеров, принципах их построения и функционирова- ния, об их многочисленных применениях. Теперь читатель получает возможность познакомиться с более специаль- ным вопросом: каким образом удается заставить компью- тер решать разнообразные задачи? Не случайно одним из самых первых названий этого устройства было универ- сальная цифровая вычислительная машина. При всей своей громоздкости такое название более точно передает смысл и назначение компьютера, подчеркивая, что в прин- ципе на нем можно решить любую задачу (разумеется, ес- ли существует способ ее решения и если мощность ма- шины достаточна, чтобы справиться с объемом необходи- мой работы). Однако на только что изготовленном ком- пьютере новой модели мало что можно сделать, хотя потенциально он представляет собой очень гибкий и мощ- ный инструмент. Чтобы он начал действовать, требуется еще довольно большая работа по написанию программы (вообще говоря, серии программ), которая только и спо- собна вдохнуть в машину жизнь. Причем для каждой но- вой задачи приходится составлять свою программу. Эта работа весьма специфична и не имеет аналогов ни в какой другой области деятельности человека. В самом деле, объ- ем программ, обеспечивающих решение компьютером ка- кого-либо комплекса задач, достигает сотни миллионов битов, и достаточно лишь в одном месте случайно перепу- тать 0 и 1, как все пойдет насмарку: компьютер либо «от- кажется» решать задачу, либо начнет выдавать несусвет- ную чушь, либо, вообще «ничего не говоря», будет бес- смысленно работать и работать, пока его не остановят. В первые десять — двадцать лет существования ком- пьютеров основные расходы фирм-изготовителей были связаны с разработкой и производством собственно ма- шин, а затраты организаций-потребителей — с покупкой и эксплуатацией их. В те времена вопросам программирова- ния уделялось гораздо меньше внимания, они оставались как бы на втором плане. Сейчас картина резко изменилась. С одной стороны грандиозные успехи электроники ведут к удешевлению самих машин, а с другой — значительное расширение сферы применения компьютеров требует все большего объема работ по программированию. В резуль- тате расходы на него достигают ныне уже 90% от общей стоимости вычислительной техники и доля их продолжает расти, а профессия программиста в наши дни стала одной из самых популярных. Разработке и функциям программного обеспечения компьютеров и посвящена книга «Язык компьютера». Как и «Знакомьтесь: компьютер», она объединяет в себе две книги американского издания: “Software” («Программное обеспечение») и “Computer languages” («Языки программи- рования»). В английском языке для программного обеспе- чения выбрано (а точнее, создано) очень удачное слово —- software (буквально — «мягкое изделие»), которое подчер- кивает равнозначность программного обеспечения и самой машины («железки» — hardware) и вместе с тем говорит о его гибкости, способности модифицироваться, приспосаб- ливаться, развиваться. Именно эти черты программное обеспечение демонстрировало на протяжении почти соро- калетнего периода своего существования, о чем подробно и увлекательно рассказывается в книге. Большое внимание уделено в ней вопросам контактов человека с компьюте- ром, где важнейшую роль играют так называемые языки программирования. Читатель узнает немало интересного о возникновении этих языков, их структуре, достоинствах и недостатках. Мы надеемся, что, познакомившись с основами вычис- лительной техники по предыдущей книге, вы, читатель, за- интересуетесь и этой, не менее увлекательной и полезной. Может быть, она разбудит у вас желание глубже разо- браться в проблемах программирования по более серьез- ной, профессиональной литературе. Для начала рекомен- дуем несколько популярных книг на эту тему, изданных на русском языке, поскольку авторский список включает в основном лишь англоязычные источники. В. М, Курочкин Бек Л. Введение в системное программирование. — М.: Мир, 1987. Вирт Н. Программирование на языке Модула-2. — М.: Мир, 1987. Ершов А. П. Теория программирования и вычислительные системы. — М.: Знание, 1972. Косневски Ч. Занимательная математика и персональный компьютер. — М.: Мир, 1987. Современный компьютер (сб. статей). — М.: Мир, 1986. Фокс А., Фокс Д. Бейсик для всех. — М.: Энергоатомиз- дат, 1986. Форсайт Р. Паскаль для всех. — М.: Машиностроение, 1986. Многие вопросы, затронутые в настоящей книге, освеще- ны в специальном: выпуске журнала «В мире науки», № 12, 1987. 5

Часть I КОМПЬЮТЕРНАЯ ПРОГРАММА — ЧТО ЭТО? Невидимый инструктор Новые языки программирования Расцвет программного обеспечения Гигантский скачок в развитии систем управления Раздвигая пределы возможного

НЕВИДИМЫЙ ИНСТРУКТОР Изображение радуги, поступаю- щее на вход компьютера, преоб- разуется программой в замысло- ватый узор ткани. Этот фанта- стический образ дает наглядное представление о возможностях программного обеспечения, лежа- щего в основе любого примене- ния компьютера — от обработки текстов до решения задач косми- ческой навигации. Ранним утром 10 апреля 1981 г. челночный космический корабль «Колумбия», казав- шийся крошечным на фоне своих громадных ракетных ускорителей, застыл, гото- вый к старту, на пусковой площадке мыса Канаверал во Флориде. Ожидая запуска на околоземную орбиту, астронавты Роберт Криппен и Джон Янг лежали, привя- занные к креслам, в кабине корабля. Это был поистине захватывающий момент. Наконец, после более чем 5 лет подготовки американцы были близки к осуществле- нию небывалой космической экспедиции — ведь впервые астронавтам предстояло совершить попытку возвращения на Землю в крылатом управляемом корабле, кото- рый можно было неоднократно использовать в последующих полетах. Погода стоя- ла ясная и безветреная. До старта оставалось 20 мин, и казалось, что все пойдет строго по расписанию. х л Внезапно на дисплеях компьютеров в Центре управления в Хьюстоне вспыхнули сигналы предупреждения. Наземный компьютер, дублирующий работу бортовой ЭВМ системы обеспечения полета, обнаружил ошибки в канале передачи информа- ции между Центром управления и кораблем. Произошел так называемый сбой свя- зи, который давал Центру право в случае необходимости взять на себя управление полетом вместо экипажа. Специалисты быстро установили, что ошибочное сообще- ние “вызвано нарушением синхронизации. Выполняемые компьютером процессы, требовавшие строгого согласования во времени, оказались смещенными по фазе на 40 мс. Для решения проблемы достаточно было осуществить повторный запуск про- граммы, но, поскольку корабль был полностью заправлен топливом, такой вариант сочли небезопасным. В любом случае до выяснения причины» рассинхронизации Центр управления не мог дать разрешение на запуск. Пока удрученные Криппен и Янг выбирались из кабины, специалисты занялись изучением причины случившегося. Выяснилось, что появление фазового сдвига свя- зано с изменениями, которые несколько лет назад были внесены в чрезвычайно сложное программное обеспечение, управляющее полетом космического корабля (т. е. в программы, или списки команд, необходимые для организации работы ком- пьютера). Было также установлено, что вероятность такой рассинхронизации факти- чески не превышает одного случая на 67 запусков, причем это может произойти только на начальной стадии работы программ бортового компьютера. Специалисты заверили НАСА (Национальное управление по аэронавтике и исследованию космиче- ского пространства), что можно гарантировать безопасность полета, не внося ника- ких изменений в программное обеспечение, — и через два дня «Колумбия» успешно стартовала. Программное обеспечение для управления полетом «космического челнока» (корабля многоразового использования серии «Шаттл») состоит по существу из 8 самостоятельных программ. Вместе они содержат около полумиллиона отдель- ных команд, контролирующих и регулирующих все процессы — от расчета траек- тории и управления полетом до поддержания работы систем жизнеобеспечения. Подобные программные комплексы одно из чудес современного мира. Их со- ставление требует не меньшего искусства, чем строительство египетских пи-
Инженер подключает кабели, при помо- щи которых осуществлялось программи- рование машины «Эниак» — первого уни- версального электронного компьютера, созданного в 1946 г. Эта гигантская ма- шина, в которой использовалось 17 468 электронных ламп, могла за секунду сло- жить 5 тыс. десятиразрядных чисел. Однако каждое изменение программы «Эниака» (для этого требовалось устано- вить в определенное положение тысячи переключателей и соединить сотни кабе- лей) превращалось в столь утомительную процедуру, что стимулировало поиск бо- лее удобных способов программирования. рамид, — разница лишь в том, что роль каменных блоков здесь выполняют логические операции. Но, несмотря на всю сложность, такие программы принципиально не отли- чаются от тех, которыми пользуется бухгалтер при финан- совых расчетах на ‘настольном компьютере или ребенок при игре с машиной, снабженной видеоэкраном. Без про- грамм компьютер любого размера — не более чем прос- тое переплетение бесполезных электронных схем. Если представить компьютер как музыкальный инстру- мент, то программное обеспечение — это нотная запись. Термин «программное обеспечение» (software) широко во- шел в обиход с начала 60-х годов. Это было связано с не- обходимостью провести четкую грань между командами, управляющими компьютером, и его физическими компо- нентами, или «аппартным обеспечением» (hardware), ко- торое, собственно, и составляет саму машину. В современных компьютерах команды, записанные в виде электромагнитных импульсов, хранятся на магнитных дисках и лентах, примерно так же, как в обычных магни- тофонах. Специальный блок компьютера считывает ин- формацию с магнитных носителей и преобразует ее в специальную форму, пригодную для запоминания во внут- ренней памяти и последующего исполнения. Поэтому пе- реключение компьютера с построения диаграммы на разработку стандартного контракта или — в случае более мощной машины — с разработки архитектурного проекта на создание карты погоды земного шара осуществляется простым изменением последовательности команд, управ- ляющих его работой. Перенастройка компьютера с одного вида деятельности на другой не всегда была столь простым делом. Для про- граммирования «монстров», возвестивших своим появле- нием в 40—50-е годы начало компьютерной эры, требовались не только математические способности, но и в не меньшей степени физическая выносливость. Среди первых программистов машины «Эниак» (ENIAC, аббре- виатура от Electronic Numerical Integrator and Computer — электронный цифровой интегратор и вычислитель), со- зданной в Высшем техническом училище Пенсильванского университета, была математик Кэтлин Макналти. Машина «Эниак» предназначалась для вычисления баллистических таблиц, в которых остро нуждалась армия США во время второй мировой войны. Такие таблицы давали артиллери- стам возможность выбрать надлежащий угол вертикаль- 10
ной наводки орудия при заданном расстоянии до цели и определенном весе снаряда с учетом атмосферных условий и скорости ветра. При использовании электромеханическо- го настольного арифмометра квалифицированный специа- лист затрачивал на вычисление одной траектории около трех дней, а для каждой комбинации орудия и снаряда требовалось 2—-4 тыс. таких расчетов. Для подготовки «Эниака» к выполнению этих операций приходилось проделывать умопомрачительную процедуру. Машина представляла собой чудовищный конгломерат электронных ламп и соединительных кабелей, которые были смонтированы на 40 панелях, расположенных в фор- ме подковы вдоль стен большой комнаты. Спустя много лет Макналти вспоминала: «Нам приносили целую охапку синек с изображением монтажных схем и заявляли: «Раз- беритесь, как работает машина, а потом придумайте, как ее запрограммировать». Макналти и другие программисты, обслуживавшие «Эниак» (большинство из них были математики- женщины), принимались за изучение чертежей, выясняли, как надо переключить сотни кабелей, и придумывали, в какие положения установить примерно 6 тыс. тумблеров и переключателей. В среднем на подготовку машины к вы- числению одной таблицы уходило два дня кропотливой ручной работы. Несмотря на низкую надежность «Эниака» и его непо- средственных послевоенных преемников, именно с по- мощью этих первых машин были заложены основы программирования. Основополагающие конструкции, изо- бретенные в те годы, составили фундамент для создания сложных систем программного обеспечения, которые су- щественно изменили жизнь современного человеческого общества. ПРЕДВЕСТНИКИ КОМПЬЮТЕРНОЙ ЭРЫ Предвестники будущего, вычислительные машины военно- го времени в конструктивном плане строились на идеях ве- ка минувшего. Например, машину «Эниак» впоследствии модифицировали таким образом, чтобы по крайней мере частично ее можно было программировать с помощью перфокарт. Перфокарточный метод управления механиз- мом, восходящий к XIX в., связан с именем французского изобретателя Жозефа Мари Жаккара. В 1804 г. Жаккар ре- волюционизировал процесс изготовления шелковой ткани тончайшей фактуры, создав ткацкий станок (у нас он изве- стен под названием «машина Жаккарда». — Ред.), для управления которым применялись перфокарты, соединен- ные друг с другом в виде ленты. Движением челнока управляли деревянные шпильки «читающего устройства» станка, которые по расположению отверстий в перфокарте ♦ определяли, какие нити следует поднять, а какие опустить для получения нужного узора. Примерно 30 лет спустя английский математик Чарлз Бэббидж использовал идею Жаккара при разработке замечательного устройства, кото- рое он назвал Аналитической машиной. Многое из того, что известно об этой машине, дошло до нас благодаря научным трудам одаренного математи- ка-любителя Огасты Ады Байрон (графини Лавлейс), до- чери поэта лорда Байрона. В 1843 г. она перевела статью об Аналитической машине, написанную одним итальян- ским математиком, снабдив ее собственными подробными комментариями, которые касались потенциальных воз- можностей машины. Воображение Бэббиджа рисовало Аналитическую ма- шину не как устройство, предназначенное для решения ка- кой-то одной конкретной вычислительной задачи, а как универсальное средство решения широкого класса подоб- ных задач. По существу он задумал и спроектировал уни- версальный программируемый компьютер, воплотив в нем многие черты, свойственные современным машинам. Хотя Бэббиджу так и не удалось осуществить свои честолюби- вые замыслы, по его тщательно разработанному проекту можно видеть, что в Аналитической машине предусматри- валось, например, специальное устройство для хранения обрабатываемых чисел. Это был своего рода аналог опе- ративного запоминающего устройства современного ком- пьютера. Управление работой Аналитической машины предполагалось осуществить с помощью перфокарт, кото- рые оператор мог бы менять по своему усмотрению. Гра- финя Лавлейс, одна из немногих современников Бэббиджа, сумевших понять значение данного изобретения, писала, что машина будет иметь ценность, «практически непред- сказуемую в ее возможных применениях». В дальнейшем на протяжении почти столетия ничего похожего на Аналитическую машину не появилось, однако идея использования перфокарт для обработки данных бы- ла опробирована довольно скоро. Спустя 20 лет после смерти Бэббиджа американский изобретатель Герман Хол- лерит создал электромеханическую счетную машину — та- булятор, в которой перфокарты использовались для обработки результатов переписи населения, проводившей- ся в СЩА в 1890 г. (Идея использования перфокарт при- шла к Холлериту не из работы Бэббиджа, а возникла, по всей видимости, когда он наблюдал, как проводник компо- стирует железнодорожные билеты.) Табулятор получил столь широкое признание, что для удовлетворения расту- щих заказов на это изобретение Холлериту пришлось основать собственную фирму. В конце концов эта фирма превратилась в знаменитую корпорацию ИБМ (IBM, Inter- national Business Machines), которая сделала перфокарты стандартным средством программирования компьютеров. ИЗОБРЕТАТЕЛЬ ПЕРВЫХ КОМПЬЮТЕРОВ В ГЕРМАНИИ Холлерит показал, что в сочетании перфокарты и электри- ческие цепи могут выполнять полезную работу. Однако сфера применения разработанного им устройства была ограничена решением простой и четко очерченной задачи — составлением таблиц. Более сложными вычисле- ниями перфокарты управлять не могли. Один из первых 11
£и 1 /6) AS) Бэббидж полагал, что Аналитическая машина будет производить вычисле- ния и «запоминать» результаты с по- мощью набора валов и шестерней. Управление машиной предполагалось осуществлять с помощью массивных перфокарт (справа). Вычислительное устройство, опередившее время В 1822 г. гениальный англичанин по имени Чарлз Бэббидж взялся за осуществление проекта, ставшего делом всей его жизни на пол века. Он умер в 1871 г., оставив более 37 м2 под- робнейших чертежей, причем многие из них относились к Аналитической машине, ставшей предвестником современ- ных компьютеров. Вначале Бэббидж попытался создать так называемую Разностную машину, которая предназначалась для точного автоматического построения сложных математи- ческих таблиц. После 12 лет работы, сопровождавшейся тех- ническими, финансовыми и политическими неурядицами, он отказался от этого проекта и приступил к работе над Анали- тической машиной. Новая машина была сложнее и позволяла решать самые разнообразные задачи. Команды и данные для каждой задачи здесь предполагалось вводить с помощью пер- фокарт. Осуществлению своей заветной мечты Бэббидж по- святил остаток жизни, однако требуемая для создания Анали- тической машины точность обработки намного превосходила технологические возможности того времени и поэтому она так и не была построена. компьютеров, который по праву можно назвать програм- мируемым, был создан немецким инженером Конрадом Цузе. В конце 30-х — начале 40-х годов он построил не- сколько счетных машин и компьютеров для осуществления сложных инженерных расчетов. Машины Цузе управлялись при помощи перфорирован- ной ленты, изготовленной из бракованной кинопленки (весьма изобретательная реакция на дефицит бумаги в го- ды войны). В качестве основных элементов машин исполь- зовались электромеханические реле, подобные тем, что применялись тогда в телефонных коммутаторах. Кроме того, Цузе одним из первых среди изобретателей компью- теров сумел построить действующую машину (Z3, 1941 г.), в которой вместо привычной нам десятичной системы счисления использовалась двоичная система. Любое деся- тичное число можно представить в двоичной системе в ви- де последовательности единиц и нулей. Этот способ записи чисел выглядит несколько замысловато, но пре- красно подходит для электрических цепей, которые могут находиться в одном из двух состояний: включено или вы- ключено. Достоинства двоичной системы не ограничива- ются ее применением для арифметических вычислений. В равной мере она удобна и для кодирования логических операций, имеющих дело с понятиями «истина» и «ложь». Возможность использования таких операций превращает компьютер в нечто большее, чем просто счетная машина. Из-за войны работы Цузе долгое время оставались не- известными за пределами Германии. Но по обе стороны Атлантики были и другие ученые, увлеченные погоней за призрачной удачей — созданием программируемых ма- шин. Некоторые из них, как и Цузе, поняли эффективность двоичной системы счисления и символьной логики для 12
проведения вычислений с помощью электрических цепей. Однако переход от десятичной системы к двоичной не сра- зу получил признание. Пока Цузе продолжал свои исследования в Германии, американские ученые работали над двумя проектами, ко- торые оставили заметный след в истории программируе- мых компьютеров. В Гарвардском университете матема- тик Говард Айкен с группой инженеров фирмы ИБМ за- вершали работу над машиной «Марк-1». Эта программно- управляемая вычислительная машина весом 5 т и стоимос- тью 500 тыс. долл, предназначалась для баллистических расчетов ВМС США. Как и машины Цузе, она была по- строена на электромеханических реле и управлялась при помощи команд, закодированных на бумажной перфолен- те. Машина производила умножение двух 23-значных чисел за 3 с и могла легко настраиваться на решение разнообраз- ных задач оборонного характера, возникавших в ходе вой- ны. Хотя вскоре другие машины превзошли «Марк-1», он тем не менее продолжал использоваться в вычислительной лаборатории Гарвардского университета вплоть до 1959 г. Однако всего важнее, вероятно, то, что эта машина послу- жила своего рода «полигоном» для подготовки многих первопроходцев в области разработки компьютеров, кото- Аду Лавлейс, одну из немногих современников Чарлза Бэббиджа, кто сумел оценить Аналитиче- скую машину, иногда называют первым в мире программистом. Она разработала теоретически не- которые приемы управления по- следовательностью вычислений, которые используются в програм- мировании и по сей день. Напри- мер, она описала команды, обес- печивающие повторение опреде- ленной последовательности шагов до тех пор, пока не выполнено заданное условие. Теперь такая конструкция называется циклом. рые впоследствии внесли заметный вклад в развитие ново- го научного направления. Другая американская разработка — машина «Эни- ак» — отличалась весьма неуклюжим способом задания программы, что, как мы уже упоминали, отравляло жизнь Кэтлин Макналти и ее коллег. Эта машина была создана сотрудниками Высшего технического училища Пенсильван- ского университета Джоном Мочли и Преспером Экертом. Как и «Марк-1», она оперировала десятичными, а не дво- ичными числами, однако вместо электромеханических реле в ней использовались электронные лампы, что позволило в 1000 раз повысить ее быстродействие по сравнению с машиной Гарвардского университета. При создании «Эни- ака» Мочли и Экерт превысили технологический предел надежности, ибо до этого ни в одной машине не использо- валось более 2 тыс. электронных ламп. В машине «Эниак» их было почти в 9 раз больше. Существенной проблемой оказалось частое перегорание ламп. За год работы маши- ны пришлось заменить около 19 тыс. ламп, более 100% от общего комплекта. И тем не менее машина продемон- стрировала, что будущее принадлежит именно электрон- ным вычислительным устройствам. Мочли и Экерт хорошо понимали, что основное пре- имущество электронных компьютеров заключается в их потенциальной способности хранить большое количество информации. Вращающиеся шпиндели и шестеренки элек- тромеханических компьютеров мало годились для постро- ения достаточно больших запоминающих устройств, способных хранить значительный объем данных. С появ- лением электроники подобная внутренняя память стала практически реальной. Сама по себе машина «Эниак» была всего лишь первой ласточкой. Разработанная в условиях довлеющей спешки, обусловленной военным временем, она имела весьма огра- ниченную внутреннюю память. Хотя эта машина очень быстро выполняла сложные программы, ее сумматор (внутреннее запоминающее устройство на электронных лампах, предназначенное для хранения обрабатываемых данных) мог запомнить лишь 20 10-значных десятичных чисел. И хотя содержимое внутренней памяти можно бы- ло быстро менять, замена самих управляющих команд требовала длительной возни с соединительными кабелями и переключателями. «Эниак» вступил в строй в 1945 г., но за два года до этого Мочли и Экерт уже начали обдумывать создание бо- лее совершенной машины, способной хранить не только большое количество данных, но и команды программы, управляющей ее работой. Их идея создания машины с программой, хранимой в памяти, изменила принципы организации вычислений, подготовив почву для появления современных языков программирования. Свою новую ма- шину Мочли и Экерт назвали «Эдвак» (EDVAC, от Ele- ctronic Discret Variable Automatic Computer — электронный автоматический вычислитель с дискретными переменны- ми). В качестве элементов внутренней памяти они предпо- 13
лагали использовать ртутные линии задержки, которые в годы войны использовались в радиолокаторах для опреде- ления времени прохождения сигнала. Эти устройства пред- ставляли ' собой заполненную ртутью трубку, в которой можно было как бы «консервировать» электрические им- пульсы, а затем при необходимости извлекать их оттуда. Еще одна особенность машины «Эдвак» заключалась в ее ориентации на работу с двоичными, а не десятичными числами, что позволяло упростить конструкцию арифме- тического устройства. Пока Мочли и Экерт трудились над новым проектом, их идеи в обобщенном виде были изло- жены в эпохальной работе, принадлежащей перу блестяще- го математика венгерского происхождения Джона фон Неймана. В то время фон Нейман, будучи сотрудником Принстонского института перспективных исследований, являлся консультантом проекта «Эниак». Свою статью объемом в 101 страницу машинописного текста он рас- сматривал лишь как набросок, предназначенный для об- суждения членами рабочей группы проекта «Эдвак». Однако 1 июня 1945 г. один из членов группы, Герман Голдстейн, разослал этот отчет более чем 30 специалистам под заголовком «Предварительный доклад о машине «Эдвак», причем фон Нейман фигурировал как единствен- ный автор отчета. Без сомнения, вклад фон Неймана в эту работу был весьма весомым, особенно в той части, которая касалась логических операций машины. Более то- го, благодаря его блестящей репутации, статья приобрела вес, который в ином случае она, возможно, и не имела бы, а это обеспечило поддержку данного проекта. Вместе с тем статья породила всеобщее убеждение, что заслуга изо- бретения компьютера с программой, хранимой в памяти, принадлежит фон Нейману. Преждевременное распространение отчета стало причи- ной многолетнего конфликта и в конечном счете привело к тому, что Мочли и Экерту так и не удалось отстоять свое право на патент. По ряду причин (среди которых ис- тория с отчетом занимала отнюдь не первое место) Мочли и Экерт в марте 1946 г. покинули Пенсильванский универ- ситет, основав собственную компанию. Вследствие потери двух ведущих сотрудников работы над машиной «Эдвак» пришлось свернуть. Несмотря на разгоревшуюся полемику, сама идея со- здания машины с программой, хранимой в памяти, начала находить своих энтузиастов, особенно в Англии. Среди тех, кто получил экземпляр отчета о проекте «Эдвак», был сотрудник британской Национальной физической ла- боратории Дж. Р. Уомерзли. Его пригласили в США для знакомства с работами над машинами «Эниак» и гарвард- ским «Марком-1». Вернувшись в Англию, Уомерзли при- вез с собой экземпляр отчета о разработке машины «Эдвак» и страстное желание начать аналогичные разра- ботки в своей стране. Для работы над проектом он в первую очередь пригла- сил Алана Тьюринга, во время войны принимавшего учас- тие в создании сверхсекретной английской декодирующей машины «Колосс». Свой первый вклад в теорию вычисле- ний Тьюринг сделал десятилетием раньше, когда в возрас- Математик Джон фон Нейман, автор блестящей концепции хранения ко- манд компьютера в его собственной внутренней памяти; на этом фото- монтаже он показывает одну из пер- । вых блок-схем. Эта блок-схема, заим- ствованная из его статьи, описывает модель столкновения ядерных частиц. 14
те 25 лет опубликовал статью «О вычислимых числах». В ней описывалось гипотетическое устройство, состоящее лишь из бесконечной бумажной ленты и головки, которая могла считывать и обрабатывать записанные на ней сим- волы. Машина была пригодна для решения любой разре- шимой математической или логической задачи. Цель Тьюринга заключалась не в изобретении компьютера, а в описании задач, не имеющих решения. Вместе с тем в ги- потетической машине Тьюринга были предвосхищены не- которые черты современных компьютеров. Например, бесконечную ленту можно рассматривать как своеобраз- ную универсальную внутреннюю память. Благодаря Тьюрингу машина «Колосс» великолепно справилась с расшифровкой донесений, создаваемых не- мецкой шифровальной машиной «Загадка». Хотя машина «Колосс» была спроектирована как логический компьютер специального назначения, по существу она была достаточ- на универсальна, чтобы решать целый ряд разнообразных задач. И поскольку это была первая машина, в которой применялось большое количество электронных ламп (она вступила в эксплуатацию на два года раньше машины «Эниак»), она также стала базой для подготовки научных кадров в области электронных вычислительных машин. Наличие квалифицированных специалистов позволило Ве- ликобритании быстро включиться в гонку, призом в кото- рой было создание компьютера с программой, хранимой в памяти. [По иронии судьбы приблизительно в то же вре- мя, когда осуществлялся проект «Колосс», Конрад Цузе с I - >. - С 2 - СЗ " 1 обратился к правительству (фашистской Германии) с просьбой о выделении средств на создание аналогичного устройства для дешифровки английских секретных кодов. Характерно, что в этом устройстве также предполагалось использовать электронные лампы. Однако ходатайство Цузе было отклонено с мотивировкой, что война закон- чится прежде, чем такая машина заработает.] Выполняя задание Уомерзли (изучить проект фон Ней- мана и построить компьютер, подобный машине «Эдвак»), Тьюринг разработал план создания машины АСЕ (Automatic Computing Engine — автоматическое вы- числительное устройство). Пользуясь буквенно-цифровым кодом, он даже написал для нее несколько простых про- грамм. Однако проект АСЕ натолкнулся на целую цепь бюрократических препон, что расстроило планы Тьюрин- га и вынудило его отстраниться от работы задолго до того, как в 1950 г. она завершилась созданием уменьшен- ного опытного варианта машины. Следующую «остановку» ТЬюринг сделал в Манчестер- ском университете, где под руководством Макса Ньюмена велись работы над еще одним компьютерным проектом. Ньюмен, один из крупнейших английских математиков, помогал в организации работ по проекту «Колосс» и, ко- нечно, был хорошо знаком с достижениями в этой обла- сти. Еще до прихода Тьюринга группа Ньюмена построила небольшую действующую модель полностью электронного компьютера с хранимой в памяти програм- мой, который, как и гарвардская машина, получил назва- ние «Марк-1». ПАМЯТЬ НА ИНДИКАТОРНЫХ ТРУБКАХ Внутренняя память манчестерского компьютера была по- строена на 6 электронно-лучевых трубках (ЭЛТ), аналогич- ных тем, какие применяются в радиолокаторах и телевизорах. В торце трубки находилась электронная пуш- ка, испускающая пучок электронов, которые создавали за- ряженные точки на покрытой фосфором внутренней поверхности трубки. Включаясь и выключаясь по команде компьютера, пучок генерировал точки, которые соответ- ствовали нулям и единицам двоичного кода. Производя регенерацию заряда 30 раз в секунду, можно было удержи- вать записанную информацию. Для обнаружения (или счи- тывания) заряженных точек использовалась система специальных электродов, расположенных снаружи трубки в непосредственной близости от ее поверхности. Кроме того, поскольку заряженные точки мог видеть и человек, одна трубка устанавливалась отдельно, что позволяло опе- ратору визуально наблюдать содержимое любой другой трубки. Система заработала не сразу. После запуска машины «точки на экране трубки заметались в каком-то сумасшед- шем танце, — вспоминал главный инженер Ф. К. Уиль- ямс. — В первых испытаниях это был поистине танец смерти, который не приводил ни к какому полезному ре- зультату, и, что еще хуже, не давал ни малейшего намека 15
на то, где искать неисправность». Однако 21 июня 1948 г. манчестерский «Марк-1» реализовал первую в мире про- грамму, хранимую в памяти машины, — поиск наиболь- шего сомножителя заданного числа. Как с восторгом заявил Уильямс, «в нужном месте ярко светился ожидае- мый результат». Пока манчестерский «Марк-1» делал первые блестящие успехи на непроторенном пути, другая группа англичан из Кембриджского университета завершала работу над маши- ной, которой суждено было продемонстрировать истин- ные возможности компьютеров с хранимой в памяти программой. Машина «Эдсак» (EDSAC, от Electronic Delay Storage Automatic Computer — электронный автоматиче- ский вычислитель с памятью на линиях задержки) была в сущности прямой копией машины «Эдвак». Руководитель университетской вычислительной лаборатории Морис Уилкс, находясь летом 1946 г. в США, прослушал там курс лекций, посвященный машинам с программами, хранимы- ми в памяти. Лекции читали Мочли, Экерт и другие со- трудники Пенсильванского университета. Как и в проекте Мочли и Экерта, внутренняя память английской машины строилась на ртутных линиях задерж- ки. Они действовали медленнее и были дороже, чем ЭЛТ, но позволяли хранить больший объем информации и, кро- ме того, отличались более высокой надежностью. Ком- пьютер «Эдсак», созданный на два года раньше, чем злополучный «Эдвак», вступил в строй спустя год после манчестерского «Марка-1», в июне 1949 г. Появление компьютеров, снабженных внутренней па- мятью и схемами обработки двоичных данных, вплотную подвело вычислительную науку к осознанию огромных возможностей подобных универсальных машин. Однако Алан ТЪюринг и другие специалисты ясно понимали, что для большинства программистов общение с машиной на языке цепочек нулей и единиц (т. е. с помощью так назы- ваемого машинного кода, который является базовым язы- ком компьютера) окажется достаточно трудным делом. Первой попыткой облегчить программистскую долю мож- но считать разработанную Тьюрингом систему сокращен- ного кодирования, которая предназначалась для записи программ манчестерского «Марка-1». В этом коде для представления длинных строк двоичных нулей и единиц использовались комбинации телетайпных символов. Буквы ТС, например, соответствовали комбинации нулей и еди- ниц, которая трактовалась компьютером как команда сло- жения. Телетайп выдавал бумажную перфоленту, которая затем вводилась в компьютер. Считывая комбинации про- бивок как эквивалент нулей и единиц, машина переводила их в соответствующие последовательности импульсов вы- сокого или низкого напряжения. СОЗДАНИЕ КОДОВ, ПОНЯТНЫХ ЧЕЛОВЕКУ Использование телетайпа вместо переключателей, несо- мненно, явилось шагом вперед, хотя еще далеким от идеа- ла. Алик Глени, один из манчестерских сотрудников Тьюринга, видел в сложных программах основное пре- пятствие на пути совершенствования и широкого распро- странения машин за пределами научно-исследовательских лабораторий. Он писал: «Для упрощения работы необхо- димо сделать кодирование более понятным. Системы обо- значений, используемые в настоящее время, имеют много недостатков. Все они непонятны для начинающего, отли- чаются друг от друга (каждая система ориентирована на конкретную машину) и трудны для чтения. Расшифровка программного кода крайне сложна и при наличии примеча- ний, даже если это ваша собственная программа, написан- ная несколько месяцев назад». Джон Мочли разделял эту точку зрения. В то время основанная им совместно с Экером компания работала над созданием двух компьютеров. Первый — двоичная маши- на «Бинак» (BINAC), разрабатываемая по заказу самоле- тостроительной компании, и второй — «Юнивак-1» (UNIVAC, Universal Automatic Computer — универсальный автоматический компьютер), предназначенный для Нацио- нального бюро переписи США. В 1949 г. Мочли поручил своим программистам создать программу, которая позво- лила бы машине воспринимать алгебраические уравнения, записанные в традиционной форме. В полной мере достичь этой честолюбивой цели не удалось. Однако созданная система кодирования под названием «Короткий код» (Short Code) действительно позволяла записывать уравне- ния не в двоичном виде, а с помощью двухсимвольных комбинаций. Так, уравнение вида А = В + С могло быть введено в форме последовательности 00 S0 03 S1 07 S2, где переменные А, В, С обозначены SO, SI, S2, а операции ра- венства и сложения — 03 и 07 (комбинация 00 определяет номер строки программы). Программист мог затем’дать компьютеру указание присвоить переменной S0, скажем, значение 5, а переменной S1 — значение 3. После этого компьютер уже сам определял значение переменной S2. Система кодирования, предложенная Мочли, явилась настоящим откровением для одного неугомонного про- граммиста из его компании — энергичной и независимой особы по имени Грейс Мюррей Хоппер. Спустя почти тридцать лет она вспоминала: «Я полагаю, это было пер- вое обстояльство, натолкнувшее меня на мысль о возмож- ности использования кода, который отличался бы от машинного». В годы второй мировой войны Хоппер, вступившая в женскую добровольную организацию содействия, была на- правлена на работу в Гарвардский университет, в отдел, занимавшийся вычислениями для нужд артиллерии. Здесь, по ее словам, она стала «третьим в мире программистом первого в мире большого цифрового компьютера», «Мар- ка-1». Она вспоминала: «В те дни мы не назывались про- граммистами. Это слово еще не дошло до нас из Англии. Мы были кодировщиками». Однако Хоппер и ее коллеги Роберт Кэмпбел и Ричард Блок заложили исключительно прочный фундамент методов программирования. 16
Логика машины Тьюринга Состояние машины Если головка читает пробел Если головка читает X СОСТОЯНИЕ 1 СТОП Стереть; перейти в состояние 2; сдвинуться влево СОСТОЯНИЕ 2 Записать;перейти в состояние 3; сдвинуться влево Остаться в состоянии 2; сдвинуться влево СОСТОЯНИЕ 3 Записать; перейти в состояние 4; сдвинуться вправо Остаться в состоянии 3; сдвинуться влево СОСТОЯНИЕ 4 Перейти в состояние 5; сдвинуться вправо Остаться в состоянии 4: сдвинуться вправе СОСТОЯНИЕ 5 СТОП Стереть; перейти в состояние 2; сдвинуться влево В 1936 г., будучи студентом Кембриджского университета, английский математик Алан Тьюринг написал статью «О вычислимых чис- лах», в которой рассмотрел гипотетическое устройство (впоследствии получившее назва- ние «машина Тьюринга») — прообраз про- граммируемого компьютера. Машина Тьюринга предназначалась для выполнения логических операций: она могла читать, пи- сать и стрирать символы, записанные в клет- ках бесконечной ленты. На каждом шаге вычислений следующее действие машины це- ликом и полностью определялось ее текущим состоянием и символом, который в данный момент считывается. В приведенном здесь примере машина Тью- ринга настроена на удвоение целых положи- тельный чисел. Ее команды описывают пять состояний; в каждом из них от машины требу- ется выполнить определенные действия. Свою работу машина начинает в состоянии 1, в этот момент считывающая головка установлена в начало записанного числа — в данном случае число 2, представленое в виде двух записанных подряд символов X (вверху). Машина заверша- ет работу после выполнения 16 шагов — в этот момент на ленте будет записано удвоен- ное количество символов X (внизу). 17
Ввиду того что основной задачей гарвардского «Мар- ка-1» было вычисление артиллерийских баллистических таблиц, в нем предусматривались некоторые математиче- ские операции общего назначения. Однако Хоппер и ее коллеги убедились, что для решения с помощью этой ма- шины конкретных задач, как правило, требуются более специфические средства. И они справились с решением этой задачи наилучшим образом. «Мы стали писать под- программы», — вспоминала Хоппер. Под этим подразуме- вались многократно используемые последовательности команд, построенные таким образом, чтобы из них можно было компоновать более крупные сегменты или блоки внутри программ. Если программистам требовались под- программы, написанные ранее кем-либо другим, то они переписывали их и его блокнотика. Таким образом, хотя само слово «подпрограмма» было придумано несколько позднее, можно считать, что один из главных приемов со- временного программирования впервые стал применяться еще в 1944 г. В следующем году Хоппер и ее коллеги ввели дру- гое — столь же фундаментальное, хотя и менее привлека- тельное — понятие программистской деятельности. Однажды жарким, влажным летним днем таинственная неисправность заставила замолчать громыхающий ком- пьютер «Марк-1». После тщательно проведенного иссле- дования программисты установили, что контакты одного из реле были заблокированы останками мотылька, невесть как проникшего через лабиринт электрических цепей ком- пьютера. С предельной осторожностью мотылька извле- кли пинцетом, а это событие зафиксировали в журнале, который по распоряжению командования ВМС США пе- дантично заполнялся на протяжении всей работы компью- тера. Сопроводительная подпись гласила: «Первый достоверный случай обнаружения насекомого (bug)». Позднее Хоппер вспоминала: «Когда к нам зашел офицер, чтобы узнать, чем мы занимаемся, мы ответили, что очи- щаем компьютер от насекомых (debugging). Термин «де- баггин» (отладка) с тех пор прижился и стал использоваться для обозначения поиска неисправностей в компьютере, особенно в программном обеспечении. В 1949 г. Хоппер перешла в компьютерную фирму Экерта и Мочли, где приняла участие в создании машины «Юнивак-1». Этой организации Хоппер оставалась верна и после того, как фирму поглотила компания «Ремингтон Рэнд», и потом, когда последняя объединилась с корпора- цией «Сперри», образовав фирму «Сперри Рэнд», — вплоть до ухода на пенсию в 1971 г., уже из отдела «Юни- вак». На протяжении всего этого периода компьютерной истории Хоппер неустанно отстаивала мысль, что для про- граммирования следует использовать языки высокого уровня, т. е. языки, в определенном смысле возможно бо- лее близкие к естественному человеческому языку. «Это были дни, полные неопределенности, — говорила Хоппер, вспоминая время, когда еще неоперившаяся ком- пания Экерта и Мочли ютилась в помещении старой фа- брики на севере Филадельфии. — Когда машина «Юнивак-1» не работала, мы, бывало, говорили, что не мешало бы ее зашвырнуть за забор на ту сторону, где бы- ла свалка, а самим махнуть на другую сторону — на кладбище». Предложенная Мочли система кодирования, несмотря на все ее неоспоримые преимущества по сравнению с про- граммированием в двоичном машинном коде, отнюдь не была панацеей. Поскольку язык этой системы был весьма далек от машинного языка нулей и единиц, фактически для ее реализации требовалась некая программа-посред- ник, которая осуществляла бы перевод программ в двоич- ный код компьютера. Программу, записанную в системе кодирования Мочли, надо было просматривать и выпол- нять строка за строкой. Это делалось при помощи специ- альной программы-переводчика, называемой интерпрета- тором. Таким образом, каждая отдельная операция про- граммы перед ее выполнением должна была подвергаться полному посимвольному разбору, даже если до этого она уже не раз использовалась. В октябре 1951 г. Грейс Хоппер получила задание со- здать набор стандартных математических подпрограмм для машины «Юнивак-1». В процессе работы она замети- ла, что ее коллеги, как и программисты гарвардского ком- пьютера «Марк-1», занимались переписыванием отдель- ных фрагментов и подпрограмм из одной программы в другую. «Этот способ был порочен по двум причи- нам,» — говорила Хоппер. Во-первых, ввиду того что при переносе подпрограммы в другую программу приходилось менять все числа, задающие адреса конкретного месторас- положения программы в памяти машины. Обычно эти адреса образовывали группу последовательных номеров. Поэтому для внесения подпрограммы в другую программу требовалось прибавить к каждому адресу подпрограммы некоторую константу, а, как отмечала Хоппер, «складыва- ют программисты ужасно плохо». Во-вторых, общеизвестно, что программисты крайне невнимательны при переписывании программ. Хоппер вспоминала: «Оставалось лишь поражаться, как часто цифра 4 превращалась в букву дельта (мы использовали ее для обозначения пробела) или букву А. Даже буква В умудрялась становиться числом 13. Когда программисты занимались переписыванием подпрограмм, могло про- изойти что угодно. Очевидно, для подобной работы требо- валось какое-то устройство, единственным назначением которого было бы аккуратное выполнение операций копи- рования и сложения». ШАГ НА БЛАГО ПРОГРАММИРОВАНИЯ Людям свойственно ошибаться. Это наблюдение стало ис- ходной предпосылкой появления на свет программы-ком- поновщика А-0. Компоновщик использовался как вспомо- гательное средство для создания других программ. По за- данному идентификатору, т. е. условному коду, он осу- ществлял выборку нужной подпрограммы из библиотеки 18
(^.-еЛол^Ъо ?ц^| Г ^(ИоГк) » п * Грейс Мюррей Хоппер, математик и пио- нер программирования. В 40-х годах, на- ходясь на службе в ВМС США, она ра- ботала в Гарвардском университете на компьютере «Марк-1», проявив при этом незаурядное искусство в устранении тех- нических неполадок. Она обнаружила и документально зафиксировала в рабочем журнале случай технической неисправнос- ти компьютера из-за насекомого, попав- шего в одно из тысяч реле машины. Приведенная здесь запись в журнале гла- сит: «Реле 70 Панель F (мотылек) в реле. Первый достоверный случай обнаружения насекомого.» (Игра слов: в английском языке слово bug имеет несколько значе- ний, в том числе и насекомое, и техниче- ская неисправность. — Перев.) подпрограмм (где она хранилась на магнитной ленте), счи- тывание и запись ее в отведенное место оперативной памя- ти. Таким образом, компоновщик, извлекая несколько различных подпрограмм, формировал из них единую про- грамму. Все это он делал абсолютно точно, не допуская ни превращений буквы В в число 13, ни ошибок, связан- ных с вычислением адресов. Компоновщик, поставлявший- ся вместе с компьютером «Юнивак» (эти машины посту- пили в продажу в конце 50-х), позволял создавать так на- зываемые автоматические программы. Автоматическими они назывались потому, что большую часть утомительной работы по компоновке программы из отдельных машин- ных команд брал на себя сам компьютер. Для специалистов, пользовавшихся компьютерами «Юнивак», автоматическое программирование, несмотря на всю его примитивность, стало настоящей находкой, по- скольку купить программное обеспечение в то время было негде. Каждая организация, приобретая вычислительную машину, обрекала себя на разработку программ, предна- значенных для решения ее специфических задач, например оформления платежных ведомостей или обработки данных о переписи населения. Один программист, вспоминая те дни, заметил, что «по стоимости программирование тогда не уступало оборудованию». Во многом благодаря неукротимой энергии Грейс Хоп- пер компоновщик и другие подобные вспомогательные средства способствовали коммерческому успеху машины «Юнивак» — первого компьютера массового выпуска и спроса. Первая машина этой модели была отправлена в Национальное бюро переписи населения США в 1951 г., и в том же году еще 4 машины были поставлены вооружен- ным силам и правительственным учреждениям. А в 1952 г. компьютер «Юнивак», правильно предсказав неожиданную победу Дуайта Эйзенхаура над Эдлаем Стивенсоном в борьбе за президентское кресло, благодаря телевидению стал известен всей стране. Правда, это предсказание стало 19
возможным лишь благодаря группе программистов, раз- работавших для этой машины программу анализа избира- тельной компании. Другие предприниматели, заметив коммерческий успех «Юнивака», быстро включились в компьютерный биз- нес — так началась технологическая революция. У нее бы- ло два движущих фактора: прогресс в области разработки быстродействующей электроники и непрерывное совер- шенствование языка общения человека с машиной. Конеч- ная цель совершенствования - создание языка, подобного языку человека. Безграничные возможности вычислитель- ной техники, которые более века назад предвидели Чарлз Бэббидж и графиня Лавлейс, стали воплощаться в жизнь. 20
возможности ПРОГРАММНОГО УПРАВЛЕНИЯ Современные достижения в области миниатюризации электронных схем позволили создать устройства, которые размещаются на кремневой пластинке размером с кончик пальца, но по вычислительной мощности превосходят ги- гантские машины 50-х годов. Это сделало компьютеры доступными практически любому человеку. Более того, со- временные машины способны решать задачи, о которых едва ли можно было даже мечтать во времена компьюте- ров на электронных лампах и перфокартах. Секрет такой универсальности кроется в программном обеспечении, которое позволяет использовать одну и ту же машину, построенную из стали и кремния, для решения несметного множества самых разнообразных задач. В от- личие от программ ранних моделей, вводившихся в маши- ну посредством утомительного переключения множества тумблеров и цифронаборных устройств, программное обеспечение, вдохнувшее жизнь в современный компьютер, записывается на магнитных лентах или дисках и вступает в работу сразу после включения машины. Однако по существу команды компьютера — хотя они и задаются теперь гораздо более удобным способом — заметных изменений не претерпели. Любой компьютер должен разложить задание на последовательность логиче- ских операций, а затем выполнять их одну за другой. За прошедшие годы развитие программного обеспече- ния выделило несколько основных типов программ. Цент- ральное место в большинстве компьютерных систем занимает специальная совокупность программ, называе- мая операционной системой, которая координирует работу компьютера и управляет размещением программ и данных в оперативной памяти. Она дает указания компьютеру, как интерпретировать команды и данные, как распределять аппаратные ресурсы для выполнения задания и как управ- лять периферийными устройствами (например, принтером или видеотерминалом). Она также обеспечивает возмож- ность непосредственного взаимодействия человека и ком- пьютера, выполняя такие действия, как хранение программ и файлов данных. Если рассматривать операционную систему как «режис- сера» компьютерного действа, то прикладные программы играют роль «артистов». Именно благодаря таким про- граммам, как текстовый процессор (word processor), игры и электронные таблицы (spreadsheet), компьютер приобре- тает удивительную разносторонность. Понятие «программное обеспечение» включает также такие программы, как трансляторы и утилиты. Трансля- торы помогают программистам создавать прикладное программное обеспечение; с их помощью так называемые языки высокого уровня, отдаленно напоминающие язык человека, преобразуются в машинный язык, представляю- щий собой комбинации нулей и единиц, которые компью- тер обрабатывает как последовательности электрических импульсов. Утилиты выполняют рутинные, но часто край- не необходимые функции, например сортировку или слия- ние файлов. Эти скромные «рабочие лошадки» помогают сложнейшим прикладным программам решать весьма пре- мудрые задачи. 21
Возможности программного управления Вычислительный процесс от ввода до вывода Каждая вычислительная операция состоит из нескольких последовательных этапов: ввод информации в компьютер, ее специализированная обработка и вывод результатов. Эту работу компьютер выполняет с помощью сложной системы, которая может состоять из различных компонен- тов. Например, такие устройства ввода, как клавиатура или «мышь», служат для задания компьютеру команд и даннных. Оперативное запоминающее устройство (ОЗУ), или оперативная память, хранит данные и программы во время их обработки. Устройства вывода позволяют де- монстрировать результаты обработки. Устройства внеш- ней памяти (диски или ленты) обеспечивают долговремен- ное хранение программных и информационных файлов. Эти устройства совмещают в себе функции ввода и выво- да. Компьютер может скопировать информацию с диска в оперативную память для обработки, а полученные ре- зультаты записать обратно на диск или ленту. УТИЛИТЫ Центральны процессор с с с 20 10 ч НАРИСОВАТЬ КАРТУ ФОНА НА ЭКРАНЕ CALL РИСКАР СДЕЛАТЬ ТРАССИРОВКУ ОРБИТ СПУТНИКОВ DO 10 ВРЕМЯ-НАЧВРЕ.КОНВРЕ.ИНТЕРВ DO 20 ИСПУГ*1.КЛСПУТ ПОЛУЧИТЬ 3-НЫЕ КООРДИНАТЫ КАЖДОГО СПУТНИКА CALL Н0ВП03(СПВЕК(НСПУТ).ВРЕМЯ.ШИР.ДОЛ.ВЫС) ПРЕОБРАЗОВАТЬ 3-НЫЕ КООРДИНАТЫ В 2-НЫЕ CALL ТРИДВА(ШИР.ДОЛ.ВЫС.Х.У) НАРИСОВАТЬ НА ЭКРАНЕ НОВОЕ ПОЛОЖЕНИЕ СПУТНИКА CALL РИС(Х.У) ВЫВЕСТИ ПРОМЕЖУТОЧНЫЕ РЕЗУЛЬТАТЫ WRITE (6.10) ВРЕМЯ.ЫСПУТ.ШИР.ДОЛ.ВЫС CONTINUE CONTINUE END Операционная система Ввод. Клавиатура (вверху) — самое распространенное устройство для взаимодействия с компьютером. Программное обеспечение, управляю- щее машиной, интерпретирует определенные комбинации вводимых символов или как команды, которые надо выполнить, или как данные, подлежащие обработке. Простые программы можно ввести непосред- ственно с клавиатуры, однако более сложные и большие программы обычно загружаются в оперативную память компьютера с помощью специального внешнего устройства (например, дисковода), которое пере- дает в машину хранимую на диске информацию. Информация записы- вается на диске по концентрическим окружностям (дорожкам); здесь могут храниться данные различных типов и программы в виде понят- ных компьютеру электромагнитных импульсов. На рисунке показан фрагмент программы, предназначенной для вычисления и вывода на экран траектории движения спутника. 22
Сердцем аппаратной части вычислительной системы является центральный процессор (ЦП), который координи- рует движения потоков информации и выполняет вычисле- ния. ЦП понимает определенную систему команд, т. е. те коды, которые предписывают ему выполнение определен- ных операций. Любая программа представляется в виде последовательности таких кодов. В период работы про- граммы ЦП в каждый момент времени выполняет одну из ее команд, причем делает это с очень высокой ско- ростью. Немногие, наиболее важные и часто используемые, про- граммы всегда хранятся в так называемом постоянном за- поминающем устройстве (ПЗУ) компьютера. Сразу же после включения компьютера ЦП по специальной встроен- ной программе отыскивает на диске операционную систе- му и загружает ее в оперативную память. Дальнейшее управление всеми устройствами компьютера осуществляет операционная система; она предоставляет также пользова- телю определенный набор команд и соответствующих им ответных реакций компьютера, с помощью которых мож- но управлять вычислительной машиной. оперативное ОЗУ ПЗУ 117599528 117617176 117634264 117649592 117662136 117671048 117675736 117675832 117671368 117662616 117658216 117635000 117617960 -109.891 -101.301 I -94.751 I -92.440 -93.857 -97.710 -102.870 ' -188.448 -113.641 . -117.565 -119.102 । -116.958 -110.555 запоминающее устройств ростоянное запоминающее устройство 7280 10800 14400 18000 21600 25200 28800 32400 36000 39600 43200 46800 50400 50.360 50.436 45.992 38.215 28.417 17.507 6.044 -5.589 17.064 -28.006 -37.861 -45.740 -50.342 Обработка. В блоке центрального процессора (ЦП) устройство управле- ния следит за порядком выполнения операций, а арифметико-логическое устройство выполняет арифметические и логические операции. Актив- ная программа помещается в оперативное запоминающее устройство (ОЗУ) компьютера, благодаря чему ЦП может выбирать команды по- следовательно, одну за другой. Программы, которые всегда хранятся в постоянном запоминающем устройстве (ПЗУ), обеспечивают начальную активизацию компьютера и поддерживают взаимодействие ЦП с устройствами ввода-вывода. В ПЗУ может, кроме того, находиться транслятор языка программирования (например, Бейсика) или приклад- ные программы (в частности, текстовый процессор). Вывод. Видеотерминал обеспечивает отображение графических результа- тов вычислений. Обычно компьютер выводит на экран информацию, поступающую с клавиатуры, а также свои ответы. Во время работы программы информация на экране быстро меняется, что способствует эффективному взаимодействию человека с компьютером. Принтер слу- жит для вывода информации на бумагу, т.е. для получения так называ- емой «твердой копии», на которой зафиксированы результаты работы программы (вверху). Информация может также выводиться в виде ис- кусственной (синтезированной) речи или электрических импульсов, кото- рые управляют движением руки робота или полетом космического корабля. 23
Возможности программного управления Распределение памяти для хранения программ Быстрый и точный доступ к обрабатываемой информации и программам, управляющим работой ЦП, позволяет са- мому обыкновенному компьютеру выполнять сотни тысяч операций в секунду. Такой доступ возможен благодаря то- му, что программы и данные кодируются в виде последо- вательностей электронных импульсов, каждый из которых соответствует одной двоичной цифре: 1 либо 0. Импульсы записываются в специальных микроэлектронных элемен- тах, из которых строится оперативная память (справа). Каждый элемент хранит одну двоичную цифру, или, как часто говорят, бит информации. Эти элементы группиру- ются друг с другом, формируя таким образом более круп- ную единицу хранения информации, называемую байтом (внизу). Постоянная память, содержимое которой не мо- жет быть изменено или уничтожено, строится аналогич- ным образом. Каждый байт памяти имеет собственный адрес. ЦП может прочитать содержимое того или иного байта памя- ти, послав сигнал по соответствующему адресу. Кроме то- го, ЦП может передать информацию по любому адресу оперативной памяти; при этом происходит замена хранив- шейся там прежде информации. Обычно программа занимает определенный блок памя- ти, а ее команды располагаются в байтах с последователь- ными адресами. Такая организация упрощает управление ходом выполнения программы, так как в этом случае не надо после каждого шага сообщать ЦП, где искать оче- редную команду. Вместо этого ЦП автоматически выбира- ет содержимое элемента памяти со следующим по порядку адресом. Последовательная выборка осуществляется до тех пор, пока не дана команда перехода на другой адрес. Оперативная память используется и для хранения обра- батываемой информации. Программа читает данные, вы- полняет над ними определенные действия и вновь заносит результаты в память. Команды каждой программы указы- вают, какой тип информации содержится по тому или ино- му адресу. ОПЕРАЦИОННАЯ СИСТЕМА Простой и гибкий код. Запомина- ющее устройство (память) ком- пьютера состоит из тысяч элек- тронных переключателей; каждый из них может находиться в одном из двух состояний: включено или выключено. Это соответствует одному биту информации (1 или 0). Последовательность из 8 бит называется байтом. Каждый байт позволяет хранить 256 (28) раз- личных комбинаций 1 и 0, кото- ' рые можно интерпретировать как некое множество символов, зави- сящее от программного обеспече- ния компьютера. 24
| 0| 111 |0|0| 1 ГоТо] Представление буквы. В специальном ко- де, который называется Американским стандартным кодом для обмена инфор- мацией (ASCII), для представления букв английского алфавита, цифр от 0 до 9 и набора знаков препинания используются десятичные числа в диапазоне от 0 до 127. Записанный в виде двоичных цифр (здесь показано двоичное представление латинской буквы d) код используется как стандартный формат для обмена инфор- мацией между компьютерами. |1|1|1|1|0|1|0(0] HLT Представление команды. Содержимое байта или некоторой последовательности* байтов может трактоваться и как коман- да ЦП, предписывающая выполнение определенных действий. Коды команд индивидуальны для каждой конкретной модели ЦП. На рисунке показан код, ко- торый вызывает полную остановку ма- шины (на одной из моделей ЦП). |о|1|1|1lololoTol 11 Представление числа. Числа, которые компьютер обрабатывает как арифмети- ческие величины, записываются в двоич- ном коде, не совпадающем с кодом ASCII. С помощью одного байта можно закодировать целые десятичные числа в интервале от -127 до +127. Для пред- ставления чисел с большей абсолютной величиной и дробей используются не- сколько байт. В других системах кодиро- вания для приближенного представления любых чисел используется фиксированное количество байт. Ю|о|о|о|1|о|оТо1 Представление произвольного символа. Одна из самых сильных возможностей программного обеспечения заключается в его способности приписывать любой смысл каждому конкретному коду, содер- жащемуся в байте информации. Байты можно использовать не только для коди- рования букв, чисел и команд, но и, на- пример, для записи нотных знаков или цветовых оттенков. 25
26
НОВЫЕ ЯЗЫКИ ПРОГРАММИРО- ВАНИЯ В середине 50-х годов, когда вычислительная техника прочно укоренилась в универ- ситетах и научно-исследовательских лабораториях США и Европы, наступило время стремительного прогресса в области программирования. Однако новые разработки отнюдь не отрицали всего того, что было сделано прежде. Напротив, они опирались на уже построенный фундамент. Компиляторы и интерпретаторы для так называе- мых языков ассемблера (такие языки требуют от программиста глубокого знания аппаратуры) остались важным средством программирования для любого компьюте- ра. Однако, хотя эти средства и продолжали использоваться, их роль постепенно снижалась. Посредниками между программистами и машинами стали языки про- граммирования нового типа. От языка ассемблера они отличались большей гибкос- тью и возможностью использования конструкций, подобных предложениям. С появлением языков высокого уровня программисты получили возможность больше времени уделять решению конкретной проблемы, не отвлекаясь особенно на весьма тонкие вопросы организации самого процесса выполнения задания на ма- шине. Кроме того, появление этих языков ознаменовало первый шаг на пути созда- ния программ, которые вышли за пределы научно-исследовательских лабораторий и финансовых отделов. Двумя яркими представителями нового направления были сотрудники математи- ческого факультета Дартмутского колледжа Томас Курц и Джон Кемени. Курц по- ступил на работу в Дартмутский колледж в 1956 г., получив степень доктора по математической статистике в Принстонском университете. Впервые он познакомился с компьютерами в 1951 г. в Калифорнийском университете, в Лос-Анджелесе, на лет- них курсах по численному анализу. Кемени был на два года младше Курца и так же, как он, получил степень доктора в Принстоне. С компьютерами Кемени был, что называется, «на ты». Еще во время учебы в Принстоне он ездил в 1945 г. в Лос-Аламос, шт. Нью-Мексико, где принимал участие в работе над особо секрет- ным «Манхэттенским проектом» по. созданию атомной бомбы. Наставником Кеме- ни был не кто иной, как сам Джон фон Нейман, чьи идеи в области компьютерных вычислений оказали непреходящее влияние на все дальнейшее развитие этого науч- ного направления. Как и фон Нейман, Кемени был венгерским эмигрантом и талантливым матема- тиком. К тому же он владел навыками применения математической логики для ана- лиза сложных систем. В 1945 г. Кемени, застенчивый юноша 16 лет, с весьма посредственным знанием английского языка, держал устный экзамен в одной из нью-йоркских школ в районе Манхэттена. Впоследствии он вспоминал об этом: «Мой словарный запас был ужасно скуден, и поэтому в каждом вопросе я улавливал всего несколько слов. Но поскольку это был тест, в котором для каждого вопроса предлагался набор вариантов в качестве ответа, то и того, что я понимал, было вполне достаточно для построения модели и нахождения правильного решения. Я сумел вскрыть этот код и получил одну из высших оценок во всем Нью-Йорке». 27
После войны Кемени работал ассистентом у Альберта Эйнштейна в Принстонском институте перспективных ис- следований, одновременно заканчивая докторантуру. Так как получить место преподавателя математики (а эта нау- ка была его истинной любовью) не удалось, он некоторое время преподавал логику. В 1953 г. ему предложили воз- главить математический факультет в Дартмутском коллед- же. В то время ему было всего 27 лет. Когда Кемени и Курц только начинали свое сотрудни- чество, Дартмутский колледж (г. Хановер, шт. Нью-Гэмп- шир) представлял собой лишь небольшое учебное заведение гуманитарного профиля, которое даже не имело своего компьютера. Однако благодаря усилиям двух моло- дых ученых всего за десять лет колледж не только стал счастливым обладателем прекрасного вычислительного центра, но и заслужил честь называться родиной языка Бейсик — одного из самых популярных языков, оказавше- го значительное влияние на программирование. МЫТАРСТВА ПАКЕТНОЙ ОБРАБОТКИ В первое время Кемени и Курц были вынуждены работать со своими математическими программами где придется. Ближайший доступный им компьютер находился в 215 км в региональном вычислительном центре Новой Англии, который располагался в Массачусетском технологическом институте (МТИ), Кембридж. Это был новейший компью- тер марки IBM-704, который имел феноменальный по тем временам объем памяти — 8192 слова, каждое длиной в 36 разрядов. Но, даже добравшись до Кембриджа, Кемени и Курц все равно не могли самостоятельно работать на ма- шине. Виной тому была нескладная система под названием система пакетной обработки (batch processing). Поскольку компьютеры были тогда немногочисленны и страшно до- роги, непосредственный доступ к ним предельно ограничи- вался. Программисту требовалось подготовить задание на перфокартах и передать его в вычислительный центр спе- циальному оператору. Этот посредник вводил карты в ма- шину в большом пакете, который часто содержал сотни отдельных программ, принадлежавших многим пользо- вателям. Потом начиналось ожидание. Компьютер не выдавал на печать результатов до завершения обработки всего па- кета, а это нередко длилось целые сутки, притом получен- ный ответ часто не оправдывал ожиданий. Малейшей описки, например пропуска скобки, было достаточно, что- бы машина прекратила выполнение программы, выдав на печать загадочное диагностическое сообщение. Исправив соответствующую строку программы, программист вы- нужден был ждать удобного случая, чтобы отправить скорректированную программу в очередном пакете. Иног- да это удавалось сделать лишь на следующий день. Если в программе вновь обнаруживалась ошибка, то все прихо- дилось начинать сначала. Даже очень хорошие программи- сты часто тратили не менее двух недель на поиск и исправление всех ошибок в одной-единственной програм- ме. Для Курца — а обычно именно он отвозил программы в МТИ — все это оборачивалось бесконечными поездками на поезде из Дартмута в Бостон и обратно. Однако проблемы не ограничивались лишь неудобства- ми, связанными с пакетной обработкой. Помимо этого самые первые программы для машины IBM-704 при- ходилось писать на языке ассемблера. Программирова- ние на этом языке по существу мало чем отличалось от программирования в двоичном коде. Если программа на- чинала вести себя «странно», то единственным способом поиска ошибки было изучение так называемого дампа па- мяти — длинной бумажной ленты, содержащей таинствен- ные числовые коды. Свое программистское мастерство Кемени и Курц от- тачивали, изучая язык ассемблера и читая бесконечные дампы памяти для машины IBM-704. И хотя Кемени ле- леял мечту об установке компьютера в Дартмуте, он не представлял, как можно научить пользоваться им коллег и студентов, если процесс программирования не переста- нет быть столь устрашающим. К началу 60-х годов Кемени и Курц добились некото- рых успехов. Так, в июне 1954 г. Дартмутский колледж за- получил собственный маленький компьютер — машину LGP-30 с объемом памяти вдвое меньше, чем у IBM-704. Курц возглавил новоиспеченный вычислительный центр, и на протяжении нескольких лет два молодых профессора занимались разработкой простых языков, предназначен- ных для работы на машине LGP-30. Один студент млад- шего курса, не имевший до этого никакого опыта работы с компьютером, разработал язык и компилятор под назва- нием «Дарт» (DART). Успехи студента подтвердили убеж- дение Кемени и Курца — работа с компьютером вполне по силам студентам младших курсов. Наконец настала пора выдвинуть идею, которую Кеме- ни и Курц вынашивали долгие годы. Их предложение бы- ло весьма радикальным: обучать азам программирования всех студентов независимо от их специализации, будь то естественные или гуманитарные науки. Получив поддерж- ку в колледже, план Кемени и Курца начал претворяться в жизнь. Поставленная цель уже сама по себе была весьма не- обычной, но намерения Кемени и Курца этим не ограничи- вались. В отличие от своих коллег из других учебных заведений, которых вполне устраивала методика обучения студентов приемам работы с компьютером путем чтения лекций, Кемени хотел, чтобы студенты осваивали машину, создавая для нее реальные программы. Но сначала пред- стояло преодолеть пару серьезных препятствий. Прежде всего — машина в колледже была всего одна. И хотя сту- дентам не приходилось путешествовать далее собственно- го вычислительного центра, утомительность работы и разочарования, по-видимому, неизменно связанные с па- кетной обработкой, все же оставались. Будущих инжене- ров или математиков еще можно было как-то заставить смириться с многочасовыми и даже многодневными ожи- 28
даниями результатов, но для студентов, специализирую- щихся в английском языке или истории, это было просто неприемлемо. Перспектива пакетной обработки, конечно, создавала определенные трудности, но они были не так пугающи, как само обучение студентов-гуманитариев языкам про- граммирования. К тому времени уже появилось несколько языков высокого уровня. Первым и одним из наиболее распространенных был Фортран (FORTRAN, от FORmula TRANslator — переводчик формул). Этот язык разработа- ла в конце 50-х годов группа программистов фирмы ИБМ. Фортран специально предназначался для работы с форму- лами, используемыми в математике и других научно- технических дисциплинах. Однако овладение им представ- ляло трудность даже для инженеров. Например, оператор DO 150 Z= 1,10 определяет начало цикла, предписывая компьютеру циклически выполнять операторы, записан- ные непосредственно вслед за ним вплоть до оператора с меткой 150 (включая и этот оператор). Причем первый раз цикл должен выполняться со значением переменной /, рав- ным 1, а при каждом следующем выполнении значение пе- ременной I должно увеличиваться на 1 — до тех пор, пока не станет равным 10. Если программист нечаянно запишет между 1 и 10 вместо запятой точку, то такой оператор уже будет интерпретироваться как присваивание величины 1.10 переменной с именем DO 150/. Этот оператор вполне допу- стим (на жаргоне программистов — «правильный»), одна- ко программа будет работать неверно. И все же подобными препятствиями «дартмутский ду- эт» испугать было трудно. Для начала они стали искать, чем заменить пакетный режим, и решили использовать систему разделения времени (time sharing), впервые пред- ложенную в МТИ в 1959 г. Система разделения времени предполагала подключе- ние к одному главному процессору (mainframe) нескольких терминалов с алфавитно-цифровой клавиатурой. (В те дни термин mainframe означал просто центральный (или глав- ный) процессор, управляющий работой машины. Сейчас его чаще относят к мощным компьютерам, чтобы отли- чить их от настольных или каких-либо других менее про- изводительных машин.) Специальные программы позволяли процессору по очереди подключаться к каждому терминалу, выполняя при этом небольшую часть каждого задания в течение определенного периода (или кванта) вре- мени, измеряемого обычно миллисекундами. Так как про- цессор обрабатывал информацию с очень большой скоростью, у каждого программиста создавалось впечатле- ние, что машина работает только с ним одним. На самом же деле программисты просто разделяли между собой вре- мя работы компьютера. По мнению Кемени и Курца, именно такая система и была нужна в Дартмуте. Следующая их идея заключалась в создании языка про- граммирования, который легко бы осваивали студенты. Воображение рисовало язык, состоящий из простых слов английского языка, где использовались бы такие операто- ры, как SAVE (сохранить), RUN (выполнить) или LIST (вывести программу). По синтаксису эти операторы дол- жны быть сходны с операторами языка Фортран, но в ——— то же время отличаться большей простотой. Например, 51ЫЗ чтобы получить от компьютера определенную фразу, про- Z2ZZZZZ граммисту достаточно было бы просто набрать оператор PRINT (печатать), а вслед за ним заключенный в кавычки текст. По словам Кемени, они хотели сделать язык на- столько простым, «чтобы студенты могли использовать его уже после трех часов занятий». УНИВЕРСАЛЬНЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ * Некоторые идеи Кемени и Курца отличались абсолютной новизной. Примером может служить оператор INPUT (ввести). Поскольку предполагалось, что студенты будут сами набирать программы непосредственно на терминале (а не передавать их в виде колоды перфокарт оператору вычислительного центра), то и язык был сконструирован с расчетом на интерактивное взаимодействие. Такое взаи- модействие позволяет программисту изменять программу в процессе ее работы, для чего требуется прервать испол- нение программы и ввести в нее новые данные или опера- торы. Кроме того, разработанный Кемени и Курцом язык предусматривал единое представление чисел, что отличало его от Фортрана, где используются два типа чисел — це- лые и так называемые числа с плавающей точкой (эти чис- ла задают дроби, и компьютер действительно интерпретирует их как числа, у которых десятичная точка может перемещаться). Поэтому студенту, программирую- щему на Бейсике, не нужно помнить о том, что в результа- те деления целого числа 2 на целое число 3 получится число, тип которого отличается от типа чисел 2 и 3. Как позднее отмечал сам Курц, «практически любое употреб- ление чисел оказывалось правильным». Для нового языка было выбрано очень удачное назва- ние — универсальный символический код для начинающих (Beginners All-Purpose Symbolic Code, или, сокращенно, BASIC). Язык Бейсик действительно универсален. С его помощью студент-социолог мог написать программу об- работки данных статистического обследования, студент- филолог, изучающий французский язык, — создать про- грамму спряжения правильных глаголов, а будущий инже- нер — подготовить программу для расчета характеристик прочности моста в зависимости от используемых мате- риалов. Летом 1963 г. Кемени начал разрабатывать первую вер- сию компилятора для языка Бейсик. Осенью того же года два студента приступили к проектированию и кодированию опе- рационной системы для машин, на которых Кемени и Курц намеревались реализовать свои идеи. Это были машины «Дженерал электрик-225» (General Electric 225) и «Дейтанет- 30» (Datanet-ЗО), приобретенные благодаря субсидиям Нацио- нального научного фонда и скидке, предоставленной фирмой «Дженерал электрик». В феврале 1964 г. оборудование было доставлено в колледж, и темпы работ сразу возросли. 29
Наконец, 1 мая 1964 г. все усилия слились воедино. В 4 ч утра в полуподвале здания колледжа Кемени-и его кол- леги заняли места у трех телетайпов, использовавшихся в качестве терминалов, и начали набирать программы. Позднее Кемени так вспоминал это событие: «Мы и рань- ше неоднократно проделывали подобную операцию, но именно в этот раз все наконец заработало. Одновременно родились язык Бейсик и система разделения времени». К июню число терминалов выросло до 11, а к осени их стало уже 20. Вскоре работа в режиме разделения времени преоблада- ла в большинстве крупных организаций — в университе- тах, правительственных агентствах и корпорациях. Правда, там обычно использовался не Бейсик, а другие языки программирования. Сам же Бейсик стал поистине массовым языком программирования. В значительной сте- пени этому способствовало то, что Бейсик практически по- всеместно начали использовать как встроенный язык микрокомпьютеров, получивших широкое распространение в конце 70-х годов. К середине 80-х годов с Бейсиком поз- накомились миллионы американских школьников, а вооб- ще в мире этим языком владеет больше людей, чем всеми скандинавскими (норвежским, шведским и датским) вместе взятыми. В начале 60-х годов все существующие языки програм- мирования высокого уровня можно было пересчитать по пальцам. Однако вскоре их общее число (с учетом разно- образных диалектов) достигло нескольких сотен. Поэтому были предприняты различные попытки создать универ- сальный язык программирования. Ни одна из них не увен- чалась полным успехом. Создается впечатление, что в программировании наилучший результат достигается только при индивидуальном подходе. Среди десятка на- иболее широко используемых языков каждый ориентиро- ван на решение специфических задач. Например, Бейсик по-прежнему широко употребляется для написания прос- тых программ, особенно программ для микрокомпьюте- ров. Фортран — с его четко определенными правилами выполнения арифметических действий — является класси- ческим (чем-то вроде латыни или греческого) языком про- граммирования, наиболее подходящим для выполнения естественнонаучных, математических и инженерных расче- тов. Язык программирования Кобол (COBOL, от Common Business Oriented Language — общий язык, ориентирован- ный на деловые задачи), созданный в 1960 г. объединен- ным комитетом производителей и пользователей компьютеров, был задуман как основной язык для массо- вой обработки данных в сферах управления и бизнеса. В Коболе, в отличие от большинства других языков, все дан- ные описываются в отдельной секции, которая не совпада- ет с секцией команд. Это соглашение позволяет использовать совместно одни и те же описания данных в различных программах. Другие языки еще более специализированны. Напри- мер, для обучения программированию школьников широко используется язык Лого (от греческого logos — слово). Этот язык позволяет новичку управлять движением по экрану специального символа под названием «черепашка». Так, набирая последовательно команды FORWARD 60 (вперед), LEFT 45 (влево), FORWARD 75, юный програм- мист сообщает компьютеру, что он хочет нарисовать пря- мую линию длиной в 60 единиц, затем сделать поворот против часовой стрелки на 45 градусов и нарисовать еще одну линию длиной в 75 единиц. Еще один заслуживающий внимания язык программи- рования — Алгол (ALGOL, от ALGOorithmic Language — алгоритмический язык). Как и Кобол, это — плод работы комитета, но не национального, а международного. Язык предназначен для записи алгоритмов, которые строятся в виде последовательности процедур, применяемых для ре- шения поставленной задачи. Первая версия этого языка, Алгол-58, была разработана в ходе напряженного восьми- дневного совещания в конце весны 1958 г. Специалисты по вычислительной технике и программированию из США (в их числе Джон Бекус — один из создателей языка Форт- ран) встретились со своими европейскими коллегами в Цюрихе. Цель встречи заключалась в разработке проекта универсального машинно-независимого языка, который по своему уровню не уступал бы Фортрану. На самом деле Фортран и сам вполне мог бы претендовать на роль тако- го универсального языка, если бы не его чересчур тесная связь с фирмой ИБМ и ее машинами. Программисты да- леко неоднозначно приняли язык Алгол-58 и его преемника Алгол-60. Широкого одобрения (которого в конце концов добился Фортран) эти языки так и не получили. И все же их влияние на развитие других языков программирования оказалось весьма значительным. Среди языков, при создании которых ставилась цель улучшить Алгол, следует отметить Паскаль. Этот язык был разработан в конце 60-х годов швейцарским ученым Никлаусом Виртом. Язык Паскаль требует от програм- миста определения всех переменных в отдельной секции, расположенной в начале программы. Так как эти определе- ния задаются явным образом, то в Паскаль-программах сравнительно немного ошибок и их проще понять и испра- вить программисту, не являющемуся автором программы. Это делает Паскаль весьма подходящим для создания больших программ. В 1963 г. он был объявлен официаль- ным языком программирования для учащихся средних школ, которые намерены специализироваться в области вычислительной техники и программирования в американ- ских университетах. Несмотря на стремительный рост числа языков про- граммирования, программное обеспечение существенно от- ставало в своем развитии от технической базы компьютеров. В то время как в области производства ап- паратного обеспечения наблюдался неуклонный рост про- изводительности и снижение цены, стоимость программ- ного обеспечения продолжала увеличиваться. Иногда за- траты на программное обеспечение больших новых вычис- 30
лительных систем доходили до 80% от их общей стоимос- ти. Это, естественно, вызывало недовольство инженеров, которые считали, что программное обеспечение фактичес- ки превратилось в фактор сдерживания как для развития аппаратного обеспечения компьютеров, так и для примене- ния последних. Главная причина, сделавшая программное обеспечение своего рода камнем преткновения, кроется в его все воз- растающей сложности. Многие программы настолько ве- лики, что даже специалисты не в состоянии их понять. Например, пакет программного обеспечения для управле- ния системой воздушных перевозок, которая работает в 20 городах США и в одном городе Великобритании, насчиты- вает более 600 тыс. отдельных машинных команд. Из них 39 203 — команды условного перехода, обеспечивающие возможность разветвления программы по двум направле- ниям. Таким образом, общее количество возможных путей в программе составляет астрономическое число, которое приблизительно выражается числом 10 с 11 800 нулями. (В языке Бейсик оператор условного перехода может иметь вид IFN > = 4 THEN 220. Такой оператор предпи- сывает компьютеру перейти к выполнению оператора, за- данного в строке 220, если переменная N больше либо равна 4. Если N меньше 4, то компьютер должен автома- тически перейти к выполнению следующей строки про- граммы.) Однако сложность программного обеспечения лишь ча- стично обусловлена запутанностью решаемой задачи. Во многом она связана и с самой сутью процесса программи- рования, требующего огромного внимания и аккуратности при переводе конкретной задачи в термины, доступные компьютеру. УСТРАНЕНИЕ НЕОДНОЗНАЧНОСТИ В программировании недопустимо полагаться на волю случая. Пользователь, завороженный магией компьютера, не владея искусством программирования, склонен упускать из виду, что те действия, которые он считает само собой разумеющимися, машине надо сообщать в самых мельчай- ших подробностях. Один специалист по компьютерам за- метил: «Если говорить только о том, как человек обдумывает способ выполнения какого-либо действия, то здесь особых проблем не возникает. Однако люди пользу- ются такими удивительными способностями, как ассоциа- тивное мышление и распознавание образов». Для компьютера любое заранее планируемое действие надо разбить на самые элементарные шаги так, чтобы в результате получился алгоритм. В простейшем случае ал- горитм ни чем не отличается от рецепта для приготовле- ния праздничного пирога. Но программист должен определить и те элементарные шаги, которые человече- ский разум склонен просто не замечать. Например, в кули- нарном рецепте может быть сказано, что следует взять 3 яйца, однако там ничего не говорится о том, что они дол- жны быть свежими и что их предварительно надо разбить и использовать только содержимое, без скорлупы. Поскольку для того, чтобы предусмотреть любую слу- чайность, надо написать сотни, а то и тысячи команд ком- пьютера, естественно, растут затраты и вкрадываются ошибки. Все это порождает, по словам голландского уче- ного Эдсгера Дийкстры, «огромное множество досадных мелочей». Дийкстра — научный сотрудник фирмы «Баро- уз» (BURROUGHS), один из наиболее авторитетных в ми- ре теоретиков программирования и последовательный критик всего того, что он считает проявлением преступной халатности в данной области. Уже не один год он утверж- дает, что большинства ошибок можно избежать, и ведет неутомимую борьбу с небрежным стилем в программиро- вании, которое развивалось в основном не как строгая нау- ка, а как искусство, основанное на интуиции и личном опыте. В мире, где текстовые процессоры стали привычными, Дийкстра выбрал весьма нешаблонный способ пропаганды своих довольно спорных воззрений. Из своего дома, рас- положенного в окрестностях промышленного города Эйндховен, он время от времени рассылал информацион- ные бюллетени с индексом EWD (его инициалы). Дийкстра писал их в форме обычных писем, а потом делал с них копии, которые распространял среди двух десятков коллег. Свой плодотворный вклад в теорию программирования Дийкстра сделал в 1968 г. в возрасте 38 лет. В небольшой работе под названием «Заметки по структурному програм- мирование) он доказывал, что большинство программ неоправданно сложны из-за отсутствия в них четкой мате- матической структуры. Состояние дел в области проекти- рования программного обеспечения вызывало на протяжении ряда лет беспокойство многих специалистов по вычислительной технике. Все чаще работы по созданию новых систем программного обеспечения для правитель- ственных учреждений и промышленности стоимостью в миллионы долларов не укладывались в заранее установ- ленные сроки, а потом в процессе использования в них об- наруживались тысячи ошибок. Как раз в то время, когда Дийкстра писал свою работу, проходила международная конференция, на которой возникшая ситуация получила на- звание «кризис программного обеспечения». ПРИЗЫВ К СОБЛЮДЕНИЮ МАТЕМАТИЧЕСКОЙ СТРОГОСТИ Главным объектом критики Дийкстра избрал общеизвест- ную команду безусловного перехода, или оператор GOTO. Данный оператор служит для передачи управления из од- ной точки программы в другую. В некоторых случаях он весьма полезен, но в то же время этот оператор затрудня- ет восприятие программы (имеется в виду восприятие про- граммы человеком, так как для компьютера обработка операторов GOTO труда не составляет). Отслеживание этого оператора напоминает ситуацию, в какой вы оказа- лись бы, если бы при чтении романа вам приходилось все время перелистывать книгу на несколько страниц то на- зад, то вперед. Прерывая логическую последовательность алгоритма, операторы GOTO практически исключают воз- 31
можность хорошо разобраться в структуре программы для всех, кроме самого ее автора. А это в свою очередь не позволяет делать в программе какие-либо изменения без риска внести ошибки в самые неожиданные ее части. Как остроумно заметил один американский специалист по компьютерам, «если в вашей программе будет много опе- раторов GOTO, то она станет похожа на спагетти». Вместо операторов GOTO Дийкстра предложил испо- льзовать три типа управляющих структур: простую после- довательность (т. е. группу операторов, выполняемых друг за другом), альтернативу (конструкцию, позволяющую вы- брать один из двух или более возможных операторов) и повторение (конструкцию, позволяющую выполнять за- данный оператор до тех пор, пока удовлетворяется некото- рое условие). По мнению Дийкстры, используя эти три структуры, программист может вообще обходиться без операторов GOTO. Сначала идеи Дийкстры вызвали лишь усмешку среди программистов, не желавших отказываться от операторов GOTO. Однако в начале 70-х годов группа сотрудников фирмы ИБМ под руководством специалиста по системно- му программированию Харлана Миллса применила струк- турное программирование для создания информационного банка данных газеты «Нью-Йорк тайме». Работа над про- ектом шла на удивление гладко, а законченная программа практически не содержала ошибок. С тех пор структурное программирование стало оказы- вать заметное влияние на развитие программного обеспе- чения всех рангов — от программ, предназначенных для домашнего компьютера, до программ, обслуживающих многомиллионные оборонные проекты. На сегодня имеет- ся уже несколько языков программирования, в частности Паскаль, основанных на принципах, предложенных Дийкстрой. Харлан Миллс заявляет: «Теперь мы можем делать то, что не могли делать 10—15 лет назад. Не ду- маю, что полеты «космического челнока» стали бы воз- можны без применения методов структурного программирования». Важной вехой на пути широкого признания принципов структурного программирования стал 1975 г. В этом году Джон Кемени и Томас Курц, авторы самого демократич- ного языка программирования, дартмутского Бейсика, провели ревизию своего детища. Они ввели в него струк- турные возможности и, по выражению Кемени и Курца, «выбросили оператор GOTO сразу и без всякого сожале- ния». А спустя десять лет они предприняли еще один, бо- лее • существенный пересмотр языка, связанный с микрокомпьютерами. Случилось так, что вплоть до нача- ла 80-х годов, когда Курц впервые стал работать на персо- нальном компьютере, ни он, ни Кемени не имели ни малейшего понятия о широком коммерческом успехе свое- го творения. В результате применения Бейсика как основ- ного языка для микрокомпьютеров (их ограниченный объем памяти требовал некоторых модификаций исходной версии языка) возникло множество неуклюжих диалектов. По словам Курца, увиденное привело его в ужас. Поэтому Кемени и Курц в содружестве с Американским институтом национальных стандартов (ANSI) принялись за разработку канонической версии языка для микрокомпьютеров. Эту версию они назвали «истинный Бейсик» (True BASIC). ПОИСК И УСТРАНЕНИЕ ОШИБОК Эдсгер Дийкстра, внеся свой вклад в пересмотр принципов составления программ и создания самих языков програм- мирования, на этом не успокоился. Не меньше, чем опера- тор GOTO, его раздражали тестирование и отладка, составляющие заключительный этап создания любого про- граммного обеспечения. Еще со времен пакетной обработ- ки этот этап строился как последовательное проведение испытаний (тестовых прогонов) и поиска ошибок. Проис- ходило это так. Законченная программа загружалась в компьютер и тестировалась. Если в результате прогона выявлялись ошибки, то программа исправлялась и пропу- скалась еще раз. Если обнаруживалась новая ошибка, то она также исправлялась и весь процесс повторялся снача- ла. На подобные тестирование и отладку часто требова- лось больше времени, чем на все другие фазы разработки программы, вместе взятые. К тому же, как указывал Дий- кстра, тестирование может показать лишь наличие оши- бок, но не их отсутствие. Даже когда казалось, что программа полностью отлажена, новые входные данные могли вызвать отказ, или, как говорят программисты, «аварию». Вместо того чтобы заниматься тестированием про- грамм, Дийкстра предлагал проверять их математически- ми методами. Применительно к маленьким программам ему удалось добиться здесь определенных успехов, однако большие программы не поддавались таким приемам. С увеличением программы объем требуемого математиче- ского доказательства выходит из-под контроля. По объ- ему доказательство приближается к самой программе и также становится подверженным ошибкам. Дийкстра по- лагает, что для доказательства правильности больших программ математикам и программистам придется «на порядок увеличить свои способности к доказательству». Он признает, что эта задача трудно достижима, «но не- обязательно нереальна». В более отдаленной перспективе многие специалисты хотели бы изменить и другие этапы разработки программ- ного обеспечения. Важная роль в преодолении сложности отводится стандартизации отдельных частей программ (аналогично тому как это делается при создании библио- тек программ), что позволило бы сделать их столь же вза- имозаменяемыми, как и аппаратные компоненты. Тогда разработчику программного обеспечения уже не придется создавать каждую программную систему с нуля. Подобно инженеру, конструирующему компьютер из различных микросхем, он сможет создавать новую систему целиком из имеющихся в наличии модулей программного обес- печения. 32
НЕЛЕГКОЕ ИСКУССТВО ПРОГРАММИРОВАНИЯ Написание компьютерных программ требует смирения и предельной точности. Команды компьютера должны фор- мулироваться абсолютно полно и четко. Машины делают только то, что им сказано, и потому выдаваемые им при- казы не должны содержать ни малейшей двусмысленнос- ти. Это справедливо для программного обеспечения любого ранга — от простой музыкальной программы для настольного компьютера до чудовищно сложной програм- мы, предназначенной для управления воздушным движе- нием в районе аэропорта. Составление программ было бы особенно сложным, если бы для этого использовались нули и единицы двоич- ного кода. На самом нижнем уровне это — единственный доступный компьютеру способ общения. Однако програм- мисты создали специализированные языки, которые поз- воляют конструировать наборы машинных команд, не оперируя непосредственно строками, состоящими из дво- ичных символов. Существует множество языков высокого уровня, имеющих собственную грамматику и синтаксис и предназначенных для решения определенного класса задач. Ни один из этих языков не может быть признан универ- сальным. Например, язык, разработанный для научных приложений, плохо подходит для программы обработки платежной ведомости. Хотя в принципе его можно было бы приспособить для новой задачи, это потребовало бы создания соответствующих средств, которые уже реализо- ваны в специальных языках, ориентированных на обработ- ку коммерческих данных. Таким образом, выбор подходящего языка высокого уровня — первый шаг в процессе создания программного обеспечения. Следующий шаг состоит в описании как са- мой работы, возлагаемой на компьютер, так и методов ее выполнения. Такое описание делается в виде алгоритма, т. е. составления пошагового плана действий. Алгоритм должен быть безупречен с логической точки зрения — в противном случае в результате выполнения программы либо возникнет какая-то тарабарщина, либо программа совсем не будет работать. Наконец, программист должен проанализировать под- лежащие обработке типы данных, подобрав наилучшие методы для их сортировки и поиска. Если программа свя- зана с процессами, где решающую роль играет фактор времени (как, например, при управлении химической реак- цией на заводе), то наилучшими методами считаются те, которые обеспечивают максимальную скорость. Однако при других обстоятельствах (например, при работе про- граммы обработки сведений о банковском кредите) пред- почтительнее использовать методы, обеспечивающие сохранность информации и позволяющие организовать эф- фективный доступ к записанным на диске данным. Как показано далее, программисты разработали разно- образные стратегические принципы и технические приемы, помогающие создавать программное обеспечение для са- мых различных сфер человеческой деятельности. Правиль- но выбрав язык, алгоритм и методы программирования, они могут использовать всю мощь компьютера с макси- мальной эффективностью. 33
Нелегкое искусство программирования Риск неоднозначного толкования Разумеется, было бы весьма удобно давать компьютеру команды на обычном английском, французском, китай- ском или любом другом естественном языке. К сожале- нию, машины в силу своей излишней «прямолинейности» не в состоянии понимать тонкости человеческого общения. В естественном человеческом языке есть много слов, значения которых можно определить лишь из кон- текста. В отличие от компьютера человек мгновенно сообразит, что в английской фразе file the papers речь идет о хранении бумаг в картотеке, а не об их обработке слесарным инструментом (слово file в английском языке можно понимать и как «хранить», и как «шлифовать напильником»). Люди в разговоре сопровождают свои слова жестами и мимикой, используют метафоры, недомолвки, сарказм и другие приемы риторики, которые позволяют им говорить одно, а сообщать при этом нечто совсем другое. Люди употребляют слова неоднозначного смысла, используют контекст, интонацию и другие факторы, уточняющие смысл сказанного. Даже при письменном общении в ход идут всевозможные намеки, помогающие лучше понять смысл сказанного. Английская фраза this car is hot («этот автомобиль го- рячий») имеет совершенно различный смысл в зависимос- ти от того, кто и при каких обстоятельствах ее говорит. Если ее произносит агент по продаже автомобилей, то слушатель понимает, что данная марка машин пользуется спросом. Та же фраза в устах полицейского означает, что автомобиль был похищен. Если подобную фразу скажет водитель, проехавший путь в 160 км при 40-градусной жа- ре, то ее следует толковать как предупреждение о том, что прикосновение к машине связано с риском обжечь пальцы. Человеческий разум способен разобраться в головолом- ках естественного языка, но компьютер понимает только абсолютно строгую, математически точную систему обще- ния. В такой сцстеме каждый символ или группа символов всегда должны означать одно и то же, а каждое предложе- ние обязано, пониматься буквально. Ирония, разговорные выражения или туманные намеки попросту недопустимы. Естественные языки часто допускают сокращения, которые человеку понятны из его социального опы- та. Например, компьютер не может догадаться, что фраза «у меня на завтрак кофе с овсянкой» означает на самом деле «у меня на завтрак чашка кофе и миска овсянки», а отнюдь не смесь кофе с овсянкой. 34
Для компьютера двусмысленности, сплошь и рядом встре- чающиеся в естественных языках, — настоящее бедствие. Например, английская фраза I see a woman on the beach with my binoculars (я вижу на берегу женщину с моим би- ноклем) может означать: я вижу на берегу женщину и одно- временно вижу свой бинокль, лежащий на берегу. Ее можно толковать и так: я вижу на берегу женщину, которая дер- жит мой бинокль. Наконец, в английском языке эта фраза может иметь еще один смысл: в свой бинокль я вижу на берегу женщину. Человек может легко разобраться в воз- можных вариантах и правильно понять смысл сказанного. Компьютер же на его месте просто застыл бы в полном не- доумении. 35
Нелегкое искусство программирования Прилежные переводчики программ В принципе компьютер может обрабатывать команды и данные только тогда, когда они представлены в машин- ном коде, т. е. выражены на языке нулей и единиц, непо- средственно связанном с электронной «начинкой» —компьютера? Однаксгписа гь про» раммьт'тгмашинникпю-' де — занятие крайне утомительное. Дело несколько упро- щается, если воспользоваться языком ассемблера (языком низкого уровня), который разрешает вместо двоичных еди- ниц и нулей использовать мнемонические коды (например, STA — для обозначения команды записи какой-то величи- ны в регистр машины). Перевод ассемблерной программы в машинный код осуществляется с помощью другой про- граммы, называемой ассемблером. Язык ассемблера, как и машинный код, учитывает специфику конкретного типа компьютера, и поэтому оба этих языка позволяют про- граммисту максимально эффективно использовать аппа- особенности машины. менее большинство программистов предпочита- языками высокого уровня (например, поскольку они гораздо ближе к
естественному, человеческому, языку. В то же время ком- пьютер не может обрабатывать какие бы то ни было ко- манды до тех пор, пока они не переведены в нули и единицы. Этот перевод можно сделать с помощью транс- лятора (компилятора илтгинтерпретатора). Транслятор — это специальная программа, которая одновременно рас- считана и на конкретный язык, и на конкретный тип ком- пьютера. Обычно трансляторы загружаются во временную память с внешних запоминающих устройств. Интерпретаторы в некоторых системах хранятся в посто- янной памяти. С точки зрения выполнения работы компилятор и ин- терпретатор существенно различаются. Компилятор чита- ет всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, ко- торый затем загружается в компьютер и выполняется. Ин- терпретатор переводит и выполняет программу строка за строкой. После того как программа откомпилирована, ни сама исходная программа, ни компилятор более не нужны. В то же время программа, записанная на интерпретируе- мом языке, должна интерпретироваться при каждом про- гоне. Поэтому откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и моди- фицировать. 'ТС^щый^ койкретный язык ориентирован либо на ком- пиляцию, либо на интерпретацию — в зависимости от то- го, для каких целей он создавался. Например, Фортран был задуман как язык для разработки больших программ, предназначенных для решения естественнонаучных и мате- матических задач, в которых особенно важна скорость вы- полнения программ. Поэтому данный язык обычно реализуется с помощью компилятора. С другой стороны, Бейсик создавался как язык для начинающих программи- стов, для которых построчное выполнение программы имеет неоценимые преимущества. Иногда для одного язы- ка имеется и компилятор, и интерпретатор. В этом случае для разработки и тестирования программы можно воспо- льзоваться интерпретатором, а затем откомпилировать отлаженную программу, чтобы повысить скорость ее вы- полнения.
Нелегкое искусство программирования Выбор подходящего языка ТеляТд^тьТГ^граммистов попросить назвать самый луч- ший язык программирования, то скорее всего мы получим" десяток разных ответов, ибо такого языка просто не^буще- ствует, как нет и самого лучшего естественного языка. Теоретически для решения большинства/задач про- граммирования можно использовать любой язык. Од- нако на практике оказывается, что написать программу для конкретной задачи гораздо легче на одних языках, чем на других. Это связано с тем, Что в языках программиро- вания способ выражения та или иных понятий приспособ- лен к потребностагконкретного образа мыслей. Каждый язы£ -программирования имеет свой собствен- ный набор так называемых ключевых слов, состоящий из слов, букв, чисел или других символов. Ключевые слова соответствуютконкрегнымонераццямилипоследователь- ностям операций, которые должен произвестикомпьютер." Некоторые ключевые слова выполняют функцию глаго- лов, другие — существительных, определений или знаков препинания. Они связываются друг с другрм в соответст- вии с синтаксическими правилами, образуя предложения языка программирования. При выборе наиболее подходя- щего языка для решения той илииной задачи следует учи- тывать ряд факторов, в том числе степень квалификации программиста и размер будущей программы. Бейсик срав- нительно несложен для ^Пучения и хорошо подходит для разработки коротких и простых программ. В то же время большие программы на^этбм языке могут оказаться неу- клюжими и плохо организованными. Язык Паскаль обес- печивает возмрзбюсть создания больших программ, поддерживад Их строгую логическую структуру. Это каче- ство данного языка весьма ценно для начинающих про- граммистов, создающих серьезные программы, так как приучает их к определенной дисциплине. Однако для ко- ротких программ Паскаль может оказаться излишне гро- моздким. Другими важными факторами являются скорость-^ы- полнения программы и легкость ее сопровождена (т. е. простота ее последующего изменения, дополнения и от- ладки в течение всего периода эксплуатации). Программы на языке Форт (FORTH, редуцированное от fourth — четвертый) предельно крапщ-и'занимают совсем немного места в памяти. Несколько ключевых слов этого языка — просто знаки препинания. Поэтому программы на Фор- те работарт'значительно быстрее, чем программы на Бей- сике^/но одновременно это затрудняет их чтение и ропдовождение. Напротив, программы на языке Кобол очень удобны для сопровождения. Это достигается, во- первых, благодаря тому, что вся программа на этом языке делится на 4 различные секции, каждая из которых содер- жит определенный тип описаний (назначение программы; характеристики компьютера, для которого она написана; тип используемых данных; выполняемые команды). Во- вторых, синтаксис Кобола моделирует синтаксис предло- жений английского языка. Язык Лисп (LISP, от LISt Processing — обработка списков) широко применяется для исследований в об- ласти искусственного интеллекта — направления, ко- торое занимается созданием программного обеспече- ния, имитирующего человеческий разум. Лисп, соз- данный в конце 50-х годов математиком из Масса- чусетского технологического института Джоном Маккарти, гораздо лучше подходит для задач, свя- занных с манипулированием символами, чем для об- работки обычных чисел. Приведенная здесь программа преобразует значе- ние температур, заданных по шкале Фаренгейта, в их эквиваленты по шкале Цельсия. • 10 INPUT "Ваше имя?м:Ы$ 20 PRINT "Здравствуйте, ";N$ 30 END Язык Бейсик (BASIC, от Beginners All-Purpose Symbolic Code — универсальный символический код для начинающих) — это, как правило, первый ком- пьютерный язык, который изучают школьники и другие начинающие программисты. Он был разрабо- тан в середине 60-х годов профессорами Дартмут- ского колледжа Джоном Кемени и Томасом Курцом. В следующее десятилетие он завоевал всеобщее при- знание вследствие своей компактности и пригоднос- ти для первых персональных компьютеров с их ограниченным объемом памяти. На рисунке показана очень короткая игровая про- грамма, которая, запросив имя собеседника, затем приветствует era 38
г НАЧИСЛЕНИЕ ЗАРПЛАТЫ. ПОМЕСТИТЬ СТАВКА В ЗАРПЛАТА. ЕСЛИ СТАХ БОЛЬШЕ 10 ТО УМНОЖИТЬ СТАВКА НА 0.20 ПОЛУЧАЯ ПРОЦЕНТ-ПРИБАВКИ. СЛОЖИТЬ ПРОЦЕНТ-ПРИБАВКИ С СТАВКА ПОЛУЧАЯ ЗАРПЛАТА. Язык Фортран (FORTRAN, от FORmula TRANslator — переводчик формул) был разработан в Язык Кобол (COBOL, of~C0mm6n Business Oriented середине 50-х годов программистами фирмы ИБМ. В основном он используется для программ, выпол- няющих естественно-научные и математические рас- четы. По мнению одного специалиста в области Languace — общий язык, ориентированный на дело- вые задачи), детище Пентагона, был разработан в 1960 г. совместными усилиями федерального прави- тельства и производителей компьютеров. Основной целью было создать язык, который могли бы легко программирования, этот язык оказал долговремен- ное влияние «в том смысле, что начиная с 1957 г. все исследования в области языков программирова- ния имели своей целью преодоление недостатков, присущих Фортрану». Приведенная здесь программа служит для подсче- та среднеарифметического нескольких чисел. понимать деловые люди, профессионально не связан- ные с программированием. Структура и словарь этого языка весьма близки к обычному английскому языку. Кобол является основным языком для обра- ботки данных в таких учреждениях, как банки и страховые компании. Здесь показан фрагмент программы для начисле- 72*5*. 19ок Язык Форт (FORTH) получил свое название от анг- лийского слова forth (четвертый), так как, с точки зрения автора, это — язык программирования чет- вертого поколения. Идея создания данного языка Язык Паскаль (Pascal) получил свое название в честь французского математика XVII в. Блеза Паскаля. Этот язык был разработан швейцарским ученым, VAR сообщение: STRING; BEGIN сообщение:= 'Я мыслю - значит, существую. : writeIn (сообщение): END. специалистом в области информатики Никлаусом Виртом. Паскаль считается важнейшим инструмен- том для обучения методам структурного программи- рования и с 1983 г. введен в учебные курсы во всех средних школах США для учащихся, которые специ- ализируются в области информатики. Показанная здесь программа печатает фразу I think therefore I ат («Я мыслю — значит, суще- ствую» — знаменитое изречение Рене Декарта). принадлежит Чарлзу Муру, который разработал его в конце 60-х — начале 70-х годов как персональное средство повышения производительности труда. Форт стал более широко применяться в задачах управления после того, как Мур использовал его для реализации программы, предназначенной для управ- ления радиотелескопом Аризонской обсерватории. Здесь показана программа для вычисления выра- жения 5 + (2 « 7). 39
Нелегкое искусство программирования Команды обработки данных 1П ATON(? Ввод. Студенты, поступающие в ’ учебное заведение, символизируют Л данные, передаваемые в компьютер в ответ на команду ввода. Набор дан- ных с помощью клавиатуры — лишь один из нескольких способов ввода. Компьютер может читать данные с диска или какого-нибудь другого за- поминающего устройства, а также принимать их по телефону. Присваивание значений. Каждому студенту отводится определенная комната, точно так же каждому эле- менту данных, поступающему в ком- пьютер, назначается собственное ме- сто в оперативной памяти машины. Команды присваивания (вроде коман- ды LET языка Бейсик) дают про- граммисту возможность следить за изменением обрабатываемой инфор- мации в процессе выполнения про- граммы. Если бы не было команд, обеспечивающих управление памятью, входные данные были бы утрачены еще на этапе ввода. При помощи заданного набора команд программа пре- дельно четко сообщает компьютеру, что надо сделать с той или иной порцией обрабатываемой информации. Дан- ный процесс ведьма напоминает функционирование некой воображаемой системы народного образования, действую- щей по строго установленным правилам, которая иллюстрирована здесь символическими фигурками, которые команды, например управления вводом и водом данных, существуют практически в каждой про- Не- вы- про- Безусловный переход. После экзаме- на в ожидании оценок студенты отправляются на скамеечку. Это оли- цетворяет команду безусловного пере- хода (GOTO — в языке Бейсик), кото- рая предписывает компьютеру перей- ти к исполнению другой части программы, отличной от строки, рас- положенной непосредственно после данной команды. Сторонники струк- турного программирования стремятся исключить такие команды, поскольку они затрудняют понимание програм- мы человеком. Вычисление. Преподаватель, ведущий занятия и принимающий экзамены, символизирует ответную реакцию компьютера на команды вычисления, задающие выполнение арифметиче- ских операций. К вычислениям могут относиться как сложные математиче- ские процедуры, так и простые дей- ствия вроде сложения, вычитания, умножения и деления. 40
грамме, другие могут вообще отсутствовать в простых программах. Однако все семь изображенных на этом раз- вороте операций настолько основополагающи, что малове- роятно найти сколь-нибудь значительную по своим возможностям" и сложности программу, где отсутствовала хотя бы одна из них. Программисты отнюдь не обязаны использовать эти команды в указанной здесь последовательности. Напри- ле и в конце программы, но и в любой промежуточной точке. Другие команды могут так же применяться в любой последовательности и повторяться столько раз, сколько необходимо в каждой конкретной программе. В силу своей исключительной важности эти командьГ реализуются во всех компьютерных языках. В каждом языке они записы- ваются по-своему, но всегда обеспечивают выполнение одних и тех же действий компьютера. мер, ввод и вывод могут осуществляться не только в нача- rf BROWN U :’DRAKE I JONES h [little ! ЕСЛИ-TO. Оценки объявлены — в ре- зультате произошло разделение сту- дентов на тех, кто выдержал экза- мен, и тех, кто провалился. Это сим- волизирует команду принятия реше- ния, которая является средством для организации в программе условного ветвления. Программа предлагает компьютеру ответить «да» или «нет» на поставленный вопрос (например, «Выдержал ли экзамен X?») и пред- принимает действия в зависимости от характера ответа — «да» или «нет». Вывод. Студенты, успешно сдавшие экзамены, покидают учебное заведе- ние, олицетворяя тем самым команду вывода. Эта команда дает возмож- ность компьютеру выдать результаты вычислений. Выходные результаты могут быть представлены в различ- ной форме, включая звуковые эффек- ты, рисунки на экране или бумаге, а также электрические сигналы, переда- ваемые другому компьютеру. Повторение. Студенты, провалившие- ся на экзамене, отправляются для по- вторения уже пройденных шагов. Ко- манды повторения программисты ис- пользуют для организации циклов, требующих от компьютера много- кратного выполнения заданной после- довательности вычислений. Цикл мо- жет быть организован так, чтобы он заканчивался после выполнения опре- деленного условия или продолжался до тех пор, пока его не прервет сам пользователь. 41
Нелегкое искусство программирования Разработка плана действий Задача программиста состоит не в том, чтобы самому ре- шить задачу, а в том, чтобы спланировать такую последо- вательность команд, которая позволит компьютеру отыскать решение. Высокое быстродействие компьютера делает его весьма подходящим средством для решения за- дач, в которых требуется выполнить сложные или повто- ряющиеся вычисления. Однако, как показано на изображенной здесь и далее модели программы, машина способна также решать задачи, описываемые на языке формальной логики. Быстрое выполнение вычислений — это работа, специ- ально предназначенная для компьютера. Более содержа- тельную часть работы, связанную с—разработкой пошагового рецепта, или алгоритма, который указывает' компьютеру, каким образом тот должен выполнять зада- ние, лучше поручить человеку с его интеллектом. Чтобы сделать алгоритм максимально ясным и кратким, про- граммист всегда начинает работу со сбора известных фак- тов и четкой постановки задачи. Только после этого он приступает к разработке логической последовательности шагов, позволяющей компьютеру найти решение. Когда требуемый алгоритм сформулирован, возникает следующая задача, которая связана с переводом каждого шага в четкие команды, соответствующие правилам вы- бранного языка программирования. Затем программист обычно рассматривает поведение алгоритма при предель- ных значениях параметров задачи — с целью проверки его надежности. Во многих случаях такая проверка позволяет выявить пропущенные шаги или некорректные команды, способные вызвать ошибочные сообщения. В то же время ни одну деталь, сколь бы очевидной она ни казалась человеку, нельзя пропустить или взять на веру. Хороший программист должен обладать, с одной сторо- ны, способностями к маштабному мышлению, которое позволяет придумывать требуемые алгоритмы, а с другой — предельным вниманием к мелочам, что необхо- димо для преобразования алгоритмов в однозначный ком- пьютерный код. Демонстрацию процесса разработки компьютерной про- граммы начнем с постановки фантастической задачи. Ящик, изображенный на рисунке, — внешний в наборе вложенных друг в друга красных лакированных ящиков. Ящики плотно прилегают один к другому, так что между их стенками нет свободного пространства. В самом внут- реннем ящике лежит спрятанный императором бесценный изумруд. Драгоценный камень диаметром ровно 2 см уло- жен в ящик наименьшего размера, достаточного для его размещения. Каждый ящик, начиная с самого большого, длина стороны которого равна 3 м, и до самого внутрен- него, имеют стенки толщиной полсантиметра. Император пообещал отдать изумруд тому, кто первым определит, сколько ящиков надо открыть, чтобы добраться до драго- ценного камня. 42
шшшш дап ЗАМЕЧАНИЯ •• | Г ЗАМЕЧАНИЯ Поспелова I ельность слагов Размер наименьшего ящика — должен бь/ть Не меньше Зсм по внешней стороне. Переформулирование задачи. Сколько л ши ков надо открыть, чтобы довраться до драгоценного камня ? задачи Работа программиста начинается с пред- варительных замечаний. Первый шаг в создании компьютерной программы — переформулирование задачи с целью вы- явления ее основных моментов. При этом рассматриваются только факты, ко- торые каким-либо образом влияют на ре- Имеющиеся сведения Размер стороны внешнего ящика — во О см Толщина стенок—0,5см Размер камня 2-см в диаметре (ат о определяет размер наименьшего ящика) 0,5 При заданных размерах Яшика и камня процедура рещения задачи состоит в последовательном вычитании удвоенной толщины стенки (/см) из длины стороны внешнего ящика до тех лор, пока получаемый результат остается большим (либо равным) длины стороны наименьшего возможного ящика. Количество тре- буемых для этого шагов и есть ответ на вопрос задачи. сном случае такие де* дика и стоимость изу- мруда, прямого отношения к задаче не имеют. Для программиста важны лишь диаметр камня, толщина стенок и размер наибольшего ящика. Применяя логику и изобретательность при оперировании эти- ми немногочисленными фактами, про- граммист намечает метод поиска решения. 43
Нелегкое искусство программирования . I i J U U 1 I м j I П . а iЛ .1 ; Ввод, НАИБОЛЬШИЕ (внешний размер наибольшего ящика) ТОЛЩИНА (толщина стенок) КАМЕНЬ (размер камня) Вывод, СЧЕТЧИК (сколько ящиков было открыто) Дуиагностические сообщения — выдать сообЩс- Ния os ошибке; если получится, ото СЧЕТЧ ИК равен 0, если толщина меньше или равна (^=) О; если КАМЕНЬ меньше Или равен (<.—) О. Что делать Ввести: НАИБОЛЬШИЕ, ТОЛЩИНА, КАМЕНЬ Проверить, возмоукно ли решение при заданных значениях- Сели да, то провести начал ьиую установку значений переменных. Начать процесс с задания следующих величин! СЧЕТЧИК О ЭТОТЯЩИК -t— НАИБОЛЬШИЕ НАИМЕНЬШИЙ *г-КАМЕНЬ +2* ТОЛЩИН А Повторять пока ЭТОТЯЩИК > = НАИМЕНЬШИЕ ЭТОТЯЩЕК к— ЭТОТЯЩИК- (2* толщена) Счетчики— счетчик +/ Вывести С Ч ЕТЧ и К и/или диагностическое сооБщение. Разработка алгоритма Чтобы определить шаги, необходимые для решения задачи, программист сначала дол- жен решить, какая информация нужна ком- пьютеру. Затем он определяет информацию, которую компьютер должен выводить. Вы- ходная информация может включать в себя сообщения об ошибках, с помощью которых компьютер предупреждает программиста о некорректности или нарушении логики во входных данных. Наконец, программист на- чинает строить алгоритм, используя символ < — для задания значений переменным (на- пример, таким, как ЭТОТЯЩИК — размер очередного открываемого ящика). 44
атгсгсаттттгт Наибольший ящик. = 15 см Толщина стенок — 0,5 см Размер камня - 2 ем 15- 1 = /4 /4 - / - Y3 13-1 = 12. 12-1 =11 11 -1 -10 1О- 1 ~ 9 д -1 ~ 9 8-1=7 7- - 1 = 6 6-1=5 5-1=4 4-7~3 3 это наименьший возможный ящик счетчик / счетчик г счетчик з счетчик 4 счетчик т счетчик 6 счетчик 7 счетчик 8 счетчик 9 счетчик ю счетчик 11 счетчик 12 счетчик 13 Работает. Наибольший ящик - 2,5см Толщина стенок 0,5см Размер камня - 2 см П оскольку наименьший возможный Ящик имеет размер 5 см, то при за- данном размере наибольшего ящика Задача не разрешима. Задача раз- решима только з том случае, если размер наибольшего ящика Больше (либо равен) 5 см Прогонка теста Чтобы выяснить, не нарушена ли логика ал- горитма, программист прогоняет два прос- тых теста, задавая значения входным пере- менным и выполняя программу вручную. Алгоритм будет работать до тех пор, пока размер внешнего ящика больше, чем размер изумруда.
Нелегкое искусство программирования Разработка программы Программа, изображенная на экране дисплея, написана на языке Бейсик. Строки перенуме- рованы с шагом 10, так что, если потребует- ся, можно будет вставить дополнительные операторы. Операторы INPUT обеспечивают ввод значений, определяющих условие зада- чи. С помощью операторов LET присваива- ются значения переменным, которые изменя- ются во время исполнения программы. Текст, начинающийся с оператора REM, слу- жит комментарием для программиста — компьютер его просто игнорирует. Строки с номерами 100—140 образуют цикл, составля- ющий основную часть программы. Компью- тер повторяет их до тех пор, пока не найдет решения. 10 INPUT "Сообщите размер внешнего ящика (см)";НАИБОЛЬШИЙ 20 INPUT "Сообщите толщину стенок (см)";ТОЛЩИНА 30 INPUT "Сообщите размер камня (см)";КАМЕНЬ 40 IF ТОЛЩИНА <= 0 OR КАМЕНЬ <= 0 THEN PRINT "Шутите...": END 50 IF НАИБОЛЬШИЙ < КАМЕНЬ * (2 * ТОЛЩИНА) THEN PRINT "Внешний ящик ЧЕРЕСЧУР мал для такого камня": END 60 LET СЧЕТЧИК = 0 70 LET НАИМЕНЬШИЙ = КАМЕНЬ ♦ (2 * ТОЛЩИНА) 80 LET ЭТОТЯШИК = НАИБОЛЬШИЙ 90 REM Это повторяющаяся часть ... 100 WHILE ЭТОТЯШИК >= НАИМЕНЬШИЙ 110 LET ЭТОТЯШИК = ЭТОТЯШИК - (2 * ТОЛЩИНА) 120 LET СЧЕТЧИК = СЧЕТЧИК <• 1 130 PRINT "Открыт следующий ящик. Всего "-.СЧЕТЧИК 140 WEND: REM Здесь заканчивается оператор WHILE 150 PRINT "Всего было открыто ";СЧЕТЧИК;" ящиков." 160 END RUN ? as 46
Прогонка программы После того как программа введена в ком- пьютер, программисту остается лишь на- брать команду RUN — и машина начнет ра- ботать. В процессе работы она осуществляет «математическое открытие» ящиков, повто- ряя операцию вычитания, заданную в про- грамме. Теперь можно еще раз сформулиро- вать условие задачи вместе с ее решением: камень диаметром 2 см помещен внутрь на- именьшего из возможных ящиков, последова- тельно вложенных друг в друга таким обра- зом, что между их стенками отсутствуют промежутки. Стенки ящиков имеют толщину 0,5 см. Длина стороны наибольшего ящи- ка — 3 м. Чтобы добраться до камня, необ- ходимо открыть 298 ящиков. 47
Нелегкое искусство программирования Наглядное представление алгоритмов —----------------- Удобным вспомогательным средством при написании про- грамм является блок-схема, с помощью которой проекти- руемую систему можно представить графически. В блок-схемах для обозначения логически различных фраг- ментов программы используются определенные стандарт- ные символы (внизу), которые позволяют создавать легко читаемый план, описывающий последовательность шагов, выполняемых машиной. Довольно часто программисты используют блок-схемы для описания алгоритмов. Такой подход позволяет систематизировать собственное понима- ние алгоритма перед тем, как приступить к написанию бо- лее формального кода, отвечающего всем требованиям языка программирования. После того как программа на- писана, блок-схему можно также использовать для того, чтобы убедиться, что никакие важные моменты не упущены. Хотя создание детальных диаграмм со многими логи- ческими разветвлениями может на первый взгляд пока- заться утомительным занятием, такие диаграммы весьма полезны, особенно когда в работе участвуют несколько программистов. Подобные схемы наглядно показывают, каков индивидуальный вклад каждого из них в общую структуру^ Правительственные учреждения США, фирма ИБМ и многие другие крупные организации требуют, что- бы программисты непременно документировали свою ра- боту с помощью блок-схем. Блок-схема, изображенная на противоположной страни- це, дает графическое представление программы для реше- ния задачи о драгоценном камне. На этой блок-схеме прослежен логический путь программы от ввода необходи- мых данных до заключительного вывода полученного ре- шения на экран дисплея. Каждый раз, когда компьютер должен принять какое-то решение, схема разветвляется на два направления. Они соответствуют выбору альтернатив «да-нет» (истина-ложь). Выбор альтернативы используется также и для организации циклов. В соответствии с командами, записанными внутри нижнего прямоугольника (рисунок на противоположной странице), на каждом шаге цикла компьютер высвечивает на экране число открытых на данный момент ящиков. На- конец, когда будет открыт ящик с камнем и программа выйдет из цикла, последнее значение счетчика цикла и бу- дет решением. Обработка Выбор Здесь показаны основные элементы, из которых строятся блок- схемы. Овал отмечает начальные и конечные точки программы; па- раллелограмм символизирует операции ввода и вывода информа- ции; прямоугольник — процесс обработки информации компьюте- ром; ромб — операцию выбора, определяющую, какое действие должно выполняться следующим.
НАЧАЛО / Ввод КАМЕНЬ, / ТОЛЩИНА, НАИБОЛЬШИЙ / стоп Толщина стенок __________ и значение НЁт7Диагностическое/ КАМЕНЬ больше 0? сообщение А Ящик достаточно большой? Установка СЧЕТЧИК, НАИМЕНЬШИЙ, ЭТОТЯЩИК ЭТОТЯЩИК > = НАИМЕНЬШИЙ ? Увеличить СЧЕТЧИК Вычислить ЭТОТЯЩИК Напечатать текущее значениё- СЧЕТЧИК СТОП ^НЕт7'Диагностическое/ сообщение стоп Последнее значение СЧЕТЧИК (298) и сообщение Логическая последовательность шагов, необходи- мая для решения задачи о спрятанном камне, легко представима в виде блок-схемы. Каждый ромб обозначает точку, в которой принимается решение. Здесь компьютер должен выбрать одно из двух направлений дальнейшей работы. Напри- мер, вначале компьютер должен определить, имеет ли задача решение при заданных значени- ях толщины стенок, размера камня и длины сто- роны ящика. Стрелка, нарисованная на левой стороне блок-схемы, обозначает циклическое вы- полнение операций принятия решения и обработ- ки, которые повторяются до тех пор, пока не будет открыт самый маленький ящик. 49
Нелегкое искусство программирования Упорядочение хаоса Задание логической последовательности команд, управля- ющей работой компьютера, — всего лишь один аспект разработки программ. Необходимо еще так организовать обрабатываемые данные, чтобы они располагались в па- “мят1Гкомпьютера в определённом порядке. Если'бьГпрб-^ граммное обеспечение не содержало средств для организации гигантских объемов данных, подлежащих НЕОРГАНИ- ф v ы список Куры куры супы кофе хлеб рыба аспирин морковь апельсины мыло масло молоко салат ОРГАНИЗО- ВАННЫЙ СПИСОК N ЭЛЕМЕНТ хлеб масло [ молоко куры рыба супы i кофе хлеб масло молоко куры рыба супы кофе аспирин мыло морковь апельсины салат Покупатель, делающий покупки в соот- ветствии с неорганизованным списком, потратит много времени на хождение взад-вперед вдоль прилавков супермарке- та. Список, показанный выше, — по сути своей связанный список, в котором эле- ___г менты сгруппированы в соответствии с расположением на полках магазина. В памяти компьютера каждый элемент свя- занного списка ссылается на область па- мяти, содержащую следующий элемент. аспирин мыло морковь апельсины [ салат ссьи г с С с писки и вязанные списки Один из способов сортировки информации в памяти ^компьютера основан на использовании связанных списков. В таких списках требуемый порядок расположения элемен- т)в поддерживается с помощью ссылок, т. е. адресов, к ггорые указывают на область памяти, содержащую г о вредной элемент списка. Так как элементы связаны меж- \ ду собой при помощи ссылок, нет необходимости хранить их в непрерывном блоке памяти. Другое свойство связан- ных списков заключается в том, что для добавления и ис- ключения отдельных элементов не требуется переписывать целиком весь список. Так, если в программе обработки текстов отдельные слова документа рассматриваются как элементы списка, то это позволяет вставлять или убирать фрагменты текста, не нарушая порядка расположения остальных слов. * 50
хранению и обработке, то компьютеры оказались бы фак- тически бесполезными. В этом случае использовать ком- пьютер было бы столь же сложно, как, например, искать обеспечивать компьютеру возможность получить инфор- компьютера программисты используют различные техни- ческие приемы. Конечно, такие методы должны также тьи располагаются не по алфавиту, а чисто случайным образом. Для организации информации и упаковки ее в память хлеб масло рыба супы кофе аспирин мыло морковь апельсины хлеб куры стоп салат Чтобы внести элемент в список (на- пример, добавить «сыр» в молочную группу), надо просто изменить ссыл- ку в элементе 3 (молоко) и устано- вить ссылку в элементе 13 на эле- мент 4 (куры). — Свободное пространство Свободное пространство хлеб масло лее, эти методы довольно часто описываются с помощью понятий, используемых в нашей повседневной жизни, на- пример, таких, как магазин, очередь или список. При удалении двух элементов из списка освобождаются две области памяти, но при этом не нужно пере- мещать остальные элементы. Изме- нив две ссылки, так чтобы элемент 2 указывал на элемент 4, а элемент 11 на элемент 13, можно весьма эффек- • тивно (с точки зрения компьютера) устранить образовавшиеся в списке сыр куры рыба супы кофе аспирин мыло морковь салат стоп Элемент «чай», который надо распо- ложить в списке между 8 и 9 элемен- тами, можно поместить в незанятый элемент 3. Далее, чтобы установить необходимый порядок, надо соответ- ствующим образом изменить ссыл- ки — указатель элемента 8 установить на элемент 3, а указатель’ элемента 3 на элемент 9. 51
Нелегкое искусство программирования Организация ^Жа™кВХнь,м Решающим фактором в обеспечении эффективной работы программы является правильная организация обрабатыва- _емых данных. На практике довольно часто применяются два метода организации данных: FIFO (first in, first out — первым_пришел, первым ушел) и LIFO (last in, first out — последним пришел, первым ушел). Примером устройства, работающего по принципу FIFO, может служить эскала- тор (кто ступает на него первым, первым сходит на следу- ющем уровне). В то же время лифт часто работает по принципу LIFO (пассажиры, вошедшие первыми, оказыва- ются у задней стенки кабины и, таким образом, тот, кто Очередь. Чтобы проиллюстрировать метод хранения информации с помощью так назы- ваемых круговых очередей, элементы данных представлены здесь в виде занумерованных шаров, скатывающихся по наклонному жело- бу во временную память (или оперативное запоминающее устройство — ОЗУ) компьюте- ра. В ОЗУ проложен путь, обеспечивающий сохранение порядка их следования. Таким об- разом, первый элемент данных, поступивший в ОЗУ, становится первым элементом, выво- 52
входит последним, выходит из лифта первым). Метод организации данных по принципу FIFO обычно называют очередью {рисунок на противоположной странице), а о данных, которые хранятся по принципу LIFO, говорят, что они записаны в магазин {внизу). Принцип FIFO программисты применяют, когда дан- ные должны обрабатываться в том же порядке, в каком поступают. Текстовый процессор, например, должен выда- вать буквы на экран в том порядке, в каком их набирают например в Форте, магазинная память по принципу LIFO используется для обработки некоторых арифметических функций. В приведенном на рисунке {внизу) примере ком- пьютер решает задачу с помощью магазина, так как с ней нельзя справиться, если обрабатывать числа в порядке их поступления. Дело в том, что операцию умножения нельзя выполнять до тех пор, пока не осуществлена операция сло- жения (этот порядок задается с помощью скобок). Таким образом, представленную здесь задачу надо решать с на клавиатуре. В некоторых языках программирования, конца. Магазин. Числа и другие символы для вычисления данного выраже- ния заносятся в магазин в порядке их поступления. Таким образом, сложение чисел 4 и 7 становится первой операцией, выбираемой для исполнения. После завершения вычислений сумма (11) записывается обратно в магазин. Следующим в оче- реди на исполне- ние стоит ум- ножение. Результат этой операции (22) за- писывается обрат- но в магазин. Теперь единствен- ным элементом в магазине является число 22, которое и выдается в каче стве ответа. 53
Нелегкое искусстве^программйрования Методы сортировки и поиска Сортировка данных с целью организации их в удобном для обработки порядке — настолько важная функция (и даже своего рода искусство) в мире программирования, что для ее выполнения разработан целый ряд специальных программ. Теперь программист, занятый разработкой про- граммы, в которой надо произвести сортировку, может не задумываться о деталях ее реализации до тех пор, пока не закончены полностью все остальные части программы, а затем надо просто выбрать наиболее подходящий метод сортировки. На приведенных здесь рисунках показаны два широко используемых метода. «Метод пузырька» получил свое на- Имена бегунов, участвующих в данном марафо- не, образуют список, который надо выстроить (отсортировать) в алфавитном порядке. Для де- монстрации трех методов сортировки из общего списка участников выбрано 6 имен. Чтобы рас- положить их в алфавитном порядке методом пу- зырька, компьютер должен выполнить 12 срав- нений и перестановок. Для сортировки методом корзин требуется произвести 8 операций пере- сылки (в 3 корзины и 5 подкорзин). При сов- местном использовании методов корзин и пу- зырька нужно осуществить лишь 6 операций пе- ресылки. звание потому, что при его использовании некоторые из сортируемых элементов как бы всплывают в списке дан- ных, подобно воздушному пузырьку в стакане воды. На рисунке изображен бегун по имени Алекс, который подни- мается вверх по списку, организованному в алфавитном порядке. Программа, работающая по методу пузырька, просматривает список от начала до конца, сравнивая вна- чале первый и второй элементы, затем второй и третий и т. д. Если порядок следования двух элементов относи- тельно друг друга оказывается неправильным, то они ме- няются местами. После того как программа доходит до конца списка, она вновь возвращается к его началу и по- вторяет такую процедуру до тех пор, пока все элементы не займут правильные места. В программе, выполняющей сортировку «методом кор- зин» элементы раскладываются по воображаемым короб- кам (или корзинам). Например, если мы делаем сортировку в алфавитном порядке, то для каждой буквы можно назначить свою отдельную корзину. Затем каждая корзина делится на подкорзины, а содержащиеся в ней эле- ментй сортируются так, чтобы каждый попал в свою под- корзину. Иногда для больших списков данных комбинация двух описанных методов может оказаться эффективней, чем каждый из них в отдельности. Вначале весь список сортируется методом корзин, а затем каждая корзина в от- дельности упорядочивается методом пузырька. N Р Программа, в которой используется ме- тод пузырька, вначале сравнивает первые два имени списка (Билл и Анна) и меня- ет порядок их расположения (1). Далее элемент Билл, ставший вторым в списке, сравнивается с элементом Бетти, меняет- ся с ним местами и становится (2) треть- им. Затем сравниваются третий и четвер- тый элементы. В данном случае переста- новка не нужна (3). Далее четвертый элемент (Боб) сравнивается и меняется местами с элементом (Алекс) (4), а затем с элементом Карл, причем здесь переме- щений делать не требуется (5). При каж- дом следующем просмотре списка про- грамма перемещает элемент Алекс на од- но место вверх — до тех пор, пока список не будет отсортирован в нужном порядке. Методичный поиск Чтобы отыскать элемент в упорядоченном массиве данных, компьютер выполняет процедуру, которая похожа на поиск фамилии в телефонном справочнике (правда, делает это бо- лее методично). Например, отыскивая фамилию Waters, ком- пьютер не будет просматривать весь справочник от Л до Ж Вместо этого он разделит книгу пополам и выяснит, в ка- кой половине находится искомая фамилия. Затем повторит эту операцию в выбранной половине и так до тех пор, пока не будет найден нужный элемент. R т U V W X Y Z и 11 \/п и V Vl ' We V \А/ W \А/ W Wo W w WlJ 54
Анна Анна Анна леке Билл Бетти !ТТИ Бетти леке Анна Билл Бетти Билл Билл Алекс Алекс Бетти Бетти Боб Боб Алекс Билл Билл Билл Билл леке Боб Алею Алекс Боб Боб Боб Боб Карл Карл Карл ^арл Карл Карл подкорзины Ал и Ан, корзина Б де- ду с элементом Алекс был еще эле- Программа, в которой используется метод корзин, сразу помещает эле- менты Анна и Алекс в корзину А, лится на подкорзины Бе, Би и Бо. Поскольку для корзины К не требу- мент Алиса или в корзине Бе вместе с элементом Бетти был элемент Бен, Боб ,арл элементы Билл, Бетти и Боб — в корзину Б, а элемент Карл — в кор- то потребовались бы дополнительные Самым эффективным способом рас положения списка в алфавитном по- рядке является комбинированная сор- ется никаких новых разбиений, сорти- ровка здесь заканчивается после пересылки. зину К. Затем корзина А делится на Бе тировка. Вначале 6 бегунов распреде- ляются по 3 корзинам, а затем для каждой корзины выполняется сорти- ровка методом пузырька. В корзинах А и Б бегуны упорядочиваются за 3 сравнения и перемещения вместо 5 перемещений, которые потребовались бы при создании 5 подкорзин. Корзи- на К и в этом случае не требует дальнейшей сортировки — таким образом, вся работа завершается за 6 шагов. 55
56
I РАСЦВЕТ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Хлынувший в 70—80-х годах мощный поток новых средств программного обеспечения принес программы, позволявшие созда- вать всевозможные изображения. Здесь показаны примеры карти- нок, которые может нарисовать компьютер на экране дисплея — от двойной спирали молекулы ДНК до траектории движения космического аппарата «Вояджер» вблизи планеты Сатурн. В 1975 г. январский номер журнала Popular Electronics взбудоражил энтузиастов компьютерной техники. В этом номере была опубликована первая часть статьи, в которой описывался «первый в мире набор для сборки мини-компьютера, способно- го конкурировать с коммерческими моделями...«Альтаир-8800». В последующие дни сотни чеков, каждый на сумму 397 долл., пришли на адрес компании-производителя «Микроинструментэйшн энд телеметри систем» (Micro Instrumentation and Telemetry System, MITS), расположенной в маленьком городке Альбукерке, шт. Нью-Мексико. Сборка компьютера, несмотря на его весьма ограниченные возможности, была не простым делом. В законченном виде он представлял собой единственную микрос- хему, размещенную в небольшом голубом ящике, на передней панели которого рас- полагались ряды переключателей и индикаторных лампочек. Однако даже опытному радиолюбителю требовалось несколько часов на распайку всех со- единений. Но и собрав машину, ее владелец по-прежнему мог рассчитывать только на соб- ственные силы, поскольку «Альтаир» выпускался без программного обеспечения и купить его было негде. Если владелец компьютера хотел, чтобы машина делала что-нибудь полезное, ему нужно было сначала создать соответствующую про- грамму. Такая программа должна была удовлетворять двум требованиям. Во-первых — быть достаточно короткой, поскольку объем оперативной памяти «Альтаира» со- ставлял всего 256 байт, т. е. его хватало приблизительно на один абзац текста; во- вторых — составляться в двоичном коде. Составив подходящую короткую двоич- ную программу, пользователь мог ввести ее в компьютер, орудуя расположенными на передней панели машины переключателями (по одному переключателю на каж- дую двоичную цифру). Результат высвечивался загадочно мигающими лампочками, и его еще надо было научиться расшифровывать. Как видим, «Альтаир» предназна- чался для людей отнюдь не робкого десятка. Среди отчаянных любителей, не побоявшихся «выбросить деньги» ради сомни- тельного удовольствия заполучить в свои руки первые машины «Альтаир», было немало тех, кто спустя примерно десятилетие, оказался в рядах революционеров компьютерной индустрии. Опыт, приобретенный ими в работе с этой простейшей машиной, не пропал даром. Одним он пригодился при создании меньших по габари- там, но более совершенных машин; другим — при разработке удивительных про- грамм, которые даже трудно было вообразить лишь несколькими годами раньше. Эти программы могли решать такие задачи, как графическое редактирование или комплексный финансовый анализ. Однако тем, кто начинал работу с «Альтаиром», пришлось сделать в некотором роде шаг назад, к тем временам, когда для создания работающего программного обеспечения программисту нужно было хорошо разо- браться в «кухне» машины. Джон Бекус (один из создателей языка программирова- ния Фортран), вспоминая эти времена, говорил, что программист «должен был 57
стать искусным изобретателем, чтобы приспособить свою за- дачу к особенностям компьютера. Нужно было суметь разме- стить программу и данные в мизерном объеме памяти и пре- одолеть невообразимые трудности, связанные с организацией ввода и вывода информации, и все это требовалось сделать, используя ограниченный и часто весьма вычурный набор ко- манд». Однако владельцы «Альтаира» имели несомненное преимущество перед программистами первого поколения, по- скольку и аппаратура, и программное обеспечение компьюте- ров значительно усовершенствовались по сравнению с теми временами, когда для замены программы в неуклюжих и гро- моздких машинах (типа «Эниака» или гарвардского «Мар- ка-1») требовалось звать на помощь инженеров. В 50-х — начале 60-х годов компьютеры стали широко использоваться в различных организациях, в том числе в ведущих университетах, и таким образом оказались до- ступными новому поколению программистов. Первое их поколение состояло из людей, работавших в корпорациях и учреждениях, которые обычно занимались задачами, связанными с проведением сложных математических рас- четов или усовершенствованием управленческих систем (например, в области бухгалтерского учета или регистра- ции студентов). Новое поколение программистов в основ- ном формировалась из тех, кто был увлечен самим процессом решения задач с помощью компьютеров. Боль- шинство из них составляли студенты. Для некоторых из этих энтузиастов электроника была их «хобби», и для них не существовало ничего более заманчивого, чем расширить область применения компьютера. Эти «компьютерные наркоманы» не могли мириться с ограниченными возможностями системы пакетной обра- ботки, при которой программы приходилось передавать оператору и часами томиться в ожидании результатов вы- числений. Поэтому они стали искать способы, которые позволили бы им добраться до компьютера. Вначале они отыскивали физический или математический факультет, располагавший собственным мини-компьютером. Про- граммы для таких машин задавались при помощи перфо- ленты и могли моментально реагировать на команды, набираемые на клавиатуре. Затем студент-любитель зака- зывал машинное время под именем кого-нибудь, имеюще- го доступ к компьютеру, а то и тайно проникал в пустой машинный зал ночью или в выходные дни. Позднее один из таких энтузиастов рассказывал: «Можно было прийти в 9 ч вечера, когда физиков уже не было, и оставаться там до 9 ч утра, когда они возвращались. Это удавалось про- делывать каждую ночь. На машине я оставался до начала занятий, но зато на лекциях спал». МЕСТО РОЖДЕНИЯ ХЭКЕРОВ Вероятно, «рассадником» подобного необузданного увле- чения компьютерами стал Массачусетский технологический институт (МТИ), где программисты-маньяки стали сами себя называть хэкерами {hacker). Вначале этим прозвищем награждали проказливых студентов, а позднее — некото- рых членов клуба железнодорожного технического модели- рования. В клубе было две секции. В первой занимались главным образом внешним оформлением макета, строя весьма реалистичные ландшафт и модели поездов, во вто- рой — увлекались созданием хитроумного лабиринта «на- чинки» макета, приводившей его в движение. Члены клуба, составлявшие ядро второй группы, с каким-то фанатич- ным рвением просиживали бесконечные часы за монтажом системы. Они непрерывно модифицировали ее, изучая, как изменения, сделанные в одной части, сказываются на функционировании другой части системы, и искренне изумлялись, видя, насколько все взаимосвязано. Члены клуба даже создали собственный словарь. Например, о вы- шедшем из строя оборудовании они говорили, что его сле- дует «разминать», пока оно не исправится. Проект, не имеющий видимого практического значения и выполняе- мый исключительно ради удовольствия от самого процес- са работы, назывался (как и грубоватые шуточки) «хэк» {hack). Естественно, те, кто занимался подобными проек- тами, стали называться хэкерами. Приобщение хэкеров к компьютерам было лишь делом времени, так как к мощной институтской вычислительной системе фирмы ИБМ они имели очень ограниченный до- ступ. Все переменилось с появлением в июле 1958 г. срав- нительно небольшой машины ТХ-0, в которой вместо объемистых электронных ламп использовались транзисто- ры и, кроме того, имелся первоклассный монитор на ЭЛТ. К тому же машина была снабжена устройством звукового вывода и даже световым пером, с помощью которого можно было «рисовать» прямо на экране монитора. Но самое главное — в компьютере ТХ-0 не было системы па- кетной обработки, а следовательно, впервые в истории МТИ компьютерные энтузиасты заполучили в собствен- ные руки машину, в которую могли самостоятельно вво- дить перфоленту со своими программами и тут же, не отходя, получать результаты. Получив разрешение использовать машину ТХ-0, когда она свободна, хэкеры стали творить чудеса. Один запро- граммировал машину таким образом, что она исполняла музыку Баха, другой создал программу, которая с огром- ной скоростью преобразовывала числа из арабского пред- ставления в римское. (Когда автор программы с восхищением наблюдал за работой своего детища, один преподаватель иронически заметил: «Бог мой, да кому все это нужно?!») Еще один хэкер (на сей раз профессор) со- здал прототип компьютерной игры. В этой игре на экране был изображен прямоугольный лабиринт, заполненный световыми отметками в виде клинышков, которые симво- лизировали кусочки сыра; другая световая отметка, изо- 58
бражающая мышку, передвигалась по лабиринту в поисках сыра. В другом варианте программы кусочки сыра были заменены бокалами с мартини, и по мере того, как мышка переходила от одного бокала к другому, ее «походка» ста- новилась все менее твердой. Студенты МТИ, члены клуба тех- нического железнодорожного мо- делирования, осматривают одну из секций тщательно изготовлен- ного макета (фото 1960 г.). Мно- гие члены клуба, с увлечением строившие головоломную элект- рическую схему, расположенную Вскоре в МТИ появился еще один компьютер: PDP-1 (Programmed Data Processor — программируемый процес- сор данных). Эта машина была создана новой компанией, которую основал воспитанник МТИ Кеннет Олсен. Еще в годы учебы в своей альма-матер, участвуя в большом ком- пьютерном проекте, он понял, что наряду с гигантскими машинами, созданием которых тогда занимались, нужны и компьютеры поменьше. Именно такой компьютер он и разработал. Эта машина габаритами примерно с три хо- лодильника стоила в десятки раз меньше, чем обычные большие компьютеры того времени. PDP-1 и стала пред- вестником так называемых мини-компьютеров, которые под поверхностью макета, впос- ледствии связали свою судьбу с еще более сложным миром ком- пьютеров. 59
Изобретательные энтузиасты ком- пьютерной техники из МТИ управляют с помощью джойстика игрой «Космическая война», кото- рая разворачивается на экране дисплея машины PDP-1 (фото на- чала 60-х годов). Совершенствуя компьютерные игры, студенты познакомились с одним из наибо- лее спорных аспектов программи- рования. со временем в корне изменили всю компьютерную инду- стрию. Хэкеры МТИ влюбились в PDP-1 с первого взгляда. Автором самой увлекательной игры, разработанной на PDP-1, стал профессор Марвин Минский, который зани- мался искусственным интеллектом — научным направле- нием, зарождавшимся именно в то время. Минский написал программу, генерировавшую на экране монитора три световых пятнышка, из которых можно было строить самые разнообразные изображения: завитки, розы, гео- метрические фигуры. Среди хэкеров, очарованных этой программой (она по- лучила название «минскитрон»), был студент по имени Стефен Рассел, молодой человек в очках, страстно увле- ченный научной фантастикой, второсортными фильмами и компьютерами. Дав полную свободу всем трем своим страстям, Рассел разработал на базе минскитрона ком- пьютерную игру. В ней два игрока, орудуя переключателя- ми, могли управлять парой вооруженных ракетами космических кораблей, которые двигались на экране дис- плея. Цель игры заключалась в том, чтобы уничтожить корабль противника. Свою незамысловатую игру Рассел назвал «Космиче- ская война». Оставив копии перфоленты со своей програм- мой в ящике рядом с машиной, он предложил приятелям-хэкерам заняться ее усовершенствованием. Предложение было встречено с восторгом. Один студент, тщательно изучив астрономические таблицы, написал под- программу, которая позволяла изображать космические корабли на фоне звездного экваториального неба. За 24 ч на экране сменялось 365 звездных ночей. Другой хэкер ввел в программу силы тяготения Солнца и планет, что потребовало от игроков учитывать их наличие при расчете маневров. Если не считать небольших перерывов на еду и кока-колу, Рассел и его друзья играли не переставая. «Космическая война» способствовала и совершенство- ванию аппаратуры. Два постоянных игрока, решив, что управлять кораблями и ракетами с помощью консольных переключателей и одновременно смотреть на экран не слишком удобно, задумали создать принципиально иное устройство. Они сделали то, что, наверное, следует счи- тать первым компьютерным джойстиком. Это устройство представляло собой небольшую деревянную коробочку с установленными на ней переключателями и кнопками. От- ныне игрокам не нужно было стоять словно приклеенным к консоли машины — они могли спокойно сидеть на стуле или слегка прохаживаться. «Мышка в лабиринте», «Космическая война» и другие игры, созданные в то время (как, впрочем, и другие про- граммы хэкеров), стали всеобщим достоянием. Хэкеры по- лагали, что все создаваемое ими программное обеспечение должно быть доступно всем другим хэкерам. (Несколько лет спустя историограф хэкерского движения Стивен Леви назовет это этикой хэкера.) Копии программ (обычно на перфоленте, которую можно было непосредственно ис- пользовать на других машинах марки PDP или модифици- ровать для иных типов машин) циркулировали по не- формальной хэкерской сети и таким образом попадали в машинные залы университетов и корпораций по всей территории США. Вопрос об авторских правах не возни- кал, ибо в то время эти программы не имели никакой ком- мерческой цены. Предметом споров подобные случайные 60
заимствования стали лишь тогда, когда парк машин зна- чительно вырос. ПРОИЗВОДСТВО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ СТАНОВИТСЯ САМОСТОЯТЕЛЬНОЙ ОТРАСЛЬЮ В 1960 г. в США было, вероятно, всего около 5 тыс. ком- пьютеров. Машины, установленные в учреждениях, приме- нялись главным образом для расчета заработной платы, складского учета, выписки счетов, подсчета реализации продукции и анализа цен. В военном деле компьютеры ис- пользовались для координации работы систем ПВО и управления полетами. В то время фирмы-производители в основном сами со- здавали программное обеспечение для собственных ма- шин. Но уже тогда появились признаки изменения ситуации. На арену вышел новый вид бизнеса — независи- мая продажа программного обеспечения. Одна из первых компаний такого рода начала свою деятельность весной 1959 г. Основателями ее были два молодых человека, ра- ботавшие ранее в авиационной промышленности. Один из них, Рой Натт, был программистом в «Юнайтед эйр- крафт» (United Aircraft). Как-то он узнал, что одной ком- пании понадобился новый компилятор для перевода программы с языка высокого уровня в машинный код их компьютера. Вместе со своим другом Флетчером Джоун- сом, работавшим в фирме «Норт америкэн эвиэйшн» (North American Aviation), он решил взять подряд на эту работу. Получив заказ, два друга уволились с прежней ра- боты и основали собственную корпорацию «Компьютер сайенсиз», КСК (Computer Sciences Corporation, CSC) с на- чальным капиталом в 100 долл. Новая компания соверши- ла поистине головокружительный взлет: в 1964 г. КСК заняла первое место среди компаний — производителей программного обеспечения, включенных в список нацио- нальной фондовой биржи. Первоначально основными клиентами Натта, Джоунса и других предпринимателей зарождающейся области ин- дустрии были гигантские корпорации и правительственные учреждения наподобие НАСА. Однако уже тогда наметил- ся значительный рост производства компьютеров, а вме- сте с ним следовало ожидать и увеличения потребности в более разнообразном программном обеспечении. Катализатором такого роста как раз и стал новый представитель семейства PDP — компьютер PDP-8. (Пер- вой в этом семействе была машина PDP-1, на которой Стефен Рассел и его друзья-хэкеры совершенствовали свою «Космическую войну».) Машина PDP-8 появилась на рын- ке в 1965 г. Это был первый мини-компьютер, имевший коммерческий успех. Цена машины зависела от набора до- полнительных устройств и конфигурации и в некоторых случаях не превышала 18 тыс. долларов. Это делало ее вполне доступной для тысяч небольших технических фирм. За этим последовали машины других фирм — производи- телей компьютеров, и к концу 60-х годов в мире использо- валось уже около 100 тыс. вычислительных машин. Отныне владение компьютерами перестало быть ис- ключительной монополией больших и богатых организа- ций, что в свою очередь стимулировало создание боль- шого количества новых разнообразных компонентов про- граммного обеспечения. Это было необходимо, так как значительно расширился круг потенциальных покупателей машин (от компаний по продаже автомобилей до фирм, занятых переработкой нефти), каждый из которых пресле- довал свои специфические интересы. Некоторые произво- дители программного обеспечения стали специализиро- ться в области создания программ для автоматизирован- ного проектирования. Автомобилестроительные компа- нии, архитектурные фирмы и разработчики космических проектов в равной степени считали, что на всех этапах процесса проектирования — от чертежной доски до испы- таний на прочность — эффективность использования ком- пьютеров не вызывает сомнений. Геологи, исследуя нефтяные месторождения, вооружались картами, состав- ленными с помощью компьютера, а на заводах мини- компьютеры стали управлять роботами, производившими сборку автомобилей. Но, несмотря на достигнутые успехи, дальнейший про- гресс в области аппаратных и программных средств был обязан не индустрии мини-компьютеров (и тем более не производителям больших машин) и не компаниям — раз- работчикам программного обеспечения, в несметном коли- честве появившимся в 60-х годах. Новый этап наступил с появлением персонального компьютера, создание которого стало возможным благодаря изобретению микропроцессо- ра. Отныне каждый хэкер и даже просто любитель, имев- ший в кармане несколько лишних сотен долларов, мог стать обладателем компьютера. Такое гигантское расшире- ние сферы применения компьютеров повлияло, в частнос- ти, и на саму этику хэкеров, существенно деформировав ее. ДВА ЧАРОДЕЯ ПРОГРАММИРОВАНИЯ Начало этой деформации положила все та же публикация журнала Popular Electronics за 1975 г., посвященная маши- не «Альтаир-8800», которая привлекла к себе* внимание многих любителей электронной и компьютерной техники. Среди наиболее горячих энтузиастов этой новинки был Пол Аллен — молодой программист из компьютерной фирмы «Хониуэлл» (Honeywell), расположенной неподале- ку от Бостона. Узнав о новой машине, Аллен немедленно отправился к своему другу детства Уильяму Гейтсу, сту- денту первого курса Гарвардского университета. Молодые люди решили, что машина-малютка нуждается в про- граммном обеспечении. Дерзкий шаг, который они пред- приняли в следующую минуту, навсегда сохранится в истории компьютеров. Гейтс и Аллен позвонили в Альбу- 61
керке в фирму, производившую машину «Альтаир». Они сообщили ее владельцу Эду Робертсу, что разработали программу, которая может переводить Бейсик в машин- ный код для «Альтаира», и готовы продать ее Робертсу. Тот не задумываясь заявил, что готов купить первый же интерпретатор Бейсика, способный работать на «Альтаире». Гейтс и Аллен лихорадочно принялись за работу. Эти дни напомнили им те времена, когда они, будучи еще уче- никами средней школы в Сиэтле, вступили в сообщество хэкеров. Их школьный клуб арендовал машинное время в системе разделения времени, и Гейтс самостоятельно на- учился программировать в возрасте всего 13 лет. Еще уче- никами Гейтс и Аллен основали компанию под названием «Траф-о-дейта» (Traf-o-Data) и попытались — правда, без особого успеха — продать результаты своих компьютер- ных исследований транспортных потоков в небольших го- родах, расположенных в окрестностях Сиэтла. Тем не менее слух о программистском искусстве двух молодых людей широко распространился, и один из основных по- ставщиков программного обеспечения предложил им напи- сать программу для компаний, обслуживающих электросети северо-восточной части США и Канады. «Никто не знал, что тогда мы были еще учениками 9 и 10 классов», — вспоминал позднее Гейтс. Полученный опыт весьма пригодился при выполнении проекта для «Альтаира», ибо они работали, даже не видев эту машину. Все, чем они располагали, — это руковод- ство по системе команд микропроцессора «Интел-8080», на базе которого был построен «Альтаир». Однако этого руководства и сведений о спецификациях самой машины было вполне достаточно, чтобы написать программу для моделирования операций нового микрокомпьютера. Про- гоняя программу на большом компьютере, они отлажива- ли свой интерпретатор. Когда первый законченный вариант интерпретатора был готов, друзья выдали его на перфоленту и Аллен вы- летел в Альбукерке, чтобы показать программу Робертсу. К тому времени Робертс оборудовал одну из своих машин дополнительной платой памяти, телетайпом и устрой- ством для чтения перфоленты. Но когда самолет начал за- ходить на посадку, Аллен вдруг сообразил, что они с Гейтсом забыли маленькую, но довольно важную де- таль — программу загрузки, без которой микропроцессор «Альтаира» просто не сможет ввести их интерпретатор в память. Ничего не оставалось делать, как тут же в само- лете набросать на клочке бумаги вариант загрузчика пря- мо в кодах машины. На следующее утро Аллен внес последние добавления, ввел ленту с интерпретатором Бейсика в машину и стал ждать. Примерно через 5 мин программа была загружена. Аллен, щелкнув переключателем, запустил ее в работу. Он прекрасно понимал, что если они с Гейтсом допустили в программе ошибку, то работать она не будет. Вдруг теле- тайп ожил и на бумаге появился текст: РАЗМЕР ПАМЯТИ?. Наконец-то можно было перевести дух. Программа, ка- жется, работала. В ответ Аллен напечатал: 7К. Затем он ввел элементарную задачу: PRINT 2+2. Машина момен- тально ответила: 4. Как отмечал цозднее Билл Гейтс, Ро- бертс и его коллеги из фирмы МИТС «были крайне взволнованы, поскольку до этого никто из них не видел, чтобы эта машина что-нибудь делала». Робертс купил программу, а Аллен и Гейтс во второй раз в жизни орга- низовали компанию, назвав ее на сей раз «Микрософт» (Microsoft). Продолжая совершенствовать интерпретатор для «Альтаира», они написали также ряд других программ для малых машин. «Вообще-то это была ерунда, — позд- нее говорил Гейтс, — но пользователи были довольны». К числу наиболее восторженных поклонников «Альтаи- ра», несомненно, можно отнести членов организованного в то время клуба «Самодельный компьютер». Территори- ально он располагался в Калифорнии, в местечке Пало- Альто, и представлял собой независимую ассоциацию эн- тузиастов компьютерной техники. На своих собраниях, проходивших в непринужденной обстановке, члены клуба обменивались информацией, техническими советами, ча- стями для компьютеров и программами. Никакая инфор- мация, имеющая отношение к аппаратуре или программному обеспечению компьютеров, независимо от того, каких трудов стоило ее заполучить, не скрывалась. Естественно, любители — истинные носители духа хэкеров — страстно желали заполучить интерпретатор Бейсика для машины «Альтаир». Но компания МИТС продавала ленточку с программой за 500 долл., что созда- вало непреодолимый барьер между Бейсиком и основной частью компьютерных любителей. В июне 1975 г. группа инженеров из фирмы МИТС про- демонстрировала «Альтаир» на семинаре в Пало-Альто. К радости многих присутствовавших там хэкеров из клуба «Самодельный компьютер» показанная модель позволяла работать с Бейсиком. Не устояв перед искушением, один из членов клуба прихватил запасную перфоленту, случайно оказавшуюся неподалеку от работающего телетайпа «Аль- таира». На следующей встрече в клубе он попросил одно- го из участников изготовить с этой ленты несколько копий. Вскоре каждый член клуба, пожелавший иметь лен- ту, смог ее заполучить. А затем по национальной хэкер- ской сети Бейсик для машины «Альтаир» быстро распространился и в другие клубы хэкеров. Аллен и Гейтс, продавшие МИТС свою программу на условиях отчисления авторского гонорара с каждого про- данного экземпляра, были более чем удручены подобным развитием событий. Их раздражение еще более возросло, когда стало очевидным, что количество покупателей было бы куда больше, не появись эта «самиздатовская» версия 62
программы. После того как первое возмущение несколько улеглось, Гейтс направил «открытое письмо любителям», которое было опубликовано в нескольких изданиях, посвя- щенных компьютерам. В письме отмечалось, что Гейтс и Аллен получили много хвалебных отзывов на свою про- грамму, но при этом выяснилось, что большинство из тех, кто не скупится на похвалы, на самом деле программу не покупал. «Как могло такое случиться? — задавал вопрос Гейтс, и затем сам же на него отвечал, высказывая резкое обвинение в адрес любителей. — Все эти многочисленные любители должны отдавать себе отчет, что они фактичес- ки украли программу, — писал он. — Кто может позво- лить себе делать профессиональную работу за просто так? Кто из любителей может потратить три человеко-года на программирование, отыскивание всех ошибок, документи- рование изделия и затем раздать его бесплатно?» Для Гейтса ответ на этот вопрос был очевиден, однако его точку зрения разделяли далеко не все. Например, ре- дактор одного небольшого издания для любителей заявил, что «самым правильным было порвать письмо и забыть о нем». А члены одного компьютерного клуба даже об- суждали вопрос о том, не привлечь ли Гейтса к суду за необоснованное обвинение в воровстве. Из нескольких со- тен писем, полученных Гейтсом в ответ на его протест, большинство содержали отрицательный отклик и лишь в пяти-шести был затребованный Гейтсом чек в оплату за полученный контрабандным путем интерпретатор Бейси- ка. НА АРЕНУ ВЫХОДЯТ ПРЕДПРИНИМАТЕЛИ Спор, разгоревшийся между Гейтсом и хэкерами, в кругах, связанных с компьютерами, получил известность как скан- дал вокруг программного обеспечения. Некоторые хэкеры оставались при своем мнении еще многие годы и после то- го, как скандал утих. Они писали и распространяли так на- зываемые программы всеобщего достояния, которыми мог бесплатно пользоваться каждый желающий. Эти про- граммы и сейчас можно найти в сотнях компьютерных бюллетеней, распространяемых по всей территории США. Однако вместе с массовым производством компьютеров колоссально выросло и количество их пользователей, и, поскольку продажа программного обеспечения сулила ог- ромные барыши, в конечном итоге восторжествовала точ- ка зрения Гейтса. Ключевую роль в переменах, происшедших в области аппаратных и программных средств, сыграл Стефан Воз- няк — один из основателей клуба «Самодельный компью- тер». Весной 1977 г. он вместе со своим другом и партнером по работе Стивеном Джобсом изготовил не- большой, относительно дешевый и вместе с тем вполне за- конченный персональный компьютер «Эпл-2». Две другие компании — «Коммодоре» (Commodore) и «Рэдио шэк» (Radio Shack) — уже выпустили в продажу похожие ма- шины, однако роль детонатора, вызвавшего взрыв в обла- сти персональных компьютеров, сыграл именно «Эпл-2». Вскоре в эту область ринулось множество других конку- рентов, а миллионы нетерпеливых покупателей поспешили обзавестись персональным компьютером. Но чтобы купленный компьютер стал действительно полезным инструментом, их владельцам требовалось про- граммное обеспечение, и в этом им готова была помочь целая армия программистов и предпринимателей. Особую популярность получили текстовые процессоры, хотя снача- ла — что характерно для любой новинки — автор первой такой программы для микрокомпьютера далеко не пре- успевал. В начале 1975 г. кинорежиссер из Нью-Йорка Майкл Шрейер, отправившийся в Калифорнию в поисках удачи, По сравнению с тщательно отделан- ными микрокомпьютерами более поз- дних моделей «Альтаир-8800», перед- няя панель которого ощетинилась ин- дикаторными лампочками и переклю- чателями, выглядит довольно стран- но. Однако не стоит забывать, что бум в области персональных компью- теров начался именно с малыша «Альтаира», увидевшего свет в 1975 г. 63
Декорации для видеоигр За привлекательным фасадом видеоигры с ее динамичной графикой и восхитительными звуковыми эффектами лежит сложнейшая компьютерная программа. Чтобы добиться успеха, создатель видеоигры должен не только обладать воображением и способностями кинорежиссера, но и быть высококлассным программистом, умеющим приспособить игру к самым разнообразным звуковым и графическим возможностям компьютера. Все видеоигры — компьютерные, но не все компьютер- ные игры — видеоигры. От других компьютерных развле- чений (вроде игры в слова, электронных шахмат или компьютерного покера) видеоигры отличаются небывалой эмоциональностью, которая порождается быстроменяю- щимися игровыми ситуациями, требующими немедленно- го ответа игрока с помощью джойстика или какого-то другого устройства управления. Игрок не может рассчиты- вать на хороший результат, если не обладает быстрой ре- акцией и прекрасной зрительно-двигательной координа- цией. Чтобы получить признание опытных игроков, созда- тель видеоигры должен найти золотую середину, которая позволила бы сделать игру одновременно и веселой, и со- стязательной. Видеоигра, показанная здесь и на следующем разворо- те, иллюстрирует некоторые основные принципы создания видеоигр. Например, иллюзия движения (поворачивающая за угол машина или движущийся по рельсам поезд) созда- ется путем быстрой смены (несколько раз в секунду) кар- тинки на экране. Одна из задач, возникающих при разработке видеоигры, заключается в том, чтобы разме- стить в памяти компьютера все данные, необходимые для создания таких быстроменяющихся картинок. Затем надо написать эффективную программу, способную монтиро- вать целостную картинку за мгновение до ее показа игроку. Создание таблицы образов. Каж- дая участвующая в игре фигура должна быть закодирована в виде набора чисел и записана в табли- цу образов (каталог). Движущие- ся фигуры (например, автомобиль или паровоз) приходится вносить в таблицу несколько раз — от- дельно для каждого угла зрения или совершаемого действия. Таб- лица образов для нашей простой игры должна содержать более 100 различных объектов. Создание образов. Каждый воз- никающий на экране компьютера образ начинается с простой кар- тинки, например с силуэта авто- мобиля (вверху). Затем создатель игры накладывает на него сетку (в центре) и строит приближен- ное представление графического образа с помощью квадратиков так, чтобы его можно было зако- дировать и хранить в памяти компьютера. Кодирование заклю- чается в том, что каждому закра- шенному квадратику ставится в соответствие 1, а каждому пусто- му — 0. В этом упрощенном при- мере графический образ автомо- биля описывается с помощью 16 рядов единиц и нулей (внизу). Чтобы нарисовать автомобиль, компьютер должен сопоставить цифры определенным точкам на экране. Единицы соответствуют светлым точкам, нули — темным. Если изображение автомобиля на- до сделать цветным, то компью- теру потребуется более сложная информация. Она должна вклю- чать дополнительный набор чи- сел, с помощью которых компью- теру сообщается не только, какие точки светлые, а какие темные, но и их цвет. 0 0 0 0 0 0 0 0 0 0 0 0 0 01 0 ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 ( 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 ( 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 ( 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 |( 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ( 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 I 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0 0 0 0 0 л 0 Q 0 0 0 0 £ J2 ( 64
Конструирование декораций. Чтобы события в видеоигре развивались быстрее, в про- грамме используется прием, суть которого состоит в со- здании неменяющегося фона. В этом случае нет нужды пе- ресчитывать расположение каждого объекта всякий раз, когда производится монтаж новой картинки. Для прида- ния изображению большей ре- альности показанный здесь фон имеет один меняющийся элемент — зыбь на поверх- ности озера. Разработчик до- бивается желаемого эффекта путем создания нескольких ва- риантов картинки, изобража- ющей озеро. Один вариант — со спокойной голубой водой, остальные — с едва отличаю- щимися расположениями бе- лых крапинок. Остается запи- сать в программе цикл, кото- рый будет случайным обра- зом чередовать картинки с изображением озера в процес- се игры. 10 REM П/П ДЛЯ ИМИТАЦИИ ВЗРЫВА 20 FOR X = -10 ТО 10 30 SOUND 0, 200. 4. 10-ABS(X) 40 SOUND 1. 255. 4. 10-ABS(X) 50 SOUND 2. 225. 4. 10-ABS(X) 60 SOUND 3. 150, 4, 10-ABS(X) 70 NEXT X 80 RETURN Создание библиотеки звуков Звуковые эффекты являются важным компо- нентом видеоигры, придающим ей дополни- тельную привлекательность. В нашей игре можно использовать такие звуки, как гудок паровоза, грохот во время аварии и мычание. Компьютер создает звуки, посылая электриче- ские импульсы либо на встроенный динамик, либо на специальный выносной блок, подклю- чаемый к машине. Нужная последователь- ность сигналов задается с помощью подпро- граммы, которая содержит цифровые наборы, определяющие высоту, силу, продолжитель- ность и другие характеристики звуковых то- нов. Различные типы компьютеров существен- но отличаются по своим звуковым возможно- стям, поэтому для каждой конкретной игры желаемые шумовые эффекты подбираются экспериментальным путем в зависимости от модели компьютера. Показанная на этом ри- сунке подпрограмма, которая состоит всего из нескольких строк, является составной частью игровой программы на языке Бейсик для ком- пьютера «Альтаир». На соответствующей ма- шине эти команды воспроизводят звуковой эффект, напоминающий скрежет попавшего в аварию автомобиля. 65
Декорации для видеоигр Человеческие рефлексы против машинной логики В течение всего сеанса игры (в нашем примере это авто- ралли) создаваемые программой картинки и сопутствую- щие им звуковые эффекты определяются двумя факто- рами: действиями игрока и внутренней логикой алгорит- ма. На каждом шаге программа повторяет неизменяемые элементы ландшафта, а также продвигает вперед поезд, коров и другие программно-управляемые фигурки. Кроме того, программа — в соответствии с последней командой, С помощью джойстика игрок ме- няет направление движения авто- мобиля. Кнопка на рукоятке джойстика служит для его оста- новки. Игровая программа, сни- мая (считывая) поступающие с джойстика сигналы с частотой около 10 раз в секунду, изменяет соответствующим образом изо- бражение автомобиля на экране монитора. При построении каж- дого нового изображения про- грамма вычисляет, на какое рас- стояние и в каком направлении продвинулся автомобиль за про- шедший отрезок времени и не произошло ли при этом столкно- вения с каким-либо объектом.
полученной через джойстик от игрока, — перемещает ав- томобиль. Одновременно происходит непрерывный отсчет (и показ) времени, прошедшего с начала игры, и отслежи- вание (в соответствии с заложенными в программе прави- лами) «конфликтных ситуаций» между автомобилем и другими фигурками на экране. В большинство видеоигр заложены кое-какие «изюмин- ки», оживляющие игру и вносящие в нее дух состязатель- ности. Например, в представленной здесь программе это достигается благодаря звуковым эффектам и динамичной графике, а также за счет введения двух железнодорожных переездов, требующих от игрока выработки определенной стратегии прохождения трассы. Создатель игры должен также предусмотреть дополнительные препятствия, повы- шающие уровень сложности по мере продолжения игры. На экране слева показан момент игры, соответствующий 83-й секунде игрового времени. Автомобиль дви- жется наперерез приближающемуся поезду. Программа генерирует гудок паровоза и другие сигналы предупре- ждения, но дальнейший ход событий зависит от реакции игрока. Сцена на экране внизу показывает, что случилось в игре секунду спустя (подобную картинку надо демонстри- ровать, по-видимому, около 8 с): игрок вовремя не остановился, авто- мобиль врезался в поезд — и про- грамма, изобразив с соответствую- щим шумом аварию, заканчивает игру. 84 67
Этот рисунок, запечатлевший членов клуба «Самодельный компьютер», украшал конверт второго письма этой группы, датируемого 12 апреля 1975 г. Этот клуб любителей сфор- мировался на добровольных началах вскоре после появления «эпохального» персонально- го компьютера «Альтаир». Впоследствии не- которые из членов клуба заняли ведущее по- ложение в индустрии программного обес- печения. стал одним из обладателей набора для конструирования компьютера «Альтаир». Вскоре он усовершенствовал свою машину, подключив к ней клавиатуру и телевизор, выпо- лнявший роль дисплея, и стал продавать небольшие про- граммы. По мере того как программы становились все более сложными, усложнялись и руководства по их испо- льзованию. И однажды Шрейера осенило, что было бы го- раздо удобнее подготавливать эти руководства с помощью «Альтаира», а не печать на машинке. Позднее, мотивируя свое решение, Шрейер говорил: «Делать вещи более прос- тыми для меня всегда было своего рода игрой». Он тру- дился над своей программой по 16—20 ч в сутки на протяжении года. Закончив работу, он пустил программу в продажу под названием «Электрический карандаш». Вскоре Шрейер понял, что его потенциальный рынок не ограничивается лишь кругом владельцев «Альтаира», и на- писал варианты «Электрического карандаша» для других микрокомпьютеров и целого ряда принтеров. В общей сложности он создал 78 вариантов своей программы. Про- дажу ее Шрейер осуществлял главным образом по почте, так как в то время было менее 500 магазинов по продаже программного обеспечения. Для человека, который по на- туре своей был программистом, а не бизнесменом, такая ноша оказалась слишком обременительной. Со временем Шрейер потерял всякий интерес к бизнесу, перестал рас- пространять свой «Электрический карандаш» и полностью посвятил себя программированию. ПЕРВЫЕ ПРОМЫШЛЕННЫЕ СТАНДАРТЫ В первые два года после появления на свет «Электриче- ский карандаш» был фактически единственным текстовым процессором, доступным массовому потребителю. Однако по мере расширения рынка персональных компьютеров и роста его прибыльности другие предприниматели последо- вали примеру Шрейера. Одним из них был житель Нью- Йорка Сеймур Рубинштейн. Свою карьеру он начинал как программист, а затем работал консультантом по системам и посредником при продаже программного обеспечения производителям микрокомпьютеров. В 1978 г. Рубинштейн стал независимым производите- лем в области программного обеспечения. Первым, с кем он начал сотрудничать, был первоклассный программист Джон Барнэби. Среди многих задумок Рубинштейна был и текстовый процессор, которому он хотел подготовить хороший прием на рынке программного обеспечения. Пре- жде чем Барнэби приступил к работе, Рубинштейн собрал агентов по продаже программного обеспечения, желая вы- яснить у них, какими возможностями должен обладать текстовый процессор, чтобы привлечь покупателей. И только получив необходимые рекомендации, Рубинштейн и Барнэби стали разрабатывать соответствующую про- грамму. План Рубинштейна оказался весьма удачным. Про- грамма, которую они назвали «Уордстар» (WordStar), бы- стро завоевала рынок, практически сразу же став стандартом текстовых процессоров для микрокомпьюте- ров. По некоторым оценкам в последующие 6 лет число пользователей этой программы превысило количество по- требителей всех других текстовых процессоров, вместе взятых. Пока Рубинштейн готовил выпуск «Уордстара», Дэни- ел Бриклин, выпускник МТИ и ветеран компьютерной ин- дустрии, посещал курсы в Гарвардской школе бизнеса. Он работал инженером-программистом в фирме ДЕК (Digital Equipment Corporation, DEC), создавшей популярную се- рию машин PDP. Здесь Бриклин участвовал в разработке системы обработки текстов, а затем перешел в другую компанию. Опыт работы в обеих фирмах навел его на мысль, что, хорошо разбираясь в технологии, он в то же время абсолютный профан в бизнесе. Это и побудило Бри- клина отправиться на курсы в Гарвард. Однажды, занимаясь утомительными вычислениями, связанными с определением изменения суммы налога в ре- зультате роста процентной ставки на издержки и прибыль предприятия, Бриклин вдруг понял, что есть иной, более удобный способ выполнения таких расчетов. Основная проблема здесь заключалась в том, что при изменении ка- кой-то одной цифры приходилось пересчитывать все про- изводные от нее величины. Электронный калькулятор, конечно, несколько облегчал задачу, но все равно такие 68
расчеты требовали слишком много времени. Малейшая описка могла испортить всю работу, которая записыва- лась на большом листе тщательно разлинованной бумаги под названием «спредшит» (развернутый лист). Программистский опыт натолкнул Бриклина на мысль, что все эти нудные жонглирования числами неплохо было бы поручить компьютеру. Свою идею он обсудил с внеш- татным инженером-программистом Робертом Фрэнксто- ном. Тот заинтересовался идеей и в конце 1978 г. начал писать программу, а уже к весне следующего года закон- чил ее. Свое детище Фрэнкстон и Бриклин назвали «Визи- калк» (VisiCalc — Visible Calculator). «Визикалк» создавала на экране персонального компьютера столбцы чисел, кото- рые мгновенно изменялись, если изменялась какая-либо позиция этой электронной таблицы. С помощью подобной программы плановики могли, например, произвести быст- рую и точную калькуляцию зависимости прибыли компа- нии от 6%-ного роста заработной платы при одновременном 7%-ном увеличении цены на готовую про- дукцию. Продавать свою программу Бриклин и Фрэнкстон нача- ли осенью 1979 г., причем в немалой степени их успеху способствовало суждение одного специалиста в области финансов, назвавшего «Визикалк» главной осью, вокруг которой вращается весь компьютер. Изначально програм- ма была написана для машины «Эпл-2», и по существу именно она сыграла главную роль в огромном успехе это- го компьютера. «Визикалк» — первый пакет программно- го обеспечения, который уже сам по себе оправдывал приобретение микрокомпьютерной системы. В течение первого года после начала продажи «Визикалка» сбыт пер- сональных компьютеров резко возрос, а сама программа разошлась тиражом около 100 тыс. экземпляров по цене около 200 долл, за штуку. «Визикалк» оставалась «бестселлером» целый год, что, естественно, привело к созданию десятков программ-подо- бий, творцы которых стремились нажить капитал на столь прибыльном деле. Одновременно «Визикалк» подго- товила почву для появления других видов программного обеспечения для бизнеса. Не последнее место в этом ряду принадлежит системе «дБейс II» (dBASE II). Эта програм- ма относится к классу так называемых систем управления базами данных, которые, основываясь на компьютере, позволяют хранить и обрабатывать большие массивы ин- формации. Создателем системы был инженер из НАСА Уэйн Рэтлифф. Первоначальный вариант программы он сделал в свободное от основной работы время и пытал- ся — правда, без особого успеха — продавать ее под на- званием «Вулкан». Так продолжалось до тех пор, пока «Вулкан» не попался на глаза Джорджу Тейту — ловкому дельцу, занимавшемуся программным бизнесом. Исключенный в свое время из школы, Тейт служил в ВВС США, а затем работал мастером по ремонту радио- аппаратуры. В 1974 г. в числе других энтузиастов он при- обрел набор для сборки компьютера «Альтаир». Закончив сборку, Тейт вдруг обнаружил, что все его знания о маши- не сводятся к тому, как она включается. «С этого момен- та, — вспоминал он позднее, — я начал изучать и постигать компьютер». Вскоре Тейт стал отличным специ- алистом в данной области и подрабатывал ремонтом ком- пьютеров. Потом служил управляющим по сбыту в одной компании, производившей компьютерные терминалы, от- куда уволился в 1980 г., занявшись на паях со своим при- ятелем Хэлом Лашли продажей программного обеспе- чения. Прослышав о существовании малоизвестной тогда сис- темы «Вулкан», Тейт и Лашли заключили с Рэтлиффом контракт, который предусматривал их исключительное право на распространение этой программы. Поскольку к тому времени на название «Вулкан» уже заявила свои пра- ва другая компания, партнеры решили наименовать дан- ное изделие как-то иначе. Их рекламный агент предложил название «дБейс II». По его мнению, оно звучало весьма респектабельно с технической точки зрения и, кроме того, содержало тонкий намек на то, что это некая новая и, ви- димо, улучшенная версия своего предшественника — систе- мы «дБейс». Конечно, никакого предшественника, который следова- ло бы улучшить, не было и в помине, однако система «дБейс II» действительно имела ощутимые преимущества по сравнению с другими программами, ориентированными на решение данного класса задач. В январе 1981 г. по всей стране началась шумная реклама этой системы, очень ско- ро ставшей новым «бестселлером». И почти столь же стремительно Рэтлифф, Лашли и Тейт пополнили все воз- растающие ряды миллионеров, наживших состояния на программном обеспечении. Вскоре к ним присоединился еще один разработчик программного обеспечения — Митчел Кэпор. Его про- грамма «Лотос 1-2-3» завоевала широкое признание, по- скольку соединяла в себе лучшие качества системы «Визикалк» с графическими возможностями и средствами информационного поиска. Подобно многим другим моло- дым людям, сделавшим свое состояние в дни триумфаль- ного шествия персональных компьютеров, Кэпор не давал повода считать, что в один прекрасный день он пополнит ряды богачей. Он вырос на Лонг-Айленде в Нью-Йорке. Проявив в школе склонность к математике, Кэпор закон- чил ее с прекрасным аттестатом. Однако в Йельском уни- верситете, где он специализировался по математике и лингвистике, его оценки были достаточно скромны. Воз- можно, это объясняется тем, что Кэпор слишком много времени проводил на университетской радиостанции, где возглавил со временем музыкальный отдел. К тому же он увлекся трансцендентальной медитацией, причем столь серьезно, что даже получил право на преподавание этого предмета. Закончив в 1971 г. университет, Кэпор два года прора- ботал диск-жокеем, после чего перебрался в Кембридж, шт. Массачусетс, где продолжил свою карьеру уже как 69
программист. «Работа моя была ужасно скучная», — вспоминал он позднее. Бросив к 1975 г. работу, он цели- ком посвятил себя преподаванию трансцендентальной ме- дитации, сначала в Кембридже, а потом в экзотическом международном Университете Махариши, шт. Айова. В поисках чего-то более значительного (чего конкретно, он tqhho не знал) Кэпор отправился в Швейцарию на ускорен- ные шестимесячные курсы по медитации. «Меня поселили в общежитии вместе со столетним новообращенным инду- сом, благодаря чему я приобрел привычку громко орать», — рассказывал он. Не выдержав подобных испытаний, Кэпор вернулся в Кембридж и всерьез занялся психоте- рапией. Наконец, в 1978 г., увлекшись персональными компью- терами, он начал продавать усовершенствованную им сте- реосистему для машины «Эпл-2.» Вскоре Кэпор всецело отдался программированию, разработав в итоге две мно- гообещающие программы для деловых операций. Свои программы он продавал через ту компанию, которая спо- собствовала огромному успеху системы «Визикалк». Про- шло немного времени, и его отчисления от прибыли стали выражаться шестизначным числом. Однако Кэпор на этом не успокоился: продав свои авторские права на программы за 1,2 млн. долл., он пошел дальше, основав собственную компанию по производству и продаже его универсальной системы «Лотос 1-2-3». Свое предприятие Кэпор открыл как нельзя вовремя. В августе 1981 г. фирма ИБМ, представив свой компьютер IBM PC, официально подтвердила давно ходившие слухи о том, что она приступает к выпуску персональных ком- пьютеров. При разработке «Лотоса 1-2-3» Кэпор ориенти- ровался именно на 16-разрядный процессор фирмы ИБМ, а не на 8-разрядные процессоры, которые в основном ис- пользовались в микрокомпьютерах того времени. Он был убежден, что огромное превосходство фирмы ИБМ скоро сделает этот процессор общепризнанным стандартом для Главные действующие лица программной революции В 1972 г. предприниматель Нолан Бушнел установил в од- ном из баров г. Саннивейл, шт. Калифорния, платный игро- вой автомат, имитирующий на компьютере игру пинг-понг. Вскоре владелец бара сообщил Бушнелу, что автомат сло- мался и попросил забрать его назад. Однако, начав разби- раться, Бушнел выяснил, что машина не сломана, а просто до отказа забита 25-центовыми монетками. Поток 25-центовиков — всего лишь слабая тень того, что последовало далее. Имея начальный капитал в 500 долл., Бушнел основал компанию «Атари» (Atari), которую через 4 года продал уже за 15 млн. долл., а еще примерно 10 лет спустя состояние Бушнела составило 70 млн. долл. В 70—80-е годы, когда производство микрокомпьютеров начало стремительно развиваться, многие программисты и предприниматели последовали за Бушнелом, желая урвать куш. Здесь запечатлены некоторые из них, весьма преуспев- шие в этом деле. 70
I всей индустрии персональных компьютеров, а это даст его программе ощутимые преимущества в конкурентной борь- бе. Расчет Кэпора полностью оправдался. Система «Лотос 1-2-3» была объявлена в конце 1982 г., причем на ее рекла- му ушел 1 млн. долл. Расходы окупились очень скоро. Система «Лотос 1-2-3» заняла первую строку в списке са- мых популярных программ, и к июлю уже 60 тыс. покупа- телей не пожалели выложить по 495 долл, каждый на ее приобретение. Своими успехами компания Кэпора, как, впрочем, и многие другие создатели программного обеспечения, ори- ентированного на компьютер IBM PC, была обязана фир- ме ИБМ, а также потоку машин-подобий, в изобилии производимых другими фирмами. Выход фирмы ИБМ на рынок персональных компьютеров стал знаменательным событием. Дело даже не в том, что сама фирма продала большое количество машин — главное то, что одно при- сутствие на этом рынке гигантской компании-ветерана окончательно убедило многих сомневающихся потенциаль- ных потребителей, что персональные компьютеры (не важно даже, кем они сделаны) заслуживают серьезного от- ношения. Другим важным следствием вторжения фирмы ИБМ явился массовый переход производителей микрокомпьюте- ров на иную операционную систему. Операционная систе- ма — хотя и не самая яркая, но крайне важная часть программного обеспечения, осуществляющая координа- цию всех внутренних процессов машины. Подобно дири- жеру, она организует гармоничное взаимодействие сложнейшей аппаратуры с ее прикладным программным обеспечением, обеспечивая тем самым выполнение постав- ленных задач. Программы, написанные для одной опера- ционной системы, не могут работать под управлением другой. Поэтому поставщик операционной системы, при- знанной в качестве промышленного стандарта, может рас- считывать на солидную прибыль. 1975 г. Поль Аллен {слева) и Уильям Гейтс — осно- ватели фирмы «Мик- рософт». 1976 г. Гарри Килдол — осно- ватель корпорации «Диджитал ресерч» для продажи создан- ной им операционной системы СР/М. 1979 г. Сеймур (справа), организовав- ший сбыт системы «Уордстар», создан- ной Джоном Барнаби. 71
В большинстве 8-разрядных машин, которые до прихо- да фирмы ИБМ преобладали на рынке, использовалась операционная система СР/М (Control Program for Microcomputers — управляющая программа для микроком- пьютеров). Она была разработана в 1979 г. специалистом в области компьютерной техники Гэрри Килдолом. По до- стоинству ее оценили спустя два года благодаря машине «Альтаир», положившей начало микрокомпьютерному бу- му. Поскольку новые производители микрокомпьютеров создавали свои машины, ориентируясь на СР/М, эта сис- тема становилась своего рода стандартом для разработчи- ков программного обеспечения. Но вот на сцене появилась фирма ИБМ. Если верить бытующим в среде производителей про- граммного обеспечения легендам — а несмотря на свой молодой возраст, индустрия программного обеспечения просто обросла легендами, — то Килдол занимался испы- таниями личного самолета, когда к нему пришли два офи- циальных представителя фирмы ИБМ с предложением обсудить операционную систему для будущего персональ- ного компьютера. Опьяненный чувством свободы, которое дарит небо, и всегда довольно безразличный к проблемам своей корпорации, экстравагантный Килдол отказался «спуститься с небес» для переговоров о делах. Как все бы- ло в действительности, трудно сказать, но рассказывают именно так. Та же история в интерпретации Килдола выглядит ина- че: проведя предварительные обсуждения с фирмой ИБМ, он улетел в двухнедельный отпуск на Карибское море. Когда же он вернулся, фирма ИБМ уже заключила кон- тракт с другой компанией — все той же «Микрософт», возглавляемой Биллом Гейтсом, создавшим программу для первого микрокомпьютера «Альтаир» еще в 1975 г. Новая операционная система MS-DOS (Micro- soft Disk Operating System — дисковая операционная систе- ма фирмы «Микрософт»), получившая благословение фир- 1981 г. Джордж Тейт (спра- ва), распространивший систему «дБейс II», разработанную Уэй- ном Рэтлиффом. 1979 г. Дэниел Бриклин (вни- зу) и Роберт Фрэнкс- тон, выпустившие в свет систему «Ви- зикалк». 1982 г. Митчел Кэпор, потра- тивший миллион дол- ларов на рекламу сис- темы «Лотос 1-2-3». 4 72
мы ИБМ, была хорошо принята многими производителями, поспешившими выйти на рынок персо- нальных компьютеров с моделями машин, совместимых с системой IBM PC. Система MS-DOS, созданная Гейтсом, узурпировала место, ранее принадлежавшее СР/М, завое- вав к тому же гораздо более широкий рынок. К середине 80-х годов бум в области программного обеспечения, кажется, пошел на убыль. Вчерашние шеро- ховатые программы хэкеров были приведены в порядок и завернуты в изящную упаковку. Многие компании, начав свою деятельность с капиталом в несколько сотен долла- ров, приобрели общенациональное значение и преврати- лись в ведущие корпорации. Предварительное изучение рынка стало обычным делом, предшествующим разработ- ке программного обеспечения. Средства, выделяемые на рекламу вновь создаваемого продукта, сейчас исчисляются миллионами долларов. Масштабы и затраты, необходи- мые для организации производства программного обеспе- чения, стали настолько большими, что возможность конкуренции со стороны новых компаний или отдельных лиц — даже при наличии у них неплохого программного продукта — теперь крайне ограниченна. Однако прежний хэкерский дух неистребим, ибо в осно- ве создания программного обеспечения лежит творческий процесс, которым — по самой его природе — трудно, а то и просто невозможно управлять. Этот процесс — про- граммирование. Пол Лутус, чрезвычайно одаренный про- граммист, автор многих самых популярных программ для компьютера «Эпл», — личность в этом смысле достаточ- но типичная. Долгое время он работал в полном уедине- нии на вершине горы, в хижине, построенной собствен- ми руками. Лутус категорически отказывался принимать Пол Лутус превыше всего ценит свою независимость. Работая в грубо сколочен- ной хижине, которую он сам построил в шт. Орегон, Лутус создал самый попу- лярный текстовый процессор для ком- пьютера «Эпл», поступивший в продажу в 1979 г. Спустя несколько лет авторский гонорар за эту программу составил более 7,5 тыс. долл, ежедневно. 73
участие в чьих бы то ни было проектах. «Если идея не моя, — объясняет он, — то она мне скоро наскучит, и я не смогу сделать по-настоящему отличную работу». Как заметил один предприниматель, «программист- скую музу нельзя приручить. Моменты рождения великих программ, как и литературных шедевров, никому неиз- вестны». И потому весьма вероятно, что следующий «Ви- зикалк», «Уордстар» или «Лотос 1-2-3» будет творением какого-то талантливого одиночки вроде Пола Лутуса, а не плодом работы целого исследовательского отдела кор- порации. 74
ЧЕТЫРЕ «РАБОЧИЕ ЛОШАДКИ» К середине 80-х годов индустрия программного обеспече- ния создала более 25 тыс. программ для персональных компьютеров, которые были столь же разнообразны по своему назначению, как и интересы все возрастающей ар- мии потребителей. Существуют программы для построе- ния астрологических карт, ведения инвентарной ведомости вин в ресторане, оказания помощи в постановке медицин- ского диагноза, построения экономических графиков, обу- чения французскому, калькуляции и даже программиро- ванию. Более того, эти различные типы программного обеспечения, кажется, не имеют ни малейшего сходства. Звуковые эффекты, имитирующие взрывы в видеоиграх, настолько отличаются от прерывистого попискивания па- кета программ для численных расчетов, что трудно заме- тить между ними хоть какие-нибудь общие черты. Однако вопреки внешним различиям все программы (даже те, что предназначены для суперкомпьютеров) должны выполнять некоторые общие основополагающие функции. Так, отли- чаясь в деталях, все программы тем не менее должны хра- нить информацию в оперативной памяти, помнить, где она находится, и извлекать ее определенным образом для выполнения требуемых действий. Среди наиболее важных функций следует выделить об- работку текстов, проведение вычислений, организацию ин- формации и управление вводом-выводом. Некоторые из этих функций отчетливо проявляются в любой программе. Например, преобразование поступающего с клавиатуры сигнала в его представление на экране — это один из ви- дов управления вводом-выводом. Другие функции, к при- меру вычисления, необходимые для построения маршрута движения автомобиля в игровой программе, практически не видны. Обычно различные функции настолько тесно пе- реплетаются между собой, что трудно сказать, где конча- ется одна и начинается другая. Хотя большинство функций в той или иной степени ис- пользуются в любой программе, одна из них иногда пре- обладает. Так, вычисления составляют основу программ обработки финансовых ведомостей, в то время как управ- ление вводом-выводом играет главную роль в графических программах, осуществляющих преобразование сигналов от устройства типа «световое перо» в волнующие образы на экране дисплея. Рисунки, приведенные далее, показывают, как в некоторых основных типах программ используются специальные технические приемы для обработки ин- формации. 75
Четыре «рабочие лошадки» Расстановка слов в нужном порядке Английский поэт Сэмуэл Тейлор Кольридж охарактеризо- вал свое ремесло как искусство расстановки «наилучших слов в наилучшем порядке». Веками писатели всех мастей вели изнурительную борьбу за достижение этой простой цели, старательно создавая все новые варианты, которые затем чаще всего отправлялись в мусорную корзину. Компьютер, оснащенный программным обеспечением для обработки текстов, круто изменил этот процесс, дав писателю возможность вносить любые изменения в элек- тронный экземпляр произведения, существующий лишь в послушной памяти компьютера. Удаление, вставка слов, проверка орфографии, перемещение целых абзацев и даже поиск и замена определенных слов сразу во всем тексте — все это можно сделать нажатиями нескольких клавиш. Та- ким образом, вариант текста, появившийся на бумаге, мо- жет быть аккуратным и безошибочным. Вправе ли он при этом называться поэзией — это вопрос другой. Организация информации в памяти. Текстовый процессор запоминает каждый символ — букву, пробел (А), символ возврата каретки (^), — ко- торые встречаются в тексте, занося их в отдельный байт оперативной памяти, и хранит указатели на их местоположение. В процессе редакти- рования документа программа изменяет порядок, в котором она считы- вает символы. На рисунке показано, что вставляемое слово (half) записы- вается в память не в том порядке, в каком оно должно быть в тексте, но считывается и показывается на экране на нужном месте (после слова cancel; см. рисунок на противоположной странице). Редактирование: старый способ. На черновике рукописного документа изображена авторская правка, кото- рая вносится с помощью специаль- ных знаков, показывающих, какие из- менения надо сделать при перепечат- ке очередного экземпляра. Редактирование: новый способ. ВСТАВКА Используя текстовый процессор, ав- тор добавляет новое слово (half). Для этого следует установить в нужное место указатель (курсор), ввести команду ВСТАВКА и набрать требу- емое слово. Программа автоматичес- ки подвинет оставшуюся часть пред- ложения вправо. УДАЛЕНИЕ Чтобы удалить фрагмент текста, ав- тору надо отметить его начало и ко- нец, а затем ввести команду УДАЛЕ- НИЕ. Программа стирает с экрана слова и сдвигает текст влево, убирая образовавшийся между словами пробел. ПЕРЕМЕЩЕНИЕ ФРАГМЕНТА Чтобы переместить фрагмент текста, надо отметить его границы, устано- вить курсор в то место, куда требу- ется поместить фрагмент и ввести команду ПЕРЕМЕЩЕНИЕ. Програм- ма сотрет фрагмент на экране, а за- тем изменит порядок считывания слов из оперативной памяти и вы- даст на экран заново перестроенный текст. ФОРМАТИРОВАНИЕ Теперь, когда сделаны все исправле- ния, можно с помощью специальной команды форматирования изменить представление документа на странице. Таким образом, уже первый печат- ный экземпляр может иметь оконча- тельный вид. 76
The moving finger writes; and, having writ, Moves on to the next thing: nor all your piety nor wit Shall lure it back to cancel half a line, Nor all your tears a word wash out of it. The moving finger writes; and, having writ, Moves on to the next thing: nor all your piety nor wit Shall lure it back to cancel half a line, Nor all your tears a word wash out of it. The moving finger writes; and, having writ, Moves on: nor all your piety nor wit Shall lure it back to cancel half a line, Nor all your tears a word wash out of it. -------- - . ..--7--------- -----------—---p . The moving finger writes; and, having writ, л Moves on: nor all your piety nor wit Shall lure it back to cancel half a line, V\ Nor all your tears wash out a word of it. 71
Четыре «рабочие лошадки» Быстрая обработка чисел и формул В основу программы обработки финансовых ведомостей заложено главное качество компьютера — его способность с огромной скоростью и гибкостью манипулировать чис- лами и сложными формулами. Электронная ведомость сделана по образу и подобию обычных финансовых ведо- мостей, с которыми работают бухгалтеры: она состоит из строк и столбцов, образующих сотни и даже тысячи кле- ток. Одновременно на экране видны лишь немногие из них, однако при помощи нескольких простых команд мож- но быстро перемещать окно видимости из одной части ве- домости в другую. Стоит только в какую-нибудь из клеток ввести наименования, числа или формулы, как практичес- ки мгновенно компьютер вычислит и покажет полученный результат. Наконец, если изменить содержимое отдельной клетки, то программа может немедленно пересчитать зна- чения всех связанных с этой клеткой чисел сразу по всей ведомости. А1 В1 С1 D1 Е1 АЗ А4 А2 В2 ВЗ А5 В5 D2 D3 D4 D5 Е2 ЕЗ Е4 Е5 Доход Дом Машина Сбере- жения Шаблон для вычислений. Вначале электрон- ная ведомость появляется на экране в виде таблицы с незаполненными клетками, каждая из которых определяется координатами ее столбца и строки (соответственно буквы и числа на приведенном вверху рисунке). Вся- кий раз, когда программа обращается за со- держимым клетки, она указывает эти коор- динаты. Таким образом, вычисления абсо- лютно не зависят от конкретных данных, занесенных в клетки. Метки, поясняющие структуру ведомости. Метки, размещенные в клетках первого столбца и первой строки, служат для указа- ния взаимосвязи между отдельными элемен- тами электронной таблицы. В нашем приме- ре метки относятся к ведомости для учета ежемесячных и годовых семейных доходов и расходов. 78
аш фев. Всего О —‘—т—-г1—- о *1 вз + сз + о + В4 + С4 + D4 о о о о v t"s гмт??чез-ет]'г,г;Г"т В5 г С5 + D5 од о 4000 /В2Ус2 7 D2 1000 1100 2100 ВЗ 1- СЗ + D3 I aiUHbJi 2QQ 250 В4 + С4 * D4Г 800 О 650 1450 В2-(ВЗ + В4) С2 (СЗ + С4) <?2 - (D3 + D4) 2000 2000 I В5 + С5 t D5 Дом Сбере- жения за год j Формулы для управления вычислениями. Формула, занесенная в клетку, предписывает программе выдать в этой клетке результат вычислений, основанных на данной формуле. Каждая формула представляег собой комби- нацию математических операций и координат клеток, содержащих используемые при вы- числениях данные. Если в клетку не записано никакого значения, то соответствующая фор- мула выдает нулевой результат. Занесение чисел. Занесение числа в клетку электронной ведомости вызывает немедлен- ную реакцию компьютера. Программа изме- няет значение каждой клетки, в которой со- держится формула, указывающая координа- ты клетки с новыми данными. Если клетки, на которые ссылается формула, еще не со- держат никаких чисел, то в клетке с данной формулой появится нуль. 79
Четыре «рабочие лошадки» Организация и управление информацией Начиная с древних клинописных табличек и папирусных свитков, регистрация данных всегда была отличительной чертой цивилизации. Предания о хаосе в системах реги- страции документов, вероятно, берут свое начало со вре- мен первых античных налоговых свитков; подобные суждения высказываются и поныне в отношении современ- ных правительственных и других бюрократических меха- низмов. Чтобы сведения были кому-то полезны, их следует должным образом организовать. Однако даже са- мая сложная бумажная система регистрации не свободна от недостатков. Например, издатель журнала должен иметь картотеку своих подписчиков, в которой на каждой карточке записа- но имя и адрес подписчика, а также дата окончания срока подписки. Если картотека организована в алфавитном по- рядке имен, то не составит труда найти каждую отдель- ную карточку, если подписчик, предположим, изменил адрес. Но если издателю потребуется узнать, для кого из подписчиков срок подписки истекает в том или ином меся- це, то лучшим способом организации картотеки будет хро- нологическое упорядочение по дате окончания подписки. Вместе с тем для анализа географического распределения подписчиков карточки необходимо разложить по городам или штатам. Если не иметь трех отдельных картотек, то каждое такое обращение потребует просмотра всех карто- чек одна за другой. Программы управления базами данных исключают на- добность в столь непроизводительной работе. Информа- ция должна заноситься лишь один раз в специальный файл. Когда программа получает задание отсортировать данные или составить какой-то список, она может быстро отыскать нужную информацию в оперативной памяти (а быть может, на диске или ленте) и скопировать все необ- ходимые данные в новый файл, но уже в требуемом по- рядке. Причем все это делается, абсолютно не изменяя исходного информационного набора. рахования Вес Дата рождения Рост Адрес Дата приема на работу Профессия Программное обеспечение для управления ба- зой данных организует информацию в фай- лы, содержащие отдельные записи. Запись, показанная на рисунке в виде большого ква- драта, составлена из отдельных элементов информации, которые называются полями. Они изображены здесь в виде маленьких цветных квадратиков. В файле личных дел, представленном в данном примере, поля мо- гут содержать имя, дату рождения и профес- сию. Конкретная информация для каждого дела будет, конечно, различной, однако лю- бая запись содержит одни и те же заранее заданные поля. Пол 80
Электронный просмотр файла. Программа может быстро просмотреть весь файл цели- ком, анализируя лишь одно поле каждой за- писи, и, исходя из полученных результатов, предпринять дальнейшие действия. Два на- иболее общих вида обработки файла — по- иск, или идентификация, всех записей, содер- жащих одну и ту же информацию в задан- ном поле, и упорядочение записей тем или иным образом, например в алфавитном или в числовом порядке. Поиск по общему атрибуту. В простейшем варианте поиска программа, анализируя одно поле в каждой записи, отыскивает поля, удовлетворяющие заданному атрибуту. В данном примере задача заключается в том, чтобы найти всех сотрудников в воз- расте 25 лет. В каждой записи файла программа анализирует поле «дата-рождения» (зеленое). Только в том случае, если поле содержит нужный год рождения, программа идентифицирует данную запись как удовлетворяющую критерию поиска. Поиск по комбинации атрибутов. Более сложный поиск может потребовать анализа нескольких полей. В данном примере зада- ча состоит в отыскании всех женщин-адвокатов, проработавших более 5 лет и проживающих в определенном районе. Используя вначале поле «профессия» (синее), программ^ проверяет, явля- ется ли данное лицо адвокатом. Если это так, то затем анали- зируются поля «пол» и «дата-приема-на-работу» (фиолетовое и розовое). Если эти поля также содержат требуемые данные, то программа переходит к последнему полю — «адрес» (желтое). Если оно содержит нужный почтовый код, то программа иден- тифицирует запись как соответствующую критерию поиска. Поиск по нескольким комбинациям. Поиск можно производить более чем по одной комбинации атрибутов. В рассматриваемом примере задача заключается в том, чтобы определить всех клерков со стажем работы более 5 лет и всех курьеров со ста- жем работы менее 2 лет. Если поле «профессия» соответствует профессии клерк или курьер, то программа анализирует поле «дата-приема-на-работу». Если это поле содержит одну из ука- занных дат (менее 2 лет для курьеров и более 5 для клерков), то программа идентифицирует запись как соответствующую критерию поиска. 81
Четыре «рабочие лошадки» Графические «фокусы» Определенная часть любой компьютерной программы предназначена для интерпретации поступающей информа- ции (т. е. ввода) и отображения полученных результатов в удобном виде (т. е. вывода). Большинство компьютеров снабжены устройствами, позволяющими осуществлять ввод с клавиатуры и вывод на экран дисплея. Однако спе- циализированное программное обеспечение создает пред- посылки для более разнообразных приложений. Многие такие приложения требуют дополнительных устройств, предназначенных для выполнения специфиче- ских функций ввода-вывода. Диапазон возможных устройств ввода простирается от графических планшетов, применяемых художниками, до оборудования, способного воспринимать команды, подаваемые голосом, и даже «ощущать» изменения температуры или атмосферного давления. Выводимую информацию можно представлять в самом разнообразном виде на принтере или дисплее. Кро- ме того, существуют специализированные устройства вы- вода, например контроллеры для управления светофором, ПРОВЕДЕНИЕ УВЕЛИЧЕНИЕ ЗАКРАШИВАНИЕ ТВЕРДАЯ КОПИЯ РАЗМЕР КИСТИ СТРУКТУРА ЗАПОЛНИТЕЛЯ механическим инструментом или звуковым синтезатором, имитирующим музыкальные инструменты и человеческие голоса. Указания о том, как использовать то или иное уст- ройство, чтобы добиться нужного результата, компьютер получает от программного обеспечения. Программное обеспечение машинной графики дает воз- можность использовать компьютер для создания огромно- го множества различных образов. Однако любая простая команда, любое изменение образа на экране монитора тре- буют гигантского объема вычислений, где каждый невиди- мый пользователю шажок управляется программой. Замечательные возможности графических программ обусловлены их способ- ностью преобразовывать простые входные команды в последовательность вычислений, приводящих к сложным изображениям на экране дисплея. До- вольно часто эти команды подаются с помощью пиктограмм (условных графических изображений выполняемой операции), подобных тем, что по- казаны на рисунке. Пиктограммы соответствуют определенным клавишам клавиатуры или выдаются на экран, где выбираются путем установки кур- сора и нажатия специальной клавиши или кнопки. НАРИСОВАТЬ КРУГ ПЕРЕМЕСТИТЬ Перемещение графического объекта. Команда ПЕРЕМЕСТИТЬ требует, чтобы программа изменила местоположение треугольника, не меняя при этом его размер и ориентацию. По величинам, хранящимся в оперативной памяти, программа вычисляет новые коорди- наты каждой точки и выдает на экран об- новленную картинку. Добавление нового объекта. Команда НАРИ- СОВАТЬ КРУГ дает возможность указать центр круга и одну точку на его окружности. По этим данным программа вычисляет ради- ус и рисует круг, добавляя в оперативную память данные о новых точках нарисованно- го графического объекта. 82
С планшета на экран Графический планшет работает в паре с программным обеспечением, кото- рое преобразует наносимые вручную линии в единицы и нули машинного кода. Поверхность планшета покрыта сеткой из тончайших проводов, кото- рые улавливают местоположение магнитной катушки, расположенной в кончике специального пера. Нажатие пера сообщает программе, что надо запомнить местоположение данной точки. Часть оперативной памяти про- грамма использует для хранения двух координат каждой отмеченной точки. Программа отображает «видеоэхо», высвечивая соответствующие точки на экране (вверху справа; показаны с увеличением). Линии и внутренние обла- сти — это просто сгруппированные множества точек. Вращение графического объекта. Команда ВРАЩАТЬ говорит программе, что объект надо переместить по дуге и перерисовать его заново. Для этого программа применяет три- гонометрические преобразования к величи- нам, хранящимся в оперативной памяти. По- вторив эту операцию несколько раз, можно получить круговые и спиральные эффекты. ВРАЩАТЬ Раскрашивание. Команда РАСКРАСИТЬ поз- воляет раскрасить простые геометрические фигуры в дужные цвета. Программа вычис- ляет границы заданной области, а затем из- меняет цвет каждой точки внутри этих границ. _ ЗЕЛЕНЫЙ 83

ГИГАНТСКИМ СКАЧОК В РАЗВИТИИ СИСТЕМ УПРАВЛЕНИЯ Заняв в конце 1947 г. должность инженера по организации транспорта в Денвере, Хенри Барнес прекрасно понимал, что его ожидают немалые трудности. Раскинув- шийся на многие километры город, подобно другим центрам урбанизации, оказался перед необходимостью разрешения проблемы все возрастающих транспортных «пробок» в часы пик, когда потоки машин заполняли центр. Введя на некоторых улицах одностороннее движение и установив несколько сотен дополнительных свето- форов, Барнес слегка поправил ситуацию, однако вскоре стало ясно, что такие тра- диционные меры не приведут к коренному решению проблемы. Бывший электротехник, Барнес в течение 20 лет упорно совершенствовал свое профессиональное мастерство, занимаясь на вечерних курсах. Он являл собой обра- зец яркой личности, страстно увлеченной работой. Наделенный кипучей энергией, шеф транспортной службы, пыхтя сигарой, проводил значительную часть своей 60- часовой рабочей недели, объезжая улицы Денвера в поисках транспортных неуря- диц. В основном данная миссия носила наблюдательный характер, однако иногда ему приходилось прибегать и к активным действиям. В один из таких набегов Бар- нес обнаружил сломанный контроллер, который препятствовал переключению 59 светофоров, установленных в центре города. В течение полутора часов до прибытия ремонтной бригады ему вручную пришлось управлять таймером. Это происшествие окончательно убедило его, что устаревшая система управления городским транспор- том нуждается в коренной перестройке. Барнесу хотелось обзавестись оборудованием, которое автоматически реагирова- ло бы на изменение ситуации, управляя транспортным потоком через центр города путем регулирования продолжительности того или иного сигнала каждого светофо- ра. Поскольку ничего похожего на подобную систему тогда не существовало, он ре- шил разработать ее самостоятельно. Во время поездки в Нью-Йорк, где он встретился с производителями систем для управления транспортом, Барнес изложил свою идею двум инженерам-электронщикам. На реализацию проекта ушло два года. В 1952 г. оборудование было установлено; его стоимость (115 тыс. долл.) почти в 17 раз превысила общий бюджет транспортной службы Денвера на 1948 г. Сердцем всей системы был электромеханический контроллер. Это устройство, состоящее из соединенных проводами (общей протяженностью около 8 км) элек- тронных ламп, таймеров, моторов и цифронаборных дисков, могло автоматически реагировать на внешние события. Машины, следующие через центр Денвера, прохо- дили над приборами, регистрировавшими изменение давления и передававшими сиг- налы контроллеру. Каждые 6 мин контроллер, подсчитывая число сигналов от каждого датчика, определял таким образом интенсивность движения в различных направлениях. На основе этой информации контроллер регулировал продолжитель- ность тех или иных сигналов светофоров, установленных на ПО перекрестках. На самых загруженных магистралях продолжительность зеленого сигнала постепенно возрастала, а на улицах с менее интенсивным движением — сокращалась. 85
В 1953 г., после введения новой системы, несмотря на то что автомобильный парк Денвера вырос на 44%, вечер- ний час пик стал заканчиваться на 20 мин раньше, и к то- му же почти наполовину сократилось количество дорож- но-транспортных происшествий. Вслед за Денвером элек- тронные системы регулировки движения начали приме- нять и в других городах, задыхавшихся от автомобильных потоков. К середине 60-х годов в мире насчитывалось свы- ше 100 городов, где применялись похожие системы. В по- следующие годы автомобильный парк США продолжал расти бурными темпами, и на смену специализированным машинам типа денверского контроллера пришли универ- сальные компьютеры, снабженные программным обеспе- чением для управления транспортными потоками. К 1980 г. компьютеризованные системы управления транс- портом стали главной преградой на пути, который мог привести к полному параличу многих городов. Система управления транспортом Денвера явилась про- образом великого множества самых разнообразных управ- ляющих систем. Такие системы применяются для управ- ления конвейерными линиями, атомными электростанция- ми и автоматическими лифтами. Система управления тех- нологическим процессом объединяет в себе компьютеры, программное обеспечение и механические устройства, осу- ществляющие связь с внешним миром, которые обычно взаимодействуют не с оператором, а с реальными объек- тами, причем темп взаимодействия задается сменой собы- тий в окружающей среде. Именно благодаря своей способности должным образом реагировать на огромное множество поступающих извне данных такие системы управления находят широкое применение. Однако управление технологическими процессами — это лишь одна область, где быстродействие и точность компьютеров эффективно используются для решения все более сложных проблем современного общества. Когда в 60—70-е годы универсальные компьютеры вошли в нашу жизнь, их начали применять для решения очень многих за- дач. Руководители банков, директора авиакомпаний и ме- неджеры бейсбольных команд — все взялись за создание программ, способных помочь им справиться с горами ин- формации, ручная обработка которой требовала непомер- ных затрат времени и средств. Сначала большинство программ использовалось в режиме пакетной обработки: запросы вводились в машину не сразу в момент поступле- ния, а спустя некоторое время. Однако в ряде случаев чрезвычайно важно иметь точную сиюминутную информа- цию. Для этого необходимо иметь компьютерную систему и программное обеспечение, позволяющее многим пользо- вателям одновременно читать и изменять содержимое большой базы данных непосредственно в процессе рабо- ты. Любые изменения заносятся в базу данных и тут же становятся доступны всем пользователям. Такой тип взаи- модействия реализуется в так называемых диалоговых системах запросов. В таких системах — в отличие от сис- тем пакетной обработки, где запросы вводятся с некото- рой задержкой, — запросы можно вводить путем непосредственного диалога с компьютером. АВТОМАТИЗИРОВАННЫЕ СИСТЕМЫ РЕЗЕРВИРОВАНИЯ АВИАБИЛЕТОВ Авиалинии США, бурное развитие которых пришлось на 50-е годы, первыми стали применять диалоговые системы запросов, что позволило обеспечить строгий учет наличия свободных мест. Чтобы авиакомпания работала эффектив- но, необходимо, с одной стороны, сократить до минимума количество пустующих мест в каждом рейсе, а с другой — не допускать продажи лишних билетов. Создание системы резервирования авиабилетов представляло собой чрезвы- чайно сложную задачу. Дело в том, что одна-единственная авиакомпания может располагать ежедневно тысячами мест на рейсы в разные пункты назначения и иметь сотни агентов, постоянно принимающих заявки на билеты и фик- сирующих отказы от зарезервированных мест. Автомати- зированная система резервирования действовала бы эффективно только в том случае, если бы давала быстрые и точные ответы в любое время и при этом была столь проста, чтобы с ней без труда могли работать агенты по продаже билетов. В течение 50-х годов авиакомпании и производители компьютеров бились над созданием подходящих машин и программного обеспечения. Некоторые первые системы лишь отчасти справлялись с поставленной задачей. В луч- шем случае они позволяли установить, есть ли свободные места на какой-то конкретный рейс. Например, в 1958 г. авиационная компания TWA (Trans World Airlines) снабдила терминалами своих агентов в шести городах, а заявки на свободные места сопоставлялись компьютерами, разме- щенными в трех городах. Компьютеры передавали сооб- щение о каждом факте продажи или отказа на телетайп в центральном бюро. Здесь находился специальный агент, который вел регистрацию свободных мест и при помощи телетайпа сообщал компьютерам, когда все места на тот или иной рейс были заняты. Эта информация автомати- чески передавалась на телетайпы агентов по продаже билетов. Однако на подходе был более совершенный вариант системы. Фирма ИБМ — сначала в содружестве с компа- нией «Америкэн эйрлайнз», а затем с компаниями «Пан Америкэн» и «Дельта» — разработала систему резервиро- вания билетов, которая революционизировала всю отрасль авиационных перевозок. Разработанные ею аппаратное и программное обеспечения стали применяться более чем в 20 авиакомпаниях. Для создания и внедрения системы «Сабре» (SABRE, Semi-Automatic Business Research 86
Environment — коммерческая полуавтоматическая поиско- вая система) потребовалось 8 лет. Первый вариант систе- мы для компании «Америкэн эйрлайнз», вступивший в строй в 1964 г., связывал в единую трансконтинентальную сеть 2 тыс. терминалов, подключенных к большому цент- ральному компьютеру’. В то время это была крупнейшая в мире коммерческая система реального времени (т. е. обеспечивающая немедленную обработку данных). Основная задача системы «Сабре» состояла в том, что- бы дать возможность каждому агенту по продаже авиаби- летов подключиться к центральной базе данных. Она обновлялась после каждой операции по продаже или воз- врату билета на любой рейс, зарегистрированный в систе- ме. Агенты могли связываться с базой данных по телефону, и при этом гарантировалось, что полученная ими от компьютера информация точно соответствует си- туации на текущий момент. Кроме того, программное обеспечение осуществляло взаимодействие центрального компьютера и подключен- ных к нему терминалов. С каждого терминала сообщения поступали по кабельным линиям на местный концентра- ’ тор. Он представлял собой электронное запоминающее устройство, предназначенное для буферизации сообщений, поступающих от нескольких агентов. Программа, управля- ющая работой центрального компьютера, по очереди опрашивала каждый концентратор. Если с момента преды- дущего опроса на концентратор поступили какие-то сооб- щения, то они пересылались в центральный компьютер. Все операции производились настолько гладко и быстро, что создавалось впечатление, будто каждый терминал об- служивается отдельным концентратором. ПОЛЕЗНАЯ УНИВЕРСАЛЬНОСТЬ С самого начала стало ясно, что возможности системы «Сабре» гораздо шире, чем просто быстрое обслуживание авиапассажиров. Она позволяла хранить данные о резерви- ровании билетов, что явилось громадным достижением по сравнению с простым учетом свободных мест. Кроме то- го, эта система предоставила американцам эффективный инструмент, который не только способствовал улучшению управления ежедневными операциями, но и открывал большие перспективы. Взяв на себя работу, которая не под силу человеку, система «Сабре» и ее «потомки» стали не- отъемлемой частью жизни. К середине 80-х годов некото- рые системы такого типа объединяли более 10 тыс. терминалов, а их центральный компьютер обрабатывал до 200 сообщений в секунду. Резервирование авиабиле- тов — лишь одна из функций подобной системы. Пользу- ясь ею, агент может также выдавать билеты и посадочные талоны, выделять конкретные места в самолете, заказы- вать специальные блюда, бронировать номер в гостинице, организовывать автомобильное обслуживание пассажиров, предоставлять переводчиков, секретарей и сиделок для младенцев. Кроме того, система используется для регул и- рования грузовых и багажных перевозок, контроля креди- та, пересылки электронных сообщений, приобретения : : иностранной валюты. ------ Опыт, накопленный при разработке системы резерви- рования авиабилетов, оказался весьма полезным для ши- рокого круга приложений, связанных с обработкой запросов. Система «Сабре» — один из первых примеров коммерческого применения режима разделения времени. В этой системе реализовать такой режим сравнительно про- сто, поскольку все пользователи работают с однотипной программой. В других ситуациях организовать режим раз- деления времени значительно сложнее. Например, в анало- гичной университетской системе интересы пользователей могут существенно различаться: один работает с програм- мой анализа экономических данных, другой — с програм- мой по обработке результатов эксперимента по органической химии и т. д. В этом случае программное обеспечение должно не только уметь выделять простран- ство в оперативной* памяти, процессорное время и другие ресурсы (например, магнитофоны или дисководы), но и уберечь данные и программы одного пользователя от их, возможно, непреднамеренного уничтожения другими поль- зователями. В 60-е годы фирма ИБМ затратила миллионы долларов и титанические усилия на реализацию режима разделения времени на своих самых новых и наиболее мощных компьютерах. Расходы на программное обеспече- ние выросли с 8 млн. долл, в 1961 г. до 44,5 млн. долл, в 1966 г. Как заметил один из директоров проекта, за вре- мя этой работы фирма ИБМ изучила немало технических идей и представлений, но это «образование было довольно дорогостоящим». Гораздо быстрее фирма ИБМ преуспела в создании программного обеспечения для одновременной обработки большого количества сообщений и объединения несколь- ких центральных процессоров с целью повышения произ- водительности системы «Сабре». Первоначально разработанная для этой цели операционная система назы- валась АСР (Airline Control Program — управляющая про- грамма для авиакомпаний). Более поздний ее вариант под названием TPF (Transaction Processing Facility — средства для обработки запросов) использовался для создания мощ- ных систем реального времени во многих других отраслях. Одной из таких отраслей стало банковское дело. Тысячи раз в день на городских улицах и в торговых центрах по всей территории США подходят люди к терми- налам ATM (Automatic Teller Machine — автоматическая кассовая машина) и с помощью пластиковых карточек, не заходя в банк, производят различные финансовые опера- ции. Обычно терминалы ATM соединены с главным бан- ковским компьютером. Работающая там программа 87
обработки запросов немедленно выдает соответствующие * сообщения клиенту через ATM. Вклады и выдача налич- ных денег, переводы с одного счета на другой и даже оплата счетов — все это производится мгновенно. Машина выдает клиенту квитанцию, а программа обновляет содер- жимое центральных банковских файлов. Кассиры в филиа- лах банка имеют доступ к тем же центральным файлам, что позволяет им вести контроль и вносить изменения в информацию, касающуюся счетов. Однако подобные системы для осуществления банков- ских операций появились лишь в самые последние годы. Вначале работники банков рассматривали компьютеры лишь как средство спасения от нахлынувшего на них океа- на бумаг. Количество обрабатываемых чеков выросло в США с 5,3 млрд, в 1945 г. до 9,5 млрд, в 1955 г. Регистра- ция и обработка чеков и множества бумаг, касающихся займов и других финансовых операций, требовали колос- сального труда банковских служащих. Рост бумажного океана грозил полной катастрофой для всей банковской системы. В ПОИСКАХ РЕШЕНИЯ В начале 50-х годов «Бэнк оф Америка» (его главная рези- денция находится в Сан-Франциско), ставший впоследст- вии крупнейшим в мире торговым банком (он обрабатывает вдвое больше бумаг, чем любой другой), на- чал предпринимать шаги для предотвращения надвигаю- щегося кризиса. В те времена чековые счета не нумеровались и мало кто из вкладчиков использовал чеки, в которых имя и адрес владельца были отпечатаны типо- графским способом. Банковские служащие должны были расшифровать подпись, разложить чеки в алфавитном по- рядке, а затем разнести их по счетам клиентов. Оказав- шись перед лицом все возрастающего объема работы, «Бэнк оф Америка» обратился за помощью в расположен- ный по соседству Станфордский научно-исследовательский институт (ныне Международный Станфордский научно- исследовательский институт). Найденное решение оказалось настолько удачным, что стало промышленным стандартом. Во-первых, была раз- работана целостная система для нумерации и чтения че- ков — система «Микр» (MICR, от Magnetic Ink Character Recognition — распознавание букв, написанных магнитны- ми чернилами). В системе использовались специальные сканеры, способные считывать числа, напечатанные маг- нитными чернилами на каждом чеке. По этим числам определялись местонахождение банка, его название, кон- кретный филиал банка и номер индивидуального банков- ского счета. Человек легко мог прочитать эти числа, но что самое главное — их могла читать машина, причем да- же тогда, когда они были закрыты почтовыми марками, которые наклеивались на чеки при их пересылке из банка в банк. Во-вторых, была разработана бухгалтерская система «Эрма» (ERMA, Electronic Recording Method of Accounting — электронный метод регистрации расчетов). Помимо сканеров системы «Микр» здесь применялся спе- циальный компьютер, спроектированный Станфордским институтом и изготовленный компанией «Дженерал элект- рик». Программное обеспечение для этого компьютера было создано самим банком. В 1959 г. «Бэнк оф Америка» начал устанавливать первые 32 системы «Эрма» в регио- нальных центрах по всей Калифорнии. Со временем компьютеры взяли на себя большую часть нудной повседневной работы банковских служащих. В те- чение 60—70-х годов, когда цены на компьютеры стали снижаться, а накладные расходы на канцелярскую банков- скую работу расти, во многих банках начали практиковать ночную пакетную обработку данных, касающихся прове- денных за день финансовых операций. На следующем эта- пе терминалы были предоставлены непосредственно в распоряжение кассиров, которые, таким образом, получи- ли возможность запрашивать необходимую информацию о банковских счетах прямо из базы данных. По мере совер- шенствования автоматизированных банковских систем банкиры стали интересоваться возможностями новейшей технологии в плане привлечения клиентов. Автоматиче- ские кассовые аппараты появились в начале 70-х годов. Первая реакция клиентов на новшество была довольно прохладной, тем не менее банки продолжали внедрение этих машин, ибо не вызывала сомнений их эффективность при проведении простых банковских операций, что позво- ляло снизить затраты на содержание кассиров. А когда ATM стали более просты в обращении, возросла их попу- лярность и среди клиентов. В конце 70-х годов один нью- йоркский банк сообщил, что свыше двух третьих опера- ций, связанных с получением наличных денег с банковских счетов, было осуществлено с помощью ATM и, более то- го, многие клиенты предпочитали пользоваться этой сис- темой даже в том случае, когда имели возможность обратиться к кассиру. Двадцать лет развития аппаратных и программных средств превратили банковские компьюте- ры из секретных «цифродробилок» в настоящих помощни- ков людей. ОБЩЕНАЦИОНАЛЬНАЯ СЕТЬ В то время как во многих приложениях эффективность компьютеров оценивается в долларах, существует система, где действуют оценки совсем другого рода, поскольку слу- жит она спасению человеческой жизни. Практика работы с различными механизмами показывает справедливость аксиомы, гласящей, что правила техники безопасности всегда пишутся кровью. Слишком часто новые методики входят в практику только после серьезных аварий. Траги- ческим подтверждением этого правила может служить ис- тория автоматизации системы управления воздушными 88
сообщениями АТС (Air-Traffic-Control) США. До 1956 г. идея автоматизации этой системы не привлекала особого внимания. Однако происшедшая в том году страшная авиационная катастрофа — столкновение в воздухе двух самолетов — выдвинула этот вопрос на передний план. В середине 50-х годов диспетчеры управляли самолета- ми только при взлете и посадке. Местонахождение авиа- лайнера определялось «вручную» на основании расчетов самого пилота. Ни сложные длинноволновые радиолока- ционные системы, ни компьютеры тогда не применялись. Субботним утром 30 июня 1956 г. произошел случай, изменивший все. В начале десятого два самолета с интер- валом в несколько минут взлетели в аэропорту Лос-Анд- желеса. Взмыв за облака, нависшие над аэропортом, они оказались в освещенном солнцем небе. Самолет марки «Локхид супер констилейшн», принадлежавший компании «Транс уорлд эйрлайнз», выполняя рейс 2, направлялся в Канзас-Сити. Его полет проходил на высоте 5800 м. Дру- гой самолет, «Дуглас DC-7», принадлежавший компании «Юнайтед эйрлайнз», выполняя рейс 718, следовал в Чика- го на высоте 6400 м. Через некоторое время рейс 2 изме- нил план полета, получив разрешение перейти на высоту 6400 м. Как обычно, оба пилота периодически обращались на ближайшие станции управления полетами, сообщая свои координаты и уточняя время прохождения определенных наземных пунктов по маршруту их следования. Содержа- ние радиосообщений передавалось по телефону на ближай- шую региональную станцию управления, где их печатали на так называемой полетной ленте. Диспетчеры сидели пе- ред высокими рамами, на которых одновременно могло находиться более 20 таких лент. Эта информация предна- значалась исключительно для того, чтобы диспетчеры имели представление о проходивших в их районе полетах. Однако, покинув район Лос-Анджелеса, самолеты оказа- лись в неконтролируемой зоне. Ни один из них не получал никаких указаний с Земли и ни один из них не имел ни малейшего представления о присутствии другого. Но в 10 ч 13 мин центр управления в Солт-Лейк-Сити получил сообщения с обоих самолетов: в каждом из них говори- лось, что контрольную точку над пустыней Пейнтид он предполагает пройти в 10 ч 31 мин. ПОСЛЕДНЕЕ СООБЩЕНИЕ Тем временем погодные условия ухудшились. Рваные об- лака собрались на высоте 4600 м в сплошной слой облач- ности с грозовыми тучами, простиравшимися в отдельных местах до высоты 7600 м. Чтобы избежать сильных тур- булентных потоков, пилоты обычно стараются обойти ту- чи. Мы никогда не узнаем подробностей случившегося, но известно, что ровно в 10 ч 31 мин рейс 2 и рейс 718 столк- нулись в небе над пустыней Пейнтид. В этот момент пункт управления в Солт-Лейк-Сити получил единственное радиосообщение: «Солт-Лейк, Юнайтед 718 ... о ... мы сейчас врежемся». Ничего больше ни с одного самолета услышать не удалось. Все 117 пассажиров и 11 членов эки- пажей погибли, когда искореженные самолеты рухнули в Большой каньон. Катастрофа, которую вполне можно было бы предот- вратить, вызвала глубокое возмущение общественности и политических кругов; это привело к незамедлительной ко- ренной реформе всей системы управления гражданской авиацией. Буквально через несколько месяцев был решен вопрос о передаче в систему гражданской авиации военных радиолокаторов. В течение двух лет конгресс сформировал Федеральное агентство по авиации, переименованное позд- нее в Федеральное авиационное управление. Основной за- дачей нового правительственного учреждения стало обеспечение безопасности воздушных перевозок. Было оче- видно, что для обработки огромного объема быстроменя- ющейся информации о местоположении, высоте и скорости полета авиалайнеров необходимо использовать компьютеры. Это положило начало созданию гигантской компьютеризованной системы, опоясавшей всю террито- рию США и связанной со многими районами мира. Сначала была автоматизирована канцелярская работа. Данные, поступающие с борта самолета, и сообщения пи- лотов об их местонахождении вводились в компьютер вручную. Затем система автоматически печатала полетные ленты, посылая соответствующую информацию диспетче- рам, отвечавшим за тот сектор, через который проходил самолет. Следующий шаг заключался в автоматизации ввода информации. Это стало возможным, когда к систе- ме были подключены более совершенные радиолокаторы. Получая информацию с радиолокаторов, компьютеры отображали на экране обстановку в воздухе. Впервые дис- петчеры могли следить за текущим местонахождением каждого самолета в наблюдаемом секторе с помощью гра- фического изображения. Компьютерная система давала также сводку погоды, что позволяло диспетчерам преду- преждать пилотов об изменении полетных условий. Кроме того, программисты придумали так называемую систему защиты от неисправностей, в которой применялись сред- ства дублирования на случай каких-либо сбоев в работе ап- паратуры, программного обеспечения или самих диспетчеров. К середине 80-х годов на программирование системы АТС было затрачено около 500 человеко-лет и написано более 500 тыс. строк программного кода. Все вместе взя- тое программное обеспечение представляло собой самую большую в мире программу. Она постоянно совершенству- ется, и, по всей видимости, эта система никогда не будет заменена какой-то абсолютно новой. Поскольку система должна надежно функционировать в любой день, любую минуту, изменения в ней можно осуществлять лишь посте- пенно. И хотя система АТС развивается в направлении 89
полной автоматизации, в ней всегда сохранится место для человека, ибо только он в конечном счете способен обеспе- чить надежность. Разумеется, людям свойственно оши- баться, но зато машины выходят из строя. И когда случается авария, последней линией обороны остается че- ловек. Как сказал один программист, 15 лет проработав- ший над созданием системы АТС, «для сопоставления информации и принятия решения лучшим компьютером в мире остается человеческий разум».
ПРОГРАММА, КАЖДЫЙ ДЕНЬ ТВОРЯЩАЯ ЧУДЕСА Многие крайне важные задачи, с которыми люди сталки- ваются в современной жизни, решаются с помощью слож- нейшего программного обеспечения. Диапазон таких задач весьма велик — от создания безопасности авиапассажиров до контроля оборота многомиллиардных денежных средств в международных валютных операциях. Но для миллионов граждан, живущих в сегодняшнем индустри- альном мире, компьютерный век проявляется и в более обыденных делах. Программное обеспечение играет мириады маленьких ролей в повседневной жизни. В компьютеризованных зда- ниях учреждений специальные программы управляют мик- роклиматом, регулируя температуру и освещенность. В сводках вечерних новостей графические программы рисуют на экранах телевизоров сменяющие друг друга метеороло- гические карты. Существуют программы, которые умеют по заранее заготовленному тексту и списку адресатов, по- лучаемому по телефонным линиям, составлять миллионы персональных писем, касающихся самых разных вопро- сов — от условий лотерии до предложений о продаже не- движимости. Когда водитель заправляет автомобиль у автоматизированной бензоколонки, продавец в универмаге принимает кредитную карточку покупателя, а сельский ме- ломан или спортивный фанатик приобретает билеты на концерт либо спортивное состязание, программное обеспе- чение осуществляет все необходимые финансовые опера- ции. Именно благодаря таким повседневным операциям программное обеспечение приобрело столь важное значе- ние в жизни современного общества. В подобных случаях чаще всего используется централь- ная вычислительная система, обслуживающая одновремен- но многих территориально весьма удаленных пользова- телей. Человек обычно не видит перед собой ничего, что напоминало бы ему компьютер, а последний в свою оче- редь нередко получает исходные данные от устройств, со- всем не похожих на клавиатуру или джойстик. Например, на контроле в супермаркете устройство ввода представля- ет собой оптический аппарат, встроенный в прилавок, а выходная информация компьютера включает, в частности, напечатанный чек, в котором содержится куда более де- тальная информация, чем та, какую выдавали нам механи- ческие кассовые аппараты прежних дней. На забитых транспортом уличных перекрестках используется устрой- ство компьютерного ввода в виде уложенной под мосто- вой магнитной катушки, которая позволяет подсчитывать количество проходящих над ней автомобилей. Выходная информация в данном случае представляет собой последо- вательность чередующихся транспарантов ИДИТЕ-СГОЙ- ТЕ, зажигающихся зеленых стрелок, красных сигналов светофоров и других видимых знаков. Приведенные далее примеры — это лишь малая часть разнообразных применений программного обеспечения в нашей повседневной жизни: рассылка писем, учет бакалей- ных товаров на контроле в супермаркете, регулировка сиг- налов светофора. Однако за каждым таким применением скрываются тысячи тщательно продуманных строк текста программы, обеспечивающих обработку огромных пото- ков данных и позволяющих наилучшим образом управлять ходом событий. 91
Программа, каждый день творящая чудеса Личные письма из компьютера Все более изощренные способы рекламы с помощью пи- сем, доставляемых клиенту по почте, коренным образом изменили сам вид этих писем. Раньше почтовые ящики обычно забивались письмами, содержавшими безымянное обращение — житель. Различные службы — организации по сбору средств для политических деятелей, благотвори- тельные общества, издатели журналов и каталогов, стра- ховые компании, производители одежды и многие другие представители делового мира, принимающие заказы по почте, — пришли к выводу, что для работы с имеющими- ся у них списками адресатов надо использовать компьюте- ры. С их помощью можно подготовить рекламное письмо или бланк заказа, адресованные конкретному клиенту. Дорогая Джейн Адамс. Гипотетический клиент Джейн Адамс получила персональное письмо с призывом вступить в общество садоводов. В текс- те письма названо ее имя и адрес, а также упоминается о том, что .ее семья занимается садоводством. Собственный список Джейн Адамс Тейлор-ст 10 Эрик Эндрюс Мейн-ст 25 Филип Астор Мэдисон-ав 2100 Салли Бакстер Н 33 я ав Vj7 Арендуемый список Тейлор-ст 10 Лесли Аделман Секонд-ст 502 Грегори Александер Н Лексингтон пр 1400 Т С Берман Флауер-зв 609 Объединенный список Дорогой ”ПОЛНОЕ ИМЯ”! В штате ’’ШТАТ” хорошо известно, что семья ’’ФАМИЛИЯ”, проживающая по ’’УЛИНА И ДОМ”, увлекается садоводством. Поэ- тому в случае Вашего вступления в Об шество садоводов мы будем рады выслать Вам таблицу с описанием пряных трав, применяемых в кулинарии. Кроме этой таблицы членам общества дополнительно ^предоставляются: Скорее всего имя Джейн Адамс оказалось в этом списке адресатов потому, что уже фигурировало в каких-то других списках. Почтовые рекламные агентства формируют свои списки из двух основных источников: списка клиентов, со- ставленного на основе данных* собранных самой компанией, и аналогичных списков, арендуемых у других фирм. Обычно все эти списки пропускают через программу, которая объ- единяет и «просеивает» их, создавая таким путем новый список, не содержащий повторяющихся имен. Кроме того, программа может отобрать почтовые индексы так, чтобы полностью исключить, например, возможность получения городским жителем письма, рекламирующего товары, пред- назначенные для людей, занимающихся сельским хозяй- ством. Программа может также убрать из списков тех лиц, которые не хотят быть связанными с почтовой рекламой. Рекламодатель составляет стандартный шаблон письма, в котором используются специальные коды для программы, показывающие, куда надо вставить имя, адрес и другие све- дения о клиенте. Программа приводит текст письма к над- лежащему виду, заполняя сделанные вставки, и таким обра- зом оно приобретает вид персонального послания. 92
Списки адресатов, с которыми работают многие почто- вые рекламные агентства, представляют собой гигантские базы данных, содержащие о каждом клиенте разнообраз- ную информацию. База данных может включать в себя сведения о возрасте, кредитной надежности, доходах, преж- них покупках, сделанных по почте, и другие детали, по- могающие торговым организациям учитывать тончайшие нюансы при осуществлении своей рекламной стратегии. Почтовые рекламные компании используют компьютеры для сортировки и объединения списков, поступающих из различных источников, для составления новых списков клиентов с учетом специфических требований. Мощное программное обеспечение для обработки текстов способно теперь составлять персональные письма, занося в стан- дартный текст не только имя и адрес клиента, но и другие личные данные. Как показано в приведенном здесь приме- ре, личное послание составляется компьютером на основе двух источников информации. Одна часть памяти машины отводится для хранения основного текста письма, другая — содержит фрагмент списка клиентов. Программа, соз- дающая персональное послание, заносит сведения о каж- дом клиенте непосредственно в текст, в соответствующие его места. При этом остальная часть текста сдвигается ровно настолько, чтобы могла поместиться вставка. При- дав таким образом письму вид персонального послания, компьютер отпечатывает его. п. проживающая по 1/1ПП мвприяятгст хорошо извест проживающая по Гпегори Александер- 2° штате Калифорния хорошо известно. ЧТО семья Александер Н Поипынгт-лн-поул дорогая Лхейн Адамс» В штате Пенсильвания но. что семья обрекается садовод- Тейлор-стрит Ю случае Вашего_________ ств0„. Поз™» ®саловоПоВ J- Ц вступления в Обш^т с бУДем ради выдать ^няемы- в W описанием пр^ых 'таблииь членам | ЮТСЯ’. - Ежеквартальный жур^^' иное письмо ' семян и лук-овин - Скидка при попу» Заполните купон и в-ли» его «.I Программа составления персональных писем нередко осу- ществляет также функцию сортировки по почтовому индек- су: это позволяет рекламодателю экономить на почтовых расходах и затратах, связанных с распечаткой писем. При массовой отправке отсортированных писем фирмы получа- ют право на скидку. Список может быть также отсортиро- ван с целью помочь рекламодателю сосредоточить внимание на районах с определенными демографическими особен- ностями. АДД2205ТАБЛИПА678 КУПОН ОБЩЕСТВА САДОВОДОВ После того как Джейн Адамс, заполнив купон, вступит в члены общества садоводов, ее ответ на рекламное письмо будет занесен в файл членов этого общества. Отныне эти данные становятся для программы исходным материалом при формировании новых списков клиентов. Исходящая почта Серийный номер на почтовом купоне, отсылаемом клиен- том в адрес рекламодателя, называется ключом. В нем ко- дируется почтовый индекс и тип рекламного материала, со- державшегося в письме. Ключ помогает рекламодателю ана- лизировать полученные ответы, получая, таким образом, дополнительную полезную информацию, которая заносится в список клиентов фирмы. Это позволяет фирме, с одной стороны, улучшить собственную рекламу, а с другой — по- вышает интерес к ее спискам со стороны других компаний. 93
Программа, каждый день творящая чудеса Компьютеры в торговле Благодарим за покупку СУПЕРМАРКЕТ В чередующихся широких и узких линиях универ- сального товарного кода зашифрован номер торго- вого изделия. Сканер, установленный на контроле в супермаркете, преобразует эти символы в электриче- ские импульсы, которые затем переводятся в двоичный код и передаются в компьютер. Номер за- писан на этикетке дважды: в форме обычного деся- тичного числа и в виде широких и узких линий. В этом коде первая половина числа обычно указывает производителя, а вторая — изделие. ТУНЕЦ .99 т СЫР 1.29 т ЯЙЦА .89 т РОСТБИФ 2.99 т ХЛЕБ 1.09 т .16lb@2lb/.99 БАНАНЫ .57 т УКСУС 1.49 т По номеру товарного ко- да компьютер находит в базе данных цену товара и выдает на кассовый ап- парат две команды. По первой из них на дисплее кассового аппарата высве- чивается название, цена и некоторые другие сведения о товаре, а по второй — та же информация печата- ется на бумажной ленте. Компьютер может посы- лать и специальные сооб- щения, например напоми- нание о том, что следует обратить внимание на возраст покупателя, при- обретающего пиво или вино. 94
Каждый раз, когда контролер супермаркета перемещает купленные вами товары по прилавку, под которым вмон- тирован слегка попискивающий сканер, в работу включает- ся сложнейшая система программного обеспечения. Считывая закодированные на специальной этикетке дан- ные, сканер передает их в память компьютера. Гораздо быстрее, чем кассир мог бы набрать стоимость покупки на кассовом аппарате, компьютер напечатает название продукта и его цену на выдаваемом покупателю чеке. Практически одновременно с этим осуществляется коррек- тировка инвентарной описи товаров, имеющихся на пол- ках магазина, что позволяет непрерывно следить за движе- нием товаров. Такая система помогает оценить эффектив- ность рекламы и успешность торговли. Ключевую роль в организации программного обеспече- ния торговых предприятий играет так называемый универ- сальный товарный код, УТК. Он представляет собой систему идентифицирующих номеров, записанных в удоб- ной для компьютера форме — в виде серии широких и уз- ких линий, которые считываются с помощью либо стационарного (вроде тех, что установлены на контроле в супермаркете), либо ручного сканера. То же самое про- граммное обеспечение, которое применяется для организа- ции учета в супермаркете, можно использовать и для других целей, например для контроля наличия комплекту- ющих изделий на заводской сборочной линии, учета сплав- ляемых по реке бревен или фиксации моментов пересечения финишной черты участниками марафонского забега. Размер Уровень повторного заказа Цена Минимальный остаток Налого- обложение Название Инвен- тарный номер Объем упаковки Номер повторного заказа 12345 67890 Уксус 9 09876 54321 ТУнеЧ 10 53640 86423 Хруст, хлопья] 2 10293 48576 Приправа 10 56473 29201 Зубная паста ю 123456 654321 246802 135793 928710 Остаток этих товаров меньше минимально допустимого Уровень Инвентар- повтппнпгп повторного НЫЙ повторного Номер утк Название заказа номер Номер УТК Отдел Специальное сообщение Универсальный товарный код используется не толь- ко для выписки чека, но и для других бухгалтерских операций. Вся нужная информация о каждом имею- щемся в магазине товаре занесена в базу данных. По запросу компьютер анализирует такие данные, как количество оставшегося товара, правила его на- логооблажения, юридические ограничения на его продажу, использование покупателем специальных купонов и множество других факторов. Одновременно с подачей сведений о проданном то- варе на дисплей кассового аппарата компьютер про- изводит соответствующую коррекцию товарной ве- домости. При этом контролируется количество оставшегося товара и, если оно становится меньше допустимого минимума, делается отметка о необхо- димости заказа товара данного вида. Обычно про- граммное обеспечение устроено так, что сводная ин- формация о наличии товаров выдается управляюще- му к концу рабочего дня. Вместе с тем управляю- щий имеет возможность обновлять данные в систе- ме, внося, скажем, информацию об изменении цен и поступлении новых партий товаров. 95
Программа, каждый день творящая чудеса Электронный помощник справочной телефонной службы На протяжении многих лет служащие справочной телефон- ной службы, отвечая на вопросы о номерах телефонов, вынуждены были вручную перелистывать телефонные справочники. Затем им на смену пришли устройства для просмотра микрофиший и, наконец, совсем недавно — компьютеры. Последние идеально подходят для подобной задачи, которая в сущности сводится к поиску конкретных сведений в длинном списке однородных данных. А теперь компьютеры могут не только отыскивать требуемые но- мера, но и — благодаря всемогущему программному обес- печению — произносить их вслух. Речь компьютера бывает двух видов — записанная за- ранее и синтезированная. И в том и в другом случае звуко- вой текст необходимо перевести в двоичный код. При воспроизведении записанный голос фактически неотличим от человеческой речи, однако для хранения записи требует- ся большой объем памяти. Чтобы запомнить одну секунду закодированной в цифровой форме речи, требуется 8 тыс. единиц памяти. Синтезированная речь конструируется из закодированных фонем. В разговорном английском насчи- тывается около 50 различных звуков, и для их хранения требуется меньший объем памяти, чем для записанной го- товой фразы, но синтезированная речь мало похожа на живой человеческий голос. Номер Эдварда Рьяна, пожалуйста Позвонив в телефонную справочную службу, абонент называет город, имя и адрес. Сидя- щий перед специальной клавиатурой и дис- плеем оператор печатает данные и вводит в компьютер команду поиска нужного номера. Есть 3 сходные по звучанию фамилии Риян, Рийян, Рейян Раздел: Код местожительство оператора: 01526 Используя программное обеспечение для управления базами данных, специализирован- ный компьютер, обслуживающий одновре- менно до 600 операторов, ведет поиск среди хранящихся в его памяти миллионов имен и номеров. Программа построена так, что поз- воляет отыскивать сходные по звучанию имена даже в том случае, если правила их написания мало похожи друг на друга. Опе- ратор набирает код подходящего варианта и тем самым передает его в блок речевого вы- вода, управляемый отдельным компьютером. Список Рьян Эдвард Дж. Кармелл пл. 1455 482-1650 А Рьян Эдвард Л. Пайн Вилла пр. 8 481-2990 Б Рьян Элизабет Бродвей 3706 936-2261 В Рьян Элмер Ф. Ривер пр. 1305 995-3273 Г Рьян Эмма Куин 2020 995-4695 Д Рьян Юджин Сандбургпр. 5915 997-2951 Е Рьян Юджиния Дабни ст. 2908 997-6631 Ж 96
Оцифрованный голос Для обработки звуков человеческой речи с помощью ком- пьютера ее надо преобразовать из аналоговой формы (не- прерывная звуковая волна) в последовательность дискретных цифровых сигналов. На рисунке данный про- цесс показан в упрощенном виде. Чтобы уловить нюансы человеческого голоса, аналого-цифровой преобразователь измеряет частоту, амплитуду и другие характеристики вол- ны тысячи раз в секунду через постоянный интервал вре- мени. Каждому измерению присваивается определенное числовое значение, и по такой закодированной диаграмме компьютер может восстановить звук. Для этого числовые значения преобразуются в электрические импульсы, кото- рые после усиления превращаются в слышимые звуки. три четыре пять шесть семь восемь девять ваш номер два ноль один Получив номер, блок речевого вывода начи- нает подбирать подходящие фонемы закоди- рованных звуков и строить из них соответ- ствующую фразу. Если искомого абонента в памяти нет, то строится фраза, сообщаю- щая, что система не обслуживает данный но- мер или что его нет в списке. Затем выдает- ся еще одно закодированное сообщение: «Ес- ли вам требуется помощь, то обратитесь к оператору еще раз», после чего линия пере- водится в состояние ожидания ответа. Если абонент вешает трубку, то производится разъединение, в противном случае абонент вновь подключается к оператору. Независимо от того, хранится звуковая ин- формация в блоке речевого вывода в виде фонем или в виде закодированного человече- ского голоса, выходные данные должны пройти через цифро-аналоговый преобразова- тель, превратившись в электрические сигна- лы, возбуждающие динамик в телефонной . трубке. 97
Программа, каждый день творящая чудеса Уличный регулировщик Десятилетия, минувшие с того времени, как в середине 50- х годов изобретение автоматизированной системы для управления транспортом позволило заметно уменьшить заторы на улицах Денвера (см. с. 00), ознаменовались но- выми успехами. Инженеры-транспортники использовали достижения в области вычислительной техники для созда- ния гибких многоцелевых систем, быстро реагирующих на самые разнообразные дорожно-транспортные ситуации. Такие системы могут автоматически настраиваться на ра- боту в условиях «часа пик» в заранее установленные ут- ренние и вечерние часы, а также наводить порядок в автомобильном хаосе, частенько возникающем вблизи больших стадионов и культурных центров. Цветные гра- фические диаграммы позволяют операторам, находящимся за пультом центрального компьютера, наблюдать за транспортными потоками на важнейших перекрестках, не- медленно замечая места повышенной опасности и ликви- дируя аварийные ситуации путем дистанционного управления. Под полотном дороги устанавливаются специальные датчики, показания с которых поступают на вход компью- тера. С помощью этих датчиков, играющих в системе роль нервных окончаний, определяется количество машин на дорогах. На основании этих данных и показаний внут- ренних часов система вычисляет величину и скорость транспортного потока. В зависимости от величины и ха- рактера потока компьютер регулирует продолжительность красного или зеленого сигналов на транспортных и пеше- ходных светофорах. Кроме того, программное обеспечение, управляющее движением транспорта, позволяет до некоторой степени снизить напряжение, возникающее обычно у водителя в го- родских районах с наиболее интенсивным движением, и тем самым сберегает человеческие жизни. Поддержание равномерности транспортного потока сокращает число как мелких столкновений, так и более серьезных аварий, будь то на центральных улицах или скоростных автомагистра- лях. В некоторых городах специальные системы приорите- тов позволяют давать «зеленую улицу» машинам «скорой помощи», пожарной охраны и другим транспортным сред- ствам, задержка движения которых может привести к тра- гическому исходу. Дорожные датчики Дорожн датчик ные На перекрестке, где движением управляет компьютер, на каждой полосе под полотном дороги на глубине около 4 см проложена проволочная петля. Такая система позволяет регистрировать каждое транспортное сред- ство, проходящее через перекресток. Сигналы от датчиков поступают в микропроцессор местного блока регистрации. Это лишь пер- вый этап пути, который должны пройти данные от перекрестка до центрального ком- пьютера. абель к центральному компьютеру естныи лок гистрации жные атчики 4
Программа, регулирующая работу системы в зависимости от времени суток, устанавливает интервалы между различ- ными световыми сигналами в соответствии с интенсивнос- тью движения на протяжении дня и в различные дни неде- ли, учитывая такие регулярные всплески, как, например, «час пик». Цветные символы на экране дисплея дают воз- можность следить с центральной станции за интенсивнос- тью транспортного потока (желтые кружочки), изменения- ми сигналов (зеленые стрелки и красные стоп-сигналы) и некоторыми другими характеристиками движения. Программа «гибкого реагирования» строит свою работу с учетом интенсивности транспортных потоков. В нее заложено несколько различных моделей регулирова- ния сигналов светофоров. Выбор модели зависит от конкретных условий. В отли- чие от программы, регулирующей движение в соответствии с временем суток и имеющей дело с заранее предсказуемыми пиками, эта программа рассчитана на районы с нерегулярными всплесками интенсивности движения транспорта, напри- мер прилегающие к торговым центрам или стадионам. На рисунке показано, как, регулируя движение на перекрестках, программа позволяет сократить заторы (красные линии) в районе Колизея. Там, где возникает угроза затора на скоростных магистра- Программа, управляющая движением на главных перекрест- ках, устанавливает продолжительность сигналов светофоров на критических участках, например, таких, где пересекаются несколько главных магистралей города. В отличие от про- граммы гибкого реагирования, в которой нужный план дей- ствия выбирается из некоторого заранее заданного набора, данная программа контролирует интенсивность транспорт- ных потоков ежесекундно и регулирует сигналы светофора на каждом перекрестке с учетом ситуации, складывающейся на ближайших перекрестках. лях, программа управления транспортным потоком регули- рует время подачи сигналов на въезд таким образом, чтобы обеспечить равномерность движения транспорта. Программа управления въездом на скоростную магистраль анализирует сигналы от датчиков, установленных как на магистрали, так и на въезде, и регулирует продолжительность красного и зе- леного сигналов светофора, расположенного при въезде на скоростную магистраль. Это позволяет пропускать автомо- били на магистраль через оптимальные интервалы времени. 99
100
РАЗДВИГАЯ ПРЕДЕЛЫ ВОЗМОЖНОГО «Пальцы» робота, сжимающие почти с человеческой осторожнос- тью хрупкое яйцо, — прекрасный образец мастерства программиро- вания. В этом опытном варианте механической руки 14 суставов, вмонтированных в запястье и пальцы. Их подвижность обеспе- чивается с помощью управляемых микрокомпьютером приводов. Координацию усилий, прилагае- мых суставами, осуществляет сложнейшее программное обес- печение. Всеведущий робот Хэл из научно-фантастического сериала «Космическая одиссея: 2001» мог говорить, слушать и, по-видимому, думать точно так же, как и люди, совершающие вместе с ним путешествие к Юпитеру на борту космического корабля. Кроме своих прямых обязанностей, связанных с круглосуточным управлением ко- раблем, Хэл прекрасно играл в шахматы и был приятным собеседником, умеющим понимать смысл сказанного по движению губ. Но ему не были чужды и такие при- скорбные человеческие недостатки, как тщеславие и паранойя. Когда Хэл, впав в ярость, начал убивать членов экипажа, то те, кому посчастливилось уцелеть, реши- лись на проведение цифровой «хирургической» операции на его мозге. Они лишили робота интеллектуальных способностей, ограничив его роль управлением механиче- скими системами корабля. Когда в 1968 г. сериал вышел на экраны, Хэл, при всех своих антисоциальных наклонностях, буквально заворожил кинозрителей. Сама идея создания умной ма- шины, которая помогала бы людям управлять миром, была поистине захватываю- щей, несмотря на растущее беспокойство по поводу того, кто (или что) реально способен управлять подобным миром. И это не было пустой фантазией. Многие специалисты предсказывали, что создание действительно интеллектуальных ком- пьютеров — всего лишь вопрос времени. Сейчас, спустя двадцать лет, многие по- прежнему придерживаются мнения, что нечто похожее на Хэла может и в самом деле появиться в начале XXI в. Хотя еще предстоит решить сложнейшие проблемы — в первую очередь это касается машинного зрения и слуха, которыми Хэл был наделен почти в совершенстве, — компьютеры уже и сейчас достигли тако- го уровня сложности и производительности, который трудно было представить в эпоху «Юнивака-1» и других машин первого поколения. Многие ныне привычные функции современных компьютеров еще вчера рисова- лись как научно-фантастические. Сегодня не вызывает сомнения, что исследования космического пространства, изучение далеких галактик и всемирная система связи просто невозможны без компьютеров. Мощные суперкомпьютеры с соответствую- щим программным обеспечением позволяют справиться с чрезвычайно сложными задачами, возникающими при подготовке прогнозов погоды. Используя методы компьютерного моделирования, ученые пытаются научиться управлять рыбными запасами океана и другими мировыми ресурсами. Хотя пока и недостаточно широ- ко, компьютеры начинают применяться в медицине и психологии, где они помогают врачам ставить диагноз и исследовать психику пациентов. Среди других применений компьютеров, менее известных непосвященным, можно назвать исследования в об- ласти фундаментальных вопросов эволюции Вселенной и происхождения жизни на Земле. И наконец, подобно барону Мюнхгаузену, пытавшемуся вытянуть се- бя из воды за собственные волосы, создатели компьютеров, опираясь на маши- ны сегодняшнего дня, разрабатывают и строят следующее поколение ком- пьютеров. 101
Необычайно яркая спиральная галактика, расположенная на расстоянии 20 млн. световых лет от Земли, на обычной фотографии в оптическом диа- пазоне имеет вид яркой расплывчатой завитушки (слева). Однако ее изо- бражение, построенное компьютером (справа), открывает нашему взору за- мысловатое разнообразие участков различной яркости. Центральные пики соответствуют наиболее ярким областям. «Вершины», окружающие ядро галактики, — это отдельные звезды. Ученые, работающие на передовых рубежах современ- ной информатики, сталкиваются с многочисленными про- блемами, которые на первый взгляд могут показаться не более чем отвлеченными размышлениями академиков, от- городившихся от мира в «башне из слоновой кости». Тем не менее эти головоломки, которые зачастую носят теоре- тический характер и предстают в виде красочных метафор, находят вполне конкретные приложения в реальном техно- логическом и деловом мире. Например, «задача о коммивояжере» волновала класси- ческие: математиков задолго до того, как ею занялись спе- циалисты в области информатики. Задача состоит в следующем: построить маршрут деловой поездки комми- вояжера по стране так, чтобы он мог объехать все города, покрыв при этом минимальное расстояние. Если количе- ство городов невелико (например, около десятка), то зада- ча решается довольно просто. Но если их достаточно много, то найти решение практически невозможно. При количестве городов, близком к сотне, даже весьма мощно- му компьютеру потребуются годы (а может, и века) для нахождения оптимального маршрута: ведь число потенци- альных маршрутов растет экспоненциально в зависимости от числа городов. В этом случае количество маршрутов, которое-надо проверить, легко может вырасти до несколь- ких миллиардов. Задача о коммивояжере и другие аналогичные голово- ломки относятся к новому быстро развивающемуся науч- ному направлению. Ученые, работающие в этой области, заняты поиском наиболее простых алгоритмов для реше- ния задач, связанных с нахождением оптимального пути в так называемых сетях. Реальный характер задачи, опи- сываемой с помощью сети, может быть любым — скажем, касаться движения электрического сигнала или движения поезда. Поэтому решение подобных задач важно и для телефонных компаний, и для фирм, занятых грузо- выми перевозками, и для производителей компьютеров, которые работают с микросхемами, содержащими до не- скольких десятков электрических цепей на 1 см2 кремние- вой пластинки. МОДЕЛИРОВАНИЕ ПОГОДЫ Пожалуй, ни одна из вычислительных задач так хорошо не подходит для компьютера (и не нуждается в таком сложном программном обеспечении), как прогнозирование погоды. В конце 40-х годов один из творцов вычислитель- ной техники Джон фон Нейман понял, что из уравнений газовой динамики, описывающих движение атмосферных потоков, можно построить большую математическую мо- дель погоды, рассчитав ее с помощью компьютера. (Мете- орологи и ранее применяли в своей работе простые математические модели, однако объем данных, который они могли использовать, был строго ограничен, поскольку все уравнения приходилось решать вручную.) В Институте перспективных исследований в Принстоне фон Нейман разработал машину, которая позволила сократить время на получение прогноза на ближайшие сутки до нескольких минут, тогда как ранее для этого требовались сутки. Хотя фон Нейману и принадлежит честь первой прак- тической демонстрации использования компьютера для со- ставления прогноза погоды, саму эту идею выдвинул несколькими десятилетиями ранее талантливый англий- ский метеоролог Льюис Ричардсон. В 1922 г. он сделал по- пытку описать центр прогнозирования будущего. Его неудержимая фантазия рисовала громадный зал, где раз- 102
мещалось 64 тыс. человек — «вычислителей», — решаю- щих уравнения с помощью логарифмических линеек и механических калькуляторов. Каждый отвечал за уравне- ния, описывающие условия в определенном районе земно- го шара. Всем процессом вычислений руководил главный метеоролог, стоявший на возвышении, которого Ричард- сон сравнивал «с дирижером оркестра, где инструментами служат логарифмические линейки и счетные машины. Но вместо взмахов дирижерской палочки он направляет розо- вый луч света на те районы, обработка данных с которых идет с опережением, и голубой — на те, где она запаз- дывает». Современному сложному миру достоверный прогноз погоды нужен куда больше, чем во времена Ричардсона. Например, в США только за один год капризы погоды (ураганы, наводнения, заморозки, град и молнии) прино- сят убытки на многие миллиарды долларов и становятся причиной тысяч несчастных случаев и человеческих жертв. Предсказание погоды — это то маленькое чудо, которое многие фермеры и бизнесмены получают от частных мете- орологических служб по подписке или телефонным звон- кам, поступающим в бюро прогнозов миллиардами. СБОР ДАННЫХ Мечты Ричардсона о прогнозе, построенном на основе вы- числений, относятся к начальному периоду становления со- временной метеорологии. Технология 20-х годов была достаточна развита, чтобы обеспечить точный системати- ческий сбор данных о погоде. Вначале от случая к случаю, а затем и ежедневно метеорологи стали запускать напол- ненные гелием воздушные шары-зонды, оборудованные устройствами для записи температуры, влажности и дав- ления на различных уровнях нижнего слоя атмосферы (на- зываемого тропосферой). Сегодня всемирная сеть собирает данные в тысячах различных точек по всему зем- ному шару, направляя эту информацию для анализа в главные центры службы погоды. На разбросанных по всей Северной Америке гидрометеостанциях ученые иссле- дуют атмосферу с помощью шаров-зондов и не менее 8 раз в сутки делают наземные измерения температуры, влажности, давления и количества выпавших осадков. Са- молеты и корабли в морях и океанах дают дополнитель- ные данные. Всего в Национальный метеорологический центр США в Кэмп-Спрингсе, шт. Мэриленд, поступают ежедневно результаты около 100 тысяч подобных из- мерений. Для обработки этого потока информации требуются самые мощные компьютеры. Такие суперкомпьютеры, как «Крей Х-МР» или «Сайбер-205» фирмы «Контрол дейта» (стоимостью 16 млн. долл, и выше), могут обрабатывать данные с невообразимой скоростью — 400 млн. операций в секунду. Столь высокая скорость необходима потому, что используемые для прогнозирования погоды математи- ческие модели — наиболее сложные из всех программ. Для их разработки требуются силы, намного превосходя- щие возможности одного, пусть даже самого опытного че- ловека. Такое программное обеспечение создается целыми бригадами программистов, каждая из которых работает над отдельной частью (или модулем) большой модели. Причем очень часто эти бригады работают в разных городах. Глобальную модель погоды строят, разбивая тропо- сферу на отдельные секции, или клетки. Обычно длина стороны такой клетки составляет 160—320 км. Однако в Европейском центре среднесрочного прогнозирования, рас- положенном в английском городе Ридинг (это самый со- временный центр погоды), применяется модель со стороной клетки 120 км. (Установленный в Ридинге kqm- пьютер «Крей Х-МР» 4 раза в сутки поглощает очередную порцию данных, пережевывает ее около 50 мин, выдавая прогноз на ближайшие 3 дня. Он может делать и долго- срочные прогнозы — до 10 сут.) Клетки делятся на уров- ни, по высоте. В европейской модели рассматриваются 15 уровней — от поверхности Земли до середины озонного слоя (около 25 км над поверхностью Земли). Для каждой клетки компьютерная модель описывается уравнениями, в которых учитываются такие погодные факторы, как ветер, облачный покров, наличие или отсутствие горных масси- вов. Уравнения внутри клетки взаимозависимы, а все клет- ки модели связаны между собой. Это похоже на своеобразную метеорологическую ведомость, в которой изменение в одной клетке оказывает воздействие на другие клетки. В природе, например, увеличение скорости ветра над океаном в районе Сан-Франциско может привести к повы- шению влажности и вызвать дождь, который станет при- чиной изменения температуры, что отразится на тепловом балансе атмосферы. В свою очередь это может вызвать возникновение западных воздушных потоков. Уравнения, описывающие процессы внутри клетки, отражают каждый шаг в этой цепи событий, а сама модель предсказывает, как изменения условий в данной клетке скажутся спустя 2 дня на погодных факторах в 2 тыс. км к востоку, в районе Канзас-Сити. Наверное, те, кто, услышав прогноз, предвещающий безоблачное небо, затем промокали до нитки под грозо- вым дождем спустя всего два часа, скептически воспримут слова о том, что предсказание погоды заметно улучши- лось (главным образом благодаря компьютерам). Тем не менее в мировом масштабе в середине 80-х годов 5—6 дневный прогноз погоды стал таким же.точным, как двух- дневный в середине 70-х годов. В предсказаниях темпера- туры на ближайшие сутки количество ошибок, превышаю- щих 5 градусов, сократилось по сравнению с 60-ми годами вдвое. Более редкие, но досадные неточности, продолжаю- щие беспокоить метеорологов, имеют разные причины, далеко выходящие за рамки самого программного обеспе- чения. Во-первых, это недостаток требуемых данных. Хо- тя мировая сеть наблюдений за погодой крайне сложна, источников информации все еще слишком мало и они 103
расположены далеко друг от друга. Большие пробелы в этой сети имеются над просторами тропической зоны оке- ана, где порой зарождается самая плохая погода. Метео- рологи также жалуются, что их погодные модели чересчур грубы. Отдельные клетки охватывают слишком большие районы, что мешает добиться требуемой точности для от- дельной местности. «Хотя мы можем с определенной точ- ностью предсказать возможность возникновения гроз в районе Канзас-Сити, — замечает директор Национально- го метеорологического центра США Уильям Боннер, — нам трудно сказать, где именно они возникнут и когда». Роберт Бантинг, работающий в правительственной лабо- ратории по изучению окружающей среды, г. Боулдер, шт. Колорадо, считает, что сегодняшняя сеть метеорологиче- ских станций «похожа на сеть для ловли кита, тогда как многие возникающие в природе бури — всего лишь мелкая рыбешка». Другая причина неточности прогнозов и вытекающих отсюда трудно разрешимых проблем — сложность моде- лирования газовых потоков. Она обусловлена вероятност- ной природой газодинамических процессов. Изменения атмосферных условий описываются с помощью нелиней- ных дифференциальных уравнений в частных производ- ных. Если линейное уравнение вида у = х + 5 на графике всегда представляется прямой линией, то уравнение вида у = х + x(dy/dx) + x(d2y/dx) может описывать совершенно непредсказуемые наборы точек, и даже мельчайшая по- грешность в значении одной из переменных может приве- сти к абсолютно неверному результату. НАКОПЛЕНИЕ ОШИБКИ С этой проблемой метеорологи столкнулись еще в 1960 г., когда сотрудник МТИ Эдвард Лоренц составил программу для простой математической модели, описывающей зем- ную атмосферу, и прогнал ее несколько раз на компьюте- ре. Лоренц был буквально потрясен, обнаружив, что небольшие изменения в данных, например округление не- которых чисел, заданных с точностью шесть знаков после запятой, до трех знаков, приводят к абсолютно иным ре- зультатам. «Именно в этот момент я понял, что если и реальная атмосфера ведет себя подобным образом, то долгосрочные прогнозы просто невозможны», — заявил он. Столь мрачный вывод означает, что даже малейшие ошибки в отдельных данных (например, ошибка на один градус при измерении температуры) могут в процессе вы- числений вырасти до огромных размеров. В итоге в двух- недельном прогнозе теряется различие между безоблачным небом и проливным дождем. «Вследствие того, что мы проводим измерения лишь с конечной точ-* ностью, — говорит физик из Калифорнийского универси- тета в Беркли Джеймс Критчфилд, — эти измерения оказываются малопригодными, а потому возникает неоп- ределенность, с которой уже ничего нельзя поделать». Сегодня изучение разнообразных вероятностных систем (таких, как погода или циклически повторяющиеся подъ- емы и спады в размножении вредных насекомых) выдели- лось в небольшое самостоятельное научное направление. Ученые, работающие в этой области, надеются найти скрытый порядок в случайной на первый взгляд цепи со-
бытий. Однако пока самое большее, что удается сделать в борьбе с неопределенностью, — это оценить ее статисти- чески, т. е. предсказать вероятность наступления того или иного события (например, снежной бури) в определенный день. И пока в этой области нет заметных сдвигов, метео- рологам пришлось установить определенный временной предел достаточно точного прогнозирования — две недели. Улучшение среднесрочных прогнозов (т. е. в пределах от 3 дней до 2 недель) связано с совершенствованием мо- делей и получением дополнительных данных. Для расши- рения объема информации наряду с развитием сети метео- рологических станций применяют и более совершенные ин- струменты, в том числе метеоспутники и метеорадары новейших типов. В свою очередь для обработки возраста- ющего объема данных необходимы значительно более мощные компьютеры, так как десятикратное увеличение разрешающей способности модели требует увеличения производительности компьютера в 10 тыс. раз. Появление столь мощных компьютеров трудно ожидать раньше 90-х годов. Для улучшения долгосрочных прогнозов (т. е. на срок свыше теоретического двухнедельного предела) потребует- ся все, о чем говорилось выше, и кое-какие дополнитель- ные средства. Национальная служба погоды США уже делает 30- и 90-дневные прогнозы, но пока это лишь ста- тистическая оценка, предсказывающая только отклонения температуры и количества осадков от их среднего уровня. Но даже для этих наиболее общих параметров лишь 65% прогнозов Национальной службы погоды оказываются правильными. Примечательно, что подобное долгосрочное прогнозирование строится не на математических моделях, а на традиционном метеорологическом анализе. Проблема кроется все в той же непредсказуемой природе погоды. И тем не менее метеорологи не теряют надежды, что в конце концов им удастся делать точные, основанные на вычислениях прогнозы на сроки, превышающие двухне- дельный рубеж. В Принстоне, в геофизической лаборато- рии газовой динамики с целью проверки такой возможности были соединены два суперкомпьютера «Сай- бер-205», на которых проводилось глобальное моделиро- вание погоды. Эти работы лаборатории финансировались Национальным управлением по океанографическим и ат- B результате компьютерной обра- ботки инфракрасного изображе- ния земной поверхности, получен- ного со спутника, районы с раз- личными температурами окраши- ваются в разные цвета. Напри- мер, зеленый цвет соответствует здесь низким температурам. По- добные крупномасштабные изо- бражения помогают метеороло- гам следить за глобальной карти- ной погоды и делать кратко- срочные прогнозы. мосферным исследованиям. Пока работы носят чисто тео- ретический характер и в основном касаются развития технических аспектов программирования для составления долгосрочных прогнозов. Ученые из Принстона ставят перед собой цель про- длить вполне надежный недельный прогноз температуры и количества осадков до 12 недель. Лаборатория распола- гает данными многолетних наблюдений погоды по всему земному шару. Эти данные внесены в модель погоды, включающую свыше 40 тыс. уравнений. Программисты, прибегая к различным ухищрениям, постоянно совершен- ствуют модель, например заменяют математическую «форму» горных массивов и вместо гладких вершин вво- дят в модель зазубренные пики, которые лучше имитиру- ют влияние гор на воздушные потоки в верхних слоях атмосферы. Лаборатория добилась определенного прогресса в изме- рении загадочных, и, казалось бы, случайных явлений, ко- торые могут сказываться на погоде в дальнейшем. Как и других метеорологов, исследователей из Принстона обна- деживает периодически наблюдаемый феномен, называе- мый блокированием. Суть этого явления заключается в непредсказуемом замедлении воздушных потоков в верх- них слоях тропосферы. Нарушая нормальный ход собы- тий, эффект блокирования может стать причиной опустошительной засухи с продолжительной жарой или вызвать резкое похолодание. Ученые до сих пор недоста- точно хорошо понимают природу этого явления и поэтому не могут запрограммировать его возникновение, что, ко- нечно, существенно снижает эффективность компьютерных моделей. В то же время явление блокирования вселяет на- дежду на то, что атмосферные процессы, возможно, под- чиняются каким-то более глубоким ритмам, которые в конечном счете окажутся предсказуемыми. «То обстоятельство, что модели ошибаются с завид- ным постоянством, вселяет в меня надежду, — заметил метеоролог Адриан Симмонс. — Если бы все определя- лось только обычным образованием и исчезновением ци- клонов и антициклонов, то это не выглядело бы столь обнадеживающе. Но поскольку некоторые из этих систем являются долгоживущими, возникает ощущение, что мы сможем их предсказывать». Своеобразным противовесом этой оптимистической точке зрения служит позиция директора Принстонской ла- боратории Кику Миякоды, который считает, что, сколь бы сложной ни была компьютерная модель, «погоду творит господь бог и потому в ней всегда будет нечто такое, чего нам никогда не удастся постичь». АКТИВНАЯ ГРАФИКА Если моделирование погоды — пока еще мало известное и довольно специфическое направление в разработке про- граммного обеспечения, то видеоигры на сегодняшний день, несомненно, самый популярный пример использова- ния компьютерных программ. Наиболее хитроумные из 105
видеоигр переносят своих участников в фантастический мир, где можно сражаться с врагами или доисторическими чудовищами. Однако компьютерные игры имеют и вполне серьезное практическое применение. Довольно популярная програм- ма для персональных компьютеров под названием «Полет- ный тренажер» первоначально создавалась как видеоигра, но оказалась настолько реалистичной, что побудила мно- гих посещать настоящие летные курсы. Графические воз- можности этой программы позволяют показывать на экране панель управления самолета «Цессна 182» и пано- раму аэропорта, какой она открывалась бы через лобовое стекло кабины самолета. Показания приборов на панели управления и вид приближающейся посадочной полосы меняются в полном соответствии с командами, которые подает с помощью джойстика «пилот», удобно устроив- шись в кресле перед компьютером. С помощью «Полетно- го тренажера» и других аналогичных программ «пилот» может варьировать погодные условия и время суток, полу- чая таким образом практический опыт управления самоле- том в различных ситуациях. Авиационные компании, военные организации и НАСА используют более мощные и сложные тренажеры для от- тачивания мастерства пилотов и астронавтов. В Центре им. Джонсона в Хьюстоне установлен тренажер для моде- лирования полетов космического корабля многоразового использования. Этот тренажер стоимостью 40 млн. долл, представляет собой своеобразный замкнутый мир, в кото- ром программное обеспечение позволяет имитировать лю- бую фазу (и возможные при этом непредусмотренные ситуации) полета «космического челнока». Для работы на тренажере надо подняться в кабину без окон, установлен- ную на подвижной гидравлической платформе на высоте около 4,5 м над полом. Платформа позволяет совершать самые разнообразные движения кабины (повороты, вра- щения, резкие подъемы), напоминающие те, что испыты- вает космический корабль в реальном полете. Механическая часть этого тренажера мало отличается от той, что используется в других тренажерах, на которых тренируются пилоты обычных самолетов. Поразительная особенность хьюстонского тренажера — это удивительное правдоподобие создаваемых ситуаций, что достигается за счет применения современной технологии. Экипаж астронавтов работает за импровизированной панелью управления, в точности копирующей обстановку реального «космического челнока». Программа управле- ния тренажером выполняет предстартовый отсчет времени и воспроизводит цифровые показания приборов, а также графическое изображение каждой фазы полета. Из иллю- минатора тренажера открываются точно такие виды, как при запуске с мыса Канаверал во время полета по орбите вокруг Земли или в момент приземления на посадочную полосу на базе ВВС в Калифорнии. При «взлете» пилот видит вспышку в момент воспламенения ракетных двига- телей и уходящий вниз стартовый стол. Через несколько минут еще одна вспышка сигнализирует отделение ракет- ных ускорителей. Затем, когда «челнок» покидает пределы атмосферы, голубое небо в иллюминаторе темнеет и на нем появляются звезды. Неслучайно основная часть времени на тренажере тра- тится на отработку навыков поведения астронавтов в слу- чае механических неисправностей различной степени сложности — от мелких неполадок до особо опасных от- казов, которые могут привести к аварии. Систему можно запрограммировать на воспроизведение практически лю- бой случайности, скажем, выхода из строя бортового ком- пьютера или неожиданно налетевшего в момент посадки 80-тонного корабля порыва ветра со скоростью 240 км/ч. Этот тренажер настолько важен для отработки всей кос- мической программы, что обычно используется круглосу- точно все 7 дней в неделю. Стандартная 4-часовая тренировка настолько хорошо имитирует реальный полет, что даже астронавты с большим стажем работы выходят из кабины тренажера взмокшими и обессиленными. Разумеется, и реальный «космический челнок» целиком и полностью зависит от компьютеров, которые обеспечи- вают все его жизненно важные функции и абсолютно точ- ное управление полетом. Всего на борту корабля установлено пять компьютеров. Одновременно работают четыре из них, причем все они проверяют друг друга. Если вдруг один из четырех компьютеров начинает выдавать данные, отличные от тех, какие поступают с трех других, то он автоматически выводится из работы. Если подобное повторится еще с одной ЭВМ и останется всего два ис- правных компьютера, то в работу включается резервный пятый — изготовленный другой фирмой и запрограмми- рованный другой группой специалистов. Программное обеспечение этого компьютера разработано таким обра- зом, что он может взять на себя все управление полетом. КОМПЬЮТЕРНЫЕ БИТВЫ Компьютерное моделирование оказалось бесценным ин- струментом не только при подготовке астронавтов, но и полезным средством обучения военных специалистов. Наи- большую известность получила видеоигра «Янус», на- званная так в честь римского бога Януса, охранявшего ворота Рима. В данной игре Янус сражается против гене- ралов на воображаемом поле боя с применением всех средств современной сухопутной войны, включая артилле- рию, танки, авиацию и тактическое ядерное оружие. По добные тренажеры, стоимостью в 2,45 млн. долл., установлены в Ливерморской национальной лаборатории им. Лоуренса (шт. Калифорния) и в колледже вооружен- ных сил США в Карлайле (шт. Пенсильвания). Огромная база данных этой модели содержит топографические кар- ты каждого участка земной поверхности со стороной ква- драта около 24 км. Однако чаще всего игры проводятся на участке вдоль границы между ГДР и ФРГ, где, по мне- нию натовских стратегов, наиболее вероятно столкновение между США и СССР. 106
Сидя за пультом управления ком- пьютерного тренажера, модели- рующего условия полета на вер- толете, стажер наблюдает «жи- вую» панораму, на которой видны высоковольтные линии электропередачи, деревья и еще один вертолет. Все это просмат- ривается как бы через лобовое стекло вертолета. Воссоздавая практически любые ситуации, с которыми может столкнуться пи- лот в полете, хороший компью- терный тренажер способен заме- нить десятки тысяч километров тренировочных полетов. Военными играми люди увлекались еще в глубокой древности. Примерно в 3000 г. до н. э. появилась китай- ская игра Вей-Хай, в которой камешки передвигались по стилизованной карте. На протяжении большей части сле- дующих 5000 лет генералы разыгрывали настольные бата- лии примерно таким же способом — маневрируя деревянными кубиками, изображавшими войска союзников и противников. Однако компьютерный век навсегда покон- чил с этими наивными развлечениями. Компьютер с его способностью хранить несметное количество информации, воспроизводить ее на экране и обрабатывать в соответст- вии с заданным алгоритмом, предоставляет нынешним полководцам фантастическое средство для имитации слож- нейших ситуаций современной войны. Ъшовой сценарий, разыгрываемый в игре «Янус», дает возможность показать на экране монитора фрагмент мест- ности с изображением рек, возвышенностей, дорог и горо- дов. Каждая из противоборствующих сторон имеет свой собственный экран, на котором отображена только та ин- формация, которая, по всей видимости, будет ей доступна в случае реального сражения. Все действия игроков, пере- дислоцирующих свои войска, передвигая специальные фишки на электронных графических планшетах, тут же отображаются на экран. Компьютер, совершающий до 2 млн. операций в секунду, вычисляет время полета артил- лерийского снаряда с точностью до миллисекунды и даже учитывает время, необходимое для перезарядки того или иного вида орудий. В случае применения одним из игроков ядерного оружия машина при расчете распространения по- ражающих факторов ядерного взрыва учитывает погодные условия, в частности ветер и влажность. Рассмотрим сценарий, где один из участников отвечает за оборону моста, ведущего в стратегически важную доли- ну, которая находится под угрозой танков противника. При поступлении разведданных о начале движения войск противника в направлении долины, офицер направляет ту- да для сбора информации эскадрилью штурмовиков (на экране они обозначены синими символоми). Достигнув пе- 107
ревала, ведущего в долину, пилоты немедленно увидят не- приятельские войска. Как только танки попадают в поле зрения пилотов, на экране появляются их изображения в виде символов красного цвета. (Момент обнаружения ком- пьютер вычисляет на основании данных о рельефе мест- ности и высоте полета самолетов.) Тем временем по самолетам открывается огонь, и, когда какой-то из штур- мовиков сбивают, на его месте возникает символ «С» (Casualty — уничтожен). Под уничтожающим обстрелом та же участь постигает еще трех пилотов, и, поскольку са- молеты — это «глаза» командования «синих», большин- ство воинских частей противника становятся как бы невидимыми и исчезают с экрана монитора. Белыми точ- ками на экране отмечаются места разрывов снарядов или ракет, и, когда одна из ракет взрывается вблизи располо- жения некоего взвода, изображение этой воинской части на экране сменяется очередной зловещей буквой «С». Но про- граммисты, создавшие «Янус», помня о капризах войны, учли и влияние случайности в военных действиях и тем са- мым дали командующим каждой из сторон надежду на удачу. Однако внезапность и превосходство в огневой мощи, а не фортуна решают исход боя. И этот урок хорошо усва- ивает каждый офицер, участвовавший в игре. НА ПОРОГЕ БУДУЩЕГО Хотя программа игры «Янус» создавалась как средство обучения, военные стратеги надеются когда-нибудь при- способить ее для выполнения функций некого «сверхразу- ма», который поможет офицерам справиться с темпами и сложностью современных военных сражений. По-видимо- му, в будущем компьютерам предстоит сыграть весьма важную роль в военных системах (правда, в одинаковой степени это относится и к любым другим применениям компьютеров). Новейший реактивный истребитель типа F-16 ВВС США просто не в состоянии оторваться от земли без помощи своих четырех бортовых компьютеров; да и поднявшись в воздух, он без их участия не может осущест- влять даже горизонтальный полет. Пентагон надеется, что «Янус» и другие аналогичные программы — лишь прелюдия к еще более сложным воен- ным компьютерным системам будущего. Разрабатывае- мые в настоящее время компьютерные системы нового поколения будут не только обладать большим объемом оперативной памяти, но, подобно человеку, смогут стро- ить разного рода предположения, опираясь на неполные или даже неточные сведения. Научить машину такому уровню интуитивного мышления — задача отнюдь не простая. Она находится на переднем крае современной ин- форматики. Физик Эдвард Тейлер, работающий над этой проблемой в компании TRW, рассуждает так: «Рассмот- рим игру в шахматы, имеющую определенное сходство с военными действиями. Для игры в шахматы разработаны разнообразные программы, причем встречаются довольно хорошие. Однако представим, что играющий в шахматы компьютер должен принимать в расчет не только правила игры, позицию и возможные последствия ходов, но и иметь еще дело с фактором неопределенности. Вообразите Поперечное сечение черепа челове- ка, построенное компьютером на основании данных, собранных с помощью специального сканирую- щего устройства, и затем раскра- шенное так, чтобы можно было отличить мозговую ткань от иных образований. Красным цве- том отмечены две мозговые опу- холи. Принимая решение о необ- ходимости хирургического вмеша- тельства или изменении курса лечения, врач с помощью слож- нейшего программного обеспече- ния может поворачивать изобра- жение, рассматривая его под раз- ными углами зрения. 108
компьютер, который бьет фигуру противника, но не знает, что это — ладья или пешка. Именно в подобной ситуации все время находятся военнослужащие, и они справляются с такой задачей, строя на основе накопленного опыта определенные предположения. Но найденные ими решения далеко не всегда оптимальны. Люди способны высказы- вать предположения, а большинство компьютерных про- грамм нет». Хотя иногда неопределенности и заводят компьютеры в тупик, они тем не менее уже умеют оценивать информа- цию, делая заключения по тому или иному вопросу. Одна- ко для этого надо, чтобы сообщаемые им факты были представлены в структурированном, логическом виде. Программное обеспечение, решающее подобные задачи, называют экспертными системами. В основе таких систем лежит дедуктивный метод. Это означает, что экспертная система обрабатывает сообщаемые ей многочисленные факты по заранее установленным правилам. Экспертные системы применяются в самых различных областях — в фундамёнтальных научных исследованиях, медицине, в геологической разведке. Прежде чем присту- пить к разработке таких систем, ее создатели опрашивают большое количество специалистов в рассматриваемой об- ласти (экспертов), собирая информацию, накопленную ими за годы работы, и вводя затем ее в базу данных системы. Таким образом, компьютер может даже в некотором роде обессмертить какого-то ученого, сохранив не только его знания, но и навыки выполнения определенной работы. Среди наиболее перспективных приложений экспертных систем следует выделить область медицинской диагности- ки. Например, при работе с программой «Кадуцей» (CADUCEUS, по-латыни — символ врачевания) врач по- следовательно отвечает на все более детализированные во- просы, касающиеся наблюдаемых у пациента симптомов и результатов анализов, и это продолжается до тех пор, пока компьютер не придет к одному или нескольким воз- можным диагнозам, которые выдаются на экран в поряд- ке возрастания их вероятности. Врач имеет возможность «спросить» систему, как она пришла к данному заключе- нию, и, если программа допустила ошибку, может ввести новые данные, которые позволят уточнить ее работу. На сегодняшний день база данных системы «Кадуцей» содер- жит сведения о 4000 вариантов 600 различных забо- леваний. Органическим свойством экспертных систем, как, впро- чем, и науки вообще, является их способность к развитию и совершенствованию по мере поступления новой инфор- мации или уточнения старой. Так, в 1976 г. в Станфорд- ском научно-исследовательском институте была создана недолговечная, но весьма эффективная геологоразведочная программа «Проспектор» (PROSPECTOR — изыскатель). Для наполнения ее базы данных вначале была опрошена небольшая группа ведущих специалистов в области эконо- мической геологии. Затем база данных системы ежегодно уточнялась и пополнялась новыми сведениями. В 1982 г. к моменту завершения работ база данных системы вклю- чала в себя коллективные знания нескольких десятков са- мых авторитетных ученых в данной области. Последний год своего совершенствования система отметила впечатля- ющим (получившим широкую рекламу) достижением — проведя анализ геологических особенностей одного из районов в восточной части шт. Вашингтон, она указала, где находится огромное месторождение молибдена, важно- го компонента в производстве особо прочных сталей. ПОСТИГАЯ НАУЧНОЕ МЫШЛЕНИЕ Еще раньше специалисты попытались заложить в эксперт- ные системы способность к индуктивному мышлению. Именно таким путем ученые, обобщая данные эксперимен- тов, приходят к теоретическим построениям и универсаль- ным законам, которые обычно выражаются математи- ческими уравнениями (например, F = та или Е = тс1). Среди наиболее перспективных систем подобного типа следует отметить программу «Бэкон», разработанную в конце 70-х годов Патриком Лэнгли из Университета Кар- неги — Меллона. Свое название программа получила в честь Фрэнсиса Бэкона, одного из основоположников экс- периментальных методов исследований и индуктивного вывода. Когда в систему заложили данные о знаменитых научных экспериментах, она заново открыла такие важные законы, как третий закон движения планет Кеплера, газо- вый закон Бойля — Мариотта, закон дифракции света Спелля, закон Блэка об удельной теплоемкости и закон Ома для электрических цепей. Пока еще ни одна эксперт- ная система не смогла открыть новый закон, ибо совре- менная наука ушла далеко вперед по сравнению с эпохой Ома или Кеплера. Однако некоторые специалисты полага- ют, что в будущем программы, подобные системе «Бэ- кон», проявят и такие способности. Своеобразной точкой отсчета для работ по созданию экспертных систем можно считать 1965 г. В том году уче- ные из Станфордского научно-исследовательского институ- та Эдвард Фейгенбаум и Брюс Бучанан вместе с нобелевским лауреатом Джошуа Ледербергом приступили к созданию компьютерной системы, предназначенной для определения молекулярной структуры химических соедине- ний. При построении этой системы — она получила назва- ние «Дендрал» — они в первую очередь создали программу, основанную на простой, но вместе с тем до- статочно мощной системе аристотелевой логики. С ее по- мощью формулировалась серия вопросов типа «если — то», которые описывали правила атомных свя- зей. Когда основа системы была готова, ее наполнили све- дениями о химических соединениях и способах мышления, которые приводят биохимиков к правильным выводам. Эти сведения были получены путем опроса биохимиков, рассказавших, как они обдумывают те или иные пробле- мы. Фейгенбаум, Бучанан и Ледерберг совершенствовали свою систему, применяя ее к задачам, решение которых было уже известно, проверяя полученный результат и мо- 109
дифицируя соответствующим образом программное обес- печение. Создатели системы «Дендрал», используя знания, на- копленные в процессе ее совершенствования, вскоре разра- ботали новую систему — «Мета-Дендрал». Последняя ста- ла вспомогательным инструментом при построении других экспертных систем. Среди многочисленных «потомков» программы «Дендрал» следует упомянуть: МИЦИН (MYCIN) — для диагностики серьезных бактериальных инфекций и помощи в выборе антибиотиков, ПАФФ (PUFF) — для диагностики легочных заболеваний, «Онко- цин» (ONCOCIN) — для назначения лечения при раковых заболеваниях, а также системы «Молген» (MOLGEN) и «Генезис» (GENESIS), оказывающих помощь специали- стам в области молекулярной биологии при планировании экспериментов по изучению ДНК и клонированию. На сегодняшний день экспертные системы являют со- бой пример наиболее успешного практического приложе- ния того направления информатики, которое известно под названием «искусственный интеллект». Этот термин ро- дился во время двухмесячной летней школы, организован- ной в Дартмуте в 1956 г. Однако сама идея о «мыслящих машинах» берет начало по крайней мере в 2500 г. до н.э., когда египтяне создавали «говорящие» статуи богов (за которых в действительности говорили спрятавшиеся там священнослужители). В те дни, когда направление искус- ственного интеллекта (ИИ) только формировалось, его сторонники предрекали возможность появления таких ма- шин, утверждая, что вскоре компьютеры обретут способ- ность осмысливать и решать задачи точно так же, как это делает человек. Конечно, этого не произошло, и многие исследователи, работающие в области ИИ, теперь полага- ют, что пройдут века, прежде чем компьютеры научатся интуитивному мышлению и овладеют всеми нюансами, неопределенностями и логическими противоречиями, с ко- торыми приходится обычно сталкиваться людям в их по- вседневной жизни. Даже самая сложная экспертная система — это не более чем недоучка, который разбирает- ся в своей узкой области, но абсолютно беспомощен во всех других вопросах. Специалисты в области ИИ продолжают разрабаты- вать более сложные программы, подобные системе «Бэ- кон». Такие системы могут имитировать некоторые аспекты индуктивного мышления. Достигнуты также определенные успехи в создании программного обеспече- ния, которое дает компьютерам возможность отвечать на команды, подаваемые голосом, и распознавать форму и образы. Работа программ, наделяющих компьютеры «слу- хом» и «зрением», основана на методе, который получил название «поиск по образцам». Суть его заключается в том, что слово или образ преобразуется в цифровой шаб- лон, который сравнивается с другими шаблонами, храня- щимися в памяти компьютера. Программное обеспечение данного типа достигло в настоящее время достаточно вы- сокого уровня и успешно используется, правда, пока в весьма ограниченных масштабах. Например, на некоторых предприятиях применяются машины для проверки элект- рических соединений печатных плат. Однако до сих пор в мире не существует компьютера, который мог бы устано- вить, что человеческое лицо, рассматриваемое анфас, иден- тично тому же лицу, рассматриваемому под несколько иным углом зрения. К числу неожиданных результатов исследований в об- ласти ИИ следует отнести выработку нового подхода к пониманию огромной сложности одного из наиболее фун- даментальных процессов человеческой деятельности, а именно — мышления. Так, в конце 60 — начале 70-х годов исследователи из МТИ потратили несколько лет на созда- ние компьютерной программы, способной, следуя прос- тым командам, подаваемым с клавиатуры, манипулиро- вать кубиками, изображения которых создавались на экра- не дисплея. В конце концов Компьютер научился строить из кубиков башенки и разбирать их не хуже трехлетнего ребенка. 110
новый взгляд НА ОКРУЖАЮЩИЙ МИР Машинная графика — несомненно, одно из самых ярких и результативных направлений информатики. Высокослож- ное графическое программное обеспечение обладает спо- собностью создавать образы, которые открывают богатейшие возможности для проникновения в суть реаль- ного мира и поражают своей удивительной красотой и яр- костью. Создаваемые при помощи компьютера модели могут описывать что угодно — молекулы и магнитные поля, висячие мосты и сверхзвуковые самолеты. Программное обеспечение такого рода настолько слож- но, что для его создания обычно приходится писать сотни тысяч команд, на что уходит несколько лет работы. Хотя многие программы выдают на экран дисплея лишь дву- мерные изображения, в памяти компьютера хранятся дан- ные о трехмерном объекте, поэтому конструктор или исследователь имеет возможность рассматривать конкрет- ную модель в различных проекциях. Эти программы поз- воляют ученым исследовать форму объекта и моделировать воздействие на него внешних сил. Новая технология имитационного моделирования про- извела настоящую революцию в области проектирования. Инженер-конструктор может подвергнуть испытаниям на прочность объект, который существует лишь как зритель- ный образ на экране дисплея. Автомобилестроители могут исследовать аэродинамические характеристики новой мо- дели, не создавая реального образца. Еще более экзотические применения машинная графика находит в научных исследованиях. Ученые обрели возмож- ность создать, например, графическую модель газовых об- лаков, вращающихся вокруг черной дыры, или модель циркуляции воды в глубинах океана. Специалисты одного из новых научных направлений, биомеханики, изучая тех- нику движения спортсменов, помогают им быстрее бегать, выше и дальше прыгать. Хирурги с помощью компьютера отрабатывают пластические операции, проверяя правиль- ность выбранных решений и анализируя полученные ре- зультаты еще до начала операции. (Аналогичным способом ученые смогли даже восстановить облик египтя- нина по его мумии, пролежавшей 3400 лет.) Наиболее обещающим аспектом медицинского прило- жения машинной графики является предупреждение забо- леваний. Используя данные, полученные с помощью рентгеноструктурного анализа, ученые могут строить ком- пьютерные модели структур вирусов. Возможно, когда-то такие модели позволят создать средства для защиты от многих человеческих болезней. 111
Новый взгляд на окружающий мир
На этой структурной модели истребителя F-15 ВВС США программа выделяет цве- том 5 основных элементов конструкции: радар (розовый), фюзеляж (синий), кры- лья (желтый), двигатель (зеленый) и хвост (красный). Инструмент для проектирования обуви и самолетов Система автоматизированного проектиро- вания позволяет обувщику эксперименти- ровать с формой и фактурой разрабаты- ваемой модели. Программа, воспроизво- дящая общий вид и окраску, создает трехмерную модель традиционной сапож- ной колодки. 113
Новый взгляд на окружающий мир Восстановление облика мумии Лицо человека, мумия которого пролежала 3400 лет, было недавно реконструировано японскими учеными с помощью программного обеспечения, обычно используемого хирургами для подготов- ки пластических операций. Данные, полученные с рентгеновского аппарата (ниже) и обработанные компьютером, позволили восстановить структур- ную модель головы (внизу), а затем уже по ней создать реальный образ (справа). 114


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

Новый взгляд на окружающий мир Модели микромира Компьютерные модели позволяют изучить структуры микроорганизмов. На противополож- ной странице показаны (сверху по часовой стрелке) следующие структуры: аденовирус, вы- зывающий простудные заболевания у детей; по- лиомавирус, являющийся причиной заболевания мышей; вирус, переносчиками которого служат комары. Внизу, желтым цветом выделена цепоч- ка аминокислот, закрученная вокруг вируса, по- ражающего томаты (половина наружной оболоч- ки вируса удалена). 119



Часть II КОМПЬЮТЕР, СЛУШАЙ МОЮ КОМАНДУ! Мучительный путь развития программирования Программирование приходит в дом

Первые языки программирования были столь несовершенны, что от идеи про- граммы до ее реализации в виде машин- ных команд пролегал нелегкий путь. На рисунке воспроизведена фраза, записанная в «шифрованной» системе обозначений, называемой языком ассемблера, которая приказывает компьютеру занести (ST — store) число 5 в ячейку памяти, помечен- ную меткой BSUM. МУЧИТЕЛЬНЫМ ПУТЬ РАЗВИТИЯ ПРОГРАММИРО- ВАНИЯ Летом 1985 г. в водах Северной Атлантики на глубине более 3 км в кромешной темноте, исследуя гористый рельеф океанского дна, медленно продвигался подвод- ный аппарат. Он носил имя «Арго» — в честь корабля, на котором герой древнегре- ческой мифологии Ясон отправился на поиски золотого руна. Этот аппарат, имев- ший около 5 м в длину, напоминал секцию строительных лесов, положенную набок и начиненную аппаратурой: мощными прожекторами, сонаром (акустическим эхоло- катором), видеокамерами. А вверху, на поверхности океана, в рубке управления ис- следовательского судна ВМС США «Кнорр» перед видеоэкраном расположились члены франко-американской научной экспедиции. Они напряженно следили за изо- бражениями, поступающими с борта аппарата, скользящего над безжизненным ландшафтом ущелий и грязевых долин. После 16 дней упорных поисков на экране возникли россыпи металлических об- ломков, а затем очертания корабельного котла, которые ни с чем нельзя было спу- тать. Торжествующий крик вырвался из груди наблюдателей. Океанский лайнер «Ти- таник», затонувший 73 года назад (и унесший в океанские глубины более 1500 чело- век из 2200 находившихся на борту) был наконец обнаружен. Поиски остатков «Титаника» на огромной океанской глубине символизировали выдающееся достижение компьютерной технологии, беспрецедентное как по исполь- зованным средствам, так и по условиям работы. Не последнюю роль в успехе дела сыграла гибкость современных средств программирования. Комплекс устройств, установленных на борту «Арго» — сонар, прожекторы и видеокамеры, — управлялся несколькими компьютерами, каждый из которых был запрограммирован на своем языке. Компьютер самого подводного аппарата исполь- зовал компактный, но гибкий язык Форт (FORTH, не путать с Фортраном), раз- работанный первоначально для управления движением телескопов; теперь с его по- мощью осуществляется управление разнообразными приборами и процессами — от кардиомониторов до специализированных видеокамер. Компьютер на борту судна «Кнорр» был запрограммирован на мощном, но малопонятном языке Си. Телемет- рическая система на обоих концах коаксиального кабеля (в палец толщиной), связы- вающего подводное и надводное суда, которая позволяла компьютерам «разговари- вать» между собой, использовала еще один примитивный язык — язык ассемблера. Языки программирования — это тщательно и изобретательно составленные последовательности слов, букв, чисел и мнемонических сокращений, которы- ми люди пользуются для общения с компьютерами. Без этих языков ком- пьютеры и связанные с ними устройства стали бы просто грудой бесполез- ного железа. Каждый язык имеет свои грамматику и синтаксис. Языки программирования, имитирующие естественные языки и способные на осно- вании одного предложения строить несколько команд компьютера, принято считать языками «высокого уровня». Но по сравнению с естественными языками, они, как правило, более строги и точны. В языках программиро- вания отсутствует многозначность слов, употребление их в переносном смысле и игра слов — как и сами компьютеры, эти языки лишены чувства юмора. 125
В настоящее время насчитывается несколько сотен та- ких языков; если же учитывать все их варианты, называе- мые диалектами, то, возможно, и более тысячи. Языки программирования служат самым разнообразным целям — от решения сложных математических задач и проведения экономико-математических расчетов до созда- ния музыкальной партитуры и машинной графики. Но тем не менее не существует ни одного машинного языка, кото- рый бы в равной мере годился для всех случаев. Выбор языка обычно определяется одним или, возможно, не- сколькими из трех факторов: язык должен быть удобен для программиста, пригоден для данного компьютера и для решения данной задачи. Яркий пример тому — много- образие языков, использованных в экспедиции по поискам «Титаника». Для компьютеров, установленных на борту надводного судна «Кнорр», был предпочтителен язык Си, поскольку он обеспечивал более непосредственное управле- ние периферийными устройствами. Форт —это единст- венный язык высокого уровня, пригодный для использо- вания на компьютере подводного аппарата «Арго». А не- обходимость точной синхронизации сигналов, передавае- мых по кабелю между двумя судами, диктовала примене- ние жесткого языка ассемблера, позволяющего управлять последовательностью отдельных машинных команд. Несмотря на различия машинных языков, все они тем не менее построены на общей основе. На самом фундамен- тальном уровне компьютеры имеют дело лишь с одним «языком» — высокими и низкими уровнями электрическо- го напряжения, соответствующими нулям и единицам дво- ичного кода. В зависимости от того, как эти сигналы ин- терпретирует компьютер, они могут иметь различный смысл. Одна комбинация нулей и единиц может указывать место в памяти компьютера, другая — часть обрабатыва- емых данных. Третья совокупность двоичных цифр, или битов, может служить командой машине выполнить то или иное дейст- вие, например сложить два числа. Компьютер любого ти- па проектируется так, чтобы он реагировал лишь на стро- го определенное множество команд, закодированных в двоичных цифрах. Сопоставляя те или иные последова- тельности команд, можно заставить компьютер решать широкий круг задач. Хотя язык команд — так называе- мый машинный код — вполне очевиден, он абсолютно противоестествен для человека. Компьютерная программа любого размера, записанная в виде машинного кода, со- стоит из тысяч и даже миллионов единиц и нулей, соеди- ненных словно бусинки на бесконечной нити. Ошибка даже в одной цифре может сделать программу неработоспо- собной. Менее полувека назад машинный код был единствен- ным средством общения человека с компьютером. С тех пор поколения создателей языков сумели заставить сам компьютер работать переводчиком с языков, понятных че- ловеку, в машинный код. Если теперь программист пишет в программе команду PRINT «HELLO» (печатать «здрав- ствуйте») или LET А = В * (С - D) (LET — положим), то вызывается программа перевода — называемая трансля- тором, — которая преобразует эти команды в нули и еди- ницы, понятные компьютеру. 126
БУМАЖНАЯ ЛЕНТА И КОНТАКТНЫЕ ПАНЕЛИ Методы программирования первых в мире универсальных компьютеров были так же примитивны, как и сами маши- ны. Исторический «Марк-1», созданный во время второй мировой войны в Гарвардском университете, представлял собой пятитонную конструкцию длиной около 15 м, состо- ящую из реле, осей, шестеренок и циферблатов. Команды для решения задач перфорировались на рулоне бумажной ленты, которая затем вводилась в компьютер. Вся эта ра- бота выполнялась небольшой группой техников. Более со- вершенная машина «Эниак» (см. с. И) была построена в 1945 г. в Высшем техническом училище Пенсильванского университета. В отличие от электромеханического «Мар- ка-1» «Эниак» был полностью электронным, но все еще чрезвычайно сложным в программировании. Поскольку война требовала быстрейшего завершения работ, основ- ные разработчики компьютера, физик Джон Мочли и ин- женер Проспер Экерт, сосредоточили все внимание на аппаратуре, а программирование оказалось на последнем месте. «Эниак» не имел даже устройства ввода команд с бумажной ленты. Для подготовки машины к работе при- ходилось вручную устанавливать тысячи переключателей и втыкать сотни штеккеров в гнезда контактной панели, ко- торая в результате становилась похожей на комок спагет- ти. Не удивительно, что пользователи «Эниака» старались выжать все из каждой набранной программной конфигура- ции, прежде чем приступить к ее изменению. Эти первые эксперименты в программировании отчет- ливо показали, что для полного раскрытия возможностей компьютеров нужны более совершенные средства связи с машиной. Пока на машине «Эниак» с большим трудом выполнялись первые вычисления, кое-где уже появились перспективные работы по языкам более высокого уровня. Но лишь через много лет эти результаты увидели свет; об одном таком случае мы и расскажем далее. ПЛАНИРУЮЩЕЕ ИСЧИСЛЕНИЕ Весной 1945 г. мир вокруг Конрада Цузе начал рушиться: кольцо войск союзников сжималось вокруг Берлина, где жил молодой немецкий инженер. Еще перед войной он за- нялся разработкой серии сравнительно небольших универ- В 1985 г. программисты, используя три языка (Си, Форт и язык ассемблера), дали возможность всему миру впервые увидеть злосчастный океанский лайнер «Титаник», который потерпел крушение и затонул 73 года назад в водах Атлан- тического океана. Изображения затонув- шего «Титаника» передавались в цифро- вом виде по глубоководному кабелю с подводного аппарата (находящегося на глубине более 4 км) на исследовательское судно «Кнорр»; связь между ними осу- ществлялась с помощью программ обра- ботки изображений и управления видео- камерами, написанных на трех разных языках. сальных компьютеров, превратив в лабораторию одну из комнат в доме родителей. Усилия Цузе — это удивитель- ный пример независимого научного творчества одиночки: он не имел ни малейшего представления о достижениях в этой области в других странах, а правительство фашист- ской Германии мало интересовалось его работой над ком- пьютером. Незадолго до падения Берлина Цузе погрузил свой единственный оставшийся компьютер Z4 на телегу и с колонной других беженцев отправился в маленький горо- док в Баварских Альпах. В тяжелые послевоенные годы Цузе, не имея ни средств, ни возможности продолжать работу непосред- ственно над компьютером, направил всю свою энергию на развитие теории. Он придумал эффективный способ про- граммирования компьютеров, причем пригодный не толь- ко для Z4, но и для любой другой аналогичной машины. Он решил, что нужна система числовых и символьных обозначений, построенная на основе логики, — по суще- ству, система исчисления шагов решения задачи. Работая в одиночку, Цузе создал систему программиро- вания, которую назвал Планкалкюль (планирующее исчис- ление). Он написал брошюру, где рассказал о своем творе- нии и возможности его использования для решения разно- образных задач, включая сортировку чисел и выполнение арифметических действий в двоичной записи (другие ком- пьютеры того времени работали в десятичной системе). Научившись играть в шахматы, Цузе написал 49 страниц фрагментов программ на Планкалкюле, которые позволя- ли компьютеру оценивать шахматные позиции. «Мне бы- ло интересно проверить эффективность и универсальность Планкалкюля применительно к шахматным задачам», — писал позже Цузе. Не рассчитывая увидеть свой язык реализованным на компьютере, он отмечал: «Планкалкюль родился исключи- тельно как результат теоретической работы, без всякой связи с тем, появятся или нет в обозримом будущем ма- шины, подходящие к программам на Планкалкюле». Хотя в конце 40-х годов Цузе и посетил США, лишь незначи- тельная часть его работы была опубликована и еще мень- ше было осуществлено в послевоенное десятилетие. Мно- гие идеи систематического логического языка остались не- известными целому поколению специалистов по компью- терной лингвистике. Только в 1972 г. работа Цузе была из- дана целиком. Эта публикация заставила специалистов задуматься над тем, какое влияние мог бы оказать План- калкюль, будь он широко известен раньше. «Видимо, все могло бы обернуться совсем иначе, и мы живем не в луч- шем из миров»,— заметил по этому поводу один из уче- ных, критикуя возникшие позднее языки. Пока Цузе трудился в одиночку, совместные усилия по созданию языка программирования предпринимались в академических центрах Великобритании и США, где уже началось использование первых компьютеров. Однако де- ло шло медленно. Мало того, что каждый компьютер имел свой собственный машинный код и метод програм- 127
мирования, — львиная доля времени и интеллекта иссле- дователей уходила на совершенствование самих машин. В первые послевоенные годы большинство программи- стов продолжали работать с машинными кодами — наборами двоичных цифр, которые соответствовали элект- рическим схемам компьютеров. Чтобы хоть как-то облег- чить работу, некоторые программисты начали использо- вать сокращенный метод записи комбинаций битов (см. с. 130—131), похожий на стенографический, когда целое слово представляется одним знаком. Первая из таких сис- тем записи имела основанием число восемь и называлась восьмеричной. Если в двоичной системе используются две цифры, 0 и 1, то в восьмеричной их восемь: от 0 до 7. Каждая цифра служит для представления одной из восьми возможных трехбитовых комбинаций (ООО, 001, 010, 011, 100, 101, ПО и 111). В более сложной системе с основани- ем 16 (шестнадцатеричной) биты группируются по 4; 16 возможных комбинаций из 4 битов выражаются цифрами от 0 до 9 и буквами А, В, С, D, Е, Е УВЛЕЧЕНИЕ МАШИНКАМИ Но не всех удовлетворял постепенный прогресс, который обеспечивали такие числовые системы. Среди них прежде всего следует назвать американского программиста Грейс Мюррей Хоппер, привыкшую всегда быть в первых рядах. С детства она была зачарована различными механически- ми устройствами — «машинками», как она их называла. Семилетней девочкой Грейс разобрала все будильники в доме, желая узнать, как они работают, но не смогла со- брать их заново. Последовавшее за сим наказание не пога- сило ее исследовательский пыл. Закончив в 1928 г. с отли- чием колледж Вассара в Пугкипси, Грейс Хоппер получила затем степень доктора математики (редкое достижение для женщины) в Йельском университете и, вернувшись в Вас- сар, стала преподавателем. В разгар второй мировой войны Хоппер вступила в резерв ВМФ США.и в июне 1944 г. получила офицерское звание. При росте 150 см и весе 47,5 кг она была, несом- ненно, самым маленьким морским офицером. Однако ее роль в эти годы* можно считать огромной. Младший лей- тенант Хоппер была включена в команду ВМФ, которая разрабатывала программы для гарвардского «Марка-1». “«Марк-1» был самой большой и симпатичной машинкой из всех виденных мной”, — говорила она позднее. Команда программистов, в которую включили Хоппер, состояла из двух мичманов-мужчин. Позднее выяснилось: узнав, что должен прийти «старый седой профессор кол- леджа», один подговорил другого не занимать соседний с ней стол. Однако вскоре Хоппер показала, чего она стоит как программист. «Я имела то преимущество, — говорила она, — что изучала как технику, так и математику и знала, как работает машина от начала до конца. Конечно же, я была счастлива. Заканчивая в 1928 г. колледж, я и не подо- зревала, что в 1944 г. появится компьютер». В 1949 г., уво- лившись с флота, Хоппер вступила во вновь образованную 1 <5 О * G ' ГТ f f £& с c Текст на Планкалкюле — языке, разра- ботанном Конрадом Цузе вскоре после окончания второй мировой войны, — воспроизводит фрагмент программы игры в шахматы. На нем показан список шагов, позволяющий определить, грозит ли опасность белому королю. Сейчас Планкалкюль по праву признан первым языком высокого уровня, но на протяже- нии десятилетий, когда Цузе занимался созданием компьютеров, этот язык оста- вался неизвестным. [ f f £ L/- X f «• - - * ,v| O' <Д* * ИС&диХъ-rr.* ] V cr o’ X tr 6 ZUAZ Д2 = v Vi 2. C K; A) W &Л . (i -£ i Vi . c ♦ 1 4 * о 4 Л C-C O C-S dl Д1 2л Z К компьютерную корпорацию Экерта и Мочли, которая рас- полагалась на территории старой фабрики в северной ча- сти Филадельфии. Мочли и Экерт покинули Высшее техни- ческое училище Пенсильванского университета после оже- сточенной борьбы за патент на созданные ими компьюте- ры. Организовав собственное дело, они заключили ряд контрактов на строительство новой машины, которая, как они надеялись, должна была доказать коммерческую цен- ность вычислений. Они назвали свою машину «Юнивак». СКРЫТАЯ ОПАСНОСТЬ ВОСЬМЕРИЧНЫХ Грейс Хоппер добросовестно проштудировала арифметику восьмеричных чисел: научилась складывать, вычитать, ум- ножать и даже делить в этой странной системе. «Все в фирме были убеждены, что единственный способ писать эффективные программы — это пользоваться восьмерич- ной системой», — жаловалась она позднее (тогда господ- ствовала точка зрения, что время компьютера много доро- 128
же времени программиста: если программа может выпол- няться быстрее, то трудоемкость ее составления несу- щественна). Восьмеричная система действительно, оказа- лась очень удобной при наладке и эксплуатации опытных образцов компьютеров компании. Однако Хоппер обнару- жила, что это привело к неприятностям в другой сфере ее жизни: она столкнулась с трудностями при попытке подве- сти баланс своего банковского счета — тяжелая проблема для опытного математика. Наконец, она обратилась к брату-банкиру, и тот за несколько вечеров решил задачу: оказалось, что она вычитала чеки в восьмеричной, а не в десятичной системе, которую, естественно, использовал банк. «Я столкнулась с проблемой жизни в двух мирах, — говорит Хоппер. — Вероятно, это было одной из причин, побудивших меня по возможности избавиться от восьме- ричных чисел». Хоппер была не одинока в своих попытках облегчить тяжесть программирования. Незадолго до ее приезда в Филадельфию Джон Мочли выступил с предложением, ко- торое позволило программированию сделать первый осто- рожный шаг на пути к отказу от восьмеричных и шестнад- цатеричных чисел. Он посоветовал своим программистам разработать компьютерный язык, который позволял бы человеку вводить задачу в машину в алгебраических терминах — этот шаг наверняка бы одобрил Конрад Цузе. В конце 1949 г. система под названием «Краткий код» за- работала. Рекламируемая позднее как «электронный сло- варь», она являлась примитивным языком высокого уров- ня и была несколько совершеннее машинного кода. Про- граммист вначале записывал решаемую задачу в виде ма- тематических уравнений, а затем, используя напечатанную таблицу перевода, символ за символом преобразовывал эти уравнения в двухлитерные коды. Например, круглая скобка превращалась в 09, плюс — в 07. Затем в компью- тере специальная программа превращала эти коды в нули и единицы, и машина выполняла нужные операции. Программа, воспринимающая «Краткий код», была по существу примитивным интерпретатором, т. е. обрабаты- вала и выполняла программу на входном языке строка за строкой. Следующая строка анализировалась лишь после выполнения функции, заданной предыдущей строкой. В последующем интерпретатор стал одним из двух типов языковых трансляторов. Новые успешные опыты в области языков программи- рования вскоре вытеснили «Краткий код», но его главная идея сохранилась. Компьютеры — это не только и не столько суммирующие машины, сколько великолепные об- работчики символов независимо от того, что эти символы представляют: числа, буквы, цвета или даже музыкальные ноты. Взяв численное значение 07, компьютер без труда выполнит последовательность шагов, в результате кото- рых вычисляется сумма двух чисел, если только он был запрограммирован так, чтобы идентифицировать 07 как операцию сложения. Таким же образом компьютер может обработать и целое предложение вида: IF N<100 THEN PRINT W/47 (IF — если, THEN — to, PRINT _ печатать) и перевести его в машинные команды, следуя которым ма- шина выполнит требуемые действия. Такие целенаправлен- ные манипуляции с символами — фундаментальный прин- цип, лежащий в основе языков программирования. Хотя «Краткий код» не имел коммерческого успеха, он оказал сильное влияние на Грейс Хоппер. “«Краткий код» был первым шагом к чему-то такому, что давало програм- мисту возможность писать программы на языке, отлич- ,ном от машинного”, — говорила она. Но чтобы сбылись надежды, порожденные «Кратким кодом», потребовалось еще много усилий. ВКЛАД ВЕЛИКОБРИТАНИИ Прогресс в развитии компьютерных языков зависел от ус- пехов в разработке аппаратной части компьютеров, а в конце 40-х годов таких успехов было немного. Почти все они были достигнуты под влиянием ранних работ Мочли и Экерта и фактически вели отсчет от конкретного собы- тия — серии лекций, прочитанных этими исследователями летом 1946 г. в Высшем техническом училище Пенсильван- ского университета. В их лекциях обсуждалось устройство преемника «Эниака». Новая машина, получившая название «Эдвак», должна была радикально сократить затраты труда при замене программ; это достигалось за счет хра- нения программ и данных электронным способом во внут- ренней расширенной памяти компьютера. Одним из слушателей лекций был Морис В. Уилкс, впоследствии глава математической лаборатории Кем- бриджского университета. Вдохновленный услышанным, Уилкс возвратился в Англию и принялся за разработку ма- шины, основанной на идее «Эдвака». Работа началась в 1947 г. Новый компьютер «Эдсак» заработал в 1949 г., за- долго до того, как фирма Мочли и Экерта выпустила пер- вый коммерческий образец. Как и многие другие первые компьютеры, «Эдсак» был очень капризным в работе. Один из программистов вспо- минал, что даже шум самолета, летящего за облаками, мог вызвать его остановку. После каждого ремонта для запуска компьютера в него загружали серию «исходных приказов». Эта процедура сопровождалась характерным жужжанием, которое служило своего рода сигналом для всех желающих поработать на компьютере. Счастливчики, чьи комнаты находились рядом с машинным залом, обыч- но оказывались в начале очереди, а остальным приходи- лось долго ждать. Вначале «Эдсак» мог выполнять лишь 18 основных действий (современные компьютеры имеют в своем «ре- пертуаре» более 200 команд), каждое из которых кодиро- валось определенной комбинацией нулей и единиц. С само- го начала проектировщики «Эдсака» решили не заставлять программистов использовать в программах только ма- шинные коды. Вместо этого они ввели систему мнемони- ки, где каждая машинная команда представлялась одной заглавной буквой. Так, 5 обозначала «вычитание», I — 129
Язык чисел На самом глубоком уровне компьютеры понимают только один язык — двоичный код нулей и единиц, представляе- мый двумя состояниями электрических импульсов. По- скольку этот код абсолютно непонятен для большинства людей, программисты разработали более компактные спо- собы изображения двоичных чисел. Такие числа могут представлять, например, содержимое памяти компьютера или адрес какой-то части данных в ней. Для сокращения записи двоичных чисел (основание 2) удобно пользоваться Четыре системы счисления с разными основаниями восьмеричной (основание 8) и шестнадцатеричной (основа- ние 16) системами счисления. Поскольку 8 равно 2 в треть- ей степени (8 = 2 х 2 х 2), одна восьмеричная цифра экви- валентна трем двоичным; аналогично шестнадцатеричная цифра представляет четыре двоичные цифры (16 равно 2 в четвертой степени). В приведенных ниже табличках даны десятичные числа от 0 до 16 и их двоичные, восьмеричные и шестнадцатеричные эквиваленты. В каждой системе счисления значение цифры определяется тем, в каком раз- ряде она находится. Латинские буквы А, В, С, D, Е и F представляют цифры (с 11-й по 16-ю) шестнадцатеричной системы. ДВОИЧНАЯ ДЕСЯТИЧНАЯ ШЕСТНАДЦАТЕРИЧНАЯ 130
Преобразование систем счисления ₽ 2409 Вычесть наибольшую возможную степень двойки из десятичного числа (здесь — 4 из 5) и продолжать вычитание наибольших возможных сте- пеней из остатка, помечая единицей каждый разряд, где вычитание произведено, и нулем — где не произведено. В нашем случае имеем 4 и 1, что дает двоичное число 101. Сложить величины всех двоичных разрядов, занятых единицами. Здесь для преобразования 12-разрядного числа 100101101001 складываем значения разрядов 2048, 256, 64, 32, 8 и 1. Результат — десятичное число 2409. Начиная с самой правой цифры, группируем двоичные цифры в трой- ки, рассматривая каждую тройку как отдельное двоичное число со зна- чениями разрядов 4, 2 и 1. Сумма величин разрядов каждой тройки да- ет одну восьмеричную цифру. Здесь суммы для каждой из четырех групп равны 4, 5, 5 и 1, что дает восьмеричное 4551. Снова, начиная справа, группируем двоичные числа по четыре, рас- сматривая каждую четверку как отдельное двоичное число с величина- ми разрядов 8, 4, 2 и 1. Сумма разрядов каждой группы дает одну шестнадцатеричную цифру. В нашем случае суммы разрядов для трех групп равны 9, 6 и 9, что образует шестнадцатеричное число 969. Методы сложения Сложение в двоичной системе. Используя те же правила, что и при десятичном сложении, начинаем складывать самые правые цифры, т.е. в столбце единиц: 1 + 1. Результат 2 вы- ражается в двоичном виде как 10 (один- ноль). Пишем 0 и запоминаем 1 в перенос. В столбце двоек снова 1 +1 равно 2, или двоич- ное 10; пишем 0 и переносим 1 в столбец четверок. Результат равен 100 — двоичный эквивалент десятичного 4. Сложение в восьмеричной системе. Сложение цифр в столбце единиц 7+1 дает 8, которое представляется в восьмеричной системе как 10 (один-ноль). Как и при двоичном сложе- нии, 0 пишем, 1 переносим. Складываем цифры в столбце восьмерок; сумма 6 и 1 да- ет 7. Результат — восьмеричное 70 — экви- валентно двоичному 111000, или десятичному 56. Сложение в шестнадцатеричной системе. Сложение цифр в столбце единиц 7+9 дает 16, основание шестнадцатеричной системы счисления, выражаемое как 10. Пишем 0 и переносим 1. В следующем столбце прибав- ляем 1 к D (десятичное 13). D плюс 1 равно Е (десятичное 14). Результат равен Е0 (Е-ноль) — шестнадцатеричное представление двоичного 11100000, или десятичного 224. 131
«прочитать следующий ряд дырочек на входной бумаж- ной ленте», Т — «передать информацию в память», а Z — «остановка машины». СОЗДАНИЕ БИБЛИОТЕКИ ПРОГРАММ Пожалуй, даже более ценным новшеством, чем мнемони- ка, введенная на «Эдсаке», явилась библиотека подпро- грамм, созданная на этой машине. Программисты уже бы- ли знакомы с понятием подпрограммы: Грейс Хоппер и ее коллеги применяли подпрограммы на гарвардском «Марке-1» во время второй мировой войны, однако каж- дая подпрограмма решала свою специфическую задачу. Подпрограммами называются независимые фрагменты компьютерной программы, используемые многократно и вызываемые из главной программы в случае необходимос- ти. Например, одна подпрограмма может вычислять ква- дратный корень, а другая заставит компьютер вывести на дисплей литеру. Первые программисты почти всегда име- ли блокноты с записью наиболее употребимых подпро- грамм, чтобы в случае необходимости не составлять их за- ново. Проблема состояла в том, что адреса расположения команд и переменных подпрограммы в памяти менялись в зависимости от ее размещения в последней. Настройка подпрограмм на определенное место в памя- ти, очевидно, нуждалась в автоматизации, и впервые это было сделано на «Эдсаке». Программисты Кембриджа на- чали с написания набора унифицированных подпрограмм, которые и образовали библиотеку. После этого достаточ- но было ввести лишь короткую команду — и компьютер проделывал всю работу по настройке и размещению под- программы внутри программы. Морис Уилкс назвал мнемоническую схему для «Эдса- ка» и библиотеку подпрограмм собирающей системой (по- английски assembly system — отсюда слово «ассемблер»), поскольку она собирала последовательности подпрограмм. В настоящее время языки программирования, в которых короткие мнемонические имена непосредственно соответ- ствуют отдельным машинным командам, называются языками ассемблера. Программа называется программой ассемблера, или, кратко, ассемблером, если она преобразу- ет мнемонику языка ассемблера непосредственно в двоич- ные представления машинных команд (с. 139—141). Языки ассемблера используются и в настоящее время, поскольку тесно связаны с машиной; действительно, язык ассемблера — это машинно-зависимый язык, спроектиро- ванный так, чтобы он соответствовал набору машинных команд, заложенных в центральный процессор конкретно- го компьютера. Поэтому язык ассемблера любят те про- граммисты, которые стремятся сжать свои программы до минимального размера, что позволяет выполнять их мак- симально быстро и эффективно. Именно по этим причи- нам ассемблер идеально подошел для программирования телеметрической системы, использованной в экспедиции поиска «Титаника» для передачи сигналов между рубкой управления надводного корабля и подводным аппаратом. Однако ассемблер имеет и недостатки. Поскольку он бли- же к языку машины, чем к естественному языку, то весьма труден для работы. Тот, кто пишет на языке ассемблера, должен быть близко знаком с работой компьютера — например, должен знать шаги, которые выполняет ком- пьютер при сложении двух чисел. Более того, поскольку ассемблер машинно-зависим, программа, написанная на ассемблере одного компьютера, абсолютно непонятна компьютеру другого типа. По этим причинам малопонятный язык ассемблера мо- жет оказаться более трудным, чем хотелось бы. Однако именно неудачная попытка создания языка ассемблера по- служила очередным толчком в развитии программирова- ния. Новый язык был творением великолепного англий- ского математика Алана М. Тьюринга, одного из осново- положников науки о компьютерах в Великобритании. В 1936 г. в возрасте 25 лет он описал (теоретически) «универ- сальную машину» способную решить почти любую логи- ческую или математическую задачу. В 1948 г. Тьюринг был назначен руководителем работ по программированию реального компьютера. Машина «Марк-1», сконструированная в Манчестерском универси- тете на севере Англии , не имела никакого отношения к гарвардскому «Марку-1». В манчестерском «Марке-1» для представления набора машинных команд использовались пятибитовые комбинации. Каждая команда требовала 4 такие комбинации, или 20 бит. Намереваясь облегчить программирование, Тьюринг организовал систему таким образом, что каждой пятибитовой комбинации соответ- ствовал мнемонический символ, т. е. имелось 32 симво- ла — по числу возможных комбинаций. Символы, кото- рые Ъюринг сопоставил комбинациям, содержали цифры, буквы и знаки препинания со стандартной телетайпной клавиатуры. Например, символ «/» (косая черта) обозна- чал 00000, R обозначала 01010 и т. д. до £, представляемо- го комбинацией 11111. ЗАПУТАННАЯ СИМВОЛИКА Полный набор символов был следующий: /E@A:SIUl/2 DRJNFCKTZLWHYPQOBG»MX£. Поскольку эта символи- ка не имела определенной системы, никто в Манчестере, за исключением, возможно, самого Тьюринга, не мог ее заучить. Вскоре кто-то придумал бессмысленный зарифмо- ванный текст, который тем не менее помогал запоминать символы клавиатуры. Многие манчестерские программи- сты запомнили этот стишок на всю жизнь. К сожалению, на практике система Тьюринга оказалась такой же неуклюжей, как и стишок, порожденный ею. В промышленном варианте манчестерского «Марка-1» пор- ции, на которые делилась 20-битовая команда, были уве- личены с пяти до шести битов, поэтому функциональная часть команды теперь представлялась не одним символом, а двумя, причем часть символа входила еще и в следую- щую команду. В результате написанные программы с тру- дом поддавались расшифровке. Уилкс из Кембриджа впос- ледствии назовет эту систему «странной до чрезвы- чайности».
Предшественники программирования Языки для написания компьютерных программ возникли только после второй мировой войны, однако зачатки про- граммирования как такового можно найти в глубокой древности. 3800 лет назад житель Вавилона изобразил на глиняной табличке (справа) алгоритм расчета банковского процента, т. е. пошаговой процедуры решения задачи оп- ределенного вида. Запись на табличке описывает процеду- ру на конкретном примере; для расчета требуется подста- вить нужные исходные данные вместо приведенных. Мно- го веков спустя древнегреческие математики описали прин- ципы формального манипулирования числами, используя при этом обычный человеческий язык со всеми его воз- можными неоднозначностями. Однозначная символьная система обозначений появилась лишь у арабов с созданием алгебраических методов, но даже она требовала от читате- ля дополнять некоторые шаги в процедуре решения зада- чи. Тем не менее родство древних методов и методов XX в. становится очевидным, если приведенные здесь и на двух следующих страницах исторические алгоритмы пере- вести на язык Бейсик (внизу) и ввести в компьютер. Маши- на получит те же результаты, которые были получены вручную много веков назад. 10 'Установить годовой прирост 207. 20 LET ПРИРОСТ ° .2 30 ' 40 'Через год общее количество зерна в ’’курах” станет 50 'равно исходному количеству плюс прирост за год 60 LET ГОДЫ - 1 70 LET ЗЕРНО = 1 ♦ ПРИРОСТ • 80 ' 90 'Продолжать вычисление прироста зерна каждый год. пока 100 'оно не достигнет или не превысит величины 2 кура 110 UHILE ЗЕРНО < 2 120 LET ПРЕДЫДУШ - ЗЕРНО 130 LET ЗЕРНО - ЗЕРН0*(1*ПРИР0СТ) 140 LET ГОДЫ - ГОДЫ ♦ 1 150 UEND 160 ' 170 'Два кура зерна будет получено через число лет на 1 180 'меньше текущего значения ГОДЫ. Теперь посчитаем 190 'месячный прирост зерна за текущий год 200 LET МЕСПРИРОСТ - (ЗЕРНО - ПРЕДЫДУШ)/12 210 LET ЧИСЛОМЕСЯЦЕВ - (2 - ПРЕДЫДУШ)/МЕСПРИРОСТ 220 ' 230 PRINT "Зерно удвоится до двух кур через ";Г0ДЫ-1: " лет и ЧИСЛОМЕСЯЦЕВ:” месяцев.” ‘'.J Древнейший расчет. На этой вавилонской глиня- ной табличке (около 1800 г. до н.э.) клинописью зафиксирована процедура вычисления сложного процента. Данный алгоритм относится к кон- кретному расчету: сколько лет и месяцев потре- буется для удвоения определенного количества (кура) зерна при годовом приросте 20% (зерно играет роль денег). Программа на Бейсике (сле- ва) описывает ту же процедуру на языке, понят- ном компьютеру. 133
Предшественники программирован 'Фр PRINT "Введите первое число":INPUT PRINT "Введите второе число":INPUT а какое меньше ЧИСЛО1 ЧИСЛ02 •tkV u.4j-pZ еу-рору^к^ р>»-аг^у <-TbF f 'j -Lnr®? v*~НгТ j I*ft-* p- i O\©-j rju£r-| |сррллгр ‘-»lpop ' t^-co^pol Vi Греческий алгоритм. Страница из 13-томного манускрипта X в., воспроизводящего классич ский трактат Евклида «Начала», написанный греческим математиком в III в. до н.э. Для яснения метода нахождения наибольшего об делителя двух чисел здесь не используются к кретные числа. Этот алгоритм (внизу слева он представлен программой на Бейсике) — древний из алгоритмов, используемых в граммировании. -К 10 20 30 40 р£у| V Г «,ОГ * wf 1 г 'Проверить, какое из чисел больше. СГ Д Д |<У “* 1*0 I* OP —|-ey~wrpcfi4»trj-vw кед c |a.Z.uy \j«-pop* mat yce>p I y*-rpp <**rpou {у у <vrp»y ‘у'' * OL^-i Г ’ 6 tj *р^^ |Uj pij- la_jj{ о irpp k-1 ©Lcp f«ктргуj Kr^- ^1* r)'*'fc*J7cr t^TT -p> p trnJ ' Laptop a-J'Arpsy tEdLijd^pko^* | К * К) c * П « V<p^iu i |c/p j’ « )' Ct. ^oj-рх» у eLAMj 'k<li_<5 ( j> ® p |lZ| у оу Ач| |y *}ft- fcn |<pykoipoyy^ qjcpp^|U^-r|Pp><tr^3o )Xrt [^f0^ p o p^^oop irpu yy J c~k Lkf c k-рУ у \_V^ A| O k <T | ®-J7*y , ppi> p u. cL» • a | < aj о ~тг | p a jj p ад op. с v L-'«a_> [ ЛГр VT^Uy\_i -e р^Т«г- a’p |u»aj 1^ Q‘ ° Г" -pi?p pf | p k^, pop 50 60 70 80 90 100 110 Отнимать из большего числа меньшее, пока остаток не станет меньше большее число на и повторять это. 120 WHILE (БОЛЬШЕ MOD МЕНЬШЕ) <> 0 130 LET ОСТАТОК « БОЛЬШЕ MOD МЕНЬШЕ 140 LET БОЛЬШЕ =. МЕНЬШЕ 150 LET МЕНЬШЕ = ОСТАТОК 160 UEND 170 180 PRINT "Наибольшее число, делящее ' ЧИСЛ02;" это - ":МЕНЬШЕ:"." :ЧИСЛ01: меньшего из чисел. Заменить меньшее, а меньшее на остаток пока остаток не станет нулем '(Оператор сработает и при равенстве чисел) IF ЧИСЛ01 >= ЧИСЛ02 THEN БОЛЬШЕ = ЧИСЛ01: МЕНЬШЕ = ЧИСЛ02: ELSE БОЛЬШЕ » ЧИСЛ02: МЕНЬШЕ = ЧИСЛ01 134
1 U e^iad I Алгебраические обозначения. В отрывке из ника «Аль-Джабр Ва-Аль-Мукабала» («Наука ключения и сокращения») арабского матема аль-Хорезми для иллюстрации метода, наз мого сейчас «выделением полного квадрата», шается уравнение х2+10х=39. Эта книга, напи санная в Багдаде в 820 г., сыграла огромную роль в развитии математики в эпоху средн вья; от нее же пошли слова «алгебра» (от «j Джабр» в заголовке) и «алгоритм» (от «аль- резми»). Программа на Бейсике воспроизво шаги решения уравнения, использованные аль- Хорезми. 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 PRINT "Введите коэффициент при X":INPUT КОЭФФ PRINT "Введите правую часть";INPUT ПРЧАСТЬ 'Вначале разделим коэффициент при X на 2. В нашем 'случае коэффициент равен 10. а его половина - 5 LET ПОЛОВИНА - КОЭФФ/2 ’ Ц/> t Ь 'Вновь полученное число 5 возводим в квадрат и 'прибавляем к обоим частям уравнения. Левая часть 'превращается в X-квадрат ♦ 10Х ♦ 25. что равно '(X ♦ 5) в.квадрате, а правая часть становится 'равной 39 ♦ 25. что равно 64 или 8 в квадрате. LET НОВЛРЧАСТЬ - ПРЧАСТЬ ♦ ПОЛОВИНА*ПОЛОВИНА 'Извлечем теперь из обоих частей квадратный корень и 'возьмем положительные значения, что дает X ♦ 5 - 8. 'Наконец, находим X. вычитая из обеих частей 5. IF НОВЛРЧАСТЬ < 0 THEN PRINT "Нет действительных решений для величины X";END LET X - SQR(НОВЛРЧАСТЬ) - ПОЛОВИНА PRINT "Число ";Х:" решает уравнение." 135
Манчестерские программисты на собственном тяжелом опыте убедились в справедливости принципа, получившего в дальнейшем широкую известность в вычислительной технике: проектные решения, принятые на ранних стадиях работы, очень трудно менять. Принятая телетайпная но- тация повлияла на структуру аппаратуры и, таким обра- зом, закрепилась в системе. Она сохранилась даже в ком- мерческих вариантах «Марка-1», выпущенных позднее фирмой «Ферранти». Однако телетайпная нотация имела и один положитель- ный момент: она привела к появлению нескольких языков высокого уровня, созданных для облегчения работы на «Марке-1». Первый такой язык разработал Алик Э. Гленн, оказавшийся в Манчестере после завершения правитель- ственного проекта ядерных исследований на «Эдсаке», проводившихся в Кембридже. Летом 1952 г. в свободное время Гленн разработал систему под названием «Авто- код», в которой использовался первый язык высокого уровня. Подобно «Краткому коду», «Автокод» позволял программисту пользоваться в программах математически- ми формулами. После ввода программ в «Марк-1» «Авто- код» транслировал их в программы на машинном коде, которые и осуществляли указанные математические опера- ции. Однако в отличие от «Краткого кода», который тре- бовал наличия интерпретатора при каждом выполнении, программы в машинном коде, сгенерированные «Автоко- дом», можно было хранить и выполнять в любое время. Создав «Автокод», Гленн стал одним из первых твор- цов компьютерных языков. Позже, отвечая на вопрос, как лучше всего подходить к подобной работе, он заявил: «Поставьте себя в положение учителя, который учит очень глупого ребенка читать». Вследствие участия Гленна в се- кретном ядерном проекте его работа не была опубликова- на, и по существу лишь он один пользовался своей систе- мой. Это был «успешный, но преждевременный экспери- мент, — заключал он позднее. — Интеллектуальная обста- новка еще не созрела». И действительно, большинство программистов того времени холодно относились к системам, подобным «Ав- токоду». Одной из причин этого были ограниченные воз- можности имеющейся аппаратуры. Программисты чув- ствовали, что только машинные коды позволяют достичь максимального быстродействия непокорных машин. Одна- ко была и другая, более тонкая причина. Первые програм- мисты хорошо осознавали свою роль посредников при не- сколько загадочном устройстве (и гордились этой ролью); они были своего рода «жрецами», контролирующими до- ступ к новым и весьма популярным машинам. Системы, подобные «Автокоду», несколько облегчая программиро- вание, грозили открыть двери «храма» для всех же- лающих. ПРОГРАММЫ, КОТОРЫЕ ПИШУТ ПРОГРАММЫ Защитники «храма» вели безнадежный бой. В начале 50-х годов компьютерная промышленность в США и Велико- британии была на пороге невиданного подъема: предпри- ниматели увидели разнообразные перспективы применения новых машин в правительственных учреждениях, бизнесе, науке. Компания «Ремингтон Рэнд» (позже «Сперри Рэнд»), стоящая на втором месте после ИВМ по продаже механического конторского оборудования, приобрела фир- му Мочли и Экерта, вовремя обеспечив дополнительный капитал и опыт торговли. Мочли и Экерт, как и их звезда программирования Грейс Хоппер, продолжали работать в фирме. В 1951 г. «Ремингтон Рэнд» поставила свой первый коммерческий компьютер «Юнивак» для Бюро переписи населения США. В этом же году Хоппер получила задание создать би- блиотеку стандартизованных математических подпро- грамм для «Юнивака». Уилкс и два других кембриджских программиста опубликовали книгу по системе программи- рования для «Эдсака» (это была первая книга по програм- мированию), и созданный ими язык ассемблера стал пред- метом зависти передовых программистов всего мира. Однако Хоппер решила пойти дальше. Опираясь на соб- ственный опыт работы с «Кратким кодом», она со своей группой занялась разработкой системы, которая могла бы транслировать программы, написанные на языке высокого уровня, в программы на машинном языке. ЗАВЕРШЕНИЕ ФУНДАМЕНТА Транслирующая программа должна за миллисекунды вы- полнять большую работу, связанную с программировани- ем: организация подпрограмм, выделение памяти компью- тера, преобразование команд высокого уровня в машин- ные команды. Хоппер назвала эту транслирующую про- грамму компилятором (compiler — компоновщик). «Под- программы находятся в библиотеке [компьютера], — объясняла она позднее, — а когда вы подбираете материал из библиотеки, — это называется компоновкой. Так же и здесь». Хотя «Автокод» Гленна обладал аналогичными свойст- вами, компилятор Хоппер стал первой транслирующей системой, получившей широкую известность. В отличие от построчной интерпретации текста, применяемой в «Крат- ком коде», компилятор Хоппер вначале целиком преобра- зовывал всю программу, записанную на языке высокого уровня, в машинный код. По желанию программиста пре- 136
неустанно работавшая вместе с еще дву- мя программистами на гарвардском «Марке-1», оторвалась на миг от беспо- рядочно разбросанных чертежей. Хоппер, ставшая в дальнейшем одним из крупней- ших специалистов по компьютерным языкам высокого уровня, при програм- мировании электромеханического «Мар- ка-1» пользовалась примитивным машин- ным кодом. образованная программа могла либо выполняться сразу, либо сохраняться для последующего использования. В от- личие от интерпретирующей программы, которая должна работать параллельно с интерпретируемой, компилирую- щую программу можно было удалить из памяти компью- тера перед выполнением компилированной программы. Таким образом, к тому времени в обиход вошли два типа языков высокого уровня: компилируемые и интерпре- тируемые. Различие между ними остается важным и по на- стоящее время. Современные компиляторы открывают возможности, о которых Хоппер и ее коллеги могли толь- ко мечтать. Однако они по-прежнему выполняют ту же основную функцию — перевод целиком всей программы, написанной на языке высокого уровня, в программу на ма- шинном коде, которую может понять компьютер. Хоппер назвала свой первый компилятор А-0, подразу- мевая, что это лишь самое начало работы. По мере улуч- шения и расширения компилятора на протяжении ряда лет А-0 превратился в А-1, затем в А-2 и А-3. Когда через не- сколько лет фирма «Ремингтон Рэнд» выпустила компиля- тор в продажу, ее отдел торговли решил дать новому из- делию более броское название, переименовав его в «Мэт- мэтик» (MATH-MATIC). Работа над транслирующими системами — как компи- ляторами, так и интерпретаторами — велась в начале 50-х годов повсюду. Когда в 1953 г. фирма ИБМ вышла на ры- нок со своим первым полностью электронным компьюте- ром модели 701, она одновременно предложила и интер- претируемый язык ассемблера, названный «Спидкодинг» (Speedcoding — быстрое кодирование). Примерно в то же время двое молодых математиков, Нил Цирлер и Дж. Халкомби Лэнинг-мл., создали язык высокого уровня и транслирующую систему для нового компьютера «Вихрь», заработавшего в Массачусетском технологическом инсти- туте. Своей системой они достигли того, чего Джон Моч- ли ожидал от «Краткого кода» — возможности вводить математические символы в компьютер в естественном ви- де. В то время как в «Кратком коде» уравнение 7=10 за- писывалось в виде трех пар двузначных кодов (плюс три пары старших нулей), в системе Лэнинга и Цирлера оно записывалось просто как i = 10. ПРОГРАММИРОВАНИЕ НА АНГЛИЙСКОМ ЯЗЫКЕ Тем временем Грейс Хоппер поставила перед собой новую цель. Она чувствовала, возможно, лучше, чем кто-либо другой, что распространение компьютеров из лабораторий в конторы корпораций и правительственные учреждения создаст совершенно новую категорию пользователей. «Су- ществует много различных людей, которым нужно решать разные задачи, — говорила она. — Некоторые из них свя- заны с обработкой символов, другие — с обработкой слов, и им нужны языки другого типа, а не наши попытки пре- вратить их всех в математиков». Исходя из этого, Хоппер и ее группа принялись за раз- работку компилятора, который позволял бы людям, заня- тым в бизнесе, программировать на языке, по возможнос- ти приближающемся к обычному английскому языку. Вме- сто того чтобы создавать новый язык, построенный на основе математических символов, они искали язык, на ко- тором можно было бы писать команды типа COMPARE (сравнить) или TRANSFER (переслать). Через несколько месяцев работы Хоппер и ее коллеги выделили список при- мерно из 30 слов, которые стали «рабочими лошадками» обработки данных. Затем они создали компилятор, кото- рый транслировал программы, написанные с помощью этих слов, в машинный код. Чтобы облегчить компилято- ру распознавание слов, группа Хоппер использовала ме- тод, который до сих пор сохранился в «потомках» их язы- ка: каждое выбранное слово содержит уникальную комби- нацию из первой и третьей букв, никакие два слова не включают одинаковой комбинации символов, поэтому компилятор при генерации машинного кода может игнори- ровать все остальные буквы в словах. В 1956 г. был готов прототип нового компилятора. Однако, прежде чем хотя бы одна копия была продана по- требителям, Хоппер поняла, что вначале придется «про- дать» идею начальству. Ее шефы, как вспоминала она впоследствии, не могли поверить, что компьютер может понимать слова. Ведь компьютеры — это всего лишь ту- пые машины, и учить их английскому так же дико, как учить разговаривать. В стремлении убедить начальство Хоппер прибегла к довольно хитрому трюку. Она модифицировала компиля- тор, называемый тогда В-0, так, чтобы он реагировал не только на английский язык, но и на французский и немец- кий. Позже она объясняла: «Если вы сделали что-то один 137
раз — это случайность, если два — совпадение, если же вам удалось осуществить это трижды, значит, вы откры- ли закон». Вскоре после такой трехъязычной демонстрации компи- лятор, получивший название «Флоу-мэтик» (FLOW- MATIC), поступил на рынок, пополнив семейство языков, облегчающих работу, таких как «Мэт-мэтик», «Спидко- динг» и другие. Таким образом, в середине 50-х годов по мере стремительного расширения использования компиля- торов развитие программирования обретало прочный фун- дамент. Золотой век языков программирования был не за горами. 138
ВНУТРЕННИМ КОМПЬЮТЕРА ЯЗЫК Писать команды компьютера в виде строк двоичных цифр, которые и составляют первичный машинный язык, — ~ - довольно мучительное занятие. Чтобы заставить компью- ----- - тер выполнить одну из более чем 200 основных команд, =R111 программист должен помнить или иметь перед глазами конкретную комбинацию нулей и единиц, «запускающую» нужную операцию. Кроме того, необходимо помнить чис- ловые адреса (тоже комбинации нулей и единиц), по кото- рым размещены данные, содержащиеся в программе. Зада- ча усложняется еще и тем, что коды команд и адреса ме- няются в зависимости от модели компьютера. Язык ассемблера — это первый шаг к избавлению про- граммиста от мелочей двоичного кодирования благодаря использованию символов, которые легко понять и запо- мнить. Этими символами могут служить такие команды, как LOAD (загрузить) или ADD (сложить), представляю- щие собой коды операций компьютера. Аналогично, обра- батываемая информация может быть представлена симво- лическими именами, выбранными программистом; по су- ществу эти имена заменяют адреса памяти, где хранится информация. Программисты, пишущие на языке ассембле- ра, группируют команды и имена в разнообразные комби- нации команд, заставляя машину выполнять множество задач, которые должна решать даже простейшая програм- ма. Чтобы компьютер смог выполнить программу, напи- санную на языке ассемблера, ее нужно предварительно пе- ревести в последовательность нулей и единиц. Это преоб- разование делается самим компьютером с помощью от- дельной программы, называемой ассемблером. На нескольких последующих разворотах показана некая схематическая машина со своим языком ассемблера; хотя она и намного проще реальных компьютеров, тем не ме- нее вполне пригодна для иллюстрации взаимодействия ап- паратных средств компьютера, его команд и символиче- ских имен ассемблерных программ. На этом простом при- мере удобно также продемонстрировать некоторые основ- ные принципы, которые нужно соблюдать при пользова- нии языком ассемблера, чтобы задействовать все мощности машины. 139
Внутренний язык компьютера Основные элементы памяти и процессора В простейшем виде компьютер имеет два основных компонента — память, где хранится информация, и цент- ральный процессор (ЦП), где она преобразуется. Третий элемент — часы, или тактовый генератор, — координиру- ет передачу информации в память и из нее, а также обра- ботку этой информации в ЦП. Память компьютера состоит из множества областей, или ячеек, где информация содержится в виде нулей и еди- ниц машинного языка. Чтобы компьютер мог следить за информацией и при необходимости обращаться к ней, каж- дая область памяти обозначается определенным двоичным адресом. Однако в программе на ассемблере для представ- ления информации программист использует легко запоми- нающиеся имена. Например, имя ЧИСЛО 1 может обозна- чать первое число в операции сложения. До выполнения программы ассемблер (элемент математического обеспече- ния, переводящий язык ассемблера в машинный код) вы- числяет, в какой области памяти будет храниться ин- формация. Память содержит как данные, так и команды для обра- ботки данных, предварительно загруженных в ЦП. В схе- матическом компьютере, изображенном справа и на следу- ющих страницах, ЦП имеет несколько рабочих обла- стей — регистров. Во время работы ЦП в них временно хранятся команды, данные и адреса памяти. Еще одна часть ЦП — арифметико-логическое устройство (АЛУ), в котором, собственно, и происходит обработка информа- ции. В нашем примере АЛУ может лишь складывать и вычитать. В реальных компьютерах ЦП содержит гораздо больше регистров, а АЛУ может выполнять множество арифметических и логических операций, что сокращает число шагов, необходимых для решения задачи. Память и ЦП управляются электрическими импульса- ми, вырабатываемыми часами (тактовым генератором) компьютера. Эти часы больше похожи на метроном, зада- ющий и координирующий ритм работы всех компонентов компьютера. В современных компьютерах темп работы часов исчисляется миллионами импульсов в секунду, и это позволяет выполнять весьма сложные операции практичес- ки мгновенно. Как показано здесь, компьютер работает, извле- кая, или считывая, данные из памяти, обрабаты- вая их в ЦП и возвращая, или записывая, ре- зультаты опять в память. В нашем примере ко- манда ассемблера LOAD (загрузить) требует считать значение по адресу (названному именем ЧИСЛО1) из памяти и поместить его в регистр ЦП. Команда ADD (сложить) считывает значе- ние из памяти по другому адресу (ЧИСЛО2) и складывает его с уже записанным значением. Наконец, команда STORE (запомнить) записыва- ет результат из ЦП в память по адресу СУММА. LOAD STORE 140
Каждая ячейка памяти компьютера имеет адрес, представляемый в машинном коде двоичным числом (на рисунке эти адреса для удобства представлены в десятичном виде). При записи информации в память по определенному адресу старая информация, находившаяся по этому адресу, пропадает. При считывании информации из памяти копия значения, находящегося по ука- занному адресу, пересылается в ЦП, причем ис- ходное значение не меняется. ЦП состоит из нескольких различных элементов. Счетчик команд указывает на следующую вы- полняемую команду. Дешифратор команд интер- претирует («разъясняет») команды для ЦП. Де- шифратор адреса хранит адрес данных, которые предстоит обработать команде. Сумматор содер- жит как входные данные для АЛУ, так и ре- зультаты его работы. АЛУ выполняет сложение и вычитание. Часы (тактовый генератор) регулируют момен- ты запуска остальных элементов процессора. У часов, показанных на рисунке, выделяется четы- ре различных момента — каждый соответствует определенной фазе (такту) работы компьютера. ДЕШИФРАЦИЯ В каждый момент часы посылают импульс на- пряжения, который координирует работу схем, переключая их элементы и обеспечивая обработ- ку данных. 141
Внутренний язык компьютера Основные действия центрального процессора Команды ассемблера состоят из двух частей: кода коман- ды и операнда. Код команды (или просто код) говорит компьютеру, какие действия нужно выполнить. Операнд — символическое имя адреса памяти, где хра- нится подлежащая обработке информация. В некоторых случаях — это адрес другой команды. В рассматриваемом Если в дешифраторе команд находится команда LOAD (загрузить), то ЦП считывает значение, хранящееся в памяти по адресу, указанному опе- рандом команды (обозначен ЧИСЛО 1), и запи- сывает его в сумматор. Команда ADD (сложить) выполняется в два ша- га. Вначале число, адрес которого указан в опе- ранде (ЧИСЛО2), считывается в АЛУ и склады- вается в нем с содержимым сумматора (вверху). Затем результат заносится снова в сумматор (справа вверху), заменяя взятое оттуда значение. Команда SUB (вычесть) работает аналогично, с той лишь разницей, что при этом происходит вычитание из сумматора значения, заданного операндом). 142
нами простом компьютере команда считывается из памя- ти и попадает сначала в дешифратор команд, который хранит код команды и копирует операнд в адресный деши- фратор. Дешифратор команд расшифровывает смысл кода команды, сравнивая последовательно его двоичные цифры со списком кодов конкретных команд машины. При совпа- дении дешифратор команд посылает электрические сигна- лы, выполняющие нужную команду. Адресный дешифра- тор открывает цепи, через которые к компьютеру подклю- чается ячейка с нужным адресом. По этим цепям инфор- мация передается из памяти в ЦП, и наоборот. ДЕШИФРАТОРАДРЕСА ЧИСЛО2 ЗНАЧЕНИЕ РЕЗУЛЬТАТА СУММАТОР ДЕШИФРАТОР КОМАНД ADD ЧИСЛО1 (ЗНАЧЕНИЕ) + ЧИСЛО2 (ЗНАЧЕНИЕ) ЗНАЧЕНИЕ РЕЗУЛЬТАТУ По команде STORE содержимое сумматора вновь попадает в память (в нашем случае по адресу СУММА). При этом значение, записанное там ранее, пропадает. 143
Внутренний язык компьютера Повторяющиеся фазы командного цикла Действия, инициируемые такими командами ассемблера, как LOAD (загрузить) и STORE (запомнить), — это в дей- ствительности заключительная фаза серии операций, назы- ваемой командным циклом. Хотя при выполнении различ- ных команд компьютер осуществляет различные наборы операций, фазы командного цикла остаются неизменными для всех команд. В любом компьютере цель командного цикла одна и та же: прочитать команду из памяти, деко- дировать ее, исполнить и приготовиться к приему следую- щей команды. При выполнении последовательности ко- манд, образующих программу, компьютер снова и снова проходит командный цикл, совершая тысячи и даже мил- лионы таких повторений. В приведенном здесь примере схематического компью- тера программа на языке ассемблера была транслирована Чтение команды и адреса. На первом такте командного цикла ЦП считыва- ет информацию из памяти, передавая ее по адресу, указанному счетчиком команд (адрес 0), и заносит ее (код операции и операнд) в дешифратор команд. 144
ассемблером и записана в память (для простоты указаны здесь ассемблерные имена кодов операций, а не двоичные числа, которые должны быть на самом деле; аналогично операнды, которые требуется перевести в двоичные числа, записаны в десятичном виде). Наш компьютер имеет че- тырехтактный цикл, переключение тактов осуществляется импульсами тактового генератора. Перед началом выпол- нения программы в программный счетчик попадает опре- деленное число. Большинство компьютеров устроено так, что при каждом запуске в счетчик команд записывается одно и то же число, обозначающее адрес памяти. Про- граммист должен сделать так, чтобы первая команда про- граммы расположилась как раз по этому адресу. В нашем случае в счетчик команд заносится нуль. Рассматривая со- держимое счетчика как адрес, компьютер копирует число с этим адресом из памяти и помещает его в дешифратор команд. На втором такте ЦП декодирует команду как целое и помещает ее операнд (т. е. адрес) в дешифратор адреса, оставляя код команды в дешифраторе команд. На третьем и четвертом тактах выполняются действия, предписывае- мые командами. Например, команды LOAD и STORE можно выполнить за один такт, для других команд, таких, как ADD (сложить) и SUB (вычесть), нужно два такта. Од- новременно с выполнением команды ЦП автоматически добавляет единицу к счетчику команд. Таким образом, в очередном командном цикле будет взято из памяти в де- шифратор команд следующее слово. Подобным образом компьютер последовательно перемещается по памяти, вы- полняя команды одну за другой. ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР СЧЕТЧИК КОМАНД ДЕШИФРАТОР АДРЕСА СУММАТОР АЛУ ДЕШИФРАТОР КОМАНД LOAD 12 Передача адреса. На втором такте ЦП считывает операнд (12) из дешифратора ко- манд и заносит его в дешифратор адреса, оставляя код операции в дешифраторе ко- манд для последующей интерпретации. случае ЦП считывает данные (число 3), записанные по адресу 12, и заносит их в сумматор. Од- новременно ЦП увеличивает на 1 содержимое счетчика команд; в начале следующего цикла ЦП считывает информацию, записан- ную в памяти по адресу 1. 145
Внутренний язык компьютера LOAD 12 ПАМЯТЬ 8 центральный процессе ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР ПАМЯТЬ -----------------s СЧЕТЧИК КОМАНД 9 15- J7ERO 10 UB 11 STORE 15 LOAU14 ADD 13 STOftE' 17 СУММАТОР АЛУ СЧИТЫВАНИЕ ДЕШИФРАЦИЯ Первые два такта цикла процессора для команды перехода. Вначале ЦП считывает команду из памяти (ко- манда JUMP 2) и записывает ее в де- шифратор команд (слева вверху). За- тем операнд (2) копируется в деши- фратор адреса (справа вверху). СЧЕТЧИК КОМАНД 9 ДЕШИФРАТОР АДРЕСА ДЕШИФРАТОР КОМАНД JUMP 2 СУММАТОР о s 2J 3J 4 5 6 ТГ el 9 10 IIs 12s 13 14' 15 LOAD 12 STORE 15 LOAD 15 JZERO 10 SUB 11 STORE 15 LOAD 14 ADD 13 STORE 14 JUMP 2 HALT 1 3 7 7 2 ДЕШИФРАТОР АДРЕСА КОМАНД Изменение последовательности выполнения команд Обычно компьютер выполняет команды, последовательно перебирая ячейки памяти. Однако программу можно со- ставить так, чтобы компьютер мог нарушить этот после- довательный перебор. Для этого в счетчик команд зано- сится другое число, что заставляет компьютер начать сле- дующий командный цикл с нового места памяти. Коман- ды, выполняющие такие действия, называются командами перехода или ветвления. Команда JUMP (прыжок, переход) полезна при много- кратных повторениях длинных цепочек команд. В конце такой цепочки ставится команда перехода в начало для следующего повтора; этот прием в программировании на- зывается циклом. И наоборот, можно обойти цепочку ко- манд, поставив перед ее началом переход за последнюю команду цепочки. Подобная гибкость достигается благодаря изменению оператором перехода содержимого счетчика команд. Обычно оно увеличивается на единицу на последнем такте командного цикла. Команда JUMP действует по-другому. При ее выполнении адрес, содержащийся в операнде, за- гружается в счетчик команд. И когда начинается следую- щий цикл, ЦП считывает содержимое памяти не из ячей- ки, расположенной после команды JUMP, а по адресу, только что занесенному в счетчик команд. Такая возмож- ность нарушать последовательный порядок выполнения команд позволяет программисту строить большие много- мерные программы, решающие очень сложные задачи. 146
ПАМЯТЬ ВЫПОЛНЕНИЯ С ДЕШИФРАТОР КОМАНД JUMP 2 СУММАТОР На последнем такте команды перехода содержимое дешифратора адреса копиру- ется в счетчик команд. Это нарушает процесс последовательного перебора ко- манд в памяти. Следующей будет выбра- на команда, находящаяся по адресу опе- ранда (LOAD 15). Переход, который происходит не всегда В некоторых программах последовательный по- рядок выполнения команд требуется изменять, но не всегда, а при определенном условии. Ко- манда, которая обеспечивает такую гибкость, на- зывается условным переходом. Она позволяет управлять ходом выполнения программы в зави- симости от получаемых промежуточных резуль- татов. Каждый раз при выполнении условного перехода ЦП проверяет значение, находящееся в определенном месте, например в сумматоре или специальном регистре. Переход происходит толь- ко тогда, когда это значение совпадает с одним из значений, ожидаемых данной командой. Если этого не происходит, то начинает выполняться команда, следующая за условным переходом. По команде JZERO (переход по нулю) ЦП проверяет содержимое сумматора. Если оно рав- но 0, то операнд из дешифратора адреса копиру- ется в программный счетчик, а значит, переход происходит. Если же в сумматоре не 0, то со- держимое программного счетчика увеличивается на 1 и продолжается последовательное выполне- ние команд. 147
Внутренний язык компьютера Превращение символов в машинный код Программа на языке ассемблера — это просто список имен команд и других слов, которые после трансляции в двоичный машинный код приводят к выполнению ком- пьютером операций, необходимых для решения определен- ной задачи. Показанная здесь программа решает простую задачу умножения двух чисел. Команды составлены так, что умножение выполняется последовательным сложе- нием. Перемножаемые числа обозначены МН0Ж1 и МН0Ж2, а результат — ПРОИЗВ. Значения обоих операн- дов задаются до трансляции первоначальной программы (или исходного кода). Таким образом, программу, исполь- зуемую для умножения 3 на 7, можно приспособить для умножения любых других чисел, изменив началь- ные значения МН0Ж1 и МН0Ж2. Программа, изображенная внизу, в своей первоначаль- ной форме содержит не только имена кодов команд и опе- рандов (т.е. адресов памяти), но и множество символиче- ских имен, называемых метками (коричневые). Метками помечены строки программы, содержащие информацию, предполагаемую для использования в качестве операндов команд. Например, меткой МН0Ж1 помечена строка про- граммы, содержащая число 3. Имя МН0Ж1 встречается и в качестве операнда команды LOAD МН0Ж1. Аналогич- но метка ЦИКЛ обозначает также имя операнда команды JUMP ЦИКЛ. С помощью меток ассемблер (программа, превращающая программу на языке ассемблера в машин- ный код) во время трансляции связывает операнды с чис- ловыми значениями или другими командами. Как показа- но на рисунках справа, ассемблер выполняет эту работу за два просмотра исходного кода. ИСХОДНАЯ ПРОГРАММА Коды операций (желтый цвет) описывают действия, которые может выполнить ЦП. Они включают пересылку данных с места на место (LOAD и STORE), обработку данных (ADD, SUB), изменение после- довательности выполнения про- граммы (JUMP, JZERO) и оста- новку компьютера (HALT). Для всех команд, кроме HALT, тре- буется наличие операнда, сооб- щающего ЦП адрес данных, ис- пользуемых при выполнении команды. Метками (коричневый) помече- ны строки программы, на кото- рые должны указывать операн- ды. Эти строки могут содер- жать либо другие команды, как в случае ЦИКЛ и КОНЕЦ, ли- бо значения, которые будут считываться и записываться ЦП. ЕДИНИЦА, МН0Ж1, МН0Ж2, ПРОИЗВ, СЧЕТ- ЧИК — это метки значений. ЦИКЛ: LOAD МН0Ж1 STORE СЧЕТЧИК LOAD СЧЕТЧИК JZERO КОНЕЦ SUB ЕДИНИЦА STORE СЧЕТЧИК Операнды (фиолетовый) пред- ставляют собой адреса памяти и ссылки на метки, отмечаю- щие другие строки программы. Такие операнды, как ЦИКЛ и КОНЕЦ, указывают место для команд перехода. Этим местом должна быть строка, содержа- щая другую команду. Другие метки - СЧЕТЧИК и ПРО- ИЗВ — отсылают к строкам программы, где находятся дан- ные, которые будут считывать- ся в ЦП и обновляться. LOAD ПРОИЗВ ADD МН0Ж2 STORE ПРОИЗВ JUMP ЦИКЛ КОНЕЦ: HALT ЕДИНИЦА 1 МНОЖГ. 3 МНОЖ2: 7 ПРОИЗВ: О счетчик: о END i _____________________________ Данные (красный) — это значе- ния, обрабатываемые при вы- полнении программы. Некото- рые величины не изменяются, например ЕДИНИЦА. Другие величины, например МН0Ж1, МН0Ж2, должны меняться при изменении входных данных про- граммы (в нашем случае пере- множаемые числа равны 3 и 7). Начальные значения для СЧЕТ- ЧИК и ПРОИЗВ равны 0, но при выполнении программы они изменяются. В программе на языке ассемблера данные за- писываются в десятичном виде и переводятся ассемблером в двоичную форму. 148
НУМЕРАЦИЯ СТРОК Первый проход. Ассемблер просмат- ривает всю программу вплоть до LOAD STORE МНОЖ1 СЧЕТЧИК 0 1 цикл: LOAD СЧЕТЧИК 2 JZERO КОНЕЦ 3 SUB ЕДИНИЦА 4 STORE СЧЕТЧИК 5 LOAD ПРОИЗВ 6 ADD МНОЖ2 7 STORE ПРОИЗВ 8 JUMP ЦИКЛ 9 КОНЕЦ. HALT 10 единица: 1 11 множ1: 3 12 МНОЖ2 7 13 ПРОИЗВ: 0 14 счетчик: о 15 END слова END (конец). Он считает стро- ки’программы (слева) и приписывает каждой двоичный адрес памяти (на рисунке они для ясности даны в деся- тичном виде). Кроме того, ассемблер создает в памяти (на время своей ра- боты) таблицу символов (внизу), где перечисляются все метки, встретив- ТАБЛИЦА СИМВОЛОВ СИМВОЛ СТРОКА ДВОИЧНЫЙ АДРЕС ЦИ Г 2 ШВШВ 10 ЕДИНИЦА 11 МНОЖ1 12 МНОЖ2 13 ПРОИЗВ 14 СЧЕТЧИК 15 0000 0010 0000 1010 0000 1011 0000 1100 0000 1101 0000 1110 0000 1111 цикл: ГЕНЕРАЦИЯ МАШИННОГО КОДА конец: LOAD МНОЖ1 0 1000 0000 0000 1100 STORE СЧЕТЧИК 1 1010 0000 0000 1111 LOAD СЧЕТЧИК 2 1000 0000 0000 1111 JZERO КОНЕЦ 3 1100 0000 0000 1010 SUB ЕДИНИЦА 4 0100 0000 0000 1011 STORE СЧЕТЧИК 5 1010 0000 0000 1111 LOAD ПРОИЗВ 6 1000 0000 0000 1110 ADD МНОЖ2 7 0110 0000 0000 1101 STORE ПРОИЗВ 8 1010 0000 0000 111г JUMP ЦИКЛ 9 1110 0000 0000 0010 HALT 10 0000 0000 ТАБЛИЦА КОМАНД КОД КОМАНДЫ ДВОИЧНЫЙ ЭКВИВАЛЕНТ LOAD 1000 0000 STORE 1010 0000 ADD 0110 0000 SUB 0100 0000 JUMP 1110 0000 JZERO 1100 0000 HALT 0000 0000 ЕДИНИЦА 1 МНОЖ1: з МНОЖ2: 7 произв: о СЧЕТЧИК: о 11 0000 0001 12 0000 0011 13 0000 0111 14 0000 0000 15 0000 0000 Таблицы. После первого прохода ассем- блер завершает таблицу символов (ввер- ху), приписывая каждой метке адрес па- мяти той строки, в которой эта метка встретилась. При окончательной трансля- ции ассемблер будет обращаться к табли- це символов (при подстановке операндов команд) и к постоянной таблице команд (вторая сверху), где содержатся в двоич- ном виде коды всех команд машины. END Второй проход. Ассемблер заменяет име- на команд их двоичными кодами, опе- ранды — двоичными адресами памяти, а десятичные данные — их двоичными эк- вивалентами. Окончательная версия про- граммы в машинном коде готова для выполнения на компьютере. 149
Внутренний язык компьютера ПАМЯТЬ юл: 1 ПАМЯТЬ ПАМЯТЬ о 2 3 4 ПАМЯТЬ S 7 6 9 10 ПАМЯТЬ 11 12 13 14 ADD 13 STORE <4 ШР 2 STOPE 15 LOAD 15 VERO 10 SUE 11 S-CRt 16 LOAD 1? STORE 15 iCAD 15 JZERO W SUB 11 LOAD 1Л ADD 13 STORE 1Л JUMP 2 HALT 12 12 Ло 27 26 АЛУ На шаге 27 компьютер начинает выпол- нение цикла в четвертый раз. Значение СЧЕТЧИК, которое теперь равно 0, за- гружается в сумматор. 18 Промежуточные состояния, приведенные на рисунке, иллюстрируют повторения цикла программы (строки 2—9). Содер- жимое ячейки СЧЕТЧИК уменьшается на 1 при каждом проходе по циклу, поэтому на 10-м шаге значение по адресу 15 рав- но 2, а по адресу 14 (ПРОИЗВ) — 7. На шаге 26 значение ПРОИЗВ равно 21 (т.е. верный ответ), значение СЧЕТЧИК — 0. 21 0 3 7 21 0 10 HALT 11 1_ 3 LOAD 12 STORE 15 LOAD 15 J7ER0 10 SUB 11 STORE 15 LOAD 14 ADD 13 STORE 14 JUMP 2 KALT LOAD 12 STORE 15 LOAD 15 JZERO 10 SUB 11 STORE 15 LOAD 14 ADD 13 STORE 14 JUMP 2 HALT7 LOAD 15 JZERO 10 SU8 11 STORE 15 13 6 | 7 8 9 LOAD 14 ADD 13 STORE 14 JUMP 2 3 7~ 14 Программа в действии: команды в работе Ассемблированная программа (теперь уже полностью в двоичном виде) загружается специальной электронной схе- мой в память компьютера. Это делается таким образом, что, когда машина начинает выполнять программу, первая нужная ей команда располагается по фиксированному адресу памяти, откуда ЦП начинает выборку команд. В нашем случае этот адрес — нуль. Начав повторение ко- мандного цикла, ЦП продолжает этот процесс, пока не встретит команду HALT (стоп), которая требует прекра- тить исполнение команд и ждать указаний от человека. При выполнении приведенной здесь программы (для ясности адреса памяти показаны десятичными числами, а коды команд — в виде ассемблерных имен) компьютер на- чинает с загрузки значения МН0Ж1 и записи его в СЧЕТ- ЧИК. Значение счетчика задает число повторений цикла, начинающегося с адреса 2 и заканчивающегося по адресу 9 переходом. При каждом прохождении цикла значение счетчика уменьшается на 1. Когда оно достигает 0, коман- да JZERO (переход, если нуль), имеющая адрес 3, пошлет компьютер на адрес 10, содержащий команду HALT. При каждом проходе по циклу компьютер добавляет значение МН0Ж2 к текущему значению ПРОИЗВ, которое вначале равно 0. Добавления повторяются МНОЖ1 раз, и результат остается в ПРОИЗВ.- ISO
КОМАНД АДРЕСА ПАМЯТЬ ЦЕНТРАЛЬНЫЙ процессор СЧЕТЧИК КОМАНД STOi-* V. ДЕШИФРАТОР АДРЕСА СУММАТОР SUB 11 АЛУ СУММАТОР АЛУ ПАМЯТЬ СЧЕТЧИК КОМАНД ДЕШИФРАТОР АДРЕСА СУММАТОР АЛУ ДЕШИФРАТОР КОМАН, JZER010 •PATOP КОМАНД LOAD На шаге 28, когда команда JZERO обнару- живает на сумматоре 0, происходит копиро- 23 ванне адреса 10 (метка КОНЕЦ) в счетчик команд, и компьютер переходит по этому адресу. ДЕШИФРАТОР КОМАНД HALT На шаге 29 происходит загрузка в ЦП ко-; манды HALT. Компьютер прекращает вы- полнение программы, оставив правильный ответ (21) по адресу 14, как значение ПРОИЗВ. STORE 15 LOAD 14 I PAD Ъ JZERO 11 ADO 13 STORE 14 JUMP 2 HAJJ SI-ORE 15 LOAD 15 J/CRO 10 SUB 11 STORF15 LOAD 14 ADD 13 STORE 14 JUMP 2 HALT

ТРИ КОММЕРЧЕСКИХ ГИГАНТА Фортран, Кобол и Алгол, эффективно связавшие человека с машиной, возникли в конце 50-х годов и до сих пор продол- жают лидировать в компьютерном мире. Большинство современных программ на- писано на языках, которые представляют собой различные варианты этих трех языков, ставших поистине классическими. В одну из пятниц апреля 1957 г. в компьютерный центр атомной лаборатории «Ве- стингауз-Беттис» возле Питтсбурга почтальон доставил загадочную посылку. Про- граммист Херб Брайт и двое его коллег, выполнив большую часть своего недельно- го задания, слонялись перед комнатой, где стояла новенькая блестящая машина IBM-704. Сгорая от нетерпения, программисты открыли ящик, на котором не было никаких пометок, и обнаружили там стопку примерно из 2 тыс. перфокарт, но без всяких инструкций. Рассматривая карты, Брайт припомнил, что в фирме ИБМ уже на протяжении нескольких месяцев идет окончательная отладка языка высокого уровня, предназна- ченного для использования на IBM-704. Этот язык, названный Фортраном (см. с. 00) представлял собой автоматическую кодирующую систему, берущую на себя наиболее тяжелую часть работы программиста. Может, почтальон принес именно этот долгожданный компилятор, т. е. программу, переводящую программы на Фортране в машинные коды? Движимые предчувствием, Брайт и его друзья решили загрузить загадочные карты в компьютер и посмотреть, что получится. Как только машина проглотила информацию, ленты магнитной памяти завра- щались и остановились, потом снова завращались и опять остановились, и, наконец, когда ленты замерли, загорелась лампочка готовности компьютера. Брайт вложил в считывающее устройство компьютера тестовую программу, написанную на Форт- ране, и нажал кнопку пуска. Затрещал принтер. Новый компилятор выдал сообще- ние: на карте №25 обнаружена ошибка в операторе — пропущена запятая. Про- граммисты, привыкшие к трудно понимаемым сообщениям в виде числовых кодов, были поражены ясностью этой информации. Неверный оператор исправили и снова нажали кнопку пуска. Ленты начали вращаться, и компьютер выдал тоненькую стопку перфокарт программы. Когда карты загрузили в считывающее устройство, заработал принтер и без остановки напечатал 28 страниц. Компьютер лишь слегка ошибся в формате выходных данных. «Но числа были правильными! Числа были правильными!» — восклицал позднее Брайт. Так Брайт и его коллеги оказались в числе первых пользователей Фортрана, пер- вого широко распространенного языка программирования высокого уровня. Его по- явление ознаменовало, вероятно, важнейшую веху в истории машинных языков. С того дня 1957 г. число программистов, работающих с Фортраном, выросло настоль- ко, что они могли бы заселить большой город. Но уже следующее поколение программистов стало считать Фортран «ископае- мым» среди машинных языков, называя его (иногда в шутку, а чаще всерьез) «дино- завром», «интеллектуальным тупиком» и даже «цепью наростов, соединенных ку- сочками синтаксиса». Эдсгер Дийкстра, авторитет ц области программного обеспе- чения, едко заметил, что обучение студентов и специалистов по информатике Форт- рану должно быть наказуемо как серьезное преступление. Тем не менее и десятиле- тия спустя Фортран не потерял своей популярности. Этот язык, предоставляющий большие возможности в обработке числовой информации, получил широкое призна- ние среди научных работников и инженеров. Однако способность глотать и перева- ривать длинные цепочки чисел лишь частично объясняет его неизменное влияние. 153
Основная причина такого долголетия проста — Фортран был первым. Исследователи фирмы ИБМ, создававшие Фортран, и не подозревали, что этот язык приобретет столь большое значение. Когда они в начале 1954 г. приступили к работе, информатика развивалась стихийно, и каждый работал, как бог на душу положит. Годы спустя руководитель груп- пы разработчиков Джон Бекус вспоминал: «Признание в маленьком программистском братстве завоевывалось ско- рее неординарностью личности, подвижничеством в рабо- те или способностью поглощать спиртное, а не интеллек- туальными озарениями». Возникала новая порода людей — программистов и специалистов по информатике. Их выводы были краткими и категоричными. Один из уп- равляющих фирмы ИБМ решил, что из шахматистов получаются хорошие программисты, поэтому он заводил беседы с возможными кандидатами в программисты во время шахматных партий с однйм из сотрудников фирмы ИБМ (который, кстати, был чемпионом США по шахма- там). Мало кто из восьми человек, занятых в разработке Фортрана, был серьезно знаком с компьютерами. Они пришли из университетов и авиакомпаний, а также из со- бственных программистских групп ИБМ. Даже Джон Бе- кус имел лишь несколько лет опыта работы с компьюте- ром, когда приступил к разработке Фортрана. До колледжа Бекус был посредственным учеником («Я прошел больше школ, чем могу вспомнить»). После служ- бы в армии во время второй мировой войны он оказался в Нью-Йорке, где поступил в школу радиотехники. «Пре- делом моих стремлений, — признался Бекус позднее, — было сделать высококачественное звуковоспроизводящее устройство». Однако преподаватель по ремонту телевизи- онной и радиоаппаратуры пробудил у Бекуса интерес к ма- тематике и убедил его продолжить учебу в Колумбийском университете. Так скромно началась одна из самых пло- дотворных карьер в истории вычислительной техники. Бе- кусу было 25 лет, когда он, получив степень магистра ма- тематики в Колумбийском университете, поступил в 1950 г. программистом в фирму ИБМ. Вскоре он возгла- вил группу, разрабатывающую интерпретатор под назва- 154
г— нием «Быстрый кодировщик» для компьютера марки IBM- 701. Затем он работал в составе группы по созданию более мощного преемника модели 701, машины IBM-704. Позже, в 1953 г., Бекус, неоднократно заявлявший, что «всегда был лентяем», обратился к своему шефу с новаторским предложением. Это были сложный язык и компилятор к нему, упрощавшие программирование модели IBM-704. Система позволяла записывать программы в алгебраиче- ской форме, а компилятор должен был автоматически пе- реводить ее в машинные коды. Предложение Бекуса было весьма своевременным. С опозданием выйдя на рынок, фирма ИБМ испытывала затруднения с увеличением сбыта своих компьютеров. По • этой причине она поддерживала исследования по информа- тике в Колумбийском, Гарвардском и некоторых других университетах. Но ИБМ продолжала и самостоятельные поиски путей снижения стоимости программирования и упрощения работы с компьютерами, чтобы сделать их бо- лее привлекательными, «дружественными» для пользова- телей. Большинство научных работников, инженеров, пре- подавателей не имели ни времени, ни терпения использо- вать машинные коды или даже язык ассемблера, посколь- ку это требовало довольно глубокого знания устройства и действия самого компьютера. Однако эти люди, вероят- но, не отказались бы изучить язык высокого уровня, осо- бенно если бы он напоминал привычные им алгебраиче- ские формулы. Идее Бекуса был дан зеленый свет. Местом рождения Фортрана стала штаб-квартира фир- мы ИБМ на Мэдисон-авеню в Нью-Йорке. Группа Бекуса расположилась в этом офисе на двадцатом этаже, рядом с машинным отделением лифта. С самого начала деятель- ность группы проходила в атмосфере скептицизма и недо- верия. Более ранние попытки совершенствования машин- ного кода и языка ассемблера нередко рекламировались как создание «почти человеческих» средств общения с ком- пьютером. Эти заявления вызывали вполне естественное недоверие. Тем не менее группа Бекуса продвигалась впе- ред. Они выделили основные понятия нового языка, в частности оператор присваивания (например, N=100), за- дававший переменным определенные значения, ввели ин- дексируемые переменные, которые сообщали компьютеру, какой элемент из списка переменных нужен (например, Х(3) означает третий элемент списка, названного X), пред- ложили очень важный оператор DO, который позволял по- вторять нужную последовательность операторов заданное число раз. Как заявлял Бекус, большинство людей «счита- ло, что основной вклад Фортрана — это возможность пи- сать программы в виде алгебраических формул, а не на машинном языке, но на самом деле это не так». По мне- нию самого Бекуса, «что делал Фортран в первую очередь, так это автоматизировал организацию циклов» — свой- ство, незаменимое в научных приложениях. Работа соб- ственно над языком шла быстро. «Мы просто придумыва- ли язык по мере продвижения», — вспоминал Бекус. Однако совсем другое дело — разработка компилятора. 155
Бекус понимал, что развеять сомнения в возможностях ав- томатического программирования, т. е. написания про- грамм на языках высокого уровня, можно лишь тогда, когда программы, полученные с помощью Фортрана, бу- дут такими же быстродействующими и надежными, как и написанные в машинных кодах или на языке ассемблера. Создать эффективный и надежный компилятор Форт- рана оказалось более трудной задачей, чем предполага- лось. Группе пришлось иметь дело со вводом, выводом, циклами DO и множеством других запутанных вещей, не- обходимых для преобразования команд на языке высокого уровня в машинный код. Первоначально надеялись, что компилятор будет готов через полгода, однако работа над ним заняла более 2 лет. В конце 1956 г. и в 1957 г. интен- сивность работы по доводке и отладке компилятора резко возросла. В этот период члены группы часто снимали но- мер в ближайшей гостинице, где отсыпались днем, рабр- тая на машине по ночам, чтобы иметь возможно больше непрерывного машинного времени. Ошибки одна за дру- гой устранялись, пока в апреле 1957 г. не стало очевид- ным, что компилятор готов для использования владельца- ми машины IBM-704. По ошибке, которую Бекус назвал «большим конфузом», компилятор Фортрана был послан в лабораторию «Вестингауз-Беттис» в виде колоды перфо- карт и без каких-либо инструкций; что и позволило Гербу Брайту запустить Фортран вслепую (см. с. 153). Осталь- ные пользователи получили систему на магнитной ленте вместе с руководством для оператора. Вначале Фортран признавали неохотно. Программи- сты, как вспоминал Бекус, «весьма скептично воспринима- ли все наши заявки». Однако по сравнению со своими предшественниками Фортран был сравнительно прост для обучения и использования. Кроме того, фирма ИБМ снаб- жала все модели 704 Фортраном бесплатно. В результате к 1958 г. более половины всех машинных команд на 60 компьютерах фирмы были получены не вручную, а авто- матически, с помощью Фортрана. Бекус и его группа предвидели, что успех Фортрана подтолкнет и других производителей к разработке анало- гичных языков для своих машин, что действительно и про- изошло. Однако Фортран быстро стал нормой и его адап- тировали (приспособили) для машин многих других марок. Первую адаптацию осуществила сама фирма ИБМ. Не- большая группа, в которую входил Дэвид Хеммис, за ко- роткое время приспособила Фортран к машине IBM-650, меньшей, чем IBM-704. Хеммис и его коллеги разработали систему «Фортранзит» (FOR TRANSIT — для перехода); позднее два слова слились в одно. Таким образом, система «Фортранзит» стала первым транслятором исходного ко- да (так иногда называли программы на языках высокого уровня), работающим на машинах нескольких моделей. Через пять лет Фортран использовался на шести различ- ных моделях компьютеров фирмы ИБМ, а также на ком- пьютерах компании «Сперри Рэнд», «Филко» и других. Не все в распространении Фортрана проходило гладко В возрасте 28 лет математик Джон Бе- кус организовал и возглавил в фирме ИБМ группу молодых программистов, разработавшую Фортран. Созданный в 1957 г., после трех лет упорной рабо- ты, этот язык стал первым широко ис- пользуемым языком высокого уровня. и безоблачно. Еще в начале 1957 г., когда продолжался процесс отладки, недостатки языка стали очевидны. Бекус и другие разработчики понимали необходимость более точной диагностики программных ошибок, а также важ- ность раздельного и независимого написания подпрограмм и программных секций, которые затем можно было бы многократно использовать. Благодаря усилиям разработ- чиков всего через год после создания оригинала появился Фортран И. Одно из достоинств нового языка состояло в том, что он позволял подсоединять программы на ассем- блере, т. е. при желании программист мог писать програм- мы частично на ассемблере, а частично на Фортране. Бо- лее поздняя версия, Фортран III, была создана в 1958 г. О Фортране IV еще больше расширявшем возможности Фортрана, стало известно в 1962 г. «Сердцевина» языка, его основные операторы и выра- жения, оставались практически неизменными на протяже- нии многих лет. Но, поскольку Фортран многократно адаптировался ко все новым системам машин, для кото- рых он не предназначался, постепенно накапливались от- личия. Одни возможности терялись, новые возникали. Это неизбежно порождало путаницу в вопросе о том, что до- пустимо и что не допустимо в Фортране. Например, не все компиляторы одинаково истолковывали важнейший опера- тор DO: некоторые всегда выполняли цикл хотя бы один раз, не проверяя, нужно ли его вообще выполнять, другие осуществляли такую проверку. Чтобы навести порядок в подобных вопросах, изготовители и пользователи компью- теров договорились провести стандартизацию языка в 1966 г., а затем в 1977 г. Фортран и по сей день остается популярным средством программирования, особенно среди научных работников. 156
Дэвид Хеммис, один из первых разра- ботчиков компьютерных языков, сидит за рулем своего автомобиля выпуска 1928 г. Фотография сделана в Уэст- хемптоне, шт. Нью-Йорк, во время ав- томобильных гонок 1957 г. Работая программистом в фирме ИБМ, Хеммис разрывался в то лето между автомо- бильными гонками и написанием транслятора «Фортранзит», который впервые позволил программировать на Фортране на небольших университет- ских компьютерах. Большинство последующих языков — его прямые либо косвенные потомки. Однако главное достоинство Фортра- на состоит в том, что он был первым широко распростра- ненным коммерческим языком. Как говорилось в руковод- стве фирмы ИБМ, выпущенном в 1957 г., «Фортран обес- печивает эффективное средство написания программ для модели 704, простое в обучении и не требующее знания машины». С тех пор научные работники, инженеры и сту- денты получили возможность общаться с компьютером без помощи профессиональных программистов, пишущих на ассемблере. ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА ПРИХОДИТ В БИЗНЕС Пока Фортран приобретал приверженцев в традиционной области применения компьютеров — науке и технике, — в мире бизнеса все сильнее чувствовалась потребность авто- матизации процесса обработки информации. Большие кор- порации, руководствующиеся принципом «время — день- ги», осознали потенциальную прибыльность компьюте- ров, способных обрабатывать огромные объемы данных с высокой скоростью. Было разработано несколько язы- ков, которые предполагалось использовать в сфере бизне- са. Наибольшую популярность приобрели языки «Флоу- мэтик» (FLOW-MATIC), разработанный Грейс Хоппер из фирмы «Сперри Рэнд», «Коммерческий транслятор» фир- мы ИБМ, предназначенный для конторских приложений, и язык «Аймако» (AIMACO), созданный в ВВС США. Однако ни один из них не подходил для всеобщего приме- нения, и каждый работал лишь на компьютерах одного семейства — недостаток, характерный для многих языков того времени. Как и предсказывала группа Бекуса, возникло множе- ство имитаций Фортрана. Однако большинство новых сис- тем годились лишь для того компьютера, для которого предназначались изначально, а проблема переноса про- граммного обеспечения с компьютера на компьютер ста- новилась все острее. Чтобы работать с различными языка- ми, программистам приходилось становиться полиглота- ми. Южная железнодорожная компания, с одной стороны, располагала тремя типами компьютеров, тремя отдельны- ми вычислительными центрами, тремя штатами програм- мистов, а с другой — имела одну большую проблему — повышение эффективности своих железных дорог. В апреле 1959 г., через два года после официального «старта» Фортрана, заинтересованные потребители, про- изводители компьютеров и академические круги, провели нечто вроде военного совета, который собрался в Пенсиль- ванском университете — колыбели вычислительной техни- ки. Эта маленькая группа пришла к выводу, что она (и остальной мир) нуждается в стандартизованном машинно- независимом языке для деловых приложений. Было ясно, что Фортран — не то, что нужно. В бизнесе требовалась быстрая работа с накладными, создание до- ступных списков потенциальных потребителей, а не реше- ние уравнений. Нужен был язык, который не только допу- скал бы такие важные операции, как сортировка элементов файла (набора однотипных элементов данных), слияние файлов и генерация отчетов, пригодных для использова- ния, но и основывался на предложениях, подобных фразам английского языка. Мало надеясь на беспристрастность в таком вопросе компаний-производителей, группа начала поиски нейтраль- ного спонсора проекта. Небольшая делегация во главе с Грейс Хоппер обратилась в министерство обороны США. У Хоппер были основания рассчитывать на то, что Пента- гон заинтересуется высокомобильным (легко переносимым с машины на машину) языком для деловых приложений. В 1959 г. министерство имело в своем распоряжении не ме- 157
нее 1046 компьютеров всевозможных марок и размеров. Правительству приходилось тратить около 500 млн. долл, в год на поддержание функционирования этой разнород- ной массы машин и их программирование на все возраста- ющем множестве языков. Пентагон разделял опасение большинства производителей компьютеров, что какой- нибудь один крупный производитель может монополизи- ровать рынок. В таком случае и Пентагону, и другим серь- езным пользователям пришлось бы иметь дело лишь с одним поставщиком. Поэтому большинство изготовителей компьютеров стремились помочь Пентагону сохранить рынок открытым. РОЖДЕНИЕ КОДАСИЛ Откликнувшись с необычайной живостью на предложение делегации во главе с Хоппер, министерство обороны орга- низовало специальную конференцию по языкам програм- мирования, которая состоялась в последнюю неделю мая 1959 г. Ее возглавлял Чарлз Филлипс, директор Института исследований систем обработки данных министерства обо- роны США, человек весьма прямолинейный. Позже это собрание получило название КОДАСИЛ (CODASYL, от Conference on Data Systems Languages — конференция по языкам систем обработки данных). Важнейшие поставщи- ки компьютеров, фирмы «Хониуэлл», «Дженерал элект- рик», «Барроуз», «Нейшнл кэш реджистер», «Филко», «Сперри Рэнд», «Рэдио корпорейшн оф Америка», «Силь- вания электрик продакте» и ИБМ, направили на конферен- цию своих представителей. Филлипс сообщил им, что Пен- тагон желает иметь единый язык программирования, при- чем как можно быстрее. Собравшиеся ответили на вызов, как обычно делают программисты — разбив задачу на шаги и пронумеровав их. Они решили образовать три группы, или комитета: кратковременный, промежуточный и долгосрочный. Пер- вый должен был разработать основу проекта, второй, опираясь на эти разработки, — создать действующую сис- тему, а третий — за несколько лет разработать то, что, по мысли членов КОДАСИЛ, должно стать последним словом в языках программирования. Исполнительному ко- митету КОДАСИЛ, также возглавляемому Филлипсом, поручалось контролировать весь этот процесс. Однако со- бытия обернулись так, что долгосрочный комитет остался всего лишь квадратиком на организационной схеме, вклад промежуточного был незначительным, а кратковременный выполнил почти всю работу по созданию нового языка. «В тот момент было совсем не очевидно, что мы дела- ли что-то еще, кроме попыток скомбинировать три извест- ных в то время языка [для деловых приложений]», — го- ворила Джин Сэммит, представитель фирмы «Сильвания» и ведущий член кратковременного комитета. Группа Сэм- мит должна была выработать временное решение, кото- рое позволило бы промежуточному комитету получить бо- лее сложный продукт. Кратковременный комитет пред- принял попытку собрать воедино основные части языков Говард Бромберг из фирмы RCA, участ- вовавший в группе по разработке Кобо- ла, прислал в начале 1960 г. этот обелиск председателю комитета КОДАСИЛ Чарлзу Филлипсу; так он выразил свое разочарование отсутствием прогресса в развитии Кобола. Попытки достичь «об- щего согласия» нередко подвергали серь- езному испытанию терпение членов груп- пы, однако к концу года такая стратегия привела к созданию первой версии языка, который до сих пор остается междуна- родным стандартом для расчетов в сфере бизнеса. В 1985 г. на праздновании 25-ле- тия Кобола Бромберг наконец сознался в своем поступке. «Флоу-мэтик», «Аймако» и «Коммерческий транслятор», но части не соединялись. В результате напряженного труда в течение лета некоторые члены комитета поняли, что мо- гут, опираясь на имеющиеся языки, создать новый, не по- хожий на них. В это время возникли разногласия среди членов коми- тета. Представители ИБМ заняли твердую позицию: вся- кая попытка написать абсолютно новый язык увела бы кратковременный комитет слишком далеко за пределы его полномочий. Большинство членов комитета, включая председателя Джозефа Уэгстена из Национального бюро стандартов, были не согласны с этим. Уэгстен весьма удачно сравнил работу комитета с работой Конституцион- ного съезда США 1787 г.: если бы делегаты того съезда не вышли за пределы исходного устава, то, утверждал он, «мы бы не имели конституции». Несмотря на неопреде- ленность роли кратковременного комитета и очевидные попытки свести на нет его усилия, работа продвигалась. К середине осени новый язык обрел определенный вид и даже имя. Он был назван Кобол (COBOL, от COmmon Business Oriented Language — универсальный язык, предна- значенный для бизнеса). Однако борьба вокруг него толь- ко начиналась. 158
Эти события застали членов промежуточного комитета врасплох. Они полагали, что именно им, а не членам крат- ковременного комитета выпадет честь создать новый язык. Собравшись в октябре, они удивили всех принятием резолюции, одобрявшей совсем другой язык: Факт (FACT, от Fully Automatic Compiling Technique — полностью авто- матический компилирующий метод) — принципиально но- вый язык обработки данных, который уже несколько меся- цев спокойно разрабатывался в компании «Хониуэлл». В его спецификациях имелось несколько привлекательных возможностей, как то: ввод данных с карт, удобный в экс- плуатации генератор отчетов. Резолюция призывала ис- полнительный комитет КОДАСИЛ заменить специфика- ции Кобола на спецификации языка Факт. Естественно, это вызвало неудовольствие членов кратковременной группы, особенно Джин Сэммит, которая изо всех сил боролась за Кобол. Как заявила Сэммит, представитель фирмы «Хо- ниуэлл» в ее комитете был «удивительно молчалив», даже не заикнувшись о существовании нового языка. «Как не- трудно представить, — писала позднее Сэммит, — резо- люция произвела на представителей кратковременного ко- митета эффект разорвавшейся бомбы». Закулисные интриги продолжались до следующего засе- дания исполнительного комитета. Не желая давать фирме «Хониуэлл» преимущества на рынке, большинство компа- ний выступило против Факта, и они победили. Собрав- шись в январе 1960 г., исполнительный комитет просто не одобрил резолюцию в пользу Факта. Споры продолжались и на последующих встречах, но к тому времени комитет уже принял Кобол. Так Кобол пережил вторую попытку похоронить его. Если бы для него потребовался надгробный камень, то он уже был у председателя КОДАСИЛ Чарлза Филлипса. Не- задолго до январского заседания в контору Филлипса до- ставили тяжелый ящик. Внутри он обнаружил небольшой мраморный обелиск, на котором был изваян лежащий яг- ненок (агнец божий). На обелиске было высечено одно слово — КОБОЛ. С тех пор для Кобола писалось много эпитафий, но все преждевременно. И даже теперь, в «возрасте» более чет- верти века, язык далек от кончины. К середине 80-х годов стоимость программ, написанных на Коболе, оценивалась в 50 млрд. долл. Такие вложения гарантируют долгую жизнь языка. Компании не желают нести дополнительные расходы, связанные с переходом на новую систему, даже если при длительном использовании она может оказаться более эффективной. Более того, Кобол периодически об- новляется, и по-прежнему эффективен в той области, для которой создавался: в обработке деловой информации. Американский бизнес ухватился за Кобол почти сразу. Спецификации Кобола были опубликованы в апреле 1960 г., а в конце этого же года компании RCA и «Сперри Рэнд» уже продавали свои компиляторы для него. Другие изготовители поспешили последовать их примеру. Фирма ИБМ первое время не участвовала в гонке за Коболом, продолжая предлагать «Коммерческий транслятор». «Хо- ниуэлл» тоже держалась в стороне, уязвленная неприятием ее языка. Однако в конце концов и они приняли Кобол. В скором времени этот язык вытеснил как Факт, так и «Коммерческий транслятор». Популярность Кобола возросла после публикации в 1962 г. его новой версии. Более мощный, чем его пред- шественник, пересмотренный Кобол включал генератор отчетов и позволял использовать директиву сортировки. Интересно, что именно эти возможности составляли силь- ные стороны Факта. Многие последующие версии Ко- бола также были одобрены наблюдательной комиссией КОДАСИЛ, которая продолжала регулярно собираться. Поскольку число конторских подразделений, использую- щих Кобол, росло на протяжении 60-х годов, один журнал по вычислительной технике сравнил его с сорняком: не- смотря на все попытки его выполоть, он продолжает рас- ти и размножаться. Кобол удобен для сферы бизнеса по нескольким причи- нам. Он особенно эффективен при описании простых опе- раций (таких, как сложение, вычитание, вычисление про- центов), применяемых к большим массивам данных. Да- лее, он также машинно-независим: программы на Коболе можно переносить с одного компьютера на другой. По- скольку в Коболе используются обычные английские слова и синтаксис английского языка, даже администраторы и менеджеры, не знакомые с программированием, без труда понимают программный код. Такая «читабельность» про- грамм облегчает поиск ошибок, добавление новых и изме- нение существующих свойств программы. Облегчаются и другие операции по сопровождению программ. Известны хорошо оформленные программы на Коболе, пережившие машины, для которых они были написаны. Кобол был разработан для выполнения однородных операций над большими массивами данных, но оказался не очень удобен как универсальный язык. Многие матема- тики и программисты научных задач (аристократы про- граммистского сообщества) считают Кобол многословным и громоздким. Как и Фортран, его часто называют дино- завром. Однако широкое применение Кобола продолжает- ся. Примерно две трети конторских программ в мире все еще пишется на Коболе. Универсальность этого языка про- демонстрировала Грейс Хоппер во время посещения вы- числительного центра в Японии. Она и хозяева-японцы ни- как не могли понять друг друга, пока Хоппер не вспомни- ла некоторые команды Кобола. «MOVE (переместить) — сказала она, показав на себя, — GOTO (перейти к) отель “Осака”». Японцы сразу же доставили ее в гостиницу. Еще до появления Кобола наметилась попытка разра- ботать третий универсальный компьютерный язык. Алгол (ALGOrithmic Language — алгоритмический язык), подоб- но Фортрану, был алгебраическим языком, разработан- ным преимущественно для решения численных задач. Как и Кобол, он родился в прокуренной комнате заседаний ко- митета и тоже дитя конфликтов и компромиссов. Но на 159
этом сходство кончается. После многолетних споров коми- тет по Алголу дал миру язык, который скорее вызвал ин- терес, чем привлек потребителей. Это, видимо, первый язык, который можно было без натяжки назвать «изящ- ным» — термин, который' Грейс Хоппер определила так: «Похож на большую поэму: простой и ясный с точки зре- ния математики, но отнюдь не практичный». СБОР В ЦЮРИХЕ Толчком к разработке Алгола послужило появление и ши- рокое распространение в 1957 г. Фортрана. Программист- скую общественность Европы беспокоил диктат ИБМ и других агрессивных американских фирм на европейском рынке компьютеров. В это время программисты США бы- ли озабочены проблемой определения единого языка для научного программирования. Эта озабоченность приняла международный характер. Первое обсуждение состоялось в Федеральном техническом университете в Цюрихе (Швейцария) 27 мая 1958 г. Когда через неделю встреча прервалась, язык, получивший название Алгол-58, уже воз- ник. В Цюрихе собрались восемь наиболее уважаемых ав- торитетов в области компьютеров: четверо из Европы и четверо из США. На встрече присутствовали создатель Фортрана Джон Бекус и Джозеф Уэгстен, который в по- следующем стал председателем кратковременного комите- та по Коболу. Конференция взяла девизом слова Вольтера «Луч- шее — враг хорошего», означавшие, что нельзя затягивать работу, пытаясь выполнить ее в совершенстве. Но все рав- но дела продвигались медленно. Американцы настаивали на языке, который был бы близок к уже используемым на компьютерах. Европейцев интересовали не столько ком- пьютеры, сколько мощь языка при решении сложных ма- тематических задач. На второй день обсуждение едва не зашло в тупик из-за мелкого, но вызвавшего бурю эмоций пункта — десятичной точки. Один из европейцев, ударив кулаком по столу, воскликнул: «Нет! Я никогда не буду использовать точку в десятичных дробях!» Американцы же пренебрежительно отнеслись к европейской привычке использовать в десятичных дробях запятую. В эту ночь не- утомимый Уэгстен носился из комнаты в комнату, пыта- ясь утихомирить «десятичную бурю». Окончательное решение проблемы, предложенное Уэгс- теном, обеспечило новому языку одно из его наиболее за- мечательных свойств. Алгол подразделяется на три уров- ня: язык описаний, определяющий основные понятия; язык публикаций, позволяющий писать и обсуждать про- граммы, и язык аппаратного уровня, реализуемый на ком- пьютере. Поскольку обсуждение в Цюрихе шло на уровне языка описаний, не учитывая деталей публикации и реали- зации, удалось избежать принятия решений по мелким во- просам, вроде выбора между точкой и запятой. Язык, созданный на конференции в Цюрихе, многое унаследовал от Фортрана, но в Алголе основные понятия Фортрана были собраны в более логичную, можно даже сказать, изящную структуру. Однако из-за надостатка вре- мени и необходимости компромиссов было допущено не- мало оплошностей. Одна из них заключалась в отсутствии процедур ввода и вывода данных. Участники совещания намеренно не касались этой области, где многое зависит от типа компьютера, полагая, что процедуры ввода и вы- вода должен написать разработчик компилятора языка. По завершении конференции часть делегатов уехала с мыслью, что язык все еще далек от завершения, другая же часть — с надеждой, что Алгол находится на пути к тому, чтобы на долгие годы стать международным стан- дартом. Одним из таких оптимистов был Джон Бекус. В февра- ле 1959 г. он ознакомил с Алголом мощную организацию (SHARE) потребителей компьютеров фирмы ИБМ. Его доклад был воспринят с энтузиазмом, и от фирмы настой- чиво потребовали реализовать Алгол. ИБМ официально сообщила о проекте разработки транслятора, но практи- чески работа не велась. Поскольку фирма ИБМ, мировой лидер в продаже компьютеров, повсюду внедряла Форт- ран, было наивно надеяться, что она станет на сторону конкурирующего языка. По мере того как капиталовложе- ния членов организации SHARE в Фортран росли, их энту- зиазм в отношении Алгола угасал. Но это не остановило Бекуса. Несмотря на явное отсутствие интереса со сторо- ны потребителей, он продолжал активно участвовать в развитии Алгола. Вернувшись в Цюрих, он заинтересовал- ся синтаксисом, т. е. правильным расположением слов и знаков в языке; в применении к компьютеру синтаксис определяет, верна ли программа грамматически. Бекус разработал строгую и точную систему определения каж- дой структуры языка логическим образом. Например, определяя элемент «цифра», он писал: «< цифра> : = = 011121 ... 191». Вскоре программисты стали называть этот подход к описанию синтаксиса нормальной формой Бекуса, или БНФ. (Последующее уточнение этой работы датским астрономом Питером Науром привело к тому, что такой подход часто стали называть «форма Бекуса— Наура», (сокращение осталось то же — БНФ). БНФ оказа- ла длительное влияние на разработку языков программи- рования, в частности была положена в основу второго эта- па разработки Алгола. Поскольку начали вставать проблемы реализации язы- ка, а надежды, зародившиеся в Цюрихе, блекли, авторы Алгола пришли к выводу, что их язык образца 1958 г. — всего лишь эскиз. Стало очевидным, что требуется даль- нейшая работа. В январе 1960 г. 13 представителей стран Европы и США, включая 7 человек из прошлой цюрихской группы, встретились в Париже, чтобы «залатать дыры», оставшиеся в первом варианте Алгола. Одним из вновь прибывших был Наур, предложивший вариант измененно- го Алгола, записанный при помощи БНФ. Было объявле- но, что группа приняла решение по языку единогласно, причем этот момент запечатлен на фотографии. После восьми дней трудных переговоров участники конференции 160
С редким единодушием комитет по раз- работке Алгола-60 «голосует» для этой групповой фотографии, сделанной на конференции в Париже 1960 г. В работе комитета участвовали американский спе- циалист по компьютерам Джон Бекус {ближайший к камере справа) и датский астроном Петер Наур {четвертый сле- ва), в честь которых система описания языков программирования получила на- звание «форма Бекуса — Наура». (Фото- графию сделал Джон Маккарти, созда- тель языка Лисп.) покинули Париж в приподнятом настроении, считая, что согласие достигнуто и даже самые ярые критики Алгола должны отныне умолкнуть. На самом деле все сложилось иначе. Едва американские участники конференции сошли с трапа самолета, на Алгол-60 обрушился огонь критики со стороны. Кроме того, небольшая группа участников кон- ференции указала на неоднозначности, оставшиеся в языке, и приступила к их «рекламированию». Другие критики подчеркивали, что в язык так и не включены средства вво- да-вывода. ТРАНСАТЛАНТИЧЕСКИЕ РАСХОЖДЕНИЯ В Америке Алгол-60 встретили холодно. Ассоциация SHARE переметнулась на сторону Фортрана. Те, кто по- пытался использовать Алгол, обнаружили, что его трудно реализовать. Даже самые сложные компьютеры того вре- мени не могли воспринимать набор из 116 литер, которые встречались в языке описаний. Однако некоторые более возвышенно настроенные американские программисты увидели в Алголе «предмет ошеломляющего очарования» — поэтическая метафора Грейс Хоппер. И они не были одиноки. Европейцы сразу приняли Алгол. Он давал им возмож- ность обмениваться интересными и сложными идеями, не- взирая на границы и языковые барьеры. Кроме того, он позволил европейской компьютерной индустрии обрести независимость от американской технологии. Подобно то- му как министерство обороны США оказало решительную поддержку Коболу, независимый исследовательский совет ФРГ и другие правительственные организации западно- европейских стран поддержали Алгол. Энергичные усилия по реализации этого языка способствовали тому, что Ал- гол распространился от Великобритании до Советского Союза. Некоторые из попыток реализации Алгола закон- чились неудачей. Например, претенциозная британская система программирования была отвергнута, когда поль- зователи обнаружили, что их компилятор Алгола может обрабатывать лишь два знака в секунду. Однако большин- ство компиляторов оказались удачными, и вскоре Алгол был признан международным языком европейских про- граммистов. В США дела обстояли иначе. Разумеется, Алгол в кон- це концов пробился ко многим американским компьюте- рам, но так и не одолел Фортран, стартовавший первым и уже завоевавший рынок. Алгол не стал универсальным языком, как надеялись некоторые, поскольку такой его статус всерьез задел бы американские интересы. Однако теоретическое влияние Алгола было в США так же силь- но, как и в Европе. «Сообщение об Алголе-60» стало на- стольной книгой для целого поколения программистов и студентов, изучающих языки программирования. «Подоб- но Библии, «Сообщение об Алголе» предназначено для толкования, а не для чтения и понимания», — заявил позднее один из специалистов по информатике. Наиболее упорные приверженцы этого языка заслужили названия его адвокатов. Многие языки, возникшие позднее, базировались (по крайней мере, частично) на Алголе, и его вклад в их разви- тие связан с несколькими основными идеями. Одна из на- иболее важных — блочная структура, позволяющая де- лить программы на замкнутые единицы, разрабатывае- мые независимо. Другая идея —рекурсия, т. е. способность программ повторно обращаться к себе. Третья идея — БНФ, формализованное определение синтаксиса, т. е. спо- соба размещения слов в языке. Эти и другие фундамен- тальные идеи, составляющие основу, достались в наслед- ство разработчикам других языков. Гигант среди произво- дителей компьютеров, фирма ИБМ, приступив в конце 1963 г. (одновременно с новой линией компьютеров) к осу- ществлению претенциозного проекта разработки языка, весьма внимательно отнеслась к этому наследию. Двумя годами раньше в компании осознали, что если они хотят сохранить первенство, то нужно сделать гигантский скачок в технологии программирования. Результатом этого реше- ния была «Система-360», впечатляющая серия универсаль- ных компьютеров. Эти машины проектировались так, чтобы в равной степени удовлетворить потребности как в аналитических вычислениях, так и в обработке данных в сфере бизнеса, а также в широком диапазоне специальных приложений. Естественно, компьютер с таким широким спектром возможностей требовал мощного языка. Непростительно поздно поняв это, ИБМ лишь за полгода до окончания ра- бот над аппаратным обеспечением начала заниматься язы- ком. Ассоциация SHARE, оценив перспективность этого дела, помогла ИБМ создать «комитет по разработке пере- 161
Многоязычные вычисления Поскольку американская компьютерная технология на про- тяжении первых десятилетий лидировала в мире, неудиви- тельно, что фактически все языки высокого уровня, начи- ная с возникшего в 1957 г. Фортрана, использовали после- довательности букв, напоминавшие слова английского языка. В настоящее время и французы, и испанцы, и япон- цы, как правило, «общаются» со своими компьютерами на английском языке. Обычно они используют метод, кото- рый демонстрирует приведенная ниже испанская програм- ма, где английские ключевые слова комбинируются с име- нами переменных и комментариями, записанными на род- ном языке. Хотя такой способ смешанного программирования и работает, он предъявляет серьезные требования к тем, кто не силен в английском. В зависимости от компьютерного языка программист должен выучить от 80 до 200 наиболее существенных иностранных слов, обеспечивающих диалог между человеком и машиной, для которой разработан язык. В некоторых странах программисты должны запо- минать также латинский алфавит, который, например, для китайцев так же сложен, как восточные иероглифы для ев- ропейцев. В 1970 г. французское министерство национального об- 10 ' Compra de divisas 20 PRINT "Que es la tasa de cambio de pesetas a ddlares?" 30 INPUT DOLARES 40 PRINT "Que es la tasa de cambio de pesetas a francos suizos?" 50 INPUT FRANCOSSUIZOS 60 PRINT "Cudntas pesetas quieres cambiar?" 70 INPUT PESETAS 80 PRINT "Quieres cambiar a dblares (1) о a francos suizos (2)?" 90 PRINT "Contesta 1 о 2." 100 INPUT CONTESTAR 110 IF CONTESTAR = 2 THEN GOTO 150 120 LET NUMERO = PESETAS/DOLARES 130 PRINT PESETAS; "pesetas equivalen a"; NUMERO; "dblares." 140 END 150 LET NUMERO = PESETAS/FRANCOSSUIZOS 160 PRINT PESETAS; "pesetas equivalen a"; NUMERO; "francos suizos." 170 END Простая программа обмена валют, написан- ная на Бейсике, использует ключевые слова из английского языка — PRINT (печать), INPUT (ввод) и GOTO (перейти) — совместно с испанскими именами переменных. Про- грамма запрашивает курс обмена испанских песет и американских долларов (строка 20), а также песет и швейцарских франков (стро- ка 40), затем спрашивает пользователя, хо- чет ли он обменять песеты на доллары (1) или франки (2) (строка 80). В зависимости от ответа программа перейдет (GOTO) на строку 120, чтобы вычислить количество долларов, или на строку 150, чтобы вычис- лить количество франков. 1 ‘ JOUR DE NOEL VERSION 3 2 * 5 CHAINE CODE 6 CODE '1LUNDI2MARDI3MERCREDI4JEUDI5VENDREDI6SAMEDI0DIMANCHE' 9 ’ 10 AFFICHER'EN'; LIRE AN 20 SIAN> 1900 ETAN < 2100 ALORSALLER EN 40 21 AFFICHER 'MILLESIME INACCEPTABLE'; TERMINER 39 ‘ 40 P 4-AN - 1900 41 BIS <— ENT (P/4) 42 J 4-2 + P + BIS 43 SEM4- ENT(J/7) 44 NOEL 4- J - 7 * SEM 59 ’ 60 AFFICHER 'NOEL TOMBE UN'. GRL(CODE,POS(CODE,1.CCA(NOEL))) 99 * 100 TERMINER Программа, написанная на французском язы- ке программирования ЛСЕ, позволяет опре- делить, на какой из семи дней недели (про- нумерованы и перечислены в строке 6) при- дется в данном году рождество. Язык ЛСЕ очень похож на Бейсик, он .тоже нумерует каждую строку и использует простые ключе- вые слова, например AFFICHER (выдать на экран) и TERMINER (закончить), которые легко понимает и новичок-программист. Как явствует из строки 20, эта программа рас- считывает день рождества, в пределах 1900—2100 гг.; если год не попадает в этот интервал, программа останавливается (TERMINER; строка 21) с сообщением, что год недопустим. 162
разования обратилось к проблеме общения с компьютера- ми, организовав разработку языка ЛСЕ (LSE, Langage Simbolique d’Enseignement — символический язык обуче- ния), содержащего исключительно французские слова и имеющего французский синтаксис. ЛСЕ легко моделирует- ся на Бейсике и достаточно прост даже для неспециали- стов, как взрослых, так и школьников. Он изучается во французских школах с 1974 г. и представляет собой одну из немногих практических попыток создать и реализовать язык программирования, не использующий английский язык как основу. Алгол-68 (см. с. 190), созданный в конце 60-х годов международным комитетом специалистов по информати- ке, предлагает более радикальное решение проблем, стоя- щих перед не говорящими по-английски программистами, ибо обладает тем свойством, что, работая с ним, програм- мисты могут писать ключевые слова на родном языке. Ключевые слова содержатся в таблице трансляции, храня- щейся в памяти компьютера и используемой компилято- ром Алгола-68 для преобразования программ в машинный код. Языки, для которых подобных таблиц не существует, тоже можно применять для написания программ, но тогда алгоритмы нужно вручную переводить на один из языков, который компьютер в состоянии понять. menge datum = tupel (ganz tag, wort monat, ganz Jahr); funktion naechster tag nach = (datum x) datum: wenn tag von x < monatslaenge (manat von x, Jahr von x) dann (tag von x + 1, manat von x, jahr von x) wennaber manat von x = "Dezember" dann (1, "Januar", jahr von x + 1) ansonsten (1, nachfolgemonat (manat von x), jahr von x) endewenn; 7П О Три одинаковые программы, вычисляющие дату, следующую за введенной, которая за- дается в виде день-месяц-год. Программы написаны на немецком, китайском и англий- ском диалектах Алгола-68. Немецкие и анг- лийские программисты могут вводить свои программы непосредственно в машину, име- ющую соответствующий транслятор. Иеро- глифы китайской программы, как и других программ, основанных не на латинском ал- фавите, перед вводом в компьютер преобра- зуются в ключевые слова одной из таблиц трансляции (обычно английской). > = ( gffi: (Жх, x) " 12 (Л 'Ш" + 1 ) ffft) (/' T" ТЛ ( X , x) mode date = struct (Int day, string month, Int year); proc the day following = (date x) dale: If day of x < length of month (month of x, year of x) then (day of x + 1, month of x, year of x) elif month of x = "December" then (1 "January", year of x + 1) else (1 successor of month (month of x), year of x) «;
дового языка». В комитет вошли представители фирм «Локхид», «Юнион карбайд», «Стандард ойл» из Кали- форнии, а также специалисты из отделов программирова- ния и разработки языков самой ИБМ. Комитет возглавил специалист по компиляторам из фирмы ИБМ Джордж Рэдин. С самого начала работа велась в условиях нехватки времени. Группа приступила к работе в октябре 1963 г., а поскольку срок окончания работ по «Системе-360» был на- значен на апрель 1984 г., ее участники изо всех сил стреми- лись успеть к сроку. Поклонники Фортрана надеялись уви- деть свой любимый язык в качестве основы нового языка. Но комиссия отвергла Фортран: он имел слишком ограни- ченные возможности, чтобы стать основой универсально- го языка, но споры по этому вопросу задержали работу на несколько недель. Обычно члены комитета собирались в выходные, как правило, в гостиничных номерах Нью- Йорка или Лос-Анджелеса. «Временами, — вспоминал по- том Рэдин, — самыми активными противниками дела ока- зывались не защитники Фортрана, а брошенные жены и мужья». Несмотря на административный нажим, спецификации языка были завершены лишь к февралю 1964 г. — новый язык явно запаздывал к дебюту «Системы-360». Возмож- но, это было и к лучшему. О результате усилий комитета, новом языке программирования, названном ПЛ/1 (PL/I, от Programming Language One — язык программирования, первый), было доложено ассоциации SHARE в марте. Не- которые специалисты характеризовали язык как бесфор- менный, переусложненный и избыточный. Другие сравни- вали его со складным ножом со 100 лезвиями, третьи сар- кастически вопрошали, почему бы проектировщикам не вставить туда еще и кухонную раковину? Надеясь, что большинство проблем, связанных с но- вым языком, прояснится в процессе реализации, фирма ИБМ дала задание своей лаборатории в Харсли (Англия) приступить к работе над компилятором. Сотрудники лабо- ратории установили, что точное определение этого массив- ного языка займет не менее 200 страниц. Язык так сильно отредактировали, что разработчики вряд ли узнали бы в получившемся результате свое творение. Однако уточнения превратили язык в практичный инструмент программиро- вания, который приветствовали многие программисты. Фирма ИБМ надеялась, что ПЛ/1 явится кульминацией всего того, что возникло в языках программирования в предыдущие десятилетия. Многие черты Фортрана, Кобо- ла и Алгола действительно нашли отражение в ПЛ/1. Но в то же время критики отмечали, что язык наделен слиш- ком многими качествами, в которых лишь увековечились ошибки прошлого. По глубокомысленному замечанию Джона Бекуса, первые коммерческие языки оказали отри- цательное влияние на развитие ПЛ/1 и последующих язы- ков программирования. «Поскольку первые языки слиш- ком глубоко проникли в среду программистов, — говорил Бекус, — они до сих пор остаются тупиками на пути к бо- лее совершенным языкам и лучшему пониманию самих компьютеров». 164
СРЕДСТВА ВЫСОКОГО УРОВНЯ ДЛЯ ПРИНЯТИЯ РЕШЕНИЙ Каждый язык программирования высокого уровня пред- ставляет собой компромисс между необходимостью точно- го описания пошагового выполнения команд, как этого требует компьютер, и стремлением человека описывать ре- шаемую задачу, опуская несущественные подробности. Язык ассемблера (с. 139—151), связанный с командами конкретного компьютера, требует от программиста выра- жать свои мысли на языке таких понятий, как централь- ный процессор, числовые адреса памяти, запоминание и считывание данных из памяти. Язык высокого уровня, на- против, разрабатывается так, чтобы скрыть особенности работы компьютера и позволить программисту сосредото- читься на самой задаче и логике ее решения. Обычно такой язык включает слова, взятые из естест- венного языка и обозначающие понятия, используемые в программировании, что намного облегчает понимание по сравнению с языком ассемблера. Однако во избежание воз- можных ошибок при переводе в машинные команды ком- пьютера, этот набор слов должен быть точно определен как часть языка. Формат программ на языке высокого уровня тоже дол- жен быть строго фиксированным. Каждый язык имеет набор правил, называемых его синтаксисом: они предпи- сывают форму, в которой должна быть выражена про- грамма. Синтаксис определяет, каким образом нужно объ- единять ключевые слова и другие элементы языка, чтобы получать более сложные конструкции, из которых в конце концов и составляется программа. Большинство языков программирования допускают много способов представле- ния данных — от простых элементов информации до сложных структур данных. Подобные структуры позволя- ют программисту так организовать информацию, что ком- пьютер может эффективно запоминать и считывать ее. Аналогично большинство языков имеют широкий диапа- зон структур, которые дают возможность управлять про- цессом обработки данных. Хотя синтаксис разных языков программирования различен — более того, синтаксис может различаться даже у разных диалектов одного и того же языка, — ряд основ- ных принципов сохраняется в большинстве современных языков. Некоторые из этих принципов мы продемонстри- руем далее на примере воображаемого языка высокого уровня, напоминающего широко известный язык програм- мирования Паскаль, используемый для учебных целей. Хо- тя приведенные нами структуры данных и управляющие структуры просты и немногочисленны, их достаточно, чтобы написать простые программы, комбинируя которые можно построить более сложные программы, например коьщьютерных игр, бухгалтерского учета и другие. 165
Средства высокого уровня для принятия решений Описания повышают ясность программ Целый тип. К данным этого ти- па относятся только целые чис- ла — положительные, отрицатель- ные и нуль. Вещественный тип. Величины этого типа используются для представления чисел, записанных с десятичной точкой (например, 1.5), в виде степени числа 10 (на- пример, 1012) или одновременно тем и другим способами. Поскольку языки программирования можно использовать для построения самых разнообразных программ, необхо- димо иметь возможность создавать и обрабатывать раз- личные типы данных. Например, программы, называемые текстовыми процессорами, обрабатывают алфавитно- цифровую знаковую информацию, объединяя ее в слова и предложения. Финансовая программа имеет дело с цифро- выми данными, производя над ними арифметические опе- рации. Во многих случаях одновременно требуются раз- ные типы данных. Большинство современных языков вы- сокого уровня обеспечивают средства разделения и разли- чения данных разных типов и хранения их по различным форматам. Основная единица информации — отдельный элемент данных, например число или слово. Эти элементы можно объединять в более сложные структуры, как показано ни- же. Подобные структуры позволяют программисту со- Строковый тип. Данные этого Логический тип. Данные этого типа могут содержать одну или типа могут содержать одно из более литер, в виде букв, цифр двух логических значений: ДА или других знаков. Часто строка или НЕТ. представляет собой имя или ка- кое-нибудь другое слово. Ъпты данных. Изображенные здесь в виде доще- чек разных цветов, данные четырех типов позво- ляют работать в языке с числами, словами и ло- гическими значениями вида ДА-НЕТ. В нашем воображаемом языке пользователь в начале про- граммы описывает идентификаторы (изображены словами в верхней части дощечек) и типы дан- ных переменных, которые встречаются в про- грамме. Значения (показаны ниже идентификато- ров) присвоены переменным, имена которых над Массив. Различные объекты одного и того же типа можно собирать в массив. В начале про- граммы пользователь должен описать идентифи- катор, тип данных и размер каждого массива. К отдельным элементам массива можно обращать- ся по номерам, называемым индексами. Индек- сы соответствуют позиции элемента в структуре. Например, в приведенном массиве под названием ВнутрПеременные к третьему элементу, равному 68.7, можно обратиться как ВнутрПеременные [3]. ними. 166
брать вместе связанные по смыслу данные, что облегчает работу с ними и повышает ее эффективность. В програм- ме каждый элемент задается идентификатором — именем, помогающим программисту следить за запоминаемой ин- формацией. Идентификатор указывает компьютеру на кон- кретное место в памяти, где хранится нужное значение; эти значения заносятся либо программистом, либо самой программой в процессе ее выполения. Поименованный элемент можно рассматривать либо как константу, т. е. значение, объявленное программистом при написании программы и не меняющееся в процессе ее выполнения, либо как переменную, значение которой мо- жет меняться во время работы. Возьмем, к примеру, про- грамму подсчета зарплаты: если бы каждый служащий имел одну и ту же почасовую ставку, то ее можно было бы описать как константу, а имя служащего и число отра- ботанных часов были бы переменными. В языке различаются разные виды информации, при- чем константам, переменным и элементам более сложных структур данных приписывается определенный тип. Четы- ре основных, базисных, типа (на противоположной стра- нице слева) позволяют программисту использовать для представления информации два вида чисел, алфавитно- цифровые строки, а также значения «да» и «нет». Во многих языках все структуры и типы данных дол- жны быть идентифицированы в разделе описаний, распо- ложенном в начале программы. Это уменьшает число ошибок и повышает эффективность выполнения програм- мы. Компьютер может заранее определить, какой объем памяти требуется для каждого элемента данных и какие операции к какому элементу применимы. Например, эле- менты типа да-нет занимают обычно меньше места в па- мяти, чем строки; вещественные и целые числа можно ум- ножать, а строки — нельзя. Запись. Связанные элементы различных типов могут храниться в записи. В начале программы пользователь дает записи имя и описывает ее элементы (называемые полями), указывая их идентификатор и тип. Запись, названная Дирек- тор, содержит три поля: Имя содержит данные строкового типа; Нанят содержит данные цело- го типа, а поле Семейный? — данные логическо- го типа, т.е. ответ вида ДА-НЕТ на вопрос «Се- мейный ли человек данный служащий?» К полю обращаются, указывая имя записи и идентифика- тор поля: поле Директор. Имя содержит Джон Браун. Массив записей. Простые структуры данных можно комбинировать в сложные, например мас- сив, в котором каждый элемент представляет со- бой запись. В массиве все записи рассматрива- ются как элементы одного типа: каждая запись имеет одинаковое количество полей одного типа, но с разными значениями. Элементарный объект массива записей обозначается идентификатором массива, индексом записи и полем в записи. Так, в массиве Служащие обозначение Служащие]!]. Нанят указывает на число 1982. 167
Средства высокого уровня для принятия решений Операции для обработки данных Простейшие манипуляции с данными задаются в програм- ме с помощью операций — слов или знаков, сообщающих компьютеру, например, о том, что нужно перемножить два числа, сцепить значения двух строковых переменных или сравнить содержимое двух переменных. Операции комбинируются с идентификаторами данных в конструк- ции, называемые операторами (аналогами предложений естественного языка); последние определяют задачи, кото- рые компьютер должен выполнить. Каждая операция имеет дело с данными строго опреде- ленных типов и всегда выдает результаты тоже заданного Образец операций и функций Операции. Простые операции, показанные спра- ва, используются в так называемом операторе присваивания «: = » (изображенном на тумбе на противоположной странице), который обозначает присваивание значения переменной. Для верхней операции сложения оператор присваивания вы- глядел бы так: Сумма := Число!+Число2. По- скольку переменные Число! и Число2 имеют це- лый тип, компьютер интерпретирует операцию «+» как арифметическую; он складывает значе- ния переменных и присваивает результат 5 пере- менной Сумма. Во втором примере переменные Слово! и Слово2 имеют строковый тип, и по- этому компьютер интерпретирует знак «+» как операцию конкатенации (сцепления) строк. Он соединяет слова «ком» и «пот», присваивая сло- во «компот» переменной (НовСлово). Третий пример — операция отношения — требует от компьютера сравнить значения, содержащиеся в двух целых переменных. Если значение Цена меньше или равно значению Сбережения, то пе- ременной логического типа Куплено присваивает- ся значение ДА, в противном случает она полу- чает НЕТ. Функции. Пример, показанный справа, демон- стрирует работу функции sqrt, находящей ква- дратный корень. Если значение целой перемен- ной Площадь равно 2, то компьютер, используя функцию sqrt, получит значение 1.4142, которое присваивается вещественной переменной Сто- рона. 168
типа. В нашем гипотетическом языке две арифметические операции — вычитание (-) и умножение (*) — работают только с числами вещественного или целого типов, выда- вая результат того же типа. Знак плюс (+) кроме обработ- ки числовых значений может также сцеплять данные стро- кового типа, выполняя операцию под названием конка- тенация. Операции отношения выполняют сравнения между эле- ментами одного и того же типа данных (за исключением логического), и всегда выдают результат логического типа (вида да-нет). Применительно к числам такие операции определяют, больше ли одно число другого (>), больше или равно (>=), равно (=), меньше (<), меньше или рав- но (< = ), не равно (< >). Для строк эти же операции вы- полняют проверку лексикографического порядка. Более сложные манипуляции с данными, которые мо- гут потребоваться программистам, выражаются в языках как функции (слева). Функция заменяет несколько операто- ров или простых операций, которые в противном случае потребовалось бы написать, например, для нахождения квадратного корня. символизируют операторы, которые должен вы- полнить компьютер. В нашем случае первый оператор осуществляет операцию присваивания (:=), занося значение 0 в переменную Время. 169
Средства высокого уровня для принятия решений Последовательное продвижение по программе По мере выполнения операторов ком- пьютер обращается к памяти, изображен- ной здесь в виде табло с дощечками, со- держащими значения; иногда оператор изменяет запомненные значения. Выпол- няя, например, оператор Сумма := К + М, компьютер складывает значения К и М и заносит результат в переменную Сумма. Затем компьютер задействует следующий оператор — Вывод(Сумма), в результате чего новое значение перемен- ной Сумма выводится на печать.
В наиболее общем виде выполняемая часть программы (иногда называемая телом) представляет собой последова- тельность операторов, которые компьютер перебирает один за другим подряд: все операции, задаваемые одним оператором, выполняются прежде, чем перейти к следую- щему. Во многих языках программирования начало и ко- нец тела программы помечаются специальными ключевы- ми словами (в нашем случае это НАЧАЛО и КОНЕЦ). При продвижении по программе компьютер должен об- ращаться к значениям, хранимым в памяти. Иногда в ре- зультате работы программы эти значения меняются. Из- менение значения не влияет на имя элемента данных и его размещение в памяти. НАЧАЛО и КОНЕЦ — только два из набора ключевых слов, управляющих продвижением компьютера по программе. Другие ключевые слова ис- пользуются при записи более сложных управляющих структур, чем простая последовательность операторов; не- которые из них приведены на последующих страницах. Ключевые слова, явно определенные в языке, должны при- меняться в строгом соответствии с синтаксисом. Если про- граммист по ошибке возьмет, например, слово НАЧАЛО для наименования переменной, то возникнет ошибка при трансляции программы: в соответствии с синтаксисом языка это слово будет рассматриваться как начало тела новой программы.
Средства высокого уровня для принятия решений Компьютер на распутье 172
В программе должна предусматриваться возможность вы- бора из нескольких вариантов, для каждого из которых в зависимости от определенного условия, выполняется раз- личная последовательность операторов. Например, про- грамма, управляющая кондиционером воздуха, могла бы выбирать одну группу операторов, если температура воз- духа ниже 20°С, и другую — если температура повы- силась. Этот вид управляющих структур называется условным ветвлением, или условным оператором; один из способов реализации такого разветвления в программе — оператор ЕСЛИ, который сравнивает два значения, делая на основе этого выбор. Обычно сравнение производится с помощью операций отношения; так, в программе управления конди- ционером мог быть оператор ЕСЛИ Темп > = 20 ТО Охл: = вкл. Поскольку результат операции сравнения мо- жет быть только логического типа, при сравнении пере- менной Темп и числа 20 получится либо ДА, либо НЕТ. Когда условие, задаваемое ключевым словом ЕСЛИ, ис- тинно (в нашем случае Темп больше или равна 20), ком- пьютер осуществит действия, заданные после ключевого слова ТО — присвоит значение вкл переменной Охл. Если же условие не удовлетворяется, то, поскольку слово ИНА- ЧЕ в этой конструкции отсутствует, компьютер просто выполнит следующий оператор в последовательности. ЕСЛИ Сбережения > = Цена ТО ИНАЧЕ Как изображено на рисунке, в условном операторе компьютер переходит, напри- мер, на оператор печати чека на покупку, если значение переменной Сбережения оказывается больше, чем Цена, если же это условие не удовлетворяется, то ком- пьютер предпринимает другие действия, например выдает сообщение о недостатке денег. Сбере- Цена жения Значения, хранящиеся в переменных Сбе- режения и Цена, указывают на то, что можно израсходовать 20 руб., а предпо- лагаемый расход — 8 руб. 98 коп. Когда компьютер сравнит эти величины, то ус- ловие для успешной покупки выполнится, и соответствующий шлагбаум откроет- ся — компьютер может перейти к вы- полнению последующих действий. В про- тивном случае открылся бы другой шлагбаум, и компьютер перешел бы к другой последовательности операторов. 173
Средства высокого уровня для принятия решений Эх раз, еще раз н^° При входе в цикл в програм- ме встречается оператор ПО- КА. Если вес коробки с пе- ченьем не меньше 2 кг, то программа проходит мимо входа в цикл на последующие операторы. Если же вес мень- ше 2 кг, то шлагбаум откры- вается и компьютер выполня- ет три оператора, которые он встретит. Добавив одно пе- ченье в коробку, программа обновляет значение перемен- ных Вес и Счетчик, после че- ‘го возвращается ко входу в цикл. Вес.- Вес+Печенье; Компьютеры отлично приспособлены к осуществлению повторяющихся действий. В большинстве языков высоко- го уровня предусмотрена возможность записать повторяе- мую последовательность операторов с помощью управля- ющей структуры, называемой циклом. Одна из таких кон- струкций начинается с ключевого слова ПОКА, которое указывает, что компьютер должен проверять заданное ус- ловие и каждый раз, когда оно оказывается истинным, вы- полнять указанную далее группу операторов, заключенную лддщцслюч^ыми словами НАЧАЛО и КОНЕЦ. Цикл гВып°0Т ПОКА 174
может начинаться также словом ДЛЯ, которое указывает, что группу операторов нужно выполнить заданное число раз. Приведенная на рисунке часть программы, управляю- щей упаковкой печенья в двухкилограммовые коробки, со- держит оператор ПОКА и три подчиненных оператора, заключенных между ключевыми словами НАЧАЛО и КО- НЕЦ. Этот оператор цикла говорит компьютеру, что нуж- но выполнять группу операторов до тех пор, пока вес ко- робки не станет больше или равным 2 кг. В теле цикла сначала вводится вес печенья, добавляемого в коробку, за- тем этот вес прибавляется к весу всей коробки и наконец прибавляется единица к счетчику числа печений в коробке. Когда встречается слово КОНЕЦ, происходит возврат к слову ПОКА и опять проверяется условие (в нашем случае то, что вес коробки меньше 2 кг), чтобы узнать, нужно ли повторить цикл еще раз. Когда условие перестанет быть истинным, компьютер перейдет к следующей части программы. 175
Средства высокого уровня для принятия решений Общий вид программы 1 „ * - Служащим Пронумерованные операторы показанной ниже простой программы соответствуют номерам строк в тексте программы (справа). Программа, в которой скомби- нированы различные элементы Паскаль- подобного языка, подсчитывает ежеме- сячную зарплату служащих фирмы. Дан- ные на табло слева можно использовать и менять с помощью любого оператора программы. НАЧАЛО ПРОГРАММА ПодсчетЗаргщаты: 1) ТИП Человек - ЗАПИСЬ Имя:СТРОКА: Часы. Ставка: ВЕЩЕСТВЕННОЕ: КОНЕЦ: ПЕРЕМЕННЕЕ Итого. Зарплата: ВЕЩЕСТВЕННОЕ: ЧислоСлужащих.Счетчик:ЦЕЛОЕ: Месяц:СТРОКА: Служащий:Человек: НАЧАЛО 2) ВводеЧислоСлужащих): 3) Вводе Месяц): 4) Итого :- 0.0: 5) ЕСЛИ ЧислоСлужащих>-1 ТО 6) ДЛЯ Счетчик 1 ДО ЧислоСлужащих ВЫПОЛНЯТЬ НАЧАЛО 7) Вводе Служащий. Часы. Служащий. Ставка. Служащий. Имя): 8) Зарплата :• Служащий.Часы*Служаший.Ставка: 9) Итого :• Итого ♦ Зарплата; 10) Выводе Служащий. Имя. Служащий. Часы. Зарплата); КОНЕЦ 11) ИНАЧЕ Выводе"В этом месяце служащих не было"); 12) Выгоде"За “.Месяц." выплачено ".Итого): КОНЕЦ
Чтобы получить полезную программу, требуется лишь не- сколько структур данных и управляющих структур. Приве- денная здесь простая программа подсчета зарплаты объ- единяет условный оператор ЕСЛИ, оператор цикла и не- сколько типов данных для получения списка имен служа- щих, их зарплаты и общей суммы зарплаты за месяц. Первая строка указывает имя программы; следующая часть (1) описывает типы данных и переменные. Тело про- граммы начинается ключевым словом НАЧАЛО, за ним следуют операторы ввода данных (2 и 3), которые прика- зывают компьютеру запросить значения двух переменных: ЧислоСлужащих и Месяц (название текущего месяца). Оператор присваивания (4) задает начальное значение для переменной Итого равным 0.0 долл. Оператор ЕСЛИ-ТО (5) проверяет величину переменной ЧислоСлужащих\ если она меньше 1, то это значит, что в данном месяце компания не имела служащих, и компью- тер сразу переходит к слову ИНАЧЕ (11). В противном случае выполняется цикл, начинающийся со слова ДЛЯ (6). Этот оператор требует повторять операторы между НАЧАЛО и КОНЕЦ, добавляя каждый раз 1 к перемен- ной Счетчик при проходе по циклу. Когда Счетчик станет равным ЧислоСлужащих, последовательность операторов выполнится последний раз и компьютер перейдет к следу- ющим операторам. Внутри оператора цикла повторяются ввод данных об очередном служащем в запись Служащий (7), вычисление зарплаты служащего за месяц (8), добавление этой зарпла- ты в общий итог (9) и дополнение ведомости еще одной строчкой, содержащей имя служащего, число отработан- ных часов и зарплату за месяц (10). Ключевое слово ИНАЧЕ (11) указывает заключитель- ную часть оператора ЕСЛИ-ТО-ИНАЧЕ, которую ком- пьютер выполняет только в том случае, если условие в операторе ЕСЛИ (5) неистинно. В противном случае он об- ходит эту часть, переходя к заключительному оператору программы (12), который требует выдать общую сумму зарплаты за текущий месяц. 177
Средства высокого уровня для принятия решений Процедуры — средство борьбы со сложностью программ Если в разных местах программы нужно выполнять одну и ту же последовательность действий, то программист мо- жет сэкономить время и усилия, воспользовавшись специ- альным средством, называемым подпрограммой или про- цедурой. По существу, это — программа внутри програм- мы. Процедура представляет собой последовательность операторов, заключенную между ключевыми словами НА- ЧАЛО и КОНЕЦ. Эта последовательность имеет имя, по ПРОЦЕДУРА ВыдатьОдинЧек(ПЕРЕМЕННЫЕ Итого:ВЕЩЕСТВЕННОЕ): КОНЕЦ ПЕРЕМЕННЫЕ Часы.Ставка.Зарплата:ВЕЩЕСТВЕННОЕ; Имя:СТРОКА; которому она вызывается из тела программы. Всякий раз, когда компьютер встречает имя процедуры, он передает ей управление, выполняя всю последовательность операто- ров, указанную в ее теле, после чего возвращается к сле- дующему оператору в главной программе. НАЧАЛО Ввод(Часы.Ставка.Имя): Зарплата : = Часы Ставка; Итого :- Итого ♦ Зарплата; НапечататьЧек(Часы.Зарплата.Имя); Кольцевая дорога, показанная на рисунке, изображает процедуру ВыдатьОдинЧек; ее операторы соответствуют тексту программы. На табло ее локальных данных представлены четыре локальные переменные, которые до- ступны только из процедуры; глобальные данные на табло в начале программы (ввер- ху) могут читаться и меняться из любого места программы. 178
В более сложной, чем приведенная здесь, программе подсчета зарплаты могло бы потребоваться печатать чек в различных точках программы. Как показано на врезке, все операторы выдачи чека можно объединить в процеду- ру с названием ВыдатьОдинЧек, которая должна исполь- зоваться всякий раз, когда нужно напечатать чек. Процедура ВыдатьОдинЧек имеет свои собственные данные в виде локальных переменных, которые могут ис- пользоваться и меняться только операторами, принадле- жащими этой процедуре. Информация, которая должна быть доступна из любой точки программы, называется глобальными данными. Такое разделение уровней данных предотвращает ряд ошибок, которые в противном случае могли бы появляться в больших программах. Например, одно и тоже имя переменной могли независимо использо- вать несколько не связанных друг с другом процедур: если переменная оказалась бы глобальной, то каждый раз при ее изменении одной процедурой другая тоже получала бы новое и, возможно, не ожидаемое ею значение. Если же переменные локальны, то ни одна процедура не может по- влиять на данные другой, даже если одно и то же имя встречается в каждой’из них. 4 3
Гггггггг ГГГГГГГ ШГГГГ ГГГГГГ.Г
ДЕСЯТИЛЕТИЕ ДИНАМИЧНОГО РАЗВИТИЯ В 60—70-е годы солидные деловые, академические и военные учреждения тратили огромные средства и усилия на разработку новых языков, предна- значенных для программирования со- временных компьютеров. В самом начале 60-х годов мир компьютерных языков казался очень простым. В программировании господствовали три языка: Фортран и Кобол владели американ- ской наукой и бизнесом, Алгол-60 был распространен в Европе. Новейший язык ПЛ/1 претендовал на то, чтобы, соединив в себе лучшие черты этих трех языков, стать универсальным языковым средством. Но при внешнем спокойствии шла на- пряженная работа. В колледжах и исследовательских лабораториях фирм, в работах отдельных исследователей и дискуссиях в авторитетных комитетах зарождались но- вые языки, предназначенные для программирования современных компьютеров. К концу 60-х годов языки начали размножаться в таком темпе, что, по словам одного специалиста по информатике, разработчику «следовало знать не менее десятка язы- ков, чтобы заслужить общественное признание». Некоторые разработчики пытались создать совершенно новые языки, облегчаю- щие решение специальных задач. Программисты тоже непрестанно модифицирова- ли компиляторы для существующих языков, совершенствуя их и меняя тем самым набор формальных правил языка, определенный разработчиком. В результате появились многочисленные варианты языков, называемые подмно- жествами, расширениями и диалектами. Подмножество — это версия языка, вклю- чающая только часть возможностей полного языка. Расширение — расширенная версия, дополненная новыми свойствами, делающими язык более разносторонним. Диалекты содержат незначительные изменения, которые способствуют либо наст- ройке языка на специальное применение, либо выявлению сильных сторон конкрет- ного компьютера. Диалекты несовместимы как с исходным языком, так и с други- ми диалектами того же языка; программа, написанная на одном диалекте, не мо- жет транслироваться компилятором, разработанным для другого диалекта. Эта нелепая ситуация была обыграна в 1969 г., когда Джин Сэммит опубликова- ла книгу «Языки программирования» — первый сравнительный исторический обзор достижений в этой области. На суперобложке и лицевом форзаце книги красовалась небрежно построенная башня, спирально устремляющаяся в небо, на которой были начертаны названия 117 различных языков. На самой вершине башни, как бы вен- чая все остальное, было написано BABEL (Вавилон — символ смешения языков). Однако это сооружение воспринималось как памятник созидательной мощи нового научного направления. Программисты писали новые языки не просто для самовыражения — компьютеры стремительно проникали в новые сферы, и программисты должны были приспосабливать к ним языки. И сегодня не менее половины всех языков программирования продолжает служить в какой-то конкретной области, будь то техника или компьютерная графика. В отличие от Фортрана и других универсальных языков программирования (которые, хотя и создавались для решения задач определенного вида, на са- мом деле оказались применимы почти к любой задаче) специализированные языки непригодны за пределами конкретной узкой области. Старейший из 181
toll 'i - pESOPT [M ^faltran!___ Jf"2~7AMTRAN L------ ^^MovieJ I APL _ lAPL/360| /APT I ___ ^bacaic| fbaseball | BUGSYS j- _/c—lQ TclpTi cobolT" COGOI ~|COLASI{ I fcOMIT I aed] Iaimaco] ALGYjJ AMBIT I [BASIC! I Г'_|С11рТ\ ICOGENT 1 [ COLINGO commercial Translator J---- -----------[-Computer Compiler r~[CPS~| ГрдТА^ТЕХт] ~ DIMATE 1 "dynamo""? [Culler-Fried] [deacon I ~~~[docus£ dysac________' --fDASj.-----1 ]bsL/90lTp^ANA4- -*-П^еге£^. ExtendedAUSOJ^^—» vsl \>~“r J—rGrapfr|C]_ ri_—-• f473L Query FformacLL r^FQRTRANS'L [~GPSS~ "JOSS F~grafj_ IDsJX— TjQYlAL flap it LISP V f L2IL=— f-—ujuTAL I ^ss'\ I I ЦчЕиАСр-Г-Г QUWT^T** OCAL "pU}] TMG MAO tiffin [LOTg, mapJL— i Vj^AlL-r 'Vpri^X-Ц 1 VO^A^jJjj ^^21 Strnul- Dig- Syst- SPRINT ( ["STRESS ^RAcT~^RANDI^^^^EET Short Code] SIMSCRIPT | [SIMULA SNOBOL | | SOL | fspwcfaxUng Y"8 STROBES ! 1 Symbolic Math. Lab." ' — — " 1 UNCOL I 1 UNICODE специализированных языков, используемый до сих пор, — АПТ (APT, от Automatically Programmed Tools — автома- тически программируемые инструменты). АПТ был разра- ботан по контракту с ВВС США электромеханической ла- бораторией Массачусетского технологического института (МТИ). Работа над языком началась в 1957 г., когда был создан Фортран — первый широко распространенный уни- версальный язык программирования. Цель была весьма специфическая — получить средство написания программ, которые, будучи закодированными на перфоленте и вве- денными в металлообрабатывающие станки, автоматичес- ки управляли бы процессом обработки металлических де- талей самолетов и других предметов, изготовляемых на станках (по существу делали бы предметы из чисел). Группу по созданию АПТ возглавлял Дуглас Т. Росс, математик и самоучка-программист, которому только что исполнилось 20 лет. Заканчивая МТИ, Росс оказался свя- занным с АПТ и другими важными проектами ВВС США, в частности с разработкой компьютеризованного способа оценки системы управления огнем в бомбардировщике В-58. После многих месяцев предварительной работы Росс сформулировал основы нового языка за один затянувший- ся уик-энд в мае 1957 г., разработав систему обозначений, насколько возможно близкую к английскому языку как по семантике, так и по синтаксису. В результате возник уди- вительно простой и легкий в изучении язык. Например, программа на АПТ, предназначенная для обработки опре- деленной детали, использовала фразы типа TL DIA/+ 1.0,INCH, что означает: диаметр (DIAmeter) режущего ин- струмента (TooL) равен 1.0 дюйму (INCH). В 1959 г. о языке АПТ и системе управления металло- Это изображение «Вавилонской башни» компьютерного века украшало супероб- ложку книги Джин Сэммит «Языки про- граммирования», в которой содержался обзор множества не совместимых друг с другом компьютерных языков, существо- вавших к моменту выхода книги в свет (1969). Для целого поколения специали- стов по информатике эта иллюстрация символизировала неэффективность сопро- вождения множества языков, каждый из которых нуждался в собственном транс- ляторе и специально обученных програм- мистах. режущими станками, разработанной в МТИ, было расска- зано на пресс-конференции, где репортеры получили в ка- честве сувениров алюминиевые пепельницы, изготовлен- ные с помощью программ, написанных на новом языке. Как вспоминал Росс, на пресс-конференции присутствовал знаменитый радиокомментатор Ловел Томас, который в очередной радиопередаче не смог удержаться от каламбу- ра: «Почти все способно случиться» (суть каламбура в со- впадении названия языка APT и слова «apt» — способ- ный. — Перев.) Система АПТ открыла современную эру компьютер- ных средств производства; сейчас машины автоматически изготовляют все — от деталей автомобилей и самолетов до искусственных протезов. Опять же благодаря усилиям Росса компьютеры стали весьма интенсивно использо- ваться и в проектных работах. Так, он курировал разра- ботку языка АЕД (AED, от ALGOL Extended for Design — Алгол, расширенный для проектирования), предназначен- 182
ного для написания программ компьютерного проектиро- вания деталей, сборка которых осуществлялась бы в даль- нейшем программно-управляемыми станками. Было создано множество других специализированных языков, с помощью которых строилось программное обеспечение, используемое в различных областях деятель- ности: гражданском строительстве, социологических ис- следованиях, музыкальной композиции, редактировании текстов и кинопроизводстве. Некоторые из этих языков в свою очередь породили новые. Например, в 60-х годах бы- ло создано два языка, Мови и Сканер, которые способ- ствовали внедрению компьютера в мультипликацию. От этой пары произошла система БАГСИС (Bug System — система «жук»), позволявшая перемещать по экрану ком- пьютера фигурки, похожие на жуков. В зависимости от команды, «жук» мог изменять яркость элемента изобра- жения (пиксела), на котором он находился, или помечать участок экрана. Такие свойства сделали БАГСИС незаме- нимым и в научно-исследовательских программах, в част- ности при анализе микрофотографий нервных волокон. В некоторых случаях языки, предназначенные первона- чально для конкретных задач, в действительности находи- ли достаточно широкое применение, обретая статус уни- версальных. Наиболее примечательные примеры этого мы видим в области искусственного интелекта (ИИ) — разде- ла информатики, ставящего своей целью создание про- грамм, имитирующих способность человека к обучению и размышлению. С 50-х годов специалисты по ИИ искали язык, пригод- ный для манипулирования понятиями, выраженными сло- вами и фразами на естественном языке. Первым результа- том этих поисков явилось семейство языков цод названи- ем ИПЛ (IPL, от Information Processing Languages — язы- ки обработки информации). Оно было создано пионером ИИ Алленом Ньюэллом и его сотрудниками. Вначале ра- бота велась в «Рэнд корпорейшн», а затем в Технологиче- ском институте Карнеги (позднее Карнеги—Меллона) в Питтсбурге, бастионе исследований по ИИ. Центральной идеей ИПЛ было понятие списка. Представляя данные в виде спиека слов и других символов, программист мог связать понятия в памяти компьютера примерно таким же образом, как, по мнению специалистов по ИИ, организо- ван человеческий мозг. Понятие списка интересовало и другого выдающегося члена тесного сообщества исследователей ИИ — Джона Маккарти, блестящего и разностороннего математика. В 1958 г., когда при его помощи организовалась лаборато- рия по ИИ при МТИ, Маккарти начал работу над языком высокого уровня, в котором понятие списка сочеталось с- системой обозначений, заимствованной из экзотической области математики — так называемого ламбда- исчисления. Введенное в 1931 г. математиком и логиком Алонзо Черчем, это исчисление оперирует только тремя элементами: символами, представляющими переменные и константы, скобками для группировки символов и обозна- чениями функций, выражаемыми греческой буквой «ламб- ---- да». Маккарти назвал свой язык Лисп (LISP, от LISt ==^=7^ Processing — обработка списков). вложенный код Даже небольшой фрагмент программы на Лиспе может содержать десятки пар скобок, определяющих списки. Ча- сто пары скобок вкладываются друг в друга, образуя спи- сок внутри списка, который в свою очередь также нахо- дится внутри списка (иногда бывает 8-10 уровней вложен- ности). В списке (PUT(QUOTE SHIP)(QUOTE LOC)(QU- ОТЕ (7 5))) функция PUT назначает для размещения • (LOCation) корабля (SHIP) декартовы координаты (7,5); функция QUOTE показывает, что нужно использовать имя списка или просто символ, а не его значение; символ LOC — имя свойства (в нашем случае размещения), при- надлежащего символу SHIP. Возможно, наиболее существенное свойство Лиспа со- стоит в том, что данные, программы и даже сам язык — представляют собой просто списки символов в скобках. Хотя подобная структура и сложна для чтения, она позво- ляет не только писать программы, которые в свою оче- редь могут писать или модифицировать другие програм- мы, но и получать программы или подпрограммы, спо- собные обращаться сами к себе. Такой способ программи- рования называется рекурсией (с. 188—189). Оба этих свой- ства Лиспа оказались весьма полезны в попытках ИИ имитировать всю сложность процесса человеческого мышления. Специалисты по информатике восхищались как эле- гантностью, так и утилитарностью Лиспа, особенно после публикации в 1960 г. широко известной статьи Маккарти под заглавием «Рекурсивные функции и символьные вы- числения», в которой излагалось математическое обосно- вание применения Лиспа. «Лисп был для нас не просто языком, который используют для определенных целей, — говорил Пол Абрахамс, бывший дипломником у Маккар- ти в период разработки нового языка, — им можно было любоваться, как прелестной вещью. Поэтому существова- ла постоянная напряженность в отношениях между теми, кто восхищался Лиспом за его чистоту, и теми, кто стре- мился использовать его для различных вычислений. Без- условно, с помощью Лиспа проделано множество вычис- лений. Но в самом начале было не так. Часто говорили, что главная цель Лиспа — делать больше Лиспа». Кроме Лиспа Маккарти предложил в 1959 г. понятие разделения времени, что позволило обслуживать почти од- новременно одним мощным компьютером большое число пользователей, работающих за терминалом, избавляя их от необходимости ждать, пока одна за другой обрабаты- ваются их программы. Благодаря настойчивости Маккар- ти в МТИ был начат ряд проектов разделения времени, и несколько лет спустя два профессора Дартмутского кол- леджа, Джон Кемени и Томас Курц позаимствовали эту идею для своего вводного курса по информатике. В даль- 183
Команды для металлообрабаты- вающих станков Язык АПТ был создан в МТИ в рамках проекта «Автома- тически программируемый инструмент». Этот язык, со- стоящий из простых описательных фраз, используется для управления станком, оснащенным встроенным компьюте- ром. Станок изготовляет детали строго заданной формы для самых разнообразных конструкций — от боевых само- летов до детских игрушек. простой металлической детали; объясне- ния к командам, строка за строкой, при- водятся в правой колонке. Команды, на- писанные на ранней (1959) версии АПТ, Переместиться влево вдоль линии, соединя- ющей точки (2,4) и (1,3), до пересечения ли- нии BASE. управляют режущим инструментом (по- GOTO/SETPT Передвинуться по прямой до точки SETPT казан на схеме кружками) который, пере- COOLNT/OFF Выключить охлаждение мещаясь в срной плоскости, вырезает двумерную форму. Для получения трех- SPINDL/OFF Выключить вращение шпинделя мерных деталей требуется более сложное END Конец работы программирование. FINI Конец программы Работая на АПТ, программист начинает с наброска желаемой формы металлической детали на пронумерован- ной сетке, нарисованной на бумаге: при этом линии, точки и кривые помечаются обычными английскими словами ти- па BASE (база) и TIP (кончик). Используя это простое ана- томическое описание для ссылок, программист составляет команды, задавая компьютеру, управляющему станком, информацию трех видов. Во-первых, описывается используемый инструмент, т.е. размер головки резца и скорость его движения отно- сительно металла. Во-вторых, математически описывает- ся форма объекта: координаты сетки задают отдельные точки, которые в дальнейшем служат метками для опре- деления прямых и кривых линий. И наконец, программист перечисляет все перемещения резца от одной поименован- ной точки или кривой к другой, пока не встретится коман- да остановки станка FINI. Программа CUTTER/1 TOLER/.005 FEDRAT/80 HEAD/1 MODE/1 SPINDLZ2400 COOLNT/FLOOD РТ1 = POINT/4,5 FROM/(SETPT = POINT/1,1) INDIR/(TIP = POINT/1,3) Объяснение Использовать резец диаметром 1 дюйм Допуск резания 0,005 дюйма Скорость перемещения 80 дюйм/мин Использовать головку N 1 Режим работы N 1 Скорость вращения шпинделя 2400 об/мин Включить жидкостное охлаждение Присвоить точке с координатами (4,5) имя PT1 Начальная установка инструмента в точке с именем SETPT и координатами (1,1) Задать направление движения к точке TIP с координатами (1,3) BASE = LINE/TIP,AT ANGL,0 Определить линию BASE, проходящую че- рез точку TIP и образующую с горизон- талью угол 0 градусов GOnO,BASE Переместиться к линии BASE TL RGT,GO RGT/BASE С инструментом в правом положении пере- меститься вправо вдоль линии BASE GO FWD/(ELLIPS/CENTER, РТ1,3,2,0) Переместиться вдоль эллипса с центром в точке РТ1, полуосями 3,2 и главной полу- осью, образующей угол 0 градусов с гори- зонтом GO LFT/(LINE/2,4,1,3,), PAST, BASE 184
нейшем для обучения начаткам программирования на сво- ей новой системе разделения времени Кемени и Курц на- писали простой, легкий в изучении язык, моделируемый на Фортране. Они назвали его Бейсик (BASIC, от Beginner’s All-purpose Symbolic Instruction Code — универ- сальный код символических инструкций для начинающих). Бейсику (богатому на диалекты) было суждено завоевать невероятную популярность и стать основным языком мик- рокомпьютерной революции, начавшейся в 70-х годах. Сегодня в США Лисп остается основным языком про- граммирования в исследованиях по ИИ и вторым (после Фортрана) универсальным языком для широкого примене- ния. Скорость и легкость, с которой можно писать, вы- полнять и видоизменять программы на Лиспе, способство- вали появлению многочисленных поклонников этого языка и за пределами лабораторий ИИ. Подобно большинству популярных языков, Лисп породил обширное потомство. Например, в Великобритании признанным языком для ИИ является производный от Лиспа язык ПОП-2 (РОР-2), соз- данный в 60-х годах и названный в честь одного из его соавторов, Робина Дж. Попплстона из Эдинбургского уни- верситета. Лисп и другие языки обработки списков относятся к процедурным языкам. Наряду с такими языками, как Фортран и Кобол, они задают компьютеру явную после- довательность действий, которую нужно выполнить для решения задачи. В отличие от этого непроцедурные языки позволяют программисту просто описывать желаемый ре- зультат, не задавая точного способа его получения. При- мером непроцедурного языка может служить Пролог (PROLOG, от PROgramming in LOGic — программирова- ние в логике), разработанный в 1972 г. Аланом Колмари из университета в Лумини (Марсель). ФАКТЫ, ОТНОШЕНИЯ И ВЫВОДЫ Выдержанный в традициях формальной логики, Пролог приобрел много горячих сторонников в европейских иссле- довательских центрах по ИИ. При работе с ним програм- мистам не требуется расписывать шаг за шагом процедуры — достаточно просто определить множество фактов и установить отношения между ними (см. с. ООО- ООО), например, что «телега» и «автомобиль», квалифици- руются как нечто, называемое «средствоПередвижения», и что это «средствоПередвижения» имеет что-то, что назы- вается «колеса». С помощью этих соотношений процеду- ры, уже встроенные в язык, получают логический вывод о том, что, скажем, «автомобиль» имеет «колеса». Эта особенность делает Пролог очень удобным для написания некой разновидности программ, получивших название «экспертные системы» — наиболее значимый в коммерче- ском отношении результат, полученный в исследованиях по ИИ. Строя логические выводы на основе человеческих знаний, введенных в программу, экспертные системы до- биваются успехов в таких областях деятельности, как диагностика заболеваний, поиск месторождений полезных ископаемых. По существу все языки обработки списков, а также Пролог возникли в академических сферах. Два других важ- ных универсальных языка обязаны своим рождением ис- следовательским лабораториям гигантских корпораций. Первый (по времени) из них, АПЛ (APL, от A Programm- ing Language — язык программирования), был разработан Кеннетом Айверсоном, в прошлом профессором Гарвард- ского университета, который перешел в фирму ИБМ. Не- смотря на непритязательное название, АПЛ настолько от- личается от других языков, что один английский специа- лист по информатике выразил свое отношение к нему ци- татой из Оскара Уайлда: «Я не говорил, что это мне нра- вится, Гарри. Я сказал, что это пленило меня. А это большая разница». Возможно, наибольшее отклонение АПЛ от привычно- го связано с его внешней формой. Язык содержит 95 ли- тер, включающих латинские и греческие буквы, арабские цифры, такие символы, как ромбик и звездочка, и так на- зываемые джоты; основной набор литер дополняется еще примерно 55 дополнительными символами, которые пред- ставляют собой комбинации основных литер. Другое отличие — удивительная компактность языка. Используя АПЛ, можно записать в одну строку или в две функции то, что на других языках потребовало бы целых страниц или экранов, «исписанных» процедурами. ЗАГАДОЧНАЯ ЧИСЛОВАЯ МЕЛЬНИЦА Необычный набор символов в сочетании с лаконичностью записи делает АПЛ настолько трудным для чтения, что зачастую программисты не могут расшифровать собствен- ную работу. Однако эти же особенности составляют и одну из самых привлекательных черт АПЛ: способность манипулировать с таблицами чисел так же эффективно, как и с отдельными числами. Это качество фактически возвращает компьютеру его первоначальную роль — мощ- ного арифмометра, способного быстро обрабатывать мас- сивы статистической и другой числовой информации. Возникновение АПЛ относится к концу 50-х годов, ког- да Айверсон — этот, как он сам себя называл, «ренегат от математики» — вел курс вычислительной математики в Гарварде. Разрабатывая АПЛ, он намеревался создать не язык программирования, а систему обозначений, позво- ляющую ясно и сжато выражать понятия вычислительной математики, которые он излагал в своих лекциях и книге под названием «Автоматическая обработка данных». Позже Айверсон пояснял, что его идеи, касающиеся программирования, сформировались под влиянием друго- го «ренегата от математики», его Гарвардского препода- вателя Говарда Айкена, гениального инициатора разра- ботки первого гарвардского компьютера «Марк-1». «Хотя склад его ума был скорее теоретическим, — говорил Айверсон об Айкене, — он всегда считал себя инженером. Он характеризовал инженера как человека, который на доллар может сделать то, на что другому потребуется де- сять, и всегда делал упор на простоту. Мне, как, вероятно, и всем его студентам особенно запомнилось, как всякий 185
раз, выслушав чье-нибудь горячее, но сбивчивое изложение какой-либо идеи, он заявлял: «Я человек простой и этого не понимаю. Может, вы попытаетесь объяснить все попроще?»» Язык АПЛ, созданный Айверсоном, соответствовал требованиям простоты, но на протяжении многих лет оставался не более чем системой обозначений, существо- вавшей лишь на бумаге. Закончив в 1960 г. работу в Гар- варде, Айверсон перешел в фирму ИБМ, в исследователь- ский центр Томаса Дж. Уотсона в Йорктаун-Хейтсе, шт. Нью-Йорк. Здесь совместно с инженером Эдином Фалкоф- фом и другими он разработал нестандартный набор литер языка АПЛ и возглавил группу, которая занималась ре- ализацией нового языка на компьютере IBM-360. Адми- нистрация компании относилась к этой работе без особого энтузиазма; в то время руководство придерживалось так называемой «политики одного языка», внедряя ПЛ/1 как универсальный язык. Благодушное безразличие админи- страции пошло на пользу, так как позволило Айверсону и Фалкоффу, спокойно поэкспериментировав, отшлифо- вать язык. В 1966 г. программисты ИБМ, начав использо- вать новый язык на экспериментальной системе разделе- ния времени, обнаружили, что на нем можно легко и бы- стро решать сложные задачи. Когда сведения о новом программном средстве распространились за пределами фирмы, ее забросали просьбами открыть АПЛ для широ- кого применения. В 1969 г. более 500 человек присутствовало на конфе- ренции, посвященной АПЛ, которая проходила в штаб- квартире ИБМ в Армонке, Нью-Йорк. На фирму обру- шился такой шквал требований довести АПЛ до потреби- телей, что участники конференции в дальнейшем называли ее не иначе, как «Демонстрация в Армонке». Через не- сколько месяцев ИБМ неохотно выпустила язык для ши- рокого пользования, но без помпы (и даже без техниче- ской поддержки). Тем не менее АПЛ быстро приобрел го- рячих сторонников среди экономистов и других специали- стов. Это был первый язык, для поддержки которого Ас- социация по компьютеризации (АСМ), международное научное и просветительское общество специалистов по ин- форматике, учредило специальную инициативную группу SIG (Special Interest Group). В те же годы скромного дебюта языка АПЛ появился еще один язык — Си (С). Он родился в «Белл телефон ла- боратории (научно-исследовательской фирме, принадле- жащей корпорации «Американ телефон энд телеграф», АТТ, и расположенной в Мюррей-хилл, шт. Нью-Джерси) в атмосфере, которую один из участников разработки определил как «благотворное пренебрежение». Никто из руководителей компании не заказывал нового языка, на него не было особого спроса. Язык Си возник лишь как результат дружеского соревнования внутри небольшой 186
о е Большинство из примерно 150 символов языка АПЛ не имеют ничего общего с другими языками. Хотя программисты, работающие на АПЛ, используют и обычные литеры, они могут существенно сократить свою работу, применяя специ- альные математические операции, задава- емые одним знаком. Например, литера над надписью дает компьютеру указание построить из имеющегося списка вещест- венных чисел новый список, полученный округлением в меньшую сторону чисел старого списка, — такая работа может потребовать страницы кода на менее мощном языке. группы программистов лаборатории, искавших язык, при- годный для экспериментов с новым программным обеспе- чением. «Не было ни проектов, ни спецификаций, ни тре- бований, — вспоминал член группы, — почти все роди- лось просто из обсуждений». АЛФАВИТНОЕ КРЕЩЕНИЕ Название «Си» (С) появилось так же случайно, как и сам язык. Он оказался преемником ранее созданного языка для внутреннего использования, получившего название Би (В) (В, С — вторая и третья буквы латинского алфавита). Отчасти язык Би основывался на созданном в Кембридж- ском университете языке БКПЛ (BCPL, от Basic Combined Programming Language — базовый комбинированный язык программирования), который в свою очередь был потом- ком Алгола-60. Язык Си разработал в 1972 г. Деннис Ричи, 31-летний специалист по системному программированию, который, получив степень бакалавра по прикладной математике в Гарвардском университете, поступил в 1968 г. на службу в «Белл телефон лабораторис». Ричи надеялся, что его но- вый язык пригодится для программирования новой опера- ционной системы «Юникс» (UNIX), работа над которой тоже не входила в официальные планы компании. Автор «Юникса» Кен Томсон считался среди коллег лучшим про- граммистом в мире. Операционная система — это сово- купность программ, выполняющих такие важные задачи, как прием, сохранение и выдача информации, и обеспечи- вающих взаимодействие аппаратуры компьютера с при- кладными программами. Ради повышения скорости рабо- ты операционных систем они традиционно писались на языке низкого уровня — ассемблере, но язык Си настоль- ко хорошо зарекомендовал себя, что в конечном счете на нем было написано более 90% всего кода центральной программы (ядра) системы «Юникс». Поскольку антитрестовское законодательство запреща- ло продавать «Юникс», корпорация АТТ распространила систему по колледжам и другим некоммерческим органи- зациям лишь за небольшую лицензионную плату. Как только система «Юникс» получила признание, язык Си об- рел популярность как так называемый язык среднего уров- ня, в котором удобство, краткость и мобильность языков высокого уровня сочетаются с возможностью непосред- ственного доступа к аппаратуре, что традиционно обеспе- чивалось ассемблером. Программисты, занимающиеся ма- шинной графикой, обнаружили, что язык Си удобен при решении таких задач, как создание специальных эффектов, например, в фильме «Возвращение Джеди», или обработка изображений, передаваемых со дна океана в экспедиции «Титаник». 187
Повторение через рекурсию Имя программы — ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ; Перед запуском выполняемой части программы да- дим определение процедуры ЕщеРаз. 1) Отвести новый кусок памяти, достаточный для хране- ния одной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее). 4) Выдать литеру на экран. НАЧАЛО выполняемой части программы ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ ЕщеРаз КОНЕЦ программы. Программа ЗЕРКАЛЬНОЕ ОТРА- ЖЕНИЕ состоит из одной коман- ды — вызова четырехшаговой про- цедуры под названием ЕщеРаз. От- ведя определенное пространство в памяти, программа посылает туда первую полученную литеру. По- скольку эта литера не является точ- кой, она переходит к команде ЕщеРаз, копирует эту процедуру и начинает все сначала. 1) Отвести новый кусок памяти, достаточный для хранения одной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее). 1) Отвести новый кусок памяти, достаточный для хранения бдной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее). 1) Отвести новый кусок памяти, достаточный для хранения одной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее). Имя программы — ПЕРЕВЕРНУТЬ; Перед запуском выполняемой части программы отвести место в памяти, достаточное для хранения А) 100 входных литер Б) Целого числа для подсчета литер НАЧАЛО исполняемой части программы ПЕРЕ- ВЕРНУТЬ 1) Установить начальное значение счетчика рав- ным 1. 2) Пока не прочитана точка и пока прочитано меньше 100 литер выполнять следующие шаги: 2А) Прочитать одну литеру из файла. 2Б) Запомнить ее в следующем участке памяти, согласно счетчику. 2В) Увеличить счетчик на 1. 3) После ввода точки или когда счетчик превысит 100, вывести на экран все литеры, запомненные на шаге 2Б, в обратном порядке, начиная с на- ибольшего значения и до 1 КОНЕЦ программы. 1) Отвести новый кусок памяти, достаточный для хранения одной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее). 1) Отвести новый кусок памяти, достаточный для хранения одной литеры. 2) Прочитать одну литеру из файла. 3) Если литера не является точкой, то «ЕщеРаз» (создать новую копию процедуры и выполнить ее 4) Выдать литеру на экран. 4) Выдать литеру на экран. Чтобы решить ту же задачу, что и программа ЗЕРКАЛЬНОЕ ОТРАЖЕ- НИЕ, данная программа должна по- лучить более детальные команды, от- ведя для сохранения литер макси- мальное количество памяти и сообщив машине, как запоминать и извлекать каждую литеру. 4) Выдать литеру на экран 4) Выдать литеру на экран. 4) Выдать литеру на экран. 188
Рекурсия, как и повторение (с. 174—175), — это метод про- граммирования, позволяющий многократно повторять операцию или множество операций. Однако, используя итерацию, программист должен задать, среди прочего, сколько повторений нужно сделать и какой объем памяти следует отвести для результата каждого действия (уровень детализации, который может оказаться неэффективным, если вообще возможным). При поиске соотношений в больших изменяющихся базах данных, что характерно, на- пример, для программ искусственного интеллекта, про- граммист не может заранее предусмотреть такие детали. Рекурсия позволяет программисту сосредоточиться в большей степени на поиске решения задачи, чем на меха- низме реализации этого решения. В одной разновидности Каждый раз, когда процедура ЕщеРаз вызы- вает себя, создается ее новая копия. Каждая последующая копия резервирует место в па- мяти и запоминает следующую литеру, дей- ствуя согласно правилу «последним пришел, первым вышел»; такой способ запоминания иначе называется «стек». Литера, запоминае- мая первой копией процедуры, помещается на дно стека, запоминаемая последней копи- ей — на верх его. рекурсии (продемонстрированной здесь на примере про- граммы ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ, выводящей лите- ры в обратном порядке) программа может вызывать себя как подпрограмму или процедуру. В некоторой точке про- грамма приостанавливается, создает, по существу, свою копию, которую затем выполняет. Эта копия в свою оче- редь тоже приостанавливается, создает копию и т. д. При определенном условии цикл прекращается; последняя ко- пия просматривается до конца, потом в процедуре преды- дущего уровня перебираются остальные команды копии и так до тех пор, пока не завершится главная программа. Последовательность команд записывается лишь один раз. Выделение памяти происходит по мере надобности, что позволяет программе решать задачи разного объема. Когда активная копия процедуры (крас- ная) встречает точку, она выполняет свою четвертую команду, посылая точ- ку из памяти на экран. Предшествую- щая копия (розовая) тоже затем вы- полняет четвертую команду и т.д., до тех пор, пока управление программой не вернется к исходному набору ко- манд, а слово .РОЗА — зеркальное от- ражение слова АЗОР. — не появится на экране. 189
УСПЕХ И СПОРЫ Атмосфера свободного поиска, без давления извне, в кото- рой создавались языки АПЛ и Си, отнюдь не типична для разработок большинства языков программирования. Чаще рождение нового языка сопровождалось горячими дебата- ми. В Европе с 60-х годов шли дискуссии вокруг спорных попыток усовершенствовать широко признанный язык программирования Алгол-60. В начале 1962 г. Междуна- родная федерация по обработке информации, ИФИП (IFIP, International Federation for Information Processing) сформи- ровала новый комитет по Алголу. Его задача состояла, во-первых, в разработке подмножества языка, в котором бы отсутствовали редко используемые конструкции Алго- ла-60, а во-вторых, в создании более совершенного языка- преемника. Хотя задача ставилась вполне определенная, обсужде- ние было длинным, шумным и бестолковым. В последст- вии К.А.Р. Хоар из Оксфордского университета, член ко- митета от Великобритании, поделился своей точкой зре- ния на шестилетнюю работу комитета. Поводом для от- кровений послужила лекция, которую Хоар прочел в 1980 г. при вручении ему Тьюринговской премии, высшей награды за вклад в области информатики, учрежденной Ассоциацией по компьютеризации. Хоар начал работу в комитете по Алголу, будучи мно- гообещающим молодым программистом в небольшой фирме по производству компьютеров. «Я был рад предо- ставившейся мне возможности встретить и услышать муд- рость многих оригинальных разработчиков языков, — вспоминал он. — Но я был поражен до глубины души и даже обижен их обсуждениями. Очевидно, первоначально разработка Алгола-60 не проходила в том духе бесстраст- ного поиска истины, который я предполагал, основываясь на качестве языка». Комитет с горем пополам согласовал требуемое подмножество; настоящие проблемы возникли, когда члены комитета занялись вопросом о языке-преем- нике. В 1965 г. Хоар и швейцарский участник Никлаус Вирт, преподававший в Станфордском университете США, предложили умеренно модифицированную версию, кото- рая, по мнению Хоара, «объединяла лучшие свойства Алгола-60 и не содержала его изъянов». Эта версия, полу- чившая название Алгол-W в честь Вирта (Wirth), была в конце концов опубликована и приобрела большую попу- лярность в университетских городках. Но комитет ее отверг. Последовал ряд других предложений. По словам Хоа- ра, каждое из них было «длинным и толстым докумен- том, полным ошибок, исправляемых в последний момент. Все они описывали одинаково малопонятные, хотя и отли- чающиеся друг от друга языки». Мало кто из членов ко- митета воспринял критику Хоара «неясности, сложности и сверхамбициозности» вырабатываемого проекта. «По существу, — говорил Хоар, — члены комитета использо- вали постоянные задержки в его работе, чтобы втиснуть в будущий язык все более сложные конструкции, вместо того чтобы попытаться упростить его». «Наконец, в декабре 1968 г., — продолжает Хоар, — В 1968 г. после пяти лет работы в Стан- фордском университете, швейцарский спе- циалист по информатике Никлаус Вирт (сфотографирован у себя дома неподале- ку от Цюриха) вернулся в Швейцарию, чтобы заняться Паскалем. Вскоре этот язык стал стандартным средством обуче- ния программированию. в состоянии глубокого уныния я присутствовал на собра- нии в Мюнхене, на котором готов был родиться наш пере- ношенный монстр, получивший имя Алгол-68». Хоар, Вирт и другие известные ученые высказывались против нового языка. Они даже набросали небольшой доклад (позднее запрещенный руководством ИФИП), где говори- лось, что «как инструмент надежного создания сложных программ язык следует признать неудачным». Как и пред- сказывалось, Алгол-68 оказался слишком громоздким и в отличие от своего предшественника Алгола-60 не получил признания в Европе. Опытные программисты с трудом понимали даже документ, определяющий новый язык. В течение многих лет только Британский королевский коми- тет по связи и радиолокации действительно использовал компилятор с Алгола-68*. Однако в стороне от горячих споров возник еще один новый элегантный язык, который в последующие годы оказал влияние на программистов во всем мире. Язык на- зывался Паскаль — в честь французского философа и ма- тематика XVII в. Блеза Паскаля, а его автором был Ни- клаус Вирт. Он начал писать Паскаль в 1968 г., когда Хоа- ру так и не удалось воспрепятствовать утверждению Ал- гола-68. В то время Вирт был профессором информатики в Федеральном техническом университете в Швейцарии (где в первый раз собирался комитет по Алголу-58) и нуж- дался в инструменте для обучения студентов навыкам про- граммирования. Вирта не удовлетворял не только новый Алгол, но и все «ныне используемые основные языки про- * Компилятор с языка Алгол-68 для машин серии ЕС был создан в Ленин- граде (ЛГУ). Этот компилятор и базирующаяся на нем мощная система программирования с успехом используются уже в течение многих лет. — Прим. ред. 190
граммирования, свойства и конструкции которых зачас- тую нельзя объяснить логически и убедительно и которые нередко просто оскорбляют здравый смысл». ИНЖЕНЕРНЫЙ ПОДХОД Еще подростком Вирт страстно увлекался конструирова- нием радиоуправляемых моделей самолетов. Это привело к тому, что в 1963 г. он получил степень бакалавра по электротехнике в Калифорнийском университете. Он подо- шел к разработке языка, как инженер подошел бы к кон- струированию машины. «Если смотреть на программиро- вание как на проектирование машины, — писал он, — то необходимость точности становится более очевидной». «Искусство инженера, — говорил он в другом случае, — состоит в том, чтобы делать сложные задачи простыми». Новый язык Вирта отражал эту точку зрения. В от- дельном разделе в начале программы на Паскале програм- мист должен определить все переменные и задать явно ти- пы их значений, т. е. указать, будет ли содержимое кон- кретной переменной рассматриваться, например, как целое число или как строка литер. Паскаль также поощряет ис- пользование логической структуры, которая делит про- грамму на небольшие простые подзадачи. Вводя такой раздел, Паскаль ограничивает свободу программиста. Но одновременно язык способствует более строгому стилю программирования, который сокращает количество ошибок. Структура Паскаля делает програм- мы легко читаемыми, позволяя даже людям, не писавшим ту или иную программу, обнаруживать и исправлять име- ющиеся в ней ошибки и вносить изменения. Благодаря этому Паскаль особенно удобен для изуче- ния теории и практики программирования, но не для ре- альных применений. Например, Паскаль, подобно Алголу, не имеет в самом формальном языке аппарата ввода и вы- вода. По мнению Вирта, машинно-зависимые действия, такие, как ввод данных с клавиатуры или запись данных во внешнюю память, не соответствуют логике изучения программирования; компиляторы, написанные для реаль- ных компьютеров, должны иметь особые средства реали- зации таких возможностей. Успех Паскаля намного превысил скромные ожидания Вирта. Коллеги по обе стороны Атлантического океана приняли его как средство обучения программированию бу- дущих специалистов по информатике. Возможно, самое важное состояло в том, что Паскаль стал путеводной звездой зарождающегося в то время движения за струк- турное программирование, которое обрело силу в конце 70-х годов. Оно ставило своей целью пересмотр способа разработки программ, и начало ему было положено пуб- ликацией в 1972 г. книги «Структурное программирова- ние» англичанина К.А.Р. Хоара, норвежца О.Дж. Дала и выдающегося голландского специалиста по информатике Эдсгера Дийкстры. УПОР НА ЛОГИКУ Хотя эту фразу разные программисты могут понимать со- вершенно по-разному, однако по существу она характери- зует систематический математический подход к созданию программного обеспечения, в частности требует разделе- ния программы на небольшие логически увязанные задачи, как это делается в Паскале. Одна из специфических целей структурного программирования — уменьшение использо- вания так называемых безусловных переходов, или опера- торов GOTO. В большинстве основных языков програм- мирования этот оператор используется для передачи управления из одного места программы в другое, которое может быть расположено достаточно далеко по тексту. Хотя оператор GOTO и удобен при написании программ, но обычно усложняет их чтение, а значит, увеличивает ве- роятность пропуска возможной ошибки. Подчеркивая необходимость строгой дисциплины при написании программ, сторонники структурного програм- мирования надеялись ограничить все возрастающую слож- ность разработки программного обеспечения. Системы управления авиационным движением, а позднее космиче- скими спутниками и другие, подобные им, требовали та- ких больших программ, что на их разработку уходили го- ды, причем писались они по частям разными группами программистов, и никто в точности не представлял, как эти части будут стыковаться друг с другом. Слишком ча- сто в результате таких работ появлялись программные системы, стоившие миллионы долларов, созданные с опозданием на многие месяцы и содержащие тысячи оши- бок. Проблема приобретала серьезный характер, вырастая поистине в «кризис программного обеспечения». Нигде кризис не переживался столь остро, как в воен- ном ведомстве США, самом крупном потребителе ком- пьютеров и программ. В 1973 г., когда руководство Пен- тагона начало уделять серьезное внимание этой проблеме, оно выделило около половины из 7,5 млрд. долл, своего компьютерного бюджета на развитие и сопровождение программного обеспечения. Ассигнование на аппаратное обеспечение компьютеров, напротив, было уменьшено, не- смотря на значительное увеличение мощности и памяти компьютеров. Наиболее остро проблема программного обеспечения стояла в так называемых встроенных компьютерных сис- темах вооружения. Это может быть, например, крошеч- ный компьютер баллистической ракеты либо больший по размеру компьютер, управляющий передачей сигналов внутри корабля или самолета. (Примерами встроенных систем гражданского применения могут служить микро- процессоры в автомобилях или микроволновых печах, а также в роботах, используемых на сборочных конвейерах.) Программы компьютеризованных военных систем обычно содержат десятки тысяч строк кода. Дорогие в на- писании, эти программы, еще дороже в сопровождении. За время эксплуатации (около 20 лет) такие программы не раз подвергаются модификации, чтобы удовлетворить не- прерывно меняющимся требованиям к системе. А ошибки в программе, управляющей баллистической ракетой или системой ПВО, могут иметь гибельные последствия. В значительной мере проблема порождалась невероят- ной мешаниной языков, на которых писались программы 191
для встроенных систем. Как следует из обзоров, в начале 70-х годов существовало не менее 450 языков высокого уровня и их диалектов, используемых для кодирования та- ких программ. (Если же учесть языки ассемблера, то эта цифра доходила до 1,5 тыс.) Многие языки были разрабо- таны лишь для одной конкретной работы, поскольку ни один из универсальных языков программирования не со- держал средств, необходимых при решения данной задачи. (К таковым можно отнести, например, нестандартный ввод-вывод или управление в реальном масштабе времени, т.е. способность следить за постоянно меняющимися ус- ловиями и реагировать на них.) Одним из результатов столь бурного размножения языков в военном программировании было повсеместное дублирование работ. Каждый род войск имел собственные «любимые» языки, не совместимые с языками, используе- мыми в других родах войск. Например, программы, напи- санные на языке, принятом в ВВС США, должны были полностью переписываться при использовании их в сухо- путных войсках или на флоте. Эта проблема и связанная с ней проблема обучения программистов нескольким язы- кам, а также необходимость разработки различных ком- пьютеров для разных применений вели к бешеному росту расходов. В январе 1975 г. Пентагон вознамерился навести по- рядок в сем «лингвистическом хаосе». Он учредил боль- шой комитет HOLWG (от High Order Language Working Group) — рабочую группу по языку высокого уровня, в ко- торую входили представители всех родов войск США, а также трех союзников США по НАТО (Франции, Запад- ной Германии и Великобритании). Комитету было предпи- сано найти или разработать языки (желательно один), пригодные для программирования всех известных встроен- ных систем. КОМПЬЮТЕРНЫЙ ЖОКЕЙ ВВС Председателем комитета и основным вдохновителем всей деятельности по ликвидации беспорядка в разработке про- грамм был подполковник ВВС Уильям Уайтекер. Блестя- щий студент, который, однако, мечтал стать летчиком, Уайтекер прошел весь курс физики в Тулейнском универси- тете за два года. В дальнейшем он достиг самых высоких академических степеней за всю историю летной школы, в которой обучался, — но управлять самолетом так и не су- мел научиться. Тем не менее Уайтекер остался в ВВС и за 16 лет работы над ядерным оружием на Кертлэндекой базе ВВС возле Лос-Аламоса (шт. Нью-Мексико), стал вы- сококвалифицированным программистом. К тому момен- ту, когда он занял пост научного руководителя лаборато- рии вооружений ВВС США, «на его счету» было 30 тыс. часов процессорного времени. За этот период Уайтекер на собственном опыте про- чувствовал проблему языковой несовместимости, особен- но хорошо запомнив одну программу, которую из-за из- Вехи развития языков В такой динамичной области, как программирование, где новинки часто устаревают прежде, чем доходят до потребителя, языки программирования демонстрируют поразительную стабильность. Большинство наиболее зна- чительных языков программирования возникло в период 1955—1960 гг. (за небольшими включениями, к коим относится, например, Пролог — непро- цедурный язык искусственного интеллекта) и после ряда изменений приня- ло весьма устойчивую форму. Например, язык Джовиал, созданный в 1960 г., является версией Алгола-58, разработанной ВВС США. На этой хронологической диаграмме, продолжающейся на последующих страницах, в основном указаны годы, когда язык был открыт для широко- го распространения. Для первых языков, Планкалкюля и языка ассемблера для машины «Эдсак», которые не имели коммерческого применения, указа- ны годы окончания работы над языком. 192
менений модели компьютера пришлось переписывать пять раз. Хотя комитет HOLWG не должен был разрабатывать единственный универсальный язык, Уайтекер с самого на- чала имел в виду именно это. «Он верил, как никто дру- гой, что нужен единственный универсальный язык, — вспоминал один из свидетелей этой работы, — и добился своего». Способ, которым это было достигнуто, резко отличал- ся от всех прежних процедур разработки языков, будь то в военной или гражданской сфере. Вместо того чтобы за- ниматься бесконечными дебатами, а затем принять реше- ние о языке, комитет (по настоянию Уайтекера) начал со- бирать пожелания пользователей компьютеров как среди военных, так и среди других специалистов по программи- рованию. Их попросили помочь в формулировке необходимых требований к универсальному языку. Задача выработки проекта общих спецификаций была возложена на Дэвида Фишера — гражданского сотрудника из Института обо- ронных исследований США. Фишер привнес в эту работу собственный солидный теоретический и практический ба- гаж: он окончил два университета и в свое время разраба- тывал военное программное обеспечение в фирме «Барро- уз». Фишер предварительно изучил вопрос о затратах ми- нистерства обороны на программное обеспечение и на- столько хорошо разобрался в путанице языков, что не за- думываясь мог ответить, какой диалект используется в министерстве на каждом устройстве и какими его свойст- вами определялся такой выбор. ПОЯВЛЕНИЕ «СОЛОМЕННОГО» В апреле 1975 г., через три месяца после образования ко- митета HOLWG, первый набросок требований к универ- сальному языку был передан для ознакомления военным, в промышленность и академические круги под кодовым названием «Соломенный». Выбор названия был не случа- ен: Фишер и Уайтекер рассчитывали, что рецензенты «как следует потреплют» документ и предложат свои улучшения. «Избиение» не заставило себя долго ждать, и с учетом критических замечаний «Соломенный» был пересмотрен. Цикл рецензирования и переработки в течение последую- щих трех лет повторялся еще пять раз, отразив в конеч- ном счете оценки более 80 групп рецензентов из США и ряда европейских стран. Каждый последующий документ получал название, которое как бы отмечало прогресс в упрочении требований: «Деревянный», «Оловянный», «Железный», «Пересмотренный железный» и, наконец, — «Стальной». Список требований удлинялся, достигнув примерно сотни на этапе «Оловянного», когда стало ясно, что ни один существующий язык удовлетворить им не может. Во- енные службы составили временный список из семи язы- ков, включая Фортран и Кобол, одобренных для использо- 193
вания при программировании встроенных систем. Однако последующий анализ этих и десятков других языков пока- зал, что ни один из них не удовлетворяет полученным тре- бованиям более чем на 75%. Под давлением Уайтекера (по словам одного наблюда- теля, «он направлял проект железной рукой, хотя и в зам- шевой перчатке») комитет согласился, что требованиям можно удовлетворить, только создав совершенно новый язык. Для этого было решено организовать беспрецедент- ное международное состязание. В мае 1977 г., когда специ- фикации еще уточнялись, комитет запросил предложения у самых известных проектировщиков языков из разных стран, причем предложения должны были базироваться на одном из трех языков: ПЛ/1, Алгол-68 и Паскаль. Отозва- лись 15 групп разработчиков (причем большинство предло- жений основывались на Паскале), продемонстрировав тем самым огромное влияние новой концепции структурного программирования. Было отобрано четыре предложения для доработки в течение предварительного шестимесячного этапа. Эти предложения (все основаны на Паскале) исходили от двух компаний из шт. Массачусетс, «Софтек» и «Интермет- рикс», калифорнийской фирмы «СРИ интернэшнл» и «Сии Хониуэлл Буль», парижского филиала американской ком- пании «Хониуэлл корпорейшн». Все команды разработчи- ков получили закодированные (цветовые) имена, чтобы со- хранить анонимность при рецензировании; но вкусы разра- ботчиков настолько различались, что опытный рецензент мог за пять минут без труда распознать группу разработ- чиков по ее проекту. В 1978 г. на основе оценок более 400 рецензентов два из четырех проектов (Красный — «Интерметрикс» и Зеленый — «Сии Хониуэлл Буль») были отобраны для окончательного рассмотрения. Последовавший затем этап уточнения растянулся на год и протекал весьма интенсив- но. Участник «красной» группы вспоминает, что, ложась ночью спать, он плакал от усталости. «Красный» был бо- лее консервативным языком, а «Зеленый» представлял со- бой кратко описанный язык авангардистского толка, — за- явил один из соревнующихся. — На заключительном этапе оба языка изменились: «Красный» стал более авангардист- ским, а «Зеленый» — более консервативным, поскольку стал толще». Победителя объявили в мае 1979 г. Им оказалась фир- ма «Сии Хониуэлл Буль». Победивший язык, «Зеленый», был окрещен Адой, в честь Огасты Ады Лавлейс, матема- тика и писателя XIX в., которую нередко называют пер- вым в мире программистом — за популярное описание Аналитической машины Чарлза Бэббиджа. Эта победа была личным триумфом Жана Ихбиа, воз- главлявшего группу «Зеленого». Ихбиа родился в Париже, обучался в престижной Политехнической школе. Позже французское правительство направило его на учебу в США. При подготовке кандидатской диссертации по опти- 194
мальному размещению систем метро он так увлекся про- граммированием, что с трудом закончил свою работу. Вскоре после этого Ихбиа поступил на службу в новую французскую компанию «Сии» (которая позже преврати- лась в «Сии Хониуэлл Буль»), где в 1972 г. разработал свой первый язык программирования ЛИС (LIS, от Langage d’Implementation de Systemes — язык реализации систем). ЛИС, созданный под влиянием Паскаля, и явился тем зерном, из которого вырос язык Ада. В процессе состязания проектов Ихбиа, говоривший не менее чем на пяти языках и имеющий «коричневый пояс» по дзюдо, погонял себя интенсивнее, чем свою междуна- родную группу, состоявшую из 10 человек — представите- лей США, Великобритании, Западной Германии и Фран- ции. Временами он работал по 100 часов в неделю, совер- шенствуя проект. Часто Ихбиа полагался на свою интуи- цию, принимая решения скорее на основе эстетических критериев, чем логического анализа. Как писал восхищен- ный член «красной» группы, результатом был язык, «раз- работанный не комитетом, а небольшой группой с силь- ным лидером». МОДУЛИ, ОБЛЕГЧАЮЩИЕ СОПРОВОЖДЕНИЕ Наиболее характерная черта языка Ада — главный акцент на структурное программирование. Язык позволяет писать программы в виде пакетов, т.е. самостоятельных модулей, которые разрабатываются отдельными программистами, а затем собираются вместе. Пакет может быть разрабо- тан, отлажен, оттестирован и сохранен в библиотеке моду- лей для дальнейшего использования в программе, как если бы это была часть стандартного программного обеспече- ния. Такая модульная схема; утверждали сторонники Ады, позволяет создавать надежные, легко читаемые и удобные в сопровождении программы, что экономит тысячи часов и сотни миллионов долларов. Однако «поклонники» Ады допускают, что за все на- званные достоинства придется платить. Поскольку этот язык создавался в соответствии с правительственным до- кументом «Стальной», в нем оказалось много особенно- стей, осложняющих его изучение. Кроме того, компилятор Ады занимает гораздо больший объем памяти, чем ком- пилятор ее предшественника, Паскаля. Размеры и слож- ность языка Ада вызвали критику специалистов, в част- ности автора Паскаля Н. Вирта и его коллеги по противо- действию Алголу-68 К.А.Р. Хоара. Последний, участво- вавший вместе с Виртом в группе «СРИ интернэшнл» и выбывший из соревнования в полуфинале, сожалел о том, что «погремушки и побрякушки возобладали над фунда- ментальными понятиями безопасности и экономичности». Выступая перед широкой аудиторией, Хоар изобразил устрашающую картину армады ракет, летящей не туда, куда следует, из-за не замеченной ошибки в компиляторе Ады. Вирт выразил свое отношение иначе. «Слишком много всего вываливается на программиста, — говорил он. — Я не думаю, что, изучив треть Ады, можно нормально рабо- тать. Если вы не освоите всех деталей языка, то в даль- нейшем можете споткнуться на них и это приведет к не- приятным последствиям». Защищая свой язык, главный «архитектор» Ады Жан Ихбиа, выразив Вирту свое «восхищение и уважение», до- бавил: «Иногда Вирт верит в малые решения больших проблем. Я не верю в такие миражи. Крупные проблемы требуют крупных решений». Другие защитники языка Ада утверждали, что единственная альтернатива подобному большому, сложному языку в больших проектах —- это размножение компактных, простых и несовместимых язы- ков (именно от этого Ада была призвана излечить). Как и следовало ожидать, создание компилятора, позволявше- го эффективно выполнять программы на Аде, оказалось нелегкой задачей. Она усугублялась требованием Пентаго- на, чтобы новый язык не засорялся диалектами, расшире- ниями или подмножествами. Министерство обороны США требовало также, чтобы каждый предлагаемый компиля- тор подвергался необычайно строгой процедуре проверки. Сквозь него следовало пропустить серию из 2000 специаль- ных тестов. ПОБЕДИТЕЛЬ В РАБОТЕ Несмотря на все трудности, удачные компиляторы в конце концов появились, и Ада стала заявлять о себе. В 1983 г. министерство обороны США распорядилось, чтобы все новые программы для «критических» приложений писа- лись на Аде; под «критическими» понимались компьюте- ризованные системы связи и системы вооружений. Напри- мер, имелись в виду громадные программы, использова- ние которых предполагается в системе СОИ. Пентагон предсказал, что к концу десятилетия 85% нового «критиче- ского» программного обеспечения (стоимостью 5 млрд, долл.) будет написано на Аде. За пределами военных при- ложений (включающих принятие Ады как стандарта для НАТО) успехи нового языка весьма умеренны. Одна жиз- ненно важная программа, использующая возможности Ады по управлению процессами в реальном масштабе вре- мени, контролирует состояние больных, присоединенных к аппарату «искусственная почка». И хотя критики Ады не умолкают, этот язык неизменно привлекает руководителей больших программных проектов. Другие основные языки программирования прошли утомительный процесс стандартизации, осуществляемый Американским национальным институтом стандартов (American National Standards Institute, ANSI) с целью огра- 195
ничения числа диалектов. Но ни один из предшествующих языков не был столь строго стандартизирован с самого начала, до появления диалектов. Таким образом, Ада в 1980 г. вплотную подошла к гарантированной мобильно- сти: программу, написанную для одного компьютера, по- чти наверняка можно перекомпилировать и правильно вы- полнить на другой машине. Одно это делает Аду важным программным средством при разработке больших проек- тов, привнося хотя бы частичный порядок в беспокойный мир языков программирования. 196
НЕОБХОДИМЫЕ ПОСРЕДНИКИ Преобразование программы, написанной на языке высоко- го уровня, в двоичный код, на котором работает компью- тер, требует пристального внимания к многочисленным деталям — того, что успешно может делать компьютер под управлением транслирующей программы. Трансли- рующие программы делятся на две категории: интерпрета- торы и компиляторы. Интерпретатор преобразует неболь- шой фрагмент исходной программы в машинные команды и, лишь дождавшись, когда компьютер их выполнит, пере- ходит к обработке следующего фрагмента. Компилятор, наоборот, транслирует всю программу, написанную на языке высокого уровня, и помещает команды в память компьютера, не выполняя их; компилированную програм- му можно сохранить, чтобы в дальнейшем использовать. Каждый из этих способов преобразования имеет свои достоинства и недостатки. Компилированные программы выполняются быстрее, чем интерпретируемые; однажды компилированная программа не требует в дальнейшем компилятора, и компьютеру не приходится исхитряться, чтобы одновременно и транслировать, и выполнять про- грамму. Программы, написанные на языках, ориентиро- ванных на интерпретацию, требуют присутствия в памяти компьютера интрепретатора, который осуществляет трансляцию программы в ходе ее выполнения. Благодаря построчной трансляции интерпретатор поле- зен как при отладке, так и при трансляции программ, под- верженных частым изменениям; исправленную программу можно сразу запустить, чтобы проверить ее работу. При использовании компилятора исправленную программу приходится перекомпилировать. Как компилятор, так и интерпретатор должны соответ- ствовать правилам конкретного языка высокого уровня, который они транслируют. Подобно тому как правила грамматики описывают естественный язык, правила фор- мального языка управляют работой программиста, указы- вая, как можно соединять слова и символы, используемые в языке, при построении сложных выражений и задавая правила форматирования, в том числе употребления про- белов и знаков пунктуации. В транслирующих программах грамматика является основой преобразования понятий ис- ходной программы в машинный код. 197
Необходимые посредники Шаги преобразования программ Исходная программа. Программа должна описывать логику решения задачи и удовлетворять правилам записи, в соот- ветствии с которыми интерпретатор или компилятор осуществляют трансляцию. Приведенная здесь программа (написан- ная на упрощенном языке, напоминаю- щем Паскаль) предназначена для возведе- ния числа в степень путем последователь- ного перемножения. Пользователь вводит значения основания и показателя степени; необходимо, чтобы эти числа были целы- ми положительными. Интерпретатор. Трансляция интерпрети- руемой исходной программы проходит в четыре этапа. На первом этапе — лекси- ческого анализа — группы литер исход- ного языка преобразуются в символы, понятные интерпретатору. Затем следует этап синтаксического анализа, когда сим- волы размещаются в иерархическом по- рядке, отражающем логику программы. На третьем этапе — контроля типов — проверяется согласованность символов друг с другом, что позволяет выявить ошибки в программе. И наконец, генера- тор кода посылает машинные команды в ЦП, где они немедленно выполняются. 198
Программа высокого уровня возникает так же, как и лю- бой другой текст, например деловое письмо, — путем вво- да с клавиатуры. Но программа, называемая исходной программой, или исходным кодом, пишется по более строгим грамматическим правилам, чем обычное письмо. Когда транслирующая программа (компилятор либо интерпретатор) запускается для обработки исходного кода, в память компьютера вместе с самим транслятором загру- жается и программа на языке высокого уровня. Затем транслятор начинает литера за литерой читать исходный код, обрабатывая его в несколько этапов, как показано на рисунке. На каждом этапе информация, полученная от пре- дыдущего этапа, обрабатывается и передается дальше. Ес- ли какое-либо правило языка оказывается нарушенным, запускается подпрограмма обработки ошибок, которая со- общает программисту о найденной ошибке. Компилятор. Подобно интерпретатору, компилятор также пропускает программу через этапы лексического анализа, син- таксического анализа, контроля типов и генерации кода. Но в этом случае от- транслированная программа не выполня- ется немедленно, а сохраняется в памяти компьютера; дополнительный этап в ра- боте компилятора — так называемая оптимизация — улучшает результат трансляции, повышая эффективность по- лученной программы. Целевой код. На выходе компилятора можно получить либо последователь- ность машинных команд низкого уровня, называемую объектным кодом, либо, как в данном примере, — последовательность команд языка ассемблера. Если целевой код является языком ассемблера, то пе- ред выполнением его следует оттрансли- ровать ассемблером. 199
Необходимые посредники Первый взгляд на написанную программу Роль первого этапа трансляции, лексического анализа, со- стоит в том, чтобы сделать программу понятной осталь- ным этапам. Литеры исходного кода читаются одна за другой, и сканер (лексический анализатор) в соответствии с грамматическими правилами языка объединяет литеры в группы, определяя их смысл. Для каждой смысловой группы литер сканер генерирует символ, называемый лек- семой, который передается дальнейшим этапам транслято- ра; сканер обрабатывает только одну лексему за раз. При выделении лексем сканер игнорирует пробелы между ними и сдвиги строк исходной программы, поскольку эта ин- формация для трансляции несущественна. Идентификатор Ключевое слово ID* ИМЯ _ ВИД ТИП ID1 Экспонента 102 Число S Юз Степень / ID4 Операция TD5 Результат Число / > рШишель Для преобразования литер исходной про- граммы в лексемы (элементы, имеющие\ смысл для транслятора) лексический ана- лизатор (сканер) использует грамматиче- ские правила. Последние задают точный смысл лексем, которые могут обозначать ключевые слова, знаки операций, числа и знаки препинания. Смысл такой лексемы, как идентификатор, определяется только при дальнейшем анализе программы. Сканер формирует таблицу символов (вверху), приписывая каждому идентифи- катору метку и оставляя место для ин- формации, которая заносится на последу- ющих этапах. 200
Большинство лексем, создаваемых сканером, имеют фиксированный смысл. Ключевые слова (например, НА- ЧАЛО, ЕСЛИ, КОНЕЦ) указывают на действия, задавае- мые синтаксисом языка программирования. Операции (ти- па -t- и : = , т. е. присвоить значение переменной) указы- вают на арифметические, логические действия или пере- сылку данных. Числа задают реальные числовые значения, скажем 5 или 7. Знаки пунктуации помогают транслятору разобраться в структуре программы. Другая разновидность лексем называется идентифика- тором, который не имеет фиксированного смысла. Иден- тификаторы изображают объекты, не определенные точно правилами языка, например имя программы, либо слова, выбранные программистом для именования переменных или констант. Сканер дополняет каждую лексему специ- альной меткой, чтобы транслятор мог ее распознать, и за- носит имена всех лексем в таблицу символов. Для допол- нительной информации о лексемах в таблице оставляются свободные места. Они заполняются на последующих эта- пах работы транслятора.
Необходимые посредники Заголовок Программы Программа ПРОГРАММА Блок Список Операторов Описание Переменных ПЕРЕМЕННЫЕ | Получив лексему ПОКА от сканера, син- таксический анализатор создает узел де- рева, соответствующий оператору «по- ка». Узел является отцом для всех эле- ментов этого оператора. Синтаксический анализатор присоединяет лексему ПОКА, как сына, к созданному узлу и формиру- ет еще один неопределенный узел, присо- единяемый к первому. Этот неопределен- ный узел соответствует лексеме или груп- пе лексем, образующих логическое выражение оператора «пока». Оператор ’’пока’ ПОКА Следующая лексема — идентификатор. В соответствии с правилами языка иденти- фикатор присоединяется в качестве сына к неопределенному узлу. Затем берется следующая лексема, которая и попадет в пока не определенный узел. Оператор ’’пока’ ПОКА Лексема операции «больше чем» попада- ет в узел, бывший неопределенным, и одновременно создается новый неопреде- ленный узел для следующей лексемы или группы лексем. ID5 ПОКА Оператор ’’пока ID5 202
Составление синтаксического дерева из кусочков Синтаксический анализатор получает от сканера лексемы и располагает их в виде структуры, позволяющей компью- теру разобраться в логике программы. Эту структуру можно представить как иерархическое образование, анало- гичное генеалогическому дереву (справа). Лексема может отец сын отец/сын сын сын быть либо «отцом», либо «сыном», либо тем и другим одновременно. Группы лексем объединяются в операто- ры — основные структурные единицы программы. Син- таксическое дерево (дерево разбора) программы «Экспо- нента» показано слева. Синтаксический анализатор разме- щает лексему в дереве, анализируя ее смысл, смысл лек- сем, предшествующих данной, а иногда и последующей лексемы. Построением дерева управляет набор явно запи- санных правил; каждой последовательности лексем соот- ветствует один-единственный способ размещения их в де- реве. Пример последовательного построения части дерева демонстрируется на примере оператора «пока», который в дереве, показанном слева, изображен полностью. Встречая последовательность лексем, к которой не под- ходит ни одно правило, синтаксический анализатор пред- полагает, что в программе содержится ошибка. В таком случае транслятор посылает программисту сообщение об ошибке, в котором содержится информация о месте и типе ошибки. В компиляторе и .интерпретаторе синтаксический ана- лиз (разбор) идет несколько по-разному. В интерпретаторе отбирается ровно столько лексем, сколько надо для обра- зования логически связанного фрагмента исходного языка. После синтаксического анализа этот фрагмент передается на следующий этап транслятора. Очередной фрагмент вы- деляется только после завершения обработки и выполне- ния текущего фрагмента. Синтаксический анализ в компи- ляторе обрабатывает всю программу целиком, не выпол- няя ее: после разбора вся программа передается на сле- дующий этап. Следующая лексема — это число; в та- ком случае, согласно правилам, создается еще один неопределенный узел (нижний вопросительный знак). Если следующей лексемой оказывается знак операции, то он попадает в узел-отец (верхний вопро- сительный знак), а число — в узел-сын. Если же следующая лексема не является знаком операции, то число занимает верхний неопределенный узел, у которого нет сыновей. Следующая лексема — ключевое слово ВЫПОЛНЯТЬ, поэтому число становит- ся узлом-сыном операции «меньше чем», а лексема ВЫПОЛНЯТЬ — узлом-сыном оператора «пока», к которому добавится еще один неопределенный узел-сын. Этот узел в свою очередь соответствует ново- му оператору, который тоже содержит сыновей на нескольких уровнях (см. пол- ное дерево слева вверху). Оператор ’’пока” о 203
Необходимые посредники Контроль типов и обнаружение ошибок мы, нарушающих правила языка. Один из наиболее важ- ных видов анализа ошибок — контроль типов. Многие языки программирования, в частности рассматриваемый нами, требуют явного описания типов данных (с. 166— 167). (В других языках, если программа не содержит ин- формации о типе переменной, транслятор должен опреде- После того как синтаксический анализатор сгруппирует лексемы, транслятор проверяет смысл как отдельных лек- Описания Переменных имвол имя ТАБЛИЦА СИМВОЛОВ вид тип ID1 Экспонента Имя программы СТРОКА 2 При обходе части дерева разбора, со- держащей описания, таблица символов, созданная лексическим анализатором, дополняется информацией об идентифи- каторах, их виде и типе. Для каждого идентификатора указывается, является он переменной, константой или именем программы. - IO2 Число Переменная ЦЕЛОЕ (I) ID3 Степень Переменная ЦЕЛОЕ (I) ID4 Результат Переменная ЦЕЛОЕ (I) IQ5 Счетчик Переменная ЦЕЛОЕ (I) 204
лить ее тип по контексту.) Если типы данных, использо- ванные в выражении, не совместимы (врезка справа), то транслированная программа не может работать правиль- но. Когда такие ошибки обнаруживаются при трансляции, надежность программирования повышается. Контроль типов играет еще одну очень важную роль — дает транслятору дополнительную информацию о лексе- мах, которая нужна при генерации кода. Например, опера- ция « + » действует по-разному, а значит, требует разного машинного кода — в зависимости от типов ее слагаемых. Обработка несовпадающих типов Если типы сыновей одного отца не совпадают, то транслятор ис- пользует правило, позволяющее ему продолжить работу. Напри- мер, если один из сыновей имеет целый, а другой — вещественный тип, то такое правило может ука- зывать, что отец должен иметь вещественный тип. Однако воз- можны неразрешимые сочетания типов. На рисунке показан случай, когда один сын имеет целый (I) тип, а второй — литерный (С). Для такой комбинации ти- пов не существует правила разрешения, и поэтому транслятор выдает програм- мисту сообщение об ошибке. Список Операторов ПОКА Процесс приписывания типов распро- страняется по дереву, причем каждому отцу приписывается тип его сыновей. Не получают типа только узлы, соот- ветствующие операторам. синтезирует типы кого уровня, припи- овей. Если два сына тип, то Оператор «пока» выполнять Список Операторов Транслятор начинает проверку типов, приписывая тип лексемам нижнего уровня, т.е. тем, которые являются сы- новьями, но не отцами. Информация о типе каждого идентификатора берется из таблицы символов. Если встречается лексема, не являющаяся идентификато- ром, то используется встроенное прави- ло определения ее типа. В случае цело- го числа 1 — это целый тип. Далее тран< лексем более высокого сывая им тип сыновей, одного отца имеют ра: транслятор использует правило определения типа отца. При отсутствии такого правила выдается сообщение об ошибке (врезка вверху) 205
Необходимые посредники Оператор «пока» ПОКА Оператор «пока» ПОКА ПОКА Список Операторов Список Операторов Интерпретатор отбирает лексемы, пока не распознает команду, затем вызывает последовательность двоичных машинных команд (справа), которую компьютер не- медленно выполняет. Это чередование трансляции и выполнения повторяется до полного завершения программы. Совершая обход дерева для оперХгора «пока» (верхнее дерево), транслятор вна- чале отбирает лексему ПОКА, у которой нет ни одного нижележащего узла. Да- лее, следуя правилу обхода дерева, транс- лятор проходит лексему (>) и отбирает ее сыновей (идентификатор Счетчик и число 0), затем возвращается и отбирает лексему (>), у которой не стало сыновей (среднее дерево). Обход дерева продол- жается, причем перемещение происходит сверху вниз, слева направо. Отбираются те узлы, у которых уже отобраны сыно- вья или их не было (нижнее дерево). \\\\W\\W^XX 206
Генерация кода: разборка дерева для получения команд Генератор кода решает центральную задачу транслятора: превращает лексемы в последовательности машинных ко- манд, управляющих компьютером. Он выполняет это в процессе обхода синтаксического дерева. Из узлов дерева в определенном порядке извлекаются лексемы. Когда на- бирается количество, достаточное для определения нужной операции, происходит генерация соответствующих машин- ных команд и обход дерева возобновляется. Как и на предыдущих этапах трансляции, обход дерева совершается в соответствии с правилами языка, используе- мого для написания исходной программы. Начало обхода части дерева нашим гипотетическим транслятором показа- но вверху слева. Обход начинается с верхушки дерева и продолжается в направлении вниз и вправо по его пери- метру. Когда встречается узел «отец», перебираются по очереди все его «сыновья»; если «сын» является также и «отцом», то перебираются и его «сыновья». Так происхо- дит спуск по дереву, пока не встретится узел, не имеющий «сыновей». Из такого узла берется лексема и рассматрива- ется следующий «сын». В конце концов перебираются все «сыновья» на самом низком уровне в этой ветке дерева. Тогда происходит возврат к «отцу», который теперь обра- батывается. Обойдя дерево, соответствующее одному вы- деленному фрагменту, интерпретатор вызывает подпро- грамму на машинном языке, которая и выполняет нужную операцию, прежде чем приступить к разбору следующего фрагмента. Компилятор же обходит дерево всей програм- мы, генерируя код и записывая его в память для после- дующего выполнения или обработки. эратор «пока» ID5 D4 ID5 D2 ID4 Компилятор не выполняет генерируемый код сразу, а по мере получения заносит его в память в виде двоичных машинных команд, или команд ассемблера. По за- вершении этого этапа трансляции код ли- бо выполняется, либо передается на сле- дующий этап работы компилятора. выполнять Список Операторов 207
Необходимые посредники 208
Шлифовка кода для повышения эффективности Транслятор устроен так, что при генерации кода не может «заглянуть» ни вперед по программе, ни назад, на уже сге- нерированный код. В результате машинный код может оказаться либо избыточным, либо плохо организованным, либо то и другое вместе. В интерпретаторе с этим прихо- дится мириться, но в компиляторе предусмотрено специ- альное средство ликвидации такой неэффективности. На последнем этапе работы компилятора, этапе опти- мизации, происходит поиск тех мест машинного кода, ко- торые можно усовершенствовать. При оптимизации реша- ются две задачи, часто противоречащие друг другу: сокра- тить длину программы, чтобы она занимала меньший объем памяти, и преобразовать ее так, чтобы она выпол- нялась быстрее. Одна из главных задач компилятора — находить и удалять избыточные команды, как показано на === рисунке для части машинного кода программы «Экспонен- ==^^7=1 та». В двух местах этой части программы компилятор сге- ^Ц|1 нерировал машинные команды, фактически исключающие ^^^==1 друг друга. Удалив обе пары команд, оптимизатор убива- ет сразу двух зайцев: получает одновременно и более ко- роткую и быстрее выполняемую программу. Оптимизации других типов требуют сложных вычисле- ний и могут существенно удлинять процесс компиляции. По этой причине в некоторых компиляторах выбирается компромиссный вариант: серьезное внимание уделяется только тем частям программы (таким, как циклы и проце- дуры), которые интенсивно используются при выполнении программы. Оптимизатор «отшлифовывает» машинный код только в этих частях программы, уменьшая время ее выполнения без больших затрат времени на компиляцию. В приведенном на рисунке фрагменте программы на языке ассемблера оптими- затор обнаруживает две пары избыточ- ных команд. В обоих случаях компьюте- ру дается указание запомнить содержи- мое сумматора, а затем без изменения передать эту информацию назад на сум- матор. Оптимизатор может исключить обе пары, сократив программу, без изме- нения ее смысла.

ПРОГРАММИРО ВАНИЕ ПРИХОДИТ В ДОМ Быстрый рост производства персональ- ных компьютеров в конце 70-х годов привел к возрождению популярности та- ких языков, как Бейсик, Паскаль и тра- диционные языки ассемблера, поскольку сотни любителей самостоятельно заня- лись программированием на компьютерах у себя дома. В 1964 г. программист из Миннеаполиса Роберт Л. Албрехт заинтересовался новым языком под названием Бейсик, который незадолго до этого был внедрен в Дарт- мутском колледже. И сокращение (BASIC — базовый, основной), и полное назва- ние (Beginner’s All-Purpose Symbolic Instruction Code — универсальный символьный код для начинающих) предполагали, что этот язык предназначен для начинающих; человек, не имеющий никакого опыта работы с компьютером, может изучить его всего за несколько часов. Кроме того, Бейсик изначально создавался для работы в системе разделения времени Дартмутского компьютера модели 225 фирмы «Дже- нерал электрик». А это означало, что с машиной одновременно могут работать несколько студентов. Теперь им не надо было передавать свои перфокарты операто- рам компьютера и целый день дожидаться, когда программу пропустят через ма- шину (в результате на отладку программы уходило две-три недели); отныне сту- дент сам садился за отдельный терминал и совершенствовал искусство программи- рования методом проб и ошибок в режиме непосредственной обратной связи с ком- пьютером. «Бейсик обеспечивает невиданный ранее способ общения с компьюте- ром, — говорил Албрехт позднее. — Он снимает с компьютерных вычислений ореол исключительности». Албрехт сам принадлежал к «компьютерной элите» — сообществу программи- стов, операторов и инженеров, контролировавших доступ к первым компьютерам. Сын преуспевающего фермера, занимающегося разведением индеек и крупного рога- того скота, он специализировался по физике и прикладной математике в универси- тете шт. Миннесота. Компьютеры заинтересовали его в 1955 г., когда он работал в аэродинамическом отделе фирмы «Миннеаполис-Хониуэлл». Албрехт научился программировать в машинном коде на принадлежавшем компании компьютере IBM-650, и с удовольствием делился с другими своими «компьютерными радостя- ми». Он мечтал о том, что технологическая революция приведет к появлению не- больших, доступных компьютеров, которые позволят множеству людей писать соб- ственные программы. В 1962 г. Албрехт, как главный аналитик фирмы «Контрол дейта», находящейся в Денвере, добился у своего начальства и совета местных школ разрешения на пре- подавание в средних школах города основ работы с компьютерами. Погрузив мини- компьютер модели 160 фирмы «Контрол дейта» в фургон, он путешествовал от школы к школе, «вербуя» учеников, желающих работать с компьютером, и воспи- тывая из них «пропагандистов» Фортрана. В следующем году фирма перевела Ал- брехта в свою штаб-квартиру в Миннеаполис как опытного специалиста по обу- чению основам программирования. Здесь он разработал упрощенную версию Форт- рана для студентов, назвав ее Бефортраном (BEFORTRAN: позже оказалось, что этот диалект Фортрана предвосхитил Бейсик, который тоже был получен из Фортрана). Едва узнав про Бейсик, Албрехт тотчас стал его проповедником, даже изготовил 211
себе пуговицы с названием созданной им организации SHAFT (the Society to Help Abolish FORTRAN Teaching — общество содействия отмене преподавания Фортрана). Вскоре Албрехт ушел из компании, целиком отдавшись просветительской деятельности. Он приступил к написа- нию первой примерно из дюжины книг по Бейсику, где вы- ступал либо как единоличный автор, либо как один из со- авторов. Став членом компьютерного комитета Нацио- нального совета преподавателей математики, он добился создания авторитетной группы, рекомендовавшей препода- вание Бейсика в средней школе. Его деятельность достигла апогея в 1966 г., когда в возрасте 36 лет Албрехт перебрался в Северную Калифор- нию. Здесь он попал в среду единомышленников — про- граммистов и инженеров, стремившихся внедрить ком- пьютеры в повседневную жизнь. КОМПЬЮТЕР ЗА 50 ЦЕНТОВ В ЧАС В начале 70-х годов Албрехт организовал издательскую фирму «Димакс», которая выпустила серию книг- руководств по Бейсику: среди них была и его книга. Он также организовал общедоступный вычислительный центр, разместив его в бывшей аптеке в Менло-парке, при- мерно в 70 км к северу от Сан-Франциско. Центр распола- гал мини-компьютером PDP-8, поставленным фирмой ДЕК (DEC, от Digital Equipment Corporation — корпорация по производству цифрового оборудования) в обмен на обе- щание Албрехта написать пособие по программированию на Бейсике для машины PDP-8. Центр также гордился сво- им терминалом, имеющим телефонную связь с располо- женным неподалеку компьютером фирмы «Хьюлетт-Пак- кард». Эта фирма, использующая компьютер в режиме разделения времени, бесплатно предоставляла машинное время центру. Как сообщил Албрехт одному репортеру, за 50 центов в час «люди могут зайти сюда, будто в парк или на лужайку, и позабавиться с компьютером». Центр также организовал доступные всем терминальные классы для работы с Бейсиком, которые особенно привлекали подростков, домохозяек и даже некоторых бизнесменов; последние надеялись завоевать рынок, разработав про- граммы, прогнозирующие изменения цен. Программиро- вание на Бейсике было легче легкого. Интерпретаторы по- всюду заменили компилятор, первоначально использовав- шийся в Дартмутском колледже. Транслируя программы построчно, а не целиком, как компилятор, интерпретаторы сделали язык еще более удобным: теперь можно было от- лаживать программы во время их выполнения. Примерно в это же время, Албрехт начал выпускать журнал «Пиплс компьютер компани», выходивший раз в два месяца, который стал своего рода бюллетенем для программистов-любителей. В нем приводились програм- мы на Бейсике, рассказывалось, как купить недорогое обо- рудование, печатались заметки хэкеров. Хотя журнал пе- чатался весьма небрежно и выглядел непрезентабельно, он возвестил о революции в области малых компьютеров за два года до того, как в 1975 г. обнаружился первый ее признак, прибывший по почте. «Альтаир-8800», голубой металлический ящик, снаб- женный множеством переключателей и лампочек, был первым широкодоступным микрокомпьютером: он стоил 397 долл, в виде набора деталей и 498 долл. — в собран- ном виде. Албрехт получил одну из самых первых моде- лей машины, выпущенной фирмой МИТС (MITS, Micro Instrumentation and Telemetry Systems — микрокомпьютер- ные инструменты и телеметрические системы) из шт. Нью-Мексико. Но несмотря на все восторги Албрехта и его коллег, которые посвятили «Альтаиру» немало стра- ниц, голубой ящик оставлял желать много лучшего. Он не имел ни клавиатуры, ни экрана, не было постоянной памяти, а 256 байт оперативной памяти едва хватило для запоминания одного абзаца информации. Конечно, объем памяти можно было увеличить, но в любом случае, пер- вые «Альтаиры» не имели ни программ, ни трансляторов с какого-либо языка высокого уровня, на котором про- граммы можно было бы написать. Единственным язы- ком, которым мог пользоваться программист, был ма- шинный код. Албрехт сразу понял, что «Альтаиру» нужен именно Бейсик. Трансляторы для таких основных языков, как Фортран и Кобол, требовали очень большого объема па- мяти. Даже Бейсик пришлось существенно модифициро- вать, чтобы его интерпретатор смог туда втиснуться. В поисках сокращенного варианта Бейсика Албрехт обратил- ся к Деннису Эллисону, квалифицированному программис- ту, члену редколлегии «Пиплс компьютер компани» и кон- сультанту по информатике Станфордского университета. Сославшись на занятость, Эллисон отказался писать ми- ниатюрный Бейсик, но согласился подготовить серию ста- тей для «Пиплс компьютер», содержащих рекомендации по реализации «минимального Бейсик-подобного языка», и обратился к 3000 подписчиков своего журнала с призы- вом разработать интерпретатор для модифицированного Бейсика. Новый диалект, предназначенный для «Альтаи- ра» и других коммерческих микрокомпьютеров, получил название «Крошка-Бейсик». В своей первой статье Эллисон как бы задал тон таким обращением к читателям: «Представьте себе, что вам семь лет, и забудьте об арифметике с плавающей точкой (это что такое?), логарифмах, синусах, обращениях мат- риц, расчетах ядерных реакторов и других подобных ве- щах». В конце 1975 г., т. е. меньше, чем через месяц после публикации последней статьи Эллисона, по почте прибыл первый интерпретатор Крошки-Бейсика, состоящий при- мерно из 20 страниц восьмеричного кода. Его прислали 212
два любителя из Техаса, Дик Уиппл и Джон Арнольд, представившиеся как члены Тайлерского отделения Севе- ро-Техасского компьютерного клуба. Уиппл, преподавав- ший математику и физику в колледже, и Арнольд, школь- ный Преподаватель математики, в течение трех часов с по- мощью переключателей на передней панели «Альтаира» старательно набирали коды, чтобы ввести в него специ- альную программу, написанную в машинных кодах, кото- рая позволила бы им работать с клавиатурой. Всего они ввели около 2000 команд в восьмеричном коде. (При рабо- те над интерпретатором техасцы покупали платы памяти фирмы МИТС, увеличив объем памяти машины до 4 ки- лобайт.) Имея в памяти интерпретатор, «Альтаир» пре- красно реагировал на команды Крошки-Бейсика (пока из- за отключения питания не стерлось все содержимое памя- ти компьютера, сохранился лишь распечатанный восьме- ричный листинг — как доказательство проделанной работы). Албрехт опубликовал сообщение о техасском Крошке- Бейсике в декабрьском выпуске газеты, предлагая послать всем заинтересованным читателям копию восьмеричного кода, который позволил бы им писать программы на Крошке-Бейсике для своих машин. Рассчитывая на какой- нибудь десяток писем, Албрехт был засыпан сотнями их. Между тем появились и новые версии Крошки-Бейсика. ИГРА В НАЗВАНИЯ Видя столь очевидный интерес, Албрехт и Эллисон реши- ли выпускать новый журнал, посвященный исключительно Крошке-Бейсику. Они поручили своему управляющему производством Эрику Бакалински придумать название из- данию. Проведя опрос коллег и резюмировав их ответы, тот пришел к такому названию: Dr. Dobb’s Journal of Tiny BASIC Calisthenics & Orthodonta: Running Light without Overbyte. (Имя Добб — аббревиатура от имен Деннис Эллисон и Боб Албрехт.) Затем название слегка модифицировали, заменив слова Tiny BASIC (Крошка-Бейсик) на слово «компьютер». Это было сделано по совету нового редактора, Джима Уорре- на, желавшего расширить сферу интересов журнала, пре- вратив его в массовое популярное издание, посвященное «свободному и недорогому программному обеспечению», а не только Крошке-Бейсику. Под руководством Уоррена журнал публиковал эклектическую смесь микрокомпью- терных новостей — от проектов персональных компьюте- ров до тяжеловесных очерков по совершенствованию ме- тодов программирования. В журнале описывались новые версии Крошки-Бейсика, предлагаемые читателями. На- пример, Ли Ченван, студент-выпускник Станфордского университета, предложил свой вариант Крошки-Бейсика, ставший самым популярным диалектом этого языка. Авторы этих диалектов широко открыли их для всех желающих, разрешив свободно копировать. Однако дру- гие читатели поставили свои разработки на коммерческую основу. Так, Том Питман, член компьютерного клуба, основанного группой регулярных посетителей вычисли- тельного центра, основанного Албрехтом, написал в 1975 г. интерпретатор Крошки-Бейсика для нескольких но- вых микрокомпьютеров, сделанных на основе микропро- цессора «Моторолла-6800». Питман продал свой интер- претатор изготовителю за 3500 долл., вместе с тем сохра- нив за собой право на независимую продажу своего изде- лия. Питман, довольно застенчивый человек среднего воз- раста, не имел намерения идти в бизнес. Он просто хотел доказать, что хорошее программное обеспечение можно разрабатывать и продавать по разумным ценам. В это же время изготовитель «Альтаира» фирма МИТС начала продавать собственную версию Бейсика за 500 долл, (если покупатель приобретал у компании до- полнительные платы памяти, то цена уменьшалась до 150 долл.). Эту версию написал весной 1975 г. (примерно в то же время, когда Албрехт начал проект Крошки- Бейсика) первокурсник Гарвардского университета Билл Гейтс и его друг Пол Аллен, молодой программист из фирмы «Хониуэлл». Они продали свою версию Бейсика фирме МИТС, на условиях получения процента с каждой проданной копии. Коллеги Питмана по компьютерному клубу возмутились высокой ценой Бейсика для «Альтаи- ра», настаивая на бесплатном распространении программ- ного обеспечения. («Тогда мы считали, что все должно быть свободным,» — заметил позднее Албрехт.) Вероят- но, кто-то из членов клуба украл программу «Альтаира» и распространил ее свободные копии, несколько приглу- шив ажиотаж, охвативший компьютерное сообщество. Желая проверить, способны ли его друзья-хэкеры удер- жаться от кражи недорогих программ, Питман предложил любителям свой интерпретатор Крошки-Бейсика, закоди- 213
рованный на перфоленте, всего за 5 долл. Реакция была столь восторженной, что Питман объявил о намерении на- писать для микрокомпьютеров Крошку-Фортран и прода- вать его по цене 25 долл. Однако ему пришлось прекра- тить свою «предпринимательскую деятельность» по се- мейным обстоятельствам, весьма понятным многим хэке- рам. «Моя компьютерная вдова оставила меня, — объяс- нял он. — Она решила, что не хочет быть замужем за “наркоманом”». РАСЦВЕТ БЕЙСИКА История «Альтаира» и Крошки-Бейсика завершилась в конце 70-х годов. Микрокомпьютеры выпускались теперь в полностью собранном виде, с большой памятью, спо- собной вместить большие диалекты Бейсика. Некоторые изготовители встраивали интерпретаторы собственных версий Бейсика непосредственно в ПЗУ (постоянное запо- минающее устройство) компьютера. Возникло много раз- личных модификаций Бейсика (часто они создавались с целью выявить достоинства того или иного конкретного микрокомпьютера), так что разработчики языков стали говорить о нем как о целом классе языков, а не об одном языке с диалектами. Вскоре наибольшую популярность за- воевал M-Бейсик (прямой наследник Бейсика «Альтаира»), с продажи которого Гейтс и Аллен начали деятельность созданной ими и весьма преуспевшей компании «Микро- софт корпорейшн» (Microsoft Corporation). Во многом благодаря предприимчивости Гейтса и Ал- лена, неутомимой деятельности Боба Албрехта и энтузи- азму малоизвестных разработчиков доморощенных кро- шек-бейсиков, этот язык, воплотившийся в многочислен- ных версиях, завоевал ведущее место в программировании микрокомпьютеров. В середине 80-х годов уже миллионы людей в США и других странах использовали Бейсик, при- чем главным образом на персональных компьютерах. Два первых разработчика Бейсика, Джон Кемени и То- мас Курц из Дартмутского колледжа, испытывали в отно- шении феноменального успеха своего языка смешанные чувства. Они были безмерно горды той ролью, которую этот язык сыграл «в содействии открытию компьютеров массами» (выражение Кемени), но одновременно встрево- жены тем, во что превратилось их творение. «Первые микрокомпьютеры имели очень ограниченную память, так что разработчикам приходилось идти на компромиссы, порой весьма неудачные, — писали Кемени и Курц в 1985 г. — Многие из этих компромиссов став неотъемле- мыми свойствами языка, закрепились, хотя первопричины их уже исчезли». В результате многие версии Бейсика оказалось невоз- можным переносить с машины на машину. Выявились и другие проблемы. Многие специалисты по информатике относились к Бейсику довольно пренебрежительно. Напри- мер, англичанин Хоар сравнивал программирование на Бейсике с игрой на пианино двумя пальцами: играя прос- тые мелодии, новички быстро делают успехи, но потом сталкиваются с огромными трудностями. Бейсик удобен для написания простых коротких программ, но из-за от- сутствия в языке структуры не годится для длинных и сложных. Например, с помощью оператора GOTO управ- ление может быть передано из одной точки программы в любую другую, что приводит к образованию структуры программы, которую называют «комок спагетти». От- сутствие структуры в программе заставило некоторые колледжи и школы отказаться от использования Бейсика для обучения программированию, и заменить его более структурированным языком Паскаль, созданным Никлау- сом Виртом. ПРИНЯТИЕ НАСТОЯЩЕГО СТАНДАРТА На протяжении многих лет Кемени и Курц периодически пересматривали первоначальную (дартмутскую) версию Бейсика и даже заменили оператор GOTO более сложными управляющими структурами. Пустив Бейсик в обращение, они уже не могли уследить, что с ним происходит за пре- делами Дартмута. Чтобы как-то решить эту проблему, Кемени и Курц в 1984 г. разработали микрокомпьютер- ную версию Бейсика, которую намеревались согласовать со стандартами Бейсика, введенными Американским на- циональным институтом стандартов. Этот пересмотр Бейсика основывался на принципах структурного програм- мирования и предусматривал использование комбинации компилятора и интерпретатора для трансляции программ на Бейсике в машинный код. Гибридный транслятор не только сразу выявлял ошибки в программах, но и позво- лил легко переносить их с одних моделей машин на дру- гие. В выборе названия для новой определяющей версии языка, который сам достиг уже 20-летия, отразилось от- ношение Кемени и Курца к другим диалектам: они назва- ли ее Истинный Бейсик. Кемени и Курц оказались друзьями по несчастью с Ни- клаусом Виртом. Созданный им сильно структурирован- ный язык Паскаль также переживал громадный успех и в конце 70-х годов получил широкое распространение в уни- верситетах. Но разработчики программного обеспечения, попытавшиеся приспособить Паскаль для микрокомпью- теров и использовать его в коммерческих целях, внесли в язык значительные изменения. Поскольку Вирт изначаль- но разрабатывал Паскаль для обучения студентов про- граммированию, язык почти не имел ввода-вывода и дру- гих средств, существенных для практического программи- рования. По этой причине в компиляторах Паскаля появ- лялись все новые расширения, выводящие язык за пределы чисто академических приложений. Это породило множе- ство диалектов. Вирт не признал новые диалекты, провозгласив в 1977 г. свою позицию: «Если язык едва походит для применения, на которое его создатель явно не рассчи- тывал, то следует набраться смелости и создать новый, полностью адекватный язык, а не усложнять сущест- вующий». 214
Помахивая саксофоном, игрой на кото- ром он когда-то зарабатывал себе на жизнь, преуспевающий бизнесмен Филип Кан восседает на краю огромной ванны, которую он приобрел на доходы от про- дажи Турбо-Паскаля — компактного и дешевого компилятора, созданного им в 1983 г. За два первых года было продано более четверти миллионов копий Турбо- Паскаля, ставшего стандартной версией Паскаля для микрокомпьютеров. Именно это Вирт и делал. В 1981 г. он разработал язык Модула-2, который должен был заменить Паскаль в универсальных применениях. Подобно Аде, язык Моду- ла-2 представлял собой расширение Паскаля в нескольких направлениях. Наиболее примечательным было введение средств написания больших и сложных программ, кото- рые можно было теперь создавать в виде отдельных само- стоятельных модулей, а затем собирать их вместе. Одна- ко в начале 80-х годов, пока компании по разработке про- граммного обеспечения трудились над компиляторами для Модулы-2, которые позволили бы использовать язык на микрокомпьютерах, с Паскалем случилось чудо. До этого времени, различные компиляторы Паскаля для микрокомпьютеров не имели особого коммерческого успеха, поскольку были дороги, занимали большой объем памяти на диске и работали с черепашьей скоростью. Но тут на арену вышел бывший студент Вирта со своим ком- пилятором для микрокомпьютеров, который он назвал Турбо-Паскаль. Это был компактный, мгновенно сраба- тывающий и удивительно дешевый компилятор. ДЖАЗИСТ Разработчиком Турбо-Паскаля стал «сумасшедший фран- цуз» по имени Филип Кан. Родом из Парижа (его отец, уро- женец Германии, был инженером, а мать-француженка — кинопродюссером), Кан некоторое время учился в Цюрихе, где прослушал вводный курс Вирта по Паскалю. Вернув- шись во Францию, он защитил диссертацию на степень кан- дидата наук по математике. В этот период он иногда под- зарабатывал игрой на саксафоне в ночных клубах. Кан занимался математикой, а компьютерами интере- совался лишь постольку, поскольку это помогало ему в решении задач и доказательстве теорем. Затем он приоб- рел свой первый микрокомпьютер. «С помощью моего «Эпл-2» (Apple — яблоко, марка широко распространенно- го микрокомпьютера) я открыл волшебство Кремниевой долины*,» — говорил он позже. Для Кана волшебство свя- зывалось с той удачей, которую «Эпл-2 принес ему, как и создателям этой машины Стивену Джобсу и Стефану Возняку. Вместе с еще двумя приятелями он начал зараба- тывать кое-какие деньги, составляя на Паскале приклад- ные программы для микрокомпьютеров. Неудовлетворен- ность существующими компиляторами Паскаля побудила Кана взяться за разработку Турбо-Паскаля. В 1982 г., имея на руках эту программу и 2000 долл, в кармане, он поки- нул Францию и уехал в Калифорнию. Вначале Кан не мог получить там даже работу. Путе- шествуя по туристской визе, он не имел права на так на- зываемую зеленую карточку — правительственное разре- шение на получение работы в США. В отчаянии он решил сделать ставку на Турбо-Паскаль и создал новую фирму по разработке программного обеспечения. Он назвал ее «Борланд интернэшнл» — название, подсказанное телеви- зионной передачей о бывшем космонавте с похожим име- нем, Франке Бормане, ставшем председателем правления Восточных авиалиний. Кан решил, что имя, имеющее «всеамериканское звучание», послужит подходящим при- крытием для чужака в мире бизнеса. Несмотря на громкое имя фирмы, Кану не удалось за- интересовать даже представителей рискового капитала. (Фирмами рискового капитала называются корпорации, вкладывающие деньги в проекты, сулящие малую вероят- ность успеха, однако успех даже десятой части таких про- ектов с лихвой окупает все затраты. — Перев.) Кан при- влек к работе в своем новом предприятии других образо- ванных новичков вроде бывшего владельца японского ре- сторана и официантки коктейль-бара, имевшей степень кандидата наук по психологии. Не имея возможности по- лучить хотя бы доллар из официальных источников фи- нансирования, Кан собрал небольшую сумму (20 тыс. долл.) у членов своей семьи. В марте 1984 г. он организо- * Кремниевая долина — место в Калифорнии (США), где особенно активно велись разработки персональных компьютеров. Более подробно об этом рассказывается в первой книге этой серии «Знакомьтесь: компьютер». — Прим. ред. 215
вал контору в двухкомнатном офисе над авторемонтным гаражом в Скоттс-вэлей, в 45 км к юго-западу от Сан-Хо- се. «Это был гараж для «ягуаров», — вспоминает Кан, — что снижало наш класс». Приступив к делу, Кан уговорил служащего одного популярного компьютерного журнала провести широкую рекламу Турбо-Паскаля в кредит. Кан понимал, что рекламное объявление — единствен- но возможный способ пробиться, и сделал все возможное. Прочитав книгу о продаже товаров по почте, где рекомен- довалось использовать яркие цвета для привлечения вни- мания читателей, он оформил рекламное объявление в рез- ких зеленых, синих и розовых тонах. В книге также гово- рилось, что для быстрого успеха стоимость товара дол- жна быть меньше 50 долл.» Поэтому он оценил свой сложный компилятор и редактор программ в 49 долл. 95 центов. Это была предельная нижняя граница — остальные системы продавались в 10 раз дороже. Реклама оказалась гениальной находкой для завоевания рынка. Только за первый месяц юна принесла Кану заказов на 150 тыс. долл., так что местные банки даже заподозри- ли его в почтовом мошенничестве и вначале отказывались оплачивать чеки и кредитные карточки. Однако заказы продолжали поступать: они стимулировались обзорами в компьютерных изданиях, где Турбо-Паскаль по удобству написания коротких программ сравнивался с Бейсиком. Эксперты отмечали также быстродействие компилятора Кана, который работал во много раз быстрее, чем его со- перники. В первые два года было продано не менее 300 тыс. ко- пий Турбо-Паскаля, что превзошло объем продажи всех прочих языков для микрокомпьютеров. Подобно тому как десятью годами ранее новая версия Бейсика «вывела на орбиту» «Микрософт», так ТУрбо-Паскаль почти за одну ночь перевел «Борланд Интернэшнл» в разряд основных производителей программного обеспечения. В 1985 г. Кан с легкостью выбросил 45 тыс. долл, на организацию при- ема, пригласив на него 600 клиентов фирмы «Борланд» и их гостей. Являя образец экстравагантности, он облачил свою внушительную фигуру в пурпурно-золотую тогу, увенчал волосы венком из виноградных листьев и испол- нил — в честь своего успеха, достигнутого в 33 года, — несколько вещей на саксафоне. НИША В МИРЕ МИКРОКОМПЬЮТЕРОВ Многие языки, первоначально разработанные для боль- ших компьютеров и мини-компьютеров, в дальнейшем приспосабливались к персональным компьютерам. Напри- мер, Лисп — основной язык исследований по искусствен- ному интеллекту — сразу хорошо подошел к персональ- ным компьютерам, поскольку он позволял быстро писать и легко изменять программы (в чем и состоит суть про- граммирования на микрокомпьютерах). Аналогично язык Си, созданный в «Белл телефон лабораторис», широко ис- пользуется профессионалами при написании прикладных программ для небольших компьютеров. Однако такие классические языки, как Фортран и Ко- бол, не удалось эффективно использовать даже после то- го, как микрокомпьютеры получили большую память, до- статочную для того, чтобы «вместить» эти языки. Одной из причин такой «нестыковки» было отсутствие быстрых компиляторов. Другая состояла в том, что именно досто- инства этих языков (у Фортрана— это ориентация на длинные задачи обработки числовой информации, встре- чающиеся в таких областях, как ядерная физика и техника, а у Кобола — возможность обработки гигантских объ- емов простой информации, например регистрационных карточек служащих) не отвечали нуждам программирова- ния большинства пользователей персональных ком- пьютеров. Однако один язык, который, казалось, был обречен на безвестность в эпоху больших компьютеров, обрел новую жизнь во время микрокомпьютерной революции. Язык Форт (FORTH — вперед) медленно завоевывал популяр- ность, в основном благодаря усилиям отдельных энтузиа- стов. Разработчик Форта Чарлз Мур утверждал, что не просто создал новый язык. Он создавал и развивал его по- степенно на протяжении многих лет как способ повыше- ния собственной производительности. «Традиционные языки программирования не обеспечивали желаемой для меня мощности, легкости и гибкости, — объяснял он позднее. — Я подсчитал, что за 40 лет очень хороший программист может написать 40 программ, а мне хоте- лось гораздо больше. В мире столько вещей, которые нужно сделать, что мне требовался инструмент, способ- ный помочь в этом». Родившись в шт. Мичиган, Мур в 1960 г. окончил Мас- сачусетский технологический институт (МТИ), где специа- лизировался в области физики. В начале 60-х годов Мур начал разрабатывать элементы Форта, создавая програм- мы для Станфордского линейного ускорителя в Калифор- нии. Одной из особенностей Форта была компактность; система его обозначений настолько лаконична, что неко- торые ключевые слова представляют собой просто знаки пунктуации. Другое свойство, необычное для других языков — легкая расширяемость: программист может без труда определять новые ключевые слова или команды в терминах, уже существующих, настраивая набор команд языка почти на любое приложение. В конце 60-х годов, когда Мур занимался программированием для одной нью- йоркской частной компании, все его идеи слились в то, что с полным правом можно было назвать языком. Внача- ле Мур хотел дать своему детищу название FOURTH (чет- вертый), поскольку ему казалось, что мощь языка на- столько велика, что он на целое поколение опередил языки использовавшихся тогда компьютеров третьего поколения. (По словам Мура, в своем окончательном виде новый язык повысил его производительность в 10 раз.) Однако машина IBM-ИЗО, на которой Мур в то время работал, ограничивала длину идентификаторов пятью литерами, поэтому.он сократил название языка до Форт (FORTH), которое он позднее охарактеризовал как «утонченную игру слов». 216
НАСТРОЙКА НА НЕБЕСА Впервые Форт стал активно применяться в начале 70-х го- дов, когда Мур работал в Национальной радиоастрономи- ческой обсерватории в Аризоне. В сотрудничестве с Элиза- бет Разер, ведавшей программным обеспечением обсерва- тории, он использовал Форт при написании серии про- грамм для мини-компьютеров, которые, в частности, управляли в реальном масштабе времени системой наведе- ния 11-метрового телескопа обсерватории Кит-Пик. Про- граммы и сама система оказались столь удачными, что в 1973 г. Мур, Разер и их руководитель Нед Конклин реши- ли создать свою компанию. «Форт инкорпорейтид» про- давала системы, пригодные не только для обсерваторий, но и для других специальных приложений, где требова- лось управление в реальном масштабе времени. Именно такая система автоматического управления видеокамерами была установлена на подводном аппарате, участвовавшем в 1985 г. в поисках затонувшего «Титаника». Хотя компания не проявляла особого интереса к рынку персональных компьютеров (в конце 70-х годов объем продажи ее наиболее дешевых систем составил 2000 долл.), Форт тем не менее вызвал ажиотаж среди любителей микрокомпьютеров. В числе первых был моло- дой инженер из Кремниевой долины по имени Ким Хар- рис. На семинаре, проводимом компанией, он с благогове- нием наблюдал, как один из демонстраторов за 15 мин. составил простую программу для исполнения компьютер- ной музыки. Харрис знал квалифицированного любителя, который трудился больше года, чтобы получить подоб- ную программу на языке ассемблера. «Это было подобно чуду, — вспоминал Харрис, — и я увидел его собственны- ми глазами». В 1977 г. Харрис, объединившись с четырьмя другими f молодыми энтузиастами, образовал инициативную группу 1 под названием ФИГ (FIG, от FORTH Interest Group), кото- | рая занялась разработкой дешевой Форт-системы для лю- 1 бител ей. Пятеро основателей и семеро их добровольных г помощников, получив из обсерватории первую широкодо- ступную версию интерпретатора Форта, трудились более полугода ночами и выходными над созданием упрощенно- го интерпретатора для персональных компьютеров. Ре- зультат этой работы, ФИГ-Форт (FIG-FORTH), продавал- ся по цене примерно 20 долл. В дальнейшем появились в продаже и другие версии Форта для микрокомпьютеров, но любители отдавали предпочтение ФИГ-Форту. Сама группа тем временем охватила около 4000 человек из раз- ных концов страны. Форт труден для изучения и малопонятен всем, кроме самих его пользователей. Однако его сторонники утверж- дают, что этот язык «усиливает их власть» над компью- тером (подобно тому как ручная передача подчиняет авто- мобиль водителю). «Язык, подобный Форту, — это рай для хэкеров», — заметил один из энтузиастов. СРЕДСТВО ДЛЯ САМЫХ МАЛЕНЬКИХ Как видно на примере Форта, микрокомпьютеры способ- ствовали распространению не только обычных языков для обучения (Бейсика и Паскаля), но и некоторых нетрадици- онных языков. Возможно, наиболее драматически влияние персональных компьютеров на революцию в языках де- монстрирует Лого — язык, настолько простой в использо- вании, что создавать на нем программы способен даже трехлетний ребенок. Лого известен как язык со встроен- ной «черепашкой». Черепашка — это треугольный значок 11-метровый радиотелескоп, установлен- ный в Национальной радиоастрономиче- ской обсерватории Китт-Пик (шт.Аризо- на), следит за звездами под управлением компьютерной программы, написанной на языке Форт, который в начале 70-х годов создал астроном Чарлз Мур. В дальнейшем Форт был приспособлен к различным типам компьютеров и исполь- зовался для разработки систем управле- ния разнообразными научными инстру- ментами и установками. 217
Обучение понятиям с помощью «черепашки» Разработанный в конце 60-х годов язык Лого приобрел широкую известность (в основном благодаря использова- нию так называемой черепашьей графики) как мощный язык обучения детей понятиям математики, геометрии и программирования. Новички приобретают опыт шаг за шагом, манипулируя треугольным значком на экране, на- зываемым «черепашкой» (внизу). Вначале программист дает черепашке простые приказы, например ВПЕРЕД 100, что означает «передвинуться вперед на 100 шагов», или ВЛЕВО 60, т. е. «сделать поворот влево на 60 градусов». Эти команды можно затем использовать для создания не- больших программ или процедур, рисующих геометриче- ские фигуры типа окружностей и квадратов, которые в свою очередь можно объединять в более сложные проце- дуры и соответственно фигуры. Подобно своему «родителю» Лиспу, Лого относится к расширяемым языкам. Помимо встроенных операций (ВПЕРЕД, ВПРАВО, ВЛЕВО) Лого позволяет програм- ДЛЯ КВАДРАТ1 ВПЕРЕД 100 ВПРАВО 90 ВПЕРЕД 100 ВПРАВО 90 ВПЕРЕД 100 ВПРАВО 90 ВПЕРЕД 100 ВПРАВО 90 КОНЕЦ 7КВАДРАТ1 Используя черепашью графику языка Ло- го, начинающий программист может на- чертить квадрат, придумав процедуру ДЛЯ КВАДРАТ1 (1 просто означает, что существуют и другие процедуры для ри- сования квадрата). Команды внутри про- цедуры управляют перемещением чере- пашки по экрану в соответствии со зна- чениями, заданными на каждом шаге. Таким образом, черепашка пройдет впе- ред 100 шагов, сделает поворот вправо на 90 градусов и т.д., пока процедура не завершится и не будет построен квадрат. ДЛЯ КВАДРАТ2 ПОВТОР 4 [ВПЕРЕД 100 ВПРАВО 90] КОНЕЦ 7КВАДРАТ2 Более искушенный программист умень- шит избыточность программы, употре- бив команду повторения, как показано в процедуре ДЛЯ КВАДРАТ2 (это эконо- мит память и снижает вероятность оши- бок при наборе программы). В соот- ветствии с командой черепашка повторя- ет действия (записанные в квадратных скобках) четыре раза, нарисовав такой же квадрат, как и в первый раз. Однако са- ма процедура теперь занимает только 3 строки вместо 10. ДЛЯ КВАДРАТ :РАЗМЕР ПОВТОР 4 [ВПЕРЕД :РАЗМЕР ВПРАВО 90] КОНЕЦ 7КВАДРАТ 80 Процедура ДЛЯ КВАДРАТ :РАЗМЕР — пример использования переменной, отме- чаемой двоеточием в начале слова. Это указание черепашке, взяв значение пере- менной, подставить его, как указано. Здесь :РАЗМЕР — это длина стороны; задавая значение этой переменной при за- пуске, программист может получать ква- драты любой величины. В нашем случае для : РАЗМЕР задано значение 80 шагов, что дает меньший квадрат, чем изобра- женный слева. 218
мисту определять новые процедуры. Слово ДЛЯ (напри- мер, ДЛЯ КВАДРАТ) указывает на то, что вы собирае- тесь определить процедуру: следующее слово — это имя процедуры, а КОНЕЦ указывает на завершение определе- ния; между ними должны быть одна или несколько ко- манд. После того как процедура определена, она стано- вится частью словаря компьютера. Если набрать имя про- цедуры, то компьютер выполнит содержащиеся в ней ко- манды. Можно вызывать не только одну процедуру из другой, как показано на этих рисунках, но и рекурсивно процедуру изнутри ее самой (с. 188—189), что позволяет записывать сложные программы в компактном виде. Другая особенность Лого, делающая его простым в обучении, — отсутствие необходимости описывать зара- нее типы переменных, как, например, в Паскале (с. 00-00). Вместо этого переменные идентифицируются просто двое- точием в начале слова. При написании процедуры ДЛЯ КВАДРАТ : РАЗМЕР (третья слева) программист просто включает переменную :РАЗМЕР в описание процедуры, не указывая, имеет она целый, вещественный или строковый тип. В приведенных здесь процедурах «черепашьей графи- ки» ввод команды КВАДРАТ 80 приводит к тому, что на- рисуется квадрат со стороной 80 единиц. В другой про- грамме на Лого команда КВАДРАТ 80 могла бы означать результат умножения числа 80 на самого себя. ДЛЯ ТРЕУГОЛЬНИК :РАЗМЕР ПОВТОР 3 [ВПЕРЕД :РАЗМЕР ВПРАВО 120] КОНЕЦ ?ТРЕУГОЛЬНИК 80 Используя переменные и команды повто- рения, программист может создавать и другие процедуры построения фигур. Приведенная здесь процедура формирует равносторонний треугольник, трижды по- вторяя команду, указанную в квадратных скобках. При ее выполнении переменной :РАЗМЕР, задающей длину каждой сто- роны, присваивается значение 80 шагов. ДЛЯ ДОМ .-РАЗМЕР КВАДРАТ .-РАЗМЕР ТРЕУГОЛЬНИК :РАЗМЕР КОНЕЦ ?ДОМ 80 При объединении процедур для создания более сложных фигур возможны непред- виденные ошибки. Целью процедуры ДЛЯ ДОМ :РАЗМЕР было построение квадратного домика с треугольной кры- шей, но неожиданно вершина треугольни- ка оказалась внутри квадрата. Это объяс- няется тем, что в конце процедуры рисо- вания квадрата черепашка, вернувшись в исходную точку (левый нижний угол), оказалась направленной вперед, поэтому она рисует треугольник, аналогичный приведенному слева. ДЛЯ ХОРОШИЙДОМ :РАЗМЕР ВПРАВО 90 КВАДРАТ :РАЗМЕР ВЛЕВО 60 ТРЕУГОЛЬНИК :РАЗМЕР КОНЕЦ 7ХОРОШИЙДОМ Процедура ДЛЯ ХОРОШИЙДОМ :РАЗ- МЕР исправляет ошибку, повернув перед вызовом процедуры ДЛЯ КВАДРАТ :РАЗМЕР черепашку на 90 градусов впра- во. Когда черепашка заканчивает квадрат (который теперь расположен в нижней части экрана), она вновь смотрит вправо. Перед началом процедуры ДЛЯ ТРЕУГОЛЬНИК :РАЗМЕР черепашка должна повернуться на 60 градусов влево — в позицию треугольника, распо- ложенного на верху квадрата, как и над- лежит располагаться крыше. 219
на экране компьютера, который возникает и движется по командам, набираемым на клавиатуре (с. 218—219). Ребе- нок (или любой другой человек) учится составлять про- граммы, рисующие простые геометрические фигуры типа треугольников или квадратов, и комбинировать эти про- граммы в более крупные, которые «строят» сложные фи- гуры, например дом. Таким образом, ребенок получает одновременно уроки искусства, геометрии и программиро- вания компьютеров. Язык Лого был разработан в конце 60-х годов в МТИ под руководством профессора математики и педагогики Сеймура Пейперта. Страстно увлекаясь изучением работы мозга, Пейперт однажды заметил, что он «всегда рас- сматривал процесс обучения как хобби». Следуя этому «хобби», он освоил такие различные виды деятельности, как пилотирование самолетов, чтение на китайском языке, искусство иллюзионизма. Раздумывая над процессами мышления, Пейперт, подобно классическим рассеянным профессорам, иногда абсолютно терял связь с окружаю- щим миром: однажды, пролетев полпути над Атлантикой, он вдруг вспомнил, что оставил свою жену в аэропорту Нью-Йорка. Пейперт родился в Южной Африке, где еще мальчиком печатал на множительном аппарате газету, осуждающую апартеид. Он получил звание доктора мате- матики у себя дома и в Кембриджском университете. За- тем он провел пять лет в Женеве, работая с выдающимся швейцарским физиологом Жаном Пиаже. Теория послед- него, согласно которой ребенок обучается в процессе игры с окружающими предметами, оказала на Пейперта силь- Разработчик Лого Сеймур Пейперт из Масса- чусетского технологического института демон- стрирует механический двойник курсора-чере- пашку, изображаемую на экране. Обучаясь про- граммированию на Лого, дети задают простые команды, которые управляют игрушечной че- репахой, снабженной карандашом. Двигаясь вперед-назад, поворачивая вправо-влево, она рисует картинки, подобные этой рыбке. ное влияние. Вспоминая о своем мальчишеском увлечении автомобилями, Пейперт, например, сделал вывод, что именно интерес к их устройству открыл ему связь «объ- ект — мысль» и облегчил в дальнейшем постижение мате- матических абстракций. ОТ МЕХАНИЧЕСКОГО УСТРОЙСТВА К КОМПЬЮТЕРУ Поняв, что аналогичным образом компьютеры могут дать детям инструмент мышления, Пейперт перешел в 1964 г. в лабораторию искусственного интеллекта МТИ, желая заняться этим новым направлением исследований. Пейперт был убежден, что ученики начальной школы и даже дети помладше, могут научиться программировать. «Изучение языков — одно из увлекательнейших занятий для ребенка, — говорил он. — Каждый нормальный ребе- нок учится разговаривать. Почему бы ему не научиться «разговаривать» с компьютером?» Но Пейперт был так- же убежден, что даже Бейсик, простейший компьютерный язык того времени, слишком абстрактен для ребенка. Поэ- тому он и его коллеги создали новый язык на основе Лис- па, назвав его Лого (что по-гречески означает «слово»). По инициативе Пейперта в язык было добавлено понятие черепашки, обеспечивающее связь «объект — мысль» (сна- чала использовалась механическая черепашка, ползающая по полу, а затем ее условное изображение на экране дис- плея), которое и придавало языку очарование и притяга- тельность для детей. Как указывал Пейперт, в большин- стве машинных команд «компьютер обычно шаг за шагом ведет ребенка за собой, т. е. как бы программирует его». Лого же, напротив, «убеждает ребенка в том, что он мо- жет управлять машиной, позволяет ребенку сказать: “Здесь я хозяин”». Первоначально Лого предназначался для больших до- рогих компьютеров и мини-компьютеров, имеющихся в МТИ, но в дальнейшем проник в тысячи классов началь- ных школ. Сейчас ребенок весело изучает искусство про- граммирования, которое поколением раньше было доступ- но только немногим специалистам-математикам. В этом процессе молодые открывают «мысленные двери», обна- руживая, как сказал один из них Пейперту, «новые комна- ты в своем сознании». 220
ДВА ОТКЛОНЕНИЯ ОТ ТРАДИЦИОННЫХ ЯЗЫКОВ При использовании любого языка высокого уровня про- граммы редактирования и трансляции функционируют со- вместно с аппаратным обеспечением, образуя так называе- мую виртуальную машину, которая использует сложные структуры данных для хранения информации и мощные процедуры для ее обработки. По существу, виртуальная машина переводит процесс решения задачи с уровня языка на уровень конкретного программного окружения. Языки различных видов могут формировать различные окруже- ния даже при одном и том же аппаратном обеспечении. В течение многих лет программное окружение строи- лось главным образом на основе процедурных языков — Фортрана, Паскаля и Ады. Программы, написанные на этих языках, делятся на две части — данных и процедур. Программист вводит данные в компьютер, а затем опи- сывает компьютеру шаг за шагом последовательность процедур* необходимых для решения задачи. Однако по мере эволюции языков высокого уровня получили широ- кое распространение языки другого типа. Объектно-ориентированные и дескриптивные (описа- тельные) языки (о них рассказывается на последующих страницах) создают окружения, радикально отличающиеся от окружения, соответствующего процедурным языкам. Во-первых, отличие состоит в том, что в первом случае от программиста скрыто гораздо больше рутинных дета- лей процесса вычисления. Например, программа, написан- ная на Прологе (дескриптивном языке, широко используе- мом в области искусственного интеллекта), состоит из описаний, задающих объекты и отношения между ними. Так, отношение (произведение высота ширина площадь} описывает формулу площадь = высота х ширина. Вместо того, чтобы расписывать компьютеру, как из уравнения найти площадь (или высоту, если известны площадь и ши- рина), программист просто определяет отношение и пре- доставляет компьютеру самому найти ответ на заданный вопрос. 221
Два отклонения от традиционных языков Окружение, работающее с объектами Объектно-ориентированный язык создает окружение в ви- де множества независимых объектов, каждый из которых отличается своими свойствами и способами взаимодейст- вия с другими объектами. В этом окружении каждый объ- ект, по существу, ведет себя подобно компьютеру: он мо- жет получать сообщения от других объектов и в свою оче- редь посылать сообщения, запоминать информацию и об- рабатывать ее определенным образом. Задавая структуру обмена сообщениями между объектами, программист по- лучает совокупность операций, которые и составляют про- грамму. Объекты можно использовать для решения задач, не понимая механизма их (объектов) работы, т.е. рассмат- ривая их как своего рода «черный ящик». Объектно- ориентированный язык скрывает многие детали работы системы внутри самих объектов. Однако при необходи- мости программист может модифицировать детали внут- реннего устройства объектов, создавая тем самым другие объекты, требуемые для решения новых задач. Операции над данными, заключенными в объекте, за- пускаются при получении им сообщения, указывающего нужную последовательность действий. Конкретная проце- дура, идентифицируемая сообщением и требующая выпол- нения, содержится в получающем сообщение объекте в виде внутренней программы, называемой методом. Метод выполняет манипуляции с данными, хранящимися внутри объекта, и может также посылать сообщения другим объ- ектам с целью получения нужного результата, который затем возвращается к объекту, пославшему сообщение. Каждый объект воспринимает сообщения, касающиеся тех понятий, которые он представляет. Например, объект, ответственный за работу с числами, понимает сообщения, касающиеся арифметических вычислений. Другой объект — представляющий список — не воспринимает по- добных сообщений, но реагирует на запросы запоминания и извлечения информации. Объект, следящий за положени- ем фигур на экране компьютера, знает, как отвечать на запросы о расположении и размерах фигур. Объектно-ориентированный язык хорошо подходит для написания сложных программ, управляющих компьютер- ной системой. Поскольку каждая часть системы может быть представлена объектом, замена одной из них, напри- мер программы управления печатающим устройством (принтером) или экраном, может быть осуществлена без изменений остальных частей системы. Программист про- сто добивается того, чтобы новая часть отвечала на те Прямоугольник Н форма увеличить:Процент площадь же сообщения, что и замененная. Каким образом достига- ется результат — несущественно. „ = В объектно-ориентированном окружении объекты напоминают маленькие специализированные ком- пьютеры со своими данными и процедурами. Программист может рассматривать объект как независимое устройство, имеющее собственное ' имя и протокол, т.е. множество сообщений, ко- торые вызывают выполнение вычислительных процессов. Списо добавь убрать найти: 222 Сорти|
Часы пуск танов ремя форма вы ветить стереть Кисть пероВверх форма пероВниз высветить черный стереть пероВниз день белый Набор Номера добавить:Имя Номер убрать:Имя автонаборам* набор:Номер Прямо- угольник в форма увеличитыПроце круж- ность А /Круж— НОСТЬ Е форма высветить кружность форм высветить :тер т< площадь Перо пероВверх стереть вь светить Ключ стереть сдвигНа:Размер; пероВниз; иость форма Прямо- угольник А Форма увеличить. Проце площадь ного- угольник С )мент JHT ПЕРЕМЕННЫЕ Позиция 15,20 Размер 7 . МЕТОДЫ форма Маркер пероВверх; сдвигК:Позиция; Внутренность объекта: данные и приказы высветить стереть чертитьдугу: Размер,360 Маркер черный Себе форма Маркер белый Себе форма Каждый объект содержит переменные, в которых находятся данные, его описывающие. Объект с именем Окружность А — это фигура, которая мо- жет быть нарисована на экране компьютера. Пере- менные этого объекта называются Позиция (пози- ция на экране центра окружности) и Размер (ради- ус окружности). Переменными объекта, представляющего список имен, должны быть сами имена. Каждому сообщению в протоколе объекта со- ответствует метод, т.е. набор процедур, которые вызываются этим сообщением. Объект Окруж- ность А имеет три сообщения: форма, высветить и стереть. Метод форма говорит объекту, как описать его форму, обращаясь к переменным и по- сылая сообщения объекту Маркер, который выпол- няет работу по вычерчиванию; метод форма вы- зывается методами высветить и стереть. Мето- ды высветить и стереть посылают сообщения Себе — встроенному имени, позволяющему объек- ту (в нашем случае это Окружность А) направ- лять сообщения самому себе. Метод высветить приказывает Себе использовать метод форма для создания окружности, послав перед этим методу Маркер сообщение о том, что ему следует рисо- вать черные линии. Метод стереть говорит Себе использовать метод форма для удаления окруж- ности, применяя Маркер, рисующий белые линии. 223
Два отклонения от традиционных языков. Класс Объект Суперклас Класс ДисплейныйОбъект Суперкла Перемени Здесь класс по имени Объект задает свой- ства всех объектов: то, что они должны реа- гировать на сообщения вызовами методов, манипулирующих с их переменными. ДисплейныйОбъект, подкласс класса Объект, представляет собой как бы эскиз объектов, которые отображаются на экране. Он задает методы для построения дуг, прямых и вы- полнения других задач. Сообщени и методы Многоугольник, подкласс класса Дисплей- ныйОбъект, имеет переменные с именами Позиция, Стороны, Длина и Угол', некото- рые из его сообщений посылают сообщения форма, высветить и стереть. Простота структуры в виде классов Каждый объект в объектно-ориентированном окружении имеет свои собственные характеристики, однако объекты, имеющие одинаковые свойства и ведущие себя сходным образом, объединяются в группы, или классы. Само опре- деление класса задает общие свойства его составляющих (экземпляров): все они имеют одинаковое число перемен- ных одного и того же типа, реагируют на одни и те же сообщения и реализуют одни и те же методы работы со своими переменными. Экземпляры класса отличаются один от другого конкретными значениями собственных пе- ременных. Например, в ответ на определенное сообщение каждый экземпляр класса, называемого Окружность, мо- жет поменять свой размер, отображаемый на экране дис- плея, но соответственно должно поменяться и значение переменной, задающей размер этого экземпляра. Как показано на приведенном здесь примере упрощен- ного объектно-ориентированного языка (справа), классы организованы как иерархия суперклассов и подклассов. Внизу стопки расположен суперкласс Объект, определяю- щий общие свойства всех объектов, например их способ- ность отвечать на сообщения. Подкласс наследует сообще- ния и методы суперкласса, расположенного выше в иерар- хии, кроме того, он может содержать новые сообщения и методы, реализующие его особенности. Сам класс тоже является экземпляром некоторого класса. Среди его мето- дов один предназначен для создания новых экземпляров этого класса. Например, программист (или другой объект) может послать сообщение классу Прямоугольник, потре- бовав создать новый объект этого класса, ПрямоугА, и задав размер и положение этого нового члена класса. Пря- моугА будет содержать все методы класса Прямоуголъ- Объект Класс Многоугольник Суперкласс ДисплейныйОбъект Переменные Размещение Стороны Длина Сообщения форма высветить стереть И Маркер пероВверх Маркер черный Маркер белый X МеТОДЫ Маркер сдвигК:Размещение Себе форма Себе форма Маркер пероВниз для n = 1 до Стороны [Маркер сдвигНа:Длина(п); Маркер поворот:Угол(п)] ник, но его личные переменные, определяющие размер и положение, будут содержать свои собственные значения. 224
класс Подкласс Прямоугольник имеет две перемен- ные, ДлСторона и КорСторона, и новый метод — увеличение', новый метод форма, описанный здесь, перекрывает одноименный метод, описанный в классе Многоугольник. Все экземпляры класса Прямоугольник также наследуют из Многоугольник такие методы, как высветить и стереть. Прямоугольник Суперкласс Многоугольник временные ДлСторона КорСторона Сообщения форма и увеличение.-Процент Подкласс Скругление имеет новую перемен- ную РазмерДуги, остальные унаследованы из класса Прямоугольник. Новый метод форма использует абсолютно новый метод Сторона для вычерчивания стороны с закругленным концом; методы высветить и стереть уна- следованы из класса Прямоугольник. Маркер пероВверх ЮТОДЫ Маркер кТочке:Размещение ДлСторона: = ДлСторона*Процен Маркер пероВниз КорСторона: = КорСторона* Проц 2 разПовтор Себе высветить Маркер чертить:КорСторона; Маркер поворот:90 Маркер чертитыДл Маркер пово Себе стереть рорма рямоугольник А величение:Процент Класс Скругление Суперкласс Переменные Сообщения и методы Прямоугольник РазмерДуги Сторона:Длина Маркер чертитыДлина -(2*РазмерДуги) Маркер чертитьДугу: РазмерДуги,90 эние В Скругление А форма форма Маркер пероВверх Маркер кТочке:Размещ Маркер чертитыРазмер Маркер пероВниз 2 разПовтор [Сторона:КорСторона;
«Вычислить площадь прямоугольника В» Прямо- угольник В форма увеличение стереть площадь Сообщение, запрашивающее площадь у объ- екта Прямоугольник В, вызывает метод, ко- торый умножает две переменные: ДлСторо- на и КорСторона. Сообщение, адресуемое объекту КорСторона, приказывает ему ис- пользовать значение ДлСторона в своем ме- тоде умножить. ДлСторона применяет свой метод значен найдя в списке своих переменных Размер, возвращая объекту КорСторона число (4) „О" ПЕРЕМЕН— у.о'Р’-' НЫЕ Размер = 2 значение умножить: Число МЕТОДЫ значение возврат Размер умножитыЧисло возврат[Размер* (Число значение)] КорСторона начинает выполнение своего ме- тода умножить посылкой сообщения значе- ние объекту ДлСторона. эн»"®*"1 226
5 Временный объект передает свое содержимое объекту Прямоугольник В, которые затем за- вершает свой метод, возвращая результат во внешний объект, который послал сообщение площадь. ПЕРЕМЕН- НЫЕ Размер = 4 Два отклонения от традиционных языков Посылка сообщений с требованием действий Программа, написанная на объектно-ориентированном языке, не имеет списка атрибутов (переменных), доступ- ных всем объектам; напротив, каждый объект контроли- рует только свои собственные атрибуты, никакая внешняя процедура не может непосредственно влиять на данные объекта. Единственный способ получить информацию об объекте или изменить его данные — это послать сообще- ния, вызывающие методы объекта, которые в свою оче- редь действуют на переменные объекта. Так как все экзем- пляры одного класса используют одни и те же методы, только благодаря разным значениям этих переменных воз- можна различная реакция на одно и то же сообщение раз- ных экземпляров одного класса. Все объекты, за исключением наиболее фундаменталь- ных, представляют собой системы со сложной внутренней структурой, которые содержат переменные, в свою оче- редь также являющиеся объектами; последним тоже мож- но посылать сообщения. Таким образом, выполнение ме- тода (даже если он обращается лишь к собственным пере- менным объекта) обычно включает в себя посылку какого- то числа сообщений. В приведенном здесь примере (подоб- ный случай вполне возможен в учебной программе) объ- ект, представляющий прямоугольник, получает сообще- ние, требующее величину его площади. Метод, соответ- ствующий этому сообщению, вызывает посылку сообще- ния к одной из переменных прямоугольника и ждет ответа. МЕТОДЫ значение возврат Размер 4 КорСторона продолжает свой метод умно- жить, умножая значение от ДлСторона на значение своей переменной Размер (2). Ре- зультирующее значение (8) помещается во временный объект класса Число. 227
Два отклонения от традиционных языков Дескриптивные языки: ничего, кроме фактов инструмент(пила) Дескриптивный язык полностью скрывает от программис- та все процедуры решения задачи. Вместо того чтобы описывать множество процедур, шаг за шагом решающих задачу, программист, работающий с дескриптивным язы- ком, строит базу данных, соответствующую интересую- щей его проблеме, а затем ставит вопросы, касающиеся каких-либо фактов. Транслятор языка анализирует факты, пока не получит решение либо не установит, что для полу- чения решения недостаточно информации. горячееБлюдо(эскалоп) горячееБлюдо(почки) прибор(вилка) инструмент(отвертка) игрушка(юла) инструмент(долото горячееБлюдо (люляКебаб) горячееБл юдо(форел ь) закуска(салат) закуска(паштет) десерт(желе; горячееБлюдо(ростбиф) горячееБлюдо(тушеноеМясо) В приведенном здесь примере элементы де- скриптивного языка изображены в виде кар- тотеки с карточками двух видов, представля- ющими факты и общие принципы (или пра- вила), касающиеся фактов. Факт десерт(пирожное) определяет, что конкрет- ный предмет (пирожное) принадлежит классу вещей под названием десерт. Правила со- держат слово если. Здесь правило для ужин указывает, что комбинация трех блюд (пред- ставлены переменными Зак, Гор и Дес) явля- ется ужином, если Зак — закуска, Гор — го- рячееБлюдо, а Дес — десерт. завтрак(Гор,Дес) если горячееБлюдо(Гор), десерт(Дес) ужин(Зак,Г ор,Дес) если закуска(Зак), горячееБлюдо(Г ор), десерт(Дес) 228
Программа на дескриптивном языке состоит из двух частей: базы данных и цели. База данных содержит кон- кретные факты о решаемой задаче и основные принципы, касающиеся соотношений между этими фактами. Цель — это общее описание решения; определяя цель, програм- мист, по существу, просит компьютер, посмотрев на фак- ты и соотношения, скомбинировать их так, чтобы можно было доказать, что цель истинна. В настоящее время дескриптивные языки особенно ши- роко применяются в такой бурно развивающейся области знаний, как разработка экспертных систем. Экспертная система представляет собой программу, которая выдает рекомендации и (в ограниченных пределах) принимает ре- шения в определенных областях знаний на основе множе- ства фактов, связанных с данной областью. горячееБлюдо(антрекот) игрушка(мяч) инструмент(молоток) полдник(Зак,Дес) если закуска(Зак), (Дес) прибор(нож) горячееБлюдо(цыпленок) прибор(ложка) игрушка(калейдоскоп) закуска(сыр) горячееБлюдо закуска(креветки) горячееБл юдо(омар) закуска(дыня) десерт(пирожное) 229
«Найти меню ужина с дыней в качестве закуски» Прежде чем приступить к выполнению про- граммы, транслятор может предварительно произвести сортировку имеющихся данных. В сущности, он соединяет все отношения вме- сте, связывая сходные факты. закуска(дыня) ужин(Зак,Гор,Дес) если закуска(Зак), горячееБлюдо(Г ор), десерт(Дес) горячееБлюдо (антрекот) В ответ на запрос сверху транс- лятор языка вначале ищет общий принцип, описывающий объект ужин. Найдя правило, начинаю- щееся с ужин(Зак,Гор,Дес), транс- лятор помечает его местонахож- дение и начинает искать элемен- ты, которые удовлетворили бы требованиям этого правила. Вместо переменной Зак в закус- ка(Зак) могут подставляться раз- личные элементы, однако требо- ванию запроса удовлетворяет только один из них. Транслятор связывает элемент дыня с пере- менной Зак и помечает это место. Следующее требование — най элемент для переменной Гэр i второй части правила для обт та ужин. Так как в очереди ег не задано никакого элемента, транслятор начинает с «перво встречного». Связывая элемён антрекот с переменной Гэр, < вновь помечает это место. «Найти другое меню ужина» Если транслятор просят найти другое меню, он продолжает поиск с того места, где оста- новился последний раз, найдя подходящее меню. Перебирая набор десертов, он находит десерт(желе). При следующем удачном сопо- ставлении транслятор сообщит пользователю Зак=дыня\ Гор=антрекот\ Дес-желе. ужин(Зак,Г ор,Дес) если закуска(Зак), горячееБлюдо(Г ор), десерт(Дес) закуска(дыня) горячееБлюдо (антрекот) десерт(желе) 230
Два отклонения от традиционных языков Методический поиск решения десерт (пирожное) При выполнении программы, написанной на дескриптив- ном языке, транслятор вначале сопоставляет запрос поль- зователя, или цель, с одним из общих принципов или правил, находящихся в базе данных. Затем, беря из базы данных факты, он пытается подставить в найденное пра- вило конкретные значения переменных. Если транслятор обнаруживает правило и множество фактов сопоставимых с запросом, то сообщает об этом, в противном случае — о неудаче поиска. Вообще говоря, при поиске ответа на запрос трансля- тор действует в определенном порядке. В нашем примере транслятор, сопоставив запрос с правилом, начинает ис- кать подходящие значения элементов правила в последова- тельности слева направо, делая это до тех пор, пока не удовлетворятся все требования. При повторении запроса в игру вступает новый процесс — так называемый перебор с возвратом, или бэктрекинг. В этом случае транслятор не приступает к поиску с самого начала, а возвращается к тому месту в базе данных, где был обнаружен послед- ний подходящий элемент, и возобновляет поиск. Если об- наружить еще один подходящий элемент не удалось, то происходит возврат к ранее найденному элементу, и про- цесс перебора с возвратом повторяется отсюда. Перебирая десерты, транслятор выполняет окончательное требо- вание правила, связывая элемент пирожное с переменной Дес. Те- перь транслятор может сообщить пользователю: Зак=дыня; Гор=- антрекот; Дес=пирожное. «И еще одно» Получив запрос еще одного варианта ужина, транслятор снова начинает с того места, где ему удалось удовлетворить предыдущий за- прос, но все элементы, являющиеся десерта- ми, уже перебраны. Тогда транслятор воз- вращается к маркеру, где была удовлетворе- на предыдущая подцель для горячих блюд. Найдя горячееБлюдо(омар), транслятор вновь возвращается к десертам, начиная их перебор сначала и находя десерт(пирожное). Теперь он может сообщить: Зак=дыня; Гор=омар; Дес=пирожное. 231
Словарь основных понятий и терминов Адрес. Число, указывающее положение конкретной ячейки в памяти ком- пьютера. Алгоритм. Пошаговое описание процедуры решения задачи; языки про- граммирования — это по существу средства представления алгоритмов. Ассемблер. Программа, преобразующая мнемонические команды языка ас- семблера в нули и единицы двоичного машинного кода. Бит. Наименьшая единица информации в цифровом двоичном компьютере, эквивалент нуля или единицы в двоичной системе. В английском языке сло- во «бит» (bit) — сокращение от «двоичная цифра» (Binary digiT). Блочная структура. Разделение программы на независимые единицы; ис- пользуется для облегчени' написания и отладки отдельных частей про- граммы. Ввод. Считывание информации с внешнего устройства в память ком- пьютера. Вещественное число. В информатике — тип данных, содержащий числа, за- писанные с десятичной точкой и(или) с десятичным порядком. Восьмеричная система. Система счисления с основанием 8, в которой каж- дая цифра представляет собой три двоичные цифры. Вывод. Результат вычислений, выдаваемый компьютером пользователю, другому компьютеру или во внешнюю память. См. Память. Двоичная система. Система счисления с основанием 2, в которой любое число представляется в виде последовательности нулей и единиц. Двоичный (бинарный) код. Система представления информации в виде ком- бинаций двух символов: 1-0, «да-нет», наличие и отсутствие напряжения в электронной схеме. Диалект. Модификация языка программирования, позволяющая использо- вать его для решения определенного типа задач либо учитывающая особен- ности конкретного компьютера. Запись. Структура данных, содержащая различные, но логически связанные элементы информации и рассматриваемая как целое. Знак операции. Слово или знак в языке высокого уровня, выражающий ма- тематические операции, логические сравнения и другие преобразования дан- ных; например, знак «+» обычно относится к операции сложения. Идентификатор. Символическое имя константы, переменной или структуры данных, которое идентифицирует их в программе; обычно идентификатор представляется в виде последовательности букв и цифр, начинающейся с буквы. Интерпретатор. Программа, строка за строкой переводящая программу с языка высокого уровня в машинный код, которая после обработки каждой строки ждет, когда компьютер выполнит полученные машинные команды, и лишь после этого приступает к обработке следующей строки. См. также Компилятор. Искусственный интеллект (ИИ). Раздел информатики, связанный с разра- боткой программ, имитирующих способность человека к рассуждению и обучению. Исходный код. Текст программы на языке высокого уровня, который вво- дится в компилятор или интерпретатор, где преобразуется в машинный код или язык ассемблера. Ключевое слово. Слово языка программирования, имеющее определенный смысл для компилятора или интерпретатора; по этой причине его нельзя использовать для других целей в программах, написанных на данном языке. Код команды. Часть команды на языке ассемблера, указывающая компью- теру операцию, которую следует выполнить. Команда. Элементарный приказ центральному процессору (выраженный в машинном коде или на языке ассемблера), сообщающий, какое действие должен выполнить компьютер; последовательность команд образует про- грамму. Командный цикл. Последовательность действий, выполняемых компьюте- ром для того, чтобы прочитать команду из памяти, декодировать ее, вы- полнить и приготовиться к приему следующей команды. Компилятор. Программа, которая переводит программу, написанную на языке высокого уровня, в машинные коды либо на язык ассемблера, но сама не выполняет ее; откомпилированная программа сохраняется и может быть выполнена в любое время в дальнейшем. См. также Интерпретатор. Компьютерный язык. См. Язык программирования. Константа. Величина, остающаяся неизменной в процессе выполнения про- граммы. Логический тип. Оперирует с данными, допускающими одно из двух воз- можных значений — да-нет (истинно-ложно); иногда также называется бу- левским — в честь английского математика XIX в. Джорджа Буля. Массив. Структура данных, объединяющая элементы, имеющие одинако- вый тип; компьютерный эквивалент таблицы. Машинно-независимый. Характеристика языка, позволяющая транслиро- вать и выполнять программы, написанные на этом языке, с помощью ком- пьютеров разных типов. Машинный код. Последовательность двоичных цифр, которую компьютер может распознавать. Мнемоника. Короткое слово, обозначающее команду или операцию в язы- ках высокого уровня и ассемблера. Непроцедурный язык. Язык, пользуясь которым программист может опи- сывать результат работы программы, не указывая, как его следует по- лучать. Объектно-ориентированный язык. Тип языка программирования, в кото- ром информация представляется в виде единиц, называемых объектами, причем каждый объект содержит данные и набор операций для обработки этих данных. Объектный код. Машинный код, получаемый в результате работы компи- лятора. Операнд. Часть команды на языке ассемблера, определяющая адрес данных. Оператор. Команда языка высокого уровня, сообщающая компьютеру, ка- кие операции следует выполнять. Операционная система. Набор программ, используемых для запуска про- грамм и контроля их выполнения на компьютере. Оптимизация. Один из этапов в работе компилятора, на котором предпри- нимается попытка сокращения или реорганизации объектного кода с целью уменьшения занимаемого объема памяти или повышения скорости работы программы. Описание. Раздел программы, идентифицирующий структуры данных, ко- торыми должна манипулировать программа, и описывающий их типы. Память. Основное рабочее пространство в компьютере, куда записываются и откуда извлекаются данные; это понятие (как и оперативную память, означающую то же самое) следует отличать от устройств внешней памяти, таких, как диски и ленты. Переменная. Описанный элемент, значение которого может меняться в процессе выполнения программы. См. также Константа. Подмножество языка. Ограниченная версия языка, располагающая лишь некоторыми из возможностей полного языка. Подпрограмма. Самостоятельная часть компьютерной программы, кото- рая создается независимо от других частей и затем вызывается по имени. Когда имя подпрограммы используется в качестве оператора программы, выполняется вся группа операторов, представляющая тело подпрограммы. Программа. Отдельная последовательность команд, позволяющая компью- теру выполнить ту или иную операцию либо решить определенную задачу. Программное обеспечение. Программы, обеспечивающие возможность ра- боты компьютера. 232
Процедура. См. Подпрограмма. Процедурный язык. Язык программирования, в котором для получения нужного решения требуется записать в явном виде последовательность команд. Расширение. Более широкая версия языка, обладающая дополнительными свойствами, которые увеличивают возможности языка. Резервированное слово. См. Ключевое слово. Рекурсия. Свойство программы, позволяющее ей вызывать себя как под- программу. Символ. Имя объекта в программе. См. также Символический адрес. Символический адрес. Слово в программе, написанной на языке ассембле- ра, которое используется вместо числа при обращении к адресам памяти. Синтаксис. Правила расположения элементов языка программирования, де- лающие текст понятным компилятору или интерпретатору. См. также Язык программирования. Строка. Последовательность литер, часто - имя или слово. Структура данных. Совокупность связанных между собой элементов дан- ных, объединенных общим именем, повышающая эффективность запоми- нания и считывания информации. Структурное программирование. Систематический подход к созданию про- граммного обеспечения, в частности требующий разбиения программы на небольшие независимые части. Таблица символов. Таблица, строящаяся в процессе работы компилятора или интерпретатора, которая содержит имена всех объектов, описанных в программе. См. также Символ. Тактовый генератор. Устройство (как правило, на кварцевом кристалле), вырабатывающее регулярные импульсы, которые координируют работу компьютера. Ъш данных. Классификация констант, переменных и элементов данных в зависимости от того, какие величины они представляют: целые, веществен- ные числа, строковые или логические значения. Функция. Разновидность подпрограммы, которая выдает единственное зна- чение и часто используется для представления, например, таких математи- ческих операций, как синус или квадратный корень; в большинстве языков программирования наиболее употребимые функции, сложение и вычитание, задаются знаками операций. Целое. В информатике тип данных, включающий нуль, положительные и отрицательные целые числа. Центральный процессор (ЦП). Часть компьютера, выполняющая команды. Цикл. Прием в программировании, позволяющий многократно повторять одну и ту же последовательность команд. Цифровой. Относящийся к представлению, обработке и передаче данных в виде дискретных сигналов. Шестнадцатеричная система. Система счисления с основанием 16, в кото- рой каждая цифра представляет собой четыре двоичные цифры. Язык ассемблера. Язык программирования низкого уровня, ориентирован- ный на компьютер конкретного типа; использует короткие мнемонические команды и позволяет программисту оперировать символическими адресами. Язык высокого уровня. Язык программирования, более близкий к естест- венному языку, чем машинный код или язык ассемблера: каждый оператор в нем соответствует нескольким командам машинного кода или языка ас- семблера. Язык обработки списков. Язык программирования, в котором данные представляются в виде списка слов и других элементов, аналогично тому, как они связаны в мозгу человека; программы на языке обработки списков могут состоять просто из списков. Язык программирования. Набор слов, букв, чисел и мнемонических сокра- щений, используемый для записи программы компьютера; правила записи программ из элементов языка называются синтаксисом этого языка. 233
ЛИТЕРАТУРА Часть I Книги Barnes Н. A. The Man with the Red and Green Eyes. — N. Y: E. P. Dutton, 1965. Brand S., ed. Whole Earth Software Catalog. — Garden City, N. Y.: Quantum Press/Doubleday, 1984. Curran S., Curnow R. Overcoming Computer Illiteracy. — N. Y: Penguin Books, 1983. Davies W. S. Basic: Getting Started. — Reading, Mass.: Addison-Wesley, 1981. Drury D. W. The Art of Computer Programming. — Blue Ridge Summit, Pa.: Tab Books, 1983. Eames Ch., Eames R. A Computer Perspective. — Cambridge, Mass.: Harvard University Press, 1973. Editors of Osborne/McGraw-Hill. The Osborne/McGraw-Hill Home Computer Software Guide. Berkeley, Calif.: Osborne/McGraw-Hill, 1984. Evans Ch. The Micro Millennium. — N. Y.: Washington Square Press, 1979. Fishman K. D. The Computer Establishment. — N. Y.: Harper & Row, 1981. Fox A., Fox D. Armchair Basic: An Absolute Beginer’s Guide to Programming in BASIC. — Berkeley, Calif.: Osborne/McGraw-Hill, 1983. Freiberger P., Swaine M. Fire in the Valley. — Berkeley, Calif.: Osborne/McGraw- Hill, 1984. Gilbert G. A. Air Traffic Control: The Uncrowded Sky. — Washington, D. C.: Smithsonian Institution Press, 1973. Godman A. The Color-Coded Guide to Microcomputers. — N. Y.: Barnes & No- ble Books, 1983. Goldstine H. H. The Computer from Pascal to von Neumann. — Princeton: Princeton University Press, 1972. Hansen D. The New Alchemists. — Boston: Little, Brown, 1982. Helms H., ed. The McGraw-Hill Computer Handbook. — N. Y.: McGraw-Hill, 1983. Helms H. L. Computer Language Reference Guide. — Indianapolis, Ind.: Ho- ward W. Sams, 1980. Horenstein H. Computer Wise. — N. Y: Random House, 1983. Lafferty P. An Introduction to Computing. — N. Y.: Simon & Schuster, 1983. Laurie P. The Joy of Computers. — London: Hutchinson, 1983. Levering R., Katz M., Moskowitz M. The Computer Entrepreneurs. — N. Y: New American Library, 1984. Levy S. Hackers: Heroes of the Computer Revolution. — N. Y: Doubleday, 1984. Metropolis N., Howlett J., Rota G.-C. A History of Computing in the Twentieth Century: A Collection of Essays. — N. Y.: Academic Press, 1980. Moreau R. The Computer Comes of Age. — Cambridge, Mass.: The M.I.T. Press, 1984. Nash E. L. Direct Marketing: Strategy/Planning/Execution. — N. Y: McGraw- Hill, 1982. Poole L., McNiff M., Cook S. Your Atari Computer. — Berkeley, Calif.: Os- borne/McGraw-Hill, 1982. Ralston A., Reilly E. D., eds. Encyclopedia of Computer Science and Engineer- ing. — N. Y.: Van Nostrand Reinhold, 1983. Richman E. The Random House Book of Computer Literacy. — N. Y: Vintage Books, 1983. Rodwell P. The Personal Computer Handbook. — N. Y.: Barron’s, 1983. Sammet J. E. Programming Languages: History and Fundamentals. — Englewood Cliffs, N. J.: Prentice-Hall, 1969. Sanders D. H. Computers Today. — N. Y.: McGraw-Hill, 1983. Wexelblat R. L., ed. History of Programming Languages. — N. Y: Academic Press, 1981. Периодические издания Brand S., ed. Keep Designing. Whole Earth Review, May 1985. Browne M. Ultimate Video Game. Discover, August 1983. Brownlee S. Weather Forecasting — How Exact Is It? Discover, April 1985. Computer Software. Scientific American, September 1984. d’Ambrosio B. Expert Systems — Myth or Reality? BYTE, January 1985. Duda R. O. Expert Systems Research. Science, April 15, 1983. Eskow D. PM ’Flies’ the Shuttle Simulator. Popular Mechanics, November 1982. Fluegelman A. In Quest of True BASIC. PC World, November 1984. Gardner M. Computer as Scientist. Discover, June 1983; Traveling Salesman’s Tra- vail. Discover, April 1985. Gifford D., Spector A. The TWA Reservation System. Communication of the ACM, July 1984. Gleick J. They’re Getting Better about Predicting the Weather. The New York Times Magazine, January 27, 1985. Immel A. R. Electric Pencil’s Rise and Fall. Popular Computing, August 1984. Knight J. R. A Case Study: Airlines Reservations Systems. Proceedings of the IEEE, November 1972. The Mechanization of Work. Scientific American, September 1982. Nulty P. The Bar-Coding of America. Fortune, December 27, 1982. Olson S. Pathways of Choice. Mosaic, July/August 1983; Sage of Software. Science 84, January/February 1984. $100,000 ’Brain’ Keeps Denver Traffic Rolling. Popular Science, January 1953. Popular Computing, Special Report: Computer Languages. September 1983. Roberts H. E. Yates W. Altair 8800. Popular Electronics, January 1975; Build the Altair 800. Popular Electronics, February 1975. Rose F. Black Knight of AL Science 85, March 1985. Savani J. Supercomputing Arrives. Princeton Weekly Bulletin, March 4, 1985. Shell E. R. The Brain behind BASIC. Technology Illustrated, December/January 1983. Smith L. Madsen K. Nonstop Transaction Processing. Datamation, March 1983. Taubes G. Mathematics of Chaos. Discover, September 1984. Taylor A. L. III. The Wizard inside the Machines. Time, April 16, 1984. Tesler L. Programming Languages. Scientific American, September 1984. Toong H. D. Gupta A. Personal Computers. Scientific American, December 1982. TX-0: Its Past and Present. Computer Museum Report. Spring 1984. Waldrop M. M. Computer Vision. Science, June 15, 1984; Machinations of Thought. Science 85, March 1985; The Necessity of Knowledge. Science, March 23, 1984. Другие издания The Home Computer Course. London: Orbis Publications, 1984. Money Guide: Personal Computers. Time Inc., 1984. U.S. Department of Commerce. A Competitive Assessment of the U.S. Software Industry. Washington D.C.: U.S. Government Printing Office, 1984. Часть II Книги Aguado-Munoz R. et al. BASIC Basico Curso de Programmacion. — Madrid: Grupo Distribuidor Editorial,1982. Al-Daffa A.A. The Muslim Contribution to Mathematics. — London: Croom Helm, 1977. Bates W The Computer Cookbook. — Garden City, N.Y: Doubleday, Quantum Press, 1984. Bitter G.G. Computers in Today’s World. — N.Y: John Wiley & Sons, 1984. Booch G, Software Engineering with Ada. — Menlo Park, Calif.: Benja- min/Cummings Publishing, 1983. Bosak J. Execute Briefing: Ada. — Reston, Va.: Longsman Crown Group, 1984. British Computer Society, The High Level Programming Languages: The Way Ahead. — Manchester, England: NCC Publications, 1973. Cashman T.J., Shelly G.B. Introduction in Computers and Data Processing. — Fullerton, Calf.: Anaheim Publishing, 1980. Chirlian P.M. Understanding Computers. — Beaverton, Ore.: Dilithium Press, 1978. Dijkstra EW. Selected Writings on Computing: A Personal Perspective. — N.Y.: Springer-Verlag, 1982. Dirksen A.J. Microcomputers: What They Are and How to Put Them to Produc- tive Use. — Slough, England: Foulsham, 1982. 234
Ditlea S., ed. Digital Deli. — N.Y.: Workman Publishing, 1984. Dodd K.N. Computer Programming and Languages. — L.: Butterwords, 1969. Eisenbach S., Sadler Ch. PASCAL for Programmers. — N.Y.: Springer-Verlag, 1981. Elson M. Concepts of Programming Languages. — Science Research Associates, 1973. Falkoff A.D., Iverson K.E. A Source Book in APL. — Palo Alto, Calf.: APL Press, 1981. Frude N. The Intimate Machine: Close Encounters with Computers and Robots. — L.: Century Publishing Company, 1983. Gallo M.A., Nenno R.B. Computers and Society with BASIC and Pascal. — Boston: Prindle, Weber and Schmidt, 1985. Glaser A. History of Binary and Other Nondecimal Numeration. — Los Angeles: Tomash Publishers, 1981. Halpern M. L, Shaw Ch. J., eds. Annual Review in Automatic Programming 5 — N. Y: Pergamon Press, 1969. Heath S. T. L. The Thirteen Books of Euclid’s Elements. Vol. 2, Books 3-9.— N. Y: Dover Publications, 1956. Helms H., ed. IBM: The McGraw-Hill Computer Handbook—N. Y.: McGraw- Hill, 1983. High Level Languages: International Computer State of The Art Report- Maidenhead, Berkshire, England: Infotech Information, 1972. Hofeditz C. A. Computer Programming Languages Made Simple.—Garden City, N. Y.: Doubleday, 1984. Horowitz E. Fundamentals of Programming Languages.—Rockville, Md.: Com- puter Science Press, 1984. Horowitz E., ed. Programming Languages: A Grand Tour.—Rockville, Md.: Com- puter Science Press, 1983. Jacker C. Man, Memory and Machines: An Introduction to Cybernetics.—N. Y.: Macmilan, 1964. Katzan H., Jr. Introduction to Computer Science. N. Y.: Petrocelli/Charter, 1975. Kemeny J. G. Man and the Computer. N. Y: Charles Scribner’s Sons, 1972. Knuth D. E. The Art of Computer Programming. Vol. 2—Reading, Mass.: Addison-Wesley, 1971. Lampton C. Computer Languages.—N. Y: Franklin Watts, 1983. Levy S. Hackers: Heroes of Computer Revolution.—Garden City, N. Y.: Double- day, Anchor Press, 1984. Lord W. A Night to Remember.—Harmondsworth, England: Penguin, 1978. McCorduck P. Machines Who Think.—San Francisco, Calif.: W. H. Freeman, 1979. Metropolis N. J., Howlett J., Rota G.-C., eds. A History of Computing in Twen- tieth Century.—N. Y.: Academic Press, 1980. Miller G. A. The Psichology of Communication: Seven Essays.—Baltimore: Pen- guin Books, 1969. Moll R., Folsom R. Apple II Instant Pascal: An Introduction in Programming- Boston: Houghton Mifflin, 1985. Neugebauer 0. The Exact Sciences in Antiquity.—L.: Dover Publications, 1969. Osborne A., Bunnel D. An Introduction to Microcomputers. Vol. 0, The Begin- ner’s Book.—Berkeley, Calif.: McGraw-Hill, 1982. Papert S. Mindstorms: Children, Computers and Powreful Ideas.—Brighton, En- gland: Harvester Press, 1982. Ralston A., Reilly E.D.,Jr., eds. Encyclopedia of Computer Science and Engineer- ing. N.Y.: Van Nostrand Reinhold, 1983. Richards M., Whitby-Stevens C. BCPL: The Language and its Compiler—N.Y.: Cambridge University Press, 1979. Rosen E, ed. The Algebra of Mohammed Ben Musa. London: The oriental Treanslation Fund, 1831. Sammet J.E. Programming Languages: History and Fundamentals.—Englewood Cliffs, N.J.: Prentice-Hall, 1969. Seidman A.H., Flores I.,eds. The Handbook of Computers and Computing.— N.Y.: Van Nostrand Reinhold, 1984. Stiegler M., Hansen B. Programming Languages: Featuring the IBM PC and Compatibles.—N.Y.: Baen Enterprises, 1984. Taylor C.F. The Master Handbook of High-Level Microcomputer Languages.— Blue Ridge Summit, Pa.: Tab Books, 1984. Time-Life Books Inc. The Time-Life Step-by-Step Guide to the IBM PC.—N.Y.: Random House, 1984. Traister R.J. Programming in C—Englewood Cliffs, N.J.: Prentice-Hall, 1984. Ticker A.B. Programming Languages.—N.Y.: McGraw-Hill, 1986. Wasserman A.I. Tutorial: Programming Language Design.—N.Y.: Computer Soci- ety Press, 1980. Wexelblat R.L.,ed. History of Programming Languages. — N.Y.: Academic Press, 1981. Zaks R. Introduction to Pascal (Including UCSD PASCAL). 2nd ed.rev.— Berkeley, Calif.: Sybex, 1981. Периодические издания и другие публикации Aarons R. Cover Story: Basic. PC Magazine, October 29, 1985. Abelson H. A Beginner’s Guide to Logo. BYTE, August 1982. Aguilar H. BASIC Recursive Techniques. COMPUTER LANGUAGE, May 1985. Albrecht R.L. A Modern-Day Medicine Show. Datamation, July 1963; Alien landing. Time, November 18, 1985. Amsterdam J. An Assembler for VM2. BYTE, November 1985; Computer Lan- guages of the Future. Popular Computing, September 1983. Angier N. After 73 Years, a Titanic Find. Time, September 16, 1985. Backus J. The History of FORTRAN I, II and III. Annals of The History of Computing, July 1979. Ballard R.D. How We Found Titanic. National Geographic, December 1985. Berner RW. A View of the History of COBOL. Honeywel Computer Journal, no date. Bright H. FORTRAN Comes to Westinghouse-Bettis, 1957. Annals of the Histo- ry of Computing, July 1979. Brodie L. An Interview with Charles Moore—Founder of Forth. COMPUTER LANGUAGE, premier issue, 1984. Campbell-Kelly M. The Development of Computer Programming in Britain (1945—1955). Annals of the History of Computing, April 1982; Program- ming the EDSAC: Early Programming Activity at the University of Cam- bridge. Annals of the History of Computing, January 1980; Programming the Mark I: Early Programming Activity at the University of Manchester. Annals of the History of Computing, April 1980. Castro J. Alien Landing. Time, November 18, 1985. Colmerauer A. Prolog in 10 Figures. Communications of the ACM, December 1985. Conner R.L. COBOL, Your Age is Showing. Computer World, May 14, 1984. Duntemann J. Cover Story: Pascal. PC Magazine, October 29, 1985. Embrey G. COBOL. Popular Computing, September 1983. Faflick Ph. Teaching the TUrtle New Trick. Time, October 11, 1982. Harvey B. Why Logo? BYTE, August 1982. Hemmes D. FORTRANSIT Recollections. Annals of the History of Computing, January 1986. Hoare C.A.R. The Emperor’s Old Clothes. Communications of the ACM, Febru- ary 1981. Joyce J. A C Language Primer. BYTE, August 1983. Kanner M. FORTRAN. Popular Computing, September 1983. Kelly M.G. BASIC: The Universal Micro Language That’s Easy to Learn and Easy to Hate. Popular Computing, September 1983. Kemeny J.G., Kurtz T.E., Elliot B. BASIC Becomes a Structured Language. COMPUTER LANGUAGE, premier issue, 1984. Knuth D.E. Ancient Babilonian Algorithms. Communications of ACM, July 1972. LaGrow C. P.J. Plauger Reflects on the History of C. COMPUTER LAN- GUAGE, February 1985. McCauley J. Languages for Thinking about Thinking. Whole Earth Software Review, Fail 1984. McCormack J, Gleaves R. Modula-2: A Worthy Successor to Pascal. BYTE, April 1983. McGrath E. Haunting Images of Disaster. Time, September 23, 1985. Machrone B. Micro-Linguistics: Languages for the PC. PC Magazine, September 6, 1983. Millison D. BASIC’s Kemeny and Kurtz Discuss the Language Today. COM- PUTER LANGUAGE, October 1985. Moore Ch.H. The Evolution of FORTH, an Unusual Language. BYTE, August 1980. 235
Oceanus, Winter 1985/1986. Pathfinder. Think, July/August 1979. Paul R.J. An Introduction to Modula-2. BYTE, August 1984. Pearlman D. FORTH Inspires a Fanatic Following. Popular Computing, Septem- ber 1983. * Petzold Ch. Assembler. PC Magazine, October 29, 1985. Fountain Dick, POP and SNAP. BYTE, October 1984. Rather E.D. Forth Programming Language. Forth Inc., January 17, 1986. Ridley R.S. Philippe Kahn: The Man Behind the Borland Myth. COMPUTER LANGUAGE, August 1985. Roberts В. C. Popular Computing, September 1983. Sammet J.E. An Overview of High-Level Languages. Bethesda, Md.: IBM Federal Systems Division. Scientific American, September 1984. Shammas N.C. Jean Ichbiah, Ada’s Architect. COMPUTER LANGUAGE, April 1985. Solomon C. Introducing Logo to Children. BYTE, August 1982. Somerson P. In Defense of Basic. PC Magazine, September 1983. Spalding M., Dawson B. Finding the Titanic. BYTE, March 1986. Takara K. Programming Philosophy: Interviews with Donald Knuth and Niklaus Wirth. COMPUTER LANGUAGE, May 1985. Tesler L.G. Programming Languages. Scientific American, September 1984. Tuttle J.K. APL pi: Designing an APL Type Font. APL Quote Quad, September 1981. ТУтопу C. A beginner Guide to Assembly Language. Popular Computing, April 1985. Wadlow T. Thrbo Pascal. BYTE, July 1984. Wagner R. COBOL: Pride and Prejudice. COMPUTER LANGUAGE, premier issue, 1984. Walker N.C. The 25th Annivesary of FORTRAN. Annals of the History of Com- puting, October 1982. Weinman W.E. Program in Style. COMPUTER LANGUAGE, January 1985. Wirth N. Data Structures and Algorithms. Scientific American, September 1984; History and Goals of Modula-2. BYTE, August 1984. Wolf C. Serious FORTRAN for the PC. PC Magazine, December 24, 1985. Woteki T., Freiden A. Pascal. Popular Computing, September 1983. Благодарности Предметный указатель к обеим частям книги подготовил Мел Инг- бер. Редакторы издания выражают благодарность всем лицам и организациям, участвовавшим в работе над книгой. Часть I В Великобритании: Остину Вудзу (Европейский центр среднесрочного про- гнозирования погоды, Беркшайр, Ридинг). В США: Джеймсу Фурлонгу (корп. «Компьютер сайенс», шт. Калифорния, Эль-Сегундо); С.Е. Роу (Транспортная служба Лос-Анджелеса, Лос-Анджелес); Силви Дж. Руффу (лаборатория компьютерной графики, Калифорнийский технологический институт, Пасадена); Рику Биби, Расселу Фенуику и Маркусу Гонсалесу («Бэнк оф Америка», Сан-Франциско); Джениферу Годуарду (корп. «Микро Интернэшнл», Сан-Рафаэл); Трою Камптону и Дэвиду Земпелу («Локхид», Санниуэйл); Эдварду Клири, Ли («Скот энд Клири», Денвер, шт. Колора- до); Джеку Ределу («Маркетинг директ», Балтимор, шт. Мэрилэнд); Донал- ду Э. Уиттену (Национальная служба погоды, Силвер-Спринг); Стефану А. Кэлису-мл. (корп. «Диджитал икуипмент», Конкорд, шт. Массачусетс); Дэ- нису Е. Уитту («Телесайнс», Мендота-Хейтс, шт. Миннесота); Ричарду Марри («Юнион колледж», Шепектэди, шт. Нью-Йорк); Джозефу Сьюику (ИБМ, Шарлот, шт. Северная Каролина); Джону О’Горману («Нэшнл кэш реджистр», Дейтон, шт. Огайо); д-ру Херману X. Голдстейну (Американ- ское философское общество, Филадельфия, шт. Пенсильвания); Джеку Кею (JHK-Эссошиэйтс, шт. Вирджиния); Лео Торалболу («Тайм-Лайф букс», Александрия); Дэвиду Уайтерфорду («Транспортейшн ресерч бод», Нацио- нальный научно-исследовательский совет, Вашингтон, окр. Колумбия). Часть II ВЬ Франции: Клоду Робле («Сосьете микродюр», Шуази-ле-Руа); Жаку Эбенстрету и Иву Нуайе («Эколь сюперьйор д’электриситэ», Жиф-сюр- Иветт). В Великобритании: фирме «Бернс & Смит» (Дерби, Дербишайр); Эндри Монку (Лондон). В Нидерландах: Ханно Вупперу (Католический уни- верситет, Неймеген). В Швейцарии: Никлаусу Вирту («Айгеноссише техни- ше хохшуле», Цюрих). В США: Еллису Хоровицу (Университет Северной Калифорнии, Лос-Анджелес); Елизабет Д. Разер («Форт инкорпорейтид», Манхэттен-бич); Бобу Албрехту («Драгон квест», Менло-парк); Стивену Мучнику («Сан микросистеме», Маунтин-вью); Джуди Бауэр Ган («ИБМ резерч лэборатори», Сан-Хосе); Джону Маккарти (Станфордский универси- тет); Аллану Перилсу (Йельский университет, шт. Коннектикут, Нью-Хэй- вен); Ричарду Уэкселблату (Трамбал); Георгу Атье (Библиотека Конгресса, Вашингтон, округ Колумбия); Руф Бэки (Средие-Восточный институт); контр-адмиралу Грейс Мюррей Хоппер (группа автоматизации обработки данных ВМС США); Уте Мерцбах (Смитсоновский институт); Джин Э. Саммит (фирма ИБМ, Бетесда, шт. Мэриленд); Дане Нау (Мэрилендский университет, Колледж-парк); Дугласу Россу («СофТек инкорпорейтид», шт. Массачусетс, Уолтэм); Нэнси Грин, Стьюарту Хэррису и Кеннету Р. Пилу, (Океанографический институт, Вудс-Хоул); Джону Мирне (группа VM-сис- тем, Арлингтон, шт. Вирджиния); Дж.А.Н.Ли (Политехнический институт шт. Вирджиния, Блэксбург). В ФРГ: Кристофу Борну (Бокумский универси- тет, Бокум); Конраду Цузе (Хунфельд); Райнеру Корбманну (журнал Chip, Мюнхен); Зигфриду Мюнху, (Компания «Математик унд датенферарбай- тунг», Св.Августин); Ули Деккеру (журнал Bild der Wissenshaft, Штутгард). 236
Источники иллюстраций КОНСУЛЬТАНТЫ Ниже перечислены источники иллюстраций, содержащихся в книге. Сведе- ния о рисунках при переходе слева направо разделяются точкой с запятой, а сверху вниз через тире. Часть I Обложка, 8, 9: Art by Matt McMullen. 10: UPI/Bettmann Newsphotos. 12: Courtesy The Science Museum, London; courtesy The National Portrait Gallery, London — Derek Bayes, courtesy The Science Museum, London. 13: Culver Pictures. 14, 15: Wolf/SEMANA Publicada; Larry Sherer, courtesy Library of Congress. 17: King’s College Library, Cambrige University. 19: Wide World; Department of the Navy. 21: Art by Matt McMullen. 22, 23: Art by Matt McMullen(3); David W. Zempel and Troy Cumpton at Lockheed Missiles and Space Company in Sunnyvale, California. 24, 25: Art by Matt McMullen. 26, 33—55: Art by Jefferey Smith. 56, 57: (©) Robert Langridge/U.C.S.F./Rainbow; created by artist Damon Rarey on an Aurora/100 Videographics System for Vari- an Associates, Inc., 1981 — (©) Dan McCoy/Rainbow; McDonnel Douglas Cor- poration — James A. Sugar/Black Star — Dr. James F. Blinn/Computer Graph- ics Lab/JPL; generated at GMAC using 1SSCO software. 59, 60: The M.I.T. Museum. 63: (©) 1984 Forrest M.Mims III. 64: Art by Frederic F. Bigio from B-C Graphics. 65: Art by Frederic F. Bigio from B-C Graphics — Computer program, courtesy of Osborne/McGrawHill from Your Atari Computer (©) 1982 by Lon Poole, Martin McNiff and Steven Cook. 66, 67: Art by Matt McMullen, computer screens by Circuit Studio. 68: Courtesy Lee Felsensten. 70, 71: Doug Wilson; Margaret Kern Wozniak — Michael Alexander; Rick Browne; Paul Hirschberger; Wayne C.Kodey/Time, art by Matt McMullen. 72: Ashton- Tate(2) — Simpson Kalisher for Fortune(2); Richard Howard, Art by Matt McMullen. 73: Paul Lutus. 75—81: Art by Matt McMullen. 82, 83: Airbrush illustration by Matt McMullen, line art by Frederic EBigio from B-C Graphics, computer screens by Teresa M. Nussbaumer/Circuit Studio. 84,. 85: Art by Mike Newman, DICOMED Corporation. 91—98: Art by Tyrone Huntley. 99: Art by Tyrone Huntley, computer screens by JHK and Associates. 100: Hitachi, Ltd., Tokyo. 102: Dr.Martin S.Burkhead; Los Alamos National Laboratory and Dr.Martin S.Burkhead. 104, 105: John Bowden/(©) 1985 Discover. 107: Evans & Sutherland Computer Corporation. 108: Dan McCoy/Rainbow. Ill: Arthur Olson, Scripps Clinic and Nelson Max, Lawrence Livermore National Laboratory. 112, 113: Jerry Mason/Photo Researchers; Evans & Sutherland Computer Corporation. 114, 115: K. Kurita/Gamma-Liaison. 116, 117: (©) Hank Morgan/ Rainbow; John Morgan. 118, 119: (©) Dan McCoy and Robert Langridge/ Rainbow(3); Arthur Olson, Scripps Clinic and Nelson Max, Livermore National Laboratory. 120, 121: Dr. James F. Blinn/Computer Graphics Lab/JPL. Часть II Обложка, 124: Art by Peter Sawyer. 126: Art by William J. Hennessy Jr. 128: Erwin Bohm, courtesy Professor Dr. Konrad Zuse, Hunfeld West Germany. 133: Tablet, Clishe des Musees Nationaux, Paris. 134: Manuscript, Biblioteka Apostol- ica Vaticana, Rome. 135: Manuscript, Ms. Huntington 214 (folio 2 Verso, folios 3 Verso & 4 recto), Bodleian Library, Oxford. 136, 137: Smithsonian Institution, Neg. No. 862845. 139—151: Art by Wayne Vincent. 152—155: Art by Peter Sawyer. 156: Bob Veltri, courtesy Special Collections Library, Virginia Politechnic Institute, Blacksburg, Virginia. 157: Courtesy David Hemmes. 158: Mark Sexton, courtesy The Computer Museum, Boston, Massachusetts. 161: John McCarthy. 162, 163: Flags, Flag Research Center, Winchester, Massachusetts. 165—179: Art by Steve Wagoner. 180: Art by Peter Sawyer. 182: From Programming Languages: History and Fundamentals, by Jean E. Sammet, (©) 1969, reprinted by permis- sion of Prentice-Hall, Inc., Englewood Cliffs, New Jersey. 184: Program from Automatically Programmed Tools, by S. Hori, IIT Research Institute, Brochure No. AZ-240, November 1963. 186—189: Art by William J. Hennessy Jr. 192: Courtesy Professor Dr. Niclaus Wirth; Zurich. 193—209: Art by Matt McMullen. 210-213: Art by Peter Sawyer. 215: (©) Ed Kashi 1985. 217: Courtesy NRAO/ AUI. 220: Susan Pogany, courtesy The M.I.T. Museum. 221—231: Art by Wayne Vincent. Изабел Лида Ниренберг, работала во многих областях применения вычис- лительной техники — от анализа данных, переданных на Землю космиче- скими аппаратами «Пионер», до подбора приемных родителей для детей- сирот. Работает в вычислительном центре университета шт. Нью-Йорк, в Олбани, помогая студентам и преподавателям в работе с прикладными программами для микрокомпьютеров. Часть I ГУэн Белл, президент компьютерного музея в г. Бостоне, шт. Массачусетс. Дж. Кирк Демари, президент компании «Компьютер ТЬюторс» (Алексан- дрия, шт. Вирджиния), которая дает консультации и готовит специалистов в области применения микрокомпьютеров. Юта К. Мерцвах, с 1963 г. ответственная за экспозицию по математике и вычислительной технике в Национальном музее американской истории при Смитсоновском институте. Р. Брюс Моррин, доцент Аэрокосмического университета им. Эмбри- Ридцла в Дейтон-Биг, шт. Флорида. Руководит работами по созданию про- грамм, предназначенных для управления воздушным движением. Майкл Уайз, разработчик программ и технический консультант компании «Бродербанд Софтуэар» (г. Сан-Рафаэль, шт. Калифорния). Занимается со- зданием видеоигр и прикладных программ для сферы услуг. Часть II Джон Бекус, пионер разработки языков программирования. За выдающиеся технические достижения удостоен в 1963 г. звания «Почетный сотрудник фирмы ИБМ». Джон Л. Куадрадо, президент консультативной фирмы «Окти инкорпорей- тид», шт. Вирджиния, и одновременно адъюнкт-профессор технической школы Тайлера при Дартмутском колледже. Роджер Грин, лондонский специалист по вычислительной технике и журна- лист: его статьи по новой технологии публикуются во многих английских газетах, журналах и специальных изданиях. Брайан Хейс, автор публикаций, посвященных вычислительной технике и языкам программирования в таких периодических изданиях, как журналы Scientific American, COMPUTER LANGUAGE, BYTE, Lotus, газета New York Times. Top Джонсон, консультант фирмы «Телезис Стрэтеджи» (Род-Айленд) по вопросам компьютерной графики и системного программирования. Нил Макелрой, бывший руководитель вычислительного центра в Уайт-Ок- ской лаборатории Центра вооружений ВМС США; ныне возглавляет груп- пу связи и управления в Эйвелокксе, шт. Мэриленд. Нэнси Стерн, профессор по компьютерным информационным системам в университете Хофстра в Хэмпстиде, шт. Нью-Йорк; автор ряда учебников по информатике, а также многочисленных Статей и монографий по истории вычислительной техники. Мэри С. Ван Дойзен, работает на системе ЛИСП/ВМ в исследовательском центре Томаса Уотсона фирмы ИБМ в Йорктаун-Хейтсе, шт. Нью-Йорк. В прошлом — председатель правления ACM SIGPLAN, неоднократно пред- седательствовала на конференциях по языкам программирования и компи- ляторам. Джим Уоррен, редактор-учредитель периодического издания Dr. Dobb’s Journal of Computer Calisthenics & Orthbdontia и основатель компании «Уэст коуст компьютер фэарз»; с 1968 г. консультант по малым ком- пьютерам. Марк Уайзер, профессор факультета информатики, а также помощник ди- ректора технических служб в университете шт. Мэриленд. Известен разра- боткой программного обеспечения для работы с окнами; интересуется окружением гетерогенных систем. 237
Предметно-именной указатель Абрахамс П. 183 Автокод 136 Автоматическая программа 25 Айверсон К. 185—186 Айкен Г. 19, 185 Албрехт Р.Л. 211—213 Ален П. 69—70, 80, 213—214 Алгоритм 38, 40, 49, 51, 133—135 «Альтаир-8800» 65, 71, 212—214 «Американ телефон энд телеграф» (АТТ) 186 Аналитическая машина 17—18 Аппаратное обеспечение 16—17 Арифметика восьмеричная 129—131 — двоичная 130—131 — шестнадцатеричная 130—131 Арнольд Дж. 213 Ассемблер 34, 43, 132, 139, 148—149 «Атари» 70 Байрон О.А. (графиня Лавлейс) 11 Байт 24 Бакалински Э. 213 Барнес X. 85 Барнэби С. 68, 71 «Барроуз» 158 Бекус Дж. 30, 153—156, 160, 164 «Белл телефон лабораторис» 186, 187 «Бинак» 16 Бит 24 Блок Р. 16 Блок-схема 48—49 Блочная структура 161 БНФ форма Бекуса-Наура 160—161 Большие программы 191 «Борланд Интернэшнл» 215—216 Брайт X. 153, 156 Бриклин Д. 68, 72 Бромберг Г. 158 Бучанан Б. 109 Бушнел Н. 70 Бэббидж Ч. 11—12 Ввод 40, 82—83 «Вестингауз-Беттис» 153 Видеоигра 64—67, 105 — «Полетный тренажер» 106 — «Янус» 106 Видеотерминал 23 «Визикалк» 68 Вирт Н. 39, 190—191, 195, 214—215 «Вихрь» 137 Военное программное обеспечение 191—192 Возняк С. 68, 71 Встроенные компьютерные системы 191—196 Вывод 41, 82—83 Гейтс У. 61—63, 71, 214 Генератор кода 207 Гленн А.Е. 16, 136 Голдстейн Г. 14 Дал О.Дж. 191 «дБейс II» 69 Двоичная система 12—13, 137—138 «Диджитал экуипмент корпорейшн» (ДЕК) 68, 212 «Дженерал электрик» 158 Дийкстра Э. 31—32, 153, 191 Джобс С. 68, 71 Джойстик 60, 66 238 Джоунс Ф. 61 «Димакс» 212 Жаккар Ж.Ф. 11 Задача о коммивояжере 102 ИБМ 11, 137 — и Алгол 161 — АПЛ 185—186 — Кобол 158, 159 — ПЛ/1 164 — Фортран 153—157 IBM-650 156, 211 IBM-701 137 IBM-704 153, 155 IBM PC 70—71 Система-360 161—164 Идентификаторы 167, 202 Индикаторная трубка 15 «Интерметрикс» 194 Интерпретатор 18, 27, 37, 129, 136, 198, 199—209 Искусственный интеллект (ИИ) ПО ИФИП 190 Ихбиа Ж. 194—195 Кан Ф. 215—216 Кемени Дж. 27—28, 185, 214 Килдол Г. 71, 72 Клавиатура 22 Ключевые слова 165, 171, 201 «Кнорр» 125, 126 Код команды (операции) 142, 148, 149 КОДАСИЛ 158—159 Колмари А. 185 «Колосс» 14—15 Команда ветвления 172—173 перехода 146—147 и ясность программ 191 условного 147 Командный цикл 144—145 «Коммерческий транслятор» 157, 158, 159 Компилятор 27, 37, 136, 198—209 Конкатенация 168 Конклин Н. 217 «Контрол дейта корпорейшн» (КДК) 211 Кризис программного обеспечения 191—192 Курц Т. 27—28, 185, 186 Кэмпбел Р. 16 Кэпор М. 69—71, 72 . Лашли X. 69 Леви С. 60 Ледерберг Дж. 109 «Локхид» 164 «Лотос 1-2-3» 69—71 Лутус П. 73—74 Лэнинг Дж.Х.мл. 137 «Маккарти Дж. 161, 183 Макналти К. 10—11 «Марк-1» гарвардский 13, 127, 128, 132 манчестерский 15—16, 132, 136 Машинная графика 111—120 Метки 148 «Микр» 88 Микрокомпьютеры и языки 211—212 «Микрософт» 62, 214, 216 Миллс X. 32 Министерство обороны США и разработка Ады 191—196 проблемы программного обеспечения 191 Минский М. 60 МИТС 212—213 Мочли Дж.В. 13, 16, 127—129, 136, 137 Мур Ч. 39 Натт Р. 61 Наур П. 161 «Нейшнл кеш реджистер» 158 Ньюмен М. 15 Ньюэлл А. 183 Олсен К. 59 Оперативное запоминающее устройство См. Оперативная память Операнд 142, 148 Оперативная память 22, 23 Оператор 171 перехода безусловного (GOTO) 31—32, 40 условного 41 цикла 13 Операционная система 21, 187 Операции 168—169, 202 над памятью 140, 141 отношения 169, 173 Описания 167, 204, 205 Оптимизаторы 209 Отладка 18, 32 Очередь 52—53 Пакетная обработка 28 Пейперт С. 220 Переменные глобальные и локальные 179 Перфокарта 11 Подпрограмма 18—19 «Пиплз компьютер компани» 212 Питман Т. 213—214 Планкалкюль 127—128 Подпрограммы 132, 178—179 Попплстоун Р.Дж. 80, 185 Принтер 23 Процедуры 178—179 Процедурные языки 185, 221 Программное обеспечение 10, 21, 61 Программирование алгоритмы 133—135 и Планкалкюль 127—128 на бумажной ленте 127; — переключателях 127 Постоянное запоминающее устройство (ПЗУ) 23—24 Разделение времени 29—30, 186, 211 Разер Э. 217 Рассел С. 60 Регистры 140 Рекурсия 161, 183, 188—189 Ричардсон Л. 102 Ричи Д. 187 Робертс Э. 62 Росс Д.Т. 182 Ртутная линия задержки 14, 16 Рубинштейн С. 68, 71 Рэдин Дж. 164 «Рэдио корпорейшн оф Америка» 158
«Ремингтон Рэнд» 136—137 См, также «Сперри Рэнд» Рэг лиф У. 69, 72 «Сабре» 86—87 «Сии Хониуэлл Буль» 194 «Сильвания электрик продакте» 136 Синтаксис и БНФ 160 — ключевые слова 171 Синтаксический анализатор 202, 203—204 Сканер (лексический анализатор) 201, 202—203 Сложение 142—143 Сортировка 54 методом «пузырька» 54, 55 — «корзин» 54 «Софтек» 194 «Спидкодинг» 137 «Сперри Рэнд» 136—137 Списки 50—51 «СРИ интернейшнл» 194 «Стандарт ойл оф Калифорния» 164 Структурное программирование 31—32, 191 Структуры данных массивы 166, 167 записи 167 Сумматор 13 Счетчик команд 145—147 Сэммит Дж. 158, 159, 181, 182 Таблица символов 149, 200, 204 Тейт Дж. 69, 72 Текстовый процессор 68, 76 Тестирование 32 Типы данных 165, 166—167 контроль 204—205 Томас Л. 182 Томас К. 187 Транслятор 21, 37 См. Компилятор; Интерпретатор ТЪюринг А.М. 14—15, 16, 17, 132 Тьюринга машина 15, 17 Уайтекер У. 192—193. Уилкс М.В. 16, 132, 136 Уильямс Ф.К. 15—16 Уиппл Р. 213 Умножение 149—152 Уомерзли Дж. Р. 14 «Уордстар» 68 Уоррен Дж. 213 Управление базой данных 80—81 Устройство ввода 90 Утилиты 21 Уэгстен Дж. 158, 160 Файгенбаум Э. 109 Фалкофф Э. 81, 186 «Филко» 158 Филипс Ч. 158 Фишер Д. 193 Фон Нейман Дж. 14 Фрэнкстон Р. 68 Функции 168, 169 Харрис К. 217 Хеммис Д. 156, 157 Хоар К.А.Р. 190, 191, 195, 214 Холлерит Г. 11 «Хониуэлл» 158, 159, 194—195, 211 Хоппер Г.М. 16, 18, 19, 128—129, 136—138, 157—158, 159, 161 Хэкер 58—60, 62—63 Центральный процессор 23, 140 Цикл 146, 150—152 в языках высокого уровня 174—175 Цирлер Н. 137 Цузе К. 12, 127, 129 Ченван Ли 213 Черчь А. 183 Шрейер М. 63 «Эдвак» 13, 16, 129 «Эд сак» 16, 129, 132 Экерт Дж.П. 13, 16, 127—129, 136 Экерта—Мочли компьютерная корпо- рация 128, 136 Экспертная система 109, 185, 229 «Бэкон» 109 «Генезис» ПО «Дендрал» 109—110 «Кадуцей» 109 МИЦИН ПО «Онкоцин» ПО ПАФФ ПО «Проспектор» 109 «Электрический карандаш» 63 Электронная ведомость 78—79 Эллисон Д. 212—213 «Эниак» 10, 13, 127 «Эпл-2» 68, 215 «Эрма» 88 «Юнивак-1» 16, 18 Юникс 187 Языки программирования 38, 125—126 ассемблера 125—126, 132, 136, 137, 139—152 в военном деле 191—196 высокого уровня 27, 33, 125, 136— 138, 165 даты появления 192—194 европейские и американские 160—161 и микрокомпьютеры 211—212 первые коммерческие 153—157 пример программы 176—179 объектно-ориентированные 221— 222, 227 свойства 165—179 дескриптивные 221, 228—231 диалект 181 для бизнеса 157—159 — мультипликации 183 ИИ (искусственного интеллекта) 183, 228—231 ~ ИПЛ 183 Лисп 183, 185 Пролог 185, 229 использование английского языка 162—163 код восьмеричный 128, 129, 130—131 — двоичный 128, 129, 130—131 — исходный 198 — машинный 126, 128, 136 — шестнадцатеричный 128, 129, 130—131 компилируемые и интерпретируемые 137 переносимость 157—158 подмножество 181 применение в них естественного языка 162—163 процедурные и непроцедурные 185, 221 раннее развитие 125—129, 132, 136—138 расширение 181 специализированные 182— 183, 191—192 трансляция 198, 199—209 управляющие структуры 169—175 конкретные Ада 195—196 создание 192—195 АЕД (Алгол, расширенный для проектирования) 182— 183 Аймако (AIMACO) 157, 158 Алгол (алгоритмический язык) 30, 159—160, 163 Алгол-58 160 Алгол-60 161—164, 181, 190 комитет по разработке 57, 160—161 Алгол-68 163, 190, 193 комитет по разработке 86, 190 Алгол-W 86 190 БАГСИС (система «жук», язык) 183 Бейсик 28—30, 32, 38, 46, 133, 162, 185, 211—214 ИПЛ 183 Кобол 30, 38, 39, 159, 181, 193 и микрокомпьютеры 216 создание 157—159 Крошка-Бейсик 212—213 «Краткий код» 16, 129, 136, 137 Лис 195 Лисп 38, 161, 183, 185 и микрокомпьютеры 216 Лого 30, 217, 218—219, 220 Мови Д83 Модула-2 194, 215 Мэт-мэтик 137 Паскаль 30, 32, 38—39, 191, 194 и микрокомпьютеры 215, 216 ТУрбо-Паскаль 215 ПЛ/1 164, 181, 186, 194 ПОП-2 185 Пролог 185, 221 Си 125, 126, 186—187, 216 Сканер 183 Факт 50, 51 159 Флоу-мэтик 138, 157, 158 Форт 38, 39, 125, 126, 216—217 ФИГ (инициативная группа Форта) 217 Фортран 29—30, 39, 153—157, 181, 193, 211 и Алгол 160, 161 — микрокомпьютеры 216 — ПЛ/1 164 — Фортранзит 156 АСМ (Ассоциация по компьютериза- ции) 186 СР/М 81 IBM PC 79—80 MS DOS 81 . PDP-1 67—68 PDP-8 69, 212 SHARE 161, 164 TX-0 66 Z4 127 239
Оглавление Предисловие редактора перевода ........... 5 Часть I. Компьютерная программа —что это? 7 1. Невидимый инструктор .................. 9 2. Новые языки программирования ......... 27 3. Расцвет программного обеспечения .... 57 4. Гигантский скачок в развитии систем управления ............................ 85 5. Раздвигая пределы возможного ........ 101 Часть II. Компьютер, слушай мою команду ... 123 1. Мучительный путь развития програм- мирования ............................ 125 2. Три коммерческих гиганта ............ 153 3. Десятилетие динамического развития 181 4. Программирование приходит в дом .... 211 Словарь основных понятий и терминов 232 Литература .......................... 234 Благодарности ....................... 236 Источники иллюстраций ............... 237 Предметно-именной указатель ......... 238 Научно-популярное издание ЯЗЫК КОМПЬЮТЕРА Заведующий редакцией В. С. Власенков Научный редактор А. Н. Кондрашова Художник Н. М. Иванов Художественный редактор Ю. Л. Максимов Технический редактор М. А. Анциферова Корректоры Р. Л. Вибке, Т. Е. Луганова ИБ № 7029 Подписано к печати 22.09.89. Формат 60 х 90!/в. Бумага офсетная № 1. Гарнитура тайме. Печать офсетная. Объем 15,00 бум. л. Усл. печ. л. 30,00. Усл. кр.-отт. 152,59. Уч.-изд. л. 39,43. Изд. № 9/6352. Тираж 100 000 экз. Зак. 130. Цена 6 р. 90 к. ИЗДАТЕЛЬСТВО «МИР» В/О «Совэкспорткнига» Государственного комитета СССР по печати. 129820, ГСП, Москва И-110, 1-й Рижский пер., 2. Набрано в Межиздательском фотонаборном центре издательства «Мир» Ордена Трудового Красного Знамени Калининский полиграфический комбинат Союзполиграфпрома при Государственном комитете СССР по печати 170024, г. Калинин, пр. Ленина, 5.
Книга «Язык компьютера» продолжает публикацию в русском переводе научно- популярной серии американского издательства «Тайм-Лайф», посвященной сов- ременным компьютерам. В предыдущей книге «Знакомьтесь: компьютер» рас- сказывалось об истории компьютера, о его создателях, устройстве и поистине безграничной сфере применения этого «чуда» XX века. Но что наделяет компьютер способностью решать разнообразные задачи, что делает эту умную машину непохожей на все другие машины и механизмы, созданные людьми за долгую историю человеческой цивилизации? Мощь компьютера заключается в его про- граммном обеспечении, и чтобы он начал действовать, требуется большая и кропотливая работа по написанию программы. Работа программиста весьма специфична и не имеет аналогов ни в какой другой деятельности человека. Ведь для каждой задачи, решаемой с помощью ЭВМ, приходится составлять свою программу, объем которой в иных случаях достигает миллионов битов, и стоит случайно перепутать один знак, как все может пойти насмарку. Прочитав книгу, вы узнаете, какой долгий и сложный путь прошло искусство программирования, как совершенствовалось оно по мере развития вычислительной техни- ки. Если на заре компьютерной эры программирование считалось чем-то второстепенным, то сейчас на разработку программного обеспечения расходуется до 90% общей стоимости вычислительной техники, а профессия программиста стала одной из самых популярных и престижных. Сложнейшие программы позволяют компьютеру регулировать движение го- родского транспорта, управлять полетами космических аппаратов, выступать в роли экс- перта в различных областях человеческой деятельности. Программа — это средство, с помощью которого человек диктует машине свою волю, заставляет ее делать нужную ему работу. Но чтобы вступить в диалог с машиной, человеку пришлось создать специальные языки — так называемые языки программирования. Увлекательно и интересно рассказыва- ется в книге о возникновении этих специфических языков, ставших универсальным сред- ством общения программистов всего мира, об их развитии, многообразии, о достоинствах и недостатках каждого из них.