Об орудиях труда
Истории развития человека и машин неразрывно переплетены. Машины позволили человеку преобразовать окружающую физическую среду. С их помощью человек вспахал землю, построил города, проложил гигантские каналы. Эти преобразования естественной среды обитания человека неизбежно порождали изменения организации его социальной жизни. Более существенное значение, однако, имело то обстоятельство, что созданные человеком машины определяли само понимание человеком своего мира и, следовательно, самого себя. Человек осознает, что существует он сам, существуют другие, ему подобные, и существует мир, который, по крайней мере в определенной степени, поддается изменениям. Но самое главное - человек может предвидеть. В процессе конструирования орудий для боронования распаханной почвы он "просматривает" их действие в своем воображении. Более того, поскольку он осознает себя существом общественным, а также неизбежно смертным, он по необходимости является учителем. Его орудия труда независимо от их исходной практической функции непременно суть также и инструменты педагогики. Таким образом, они представляют собой часть того материала, которым пользуется человек, моделируя в своем воображении перестройку мира.
Именно в этом созданном им самим интеллектуальном и социальном мире человек высказывает и "проигрывает" бесчисленные волнующие гипотезы о том, каким мог бы быть мир в прошлом и чем он мог бы стать. Этот мир - хранилище субъективизма человека. Следовательно, он служит стимулятором сознания человека и в конечном счете конструктором самого материального мира. Именно этот самодельный мир человек воспринимает как явно внешнюю силу. Но он несет его в самом себе; то, с чем он имеет дело, - это его собственная модель Вселенной, и поскольку человек является ее частью, его модель самого себя.
Человек может создать очень мало, не вообразив сначала, что он может создать нечто. Мы может представить себе, как должен был бы воображать использование топора человек каменного века, напряженно трудясь над его изготовлением.
А не воспроизводил ли каждый из нас этот наследственный опыт, когда ребенком мастерил примитивные игрушки из любого подручного материала? Но орудия труда и машины не просто символизируют воображение человека и его творческие возможности и, конечно, они важны не только как инструменты воздействия на преобразуемую почву: они сами по себе суть содержательные символы. Они символизируют деятельность, возможность которой они обеспечивают, т. е. собственное использование. Весло-орудие гребли и оно представляет мастерство гребли во всей его сложности. Тот, кто никогда не греб, не может увидеть в весле весло в истинном смысле этого слова. Отношение к скрипке человека, никогда на ней не игравшего, отличается, и очень сильно, от отношения к ней скрипача. Орудие труда - это также и модель для собственного воспроизводства, и сценарий многократного повторения актов демонстрации того мастерства, которое оно символизирует.
Именно в этом смысле оно является инструментом педагогики, средством обучения людей, живущих в другие времена или в иных местах, способом мышления и деятельности, накопленным в процессе культурного развития. Таким образом, орудие труда как символ во всех этих отношениях выходит за пределы своей роли практического средства достижения определенных целей: оно является составной частью символического воссоздания человеком своего мира. Следовательно, орудия труда неизбежно должны входить в то образное исчисление, которое непрерывно обеспечивает построение его мира. В этом смысле орудия труда - нечто большее, чем просто приспособление: они представляют собой силу, осуществляющую изменения. Это даже больше, чем фрагменты плана мира, определенного и завещанного человеку его предками (хотя и это тоже). Легко понять, что орудия ручного труда и особенно личное оружие прямо воздействуют на воображение людей, использующих их. Когда у охотника появились, например, копья, они обнаружили, что их взаимоотношения с окружающим миром полностью переменились. Крупные животные, которых человек боялся, совершавшие прежде набеги на продовольственные запасы человека и даже нападавшие на его детей, теперь превратились в его добычу.
Круг источников пищи человека расширился, так как теперь люди могли убивать животных на расстоянии, в том числе множество видов, ранее ускользавших от человека. Существенно большее количество пищи расширило и районы деятельности человека, увеличив вероятность встречи с другими людьми. Жизненный опыт человека изменился, и то же самое должно было произойти с его представлением о своем месте в мире.
На Американском Западе в XIX в. шестизарядный револьвер был известен как "великий уравнитель" [Прим. перев.: Автор употребляет термин "great equalizer". Интересно, что слово "equalizer" имеет в английском языке кроме основного значения "уравнитель", "компенсатор" жаргонное значение "пистолет" (основной английский термин для пистолета - "pistol")] - это название красноречиво свидетельствует о том, как эта разновидность оружия влияла на самооценку вооруженного человека, если, не имея его, он чувствовал себя в невыгодном положении по отношению к своим согражданам.
Но устройства и машины, известные, быть может (и, несомненно, принадлежащие и служащие), лишь относительно немногим членам общества, часто влияли на самооценку отдельных членов общества и на представление всего общества о мире столь же глубоко, сколь и широко используемые орудия ручного труда. Всевозможные корабли, например, служили средством информирования человека о необъятности его территорий. Они позволяли различным культурам вступать в соприкосновение и взаимно оплодотворять друг друга. Корабли и все остальные атрибуты мореплавателя, его мифы и легенды эффективно передавали его профессиональное мастерство из поколения в поколение. И они питали подсознание тех, кто оставался на земле, а также тех, кто уходил в море. Печатный станок изменил мир даже для тех миллионов людей, кто, например, во времена Мартина Лютера оставался неграмотным и, быть может, никогда реально не имел дела с книгой. А какая часть той огромной массы людей во всем мире, чья жизнь самым непосредственным к драматическим образом изменилась в результате промышленной революции, практически соприкасалась с паровой машиной?
Точно так же и современное общество не избавлено от гигантских потрясений, возникающих как побочный эффект при внедрении новых машин. Хлопкоуборочная машина стала использоваться на хлопковых полях Американского Юга примерно с 1955 г. Она быстро разрушила рынок единственного товара-собственного труда, который могли предложить огромные массы чернокожих, сельскохозяйственных рабочих Юга. Так началась массовая миграция американских негров в города, преимущественно в такие северные промышленные центры, как Детройт, Чикаго и Нью-Йорк, но вместе с тем и в крупные южные города типа Бирмингема и Атланты. Эти колоссальные демографические перемены в США, эта внутренняя миграция миллионов граждан страны, несомненно, были и остаются одним из основных факторов, определяющих американское движение борьбы за гражданские права. А это движение оказывает немалое влияние на сознание по меньшей мере каждого американца, если не почти любого взрослого человека во всех частях земного шара.
Что же за непреодолимая сила заключена в машине, если она способна так успешно проникать в самую сердцевину того материала, из которого человек строит свой: мир?
Много машин представляют собой функциональные дополнения человеческого тела, в сущности - протезы, Некоторые из них (например, рычаг, паровая лопата просто увеличивают физическую силу управляющих ими людей; другие (микроскоп, телескоп и различные измерительные приборы) являются продолжениями органов чувств человека; третьи расширяют пределы физически достижимой для человека области. Копье и радио, например, позволяют человеку оказывать влияние в пределах, превышающих возможности его рук и голоса соответственно. Транспортные средства человека обеспечивают возможность странствовать быстрее и дальше, чем позволяли это его собственные ноги; эти же средства обеспечивают перевозку колоссальных грузов на гигантские расстояния. Легко понять, как и почему эти машины-протезы непосредственно усиливают чувство власти человека над материальным миром. И одновременно они оказывают существенное психологическое влияние: говорят человеку, что он может переделать самого себя.
Действительно, они являются частью множества символов, используемых человеком для восстановления своего прошлого, т. е. конструирования своей истории и создания своего будущего. Они демонстрируют, что человек - homo Фабер [Прим. перев.: Homo faber - "человек производящий"; "faber" (лат.) - мастер, творец, создатель] - может преодолеть ограничения, налагаемые на него несовершенством его тела и органов чувств. Когда-то человек мог убивать другое животное, забив или разодрав его своими руками; затем он обзавелся топором, копьем, стрелой, пушечным ядром, артиллерийским снарядом. Ныне заряды, которыми оснащены ракеты, могут уничтожить само человечество. Вот один из критериев оценки того, насколько далеко человек зашел в расширении своих возможностей и переделке себя с тех пор, как начал изготовлять разнообразные орудия.
Истолкование влияния орудий труда - протезов - на трансформацию человека целиком в терминах мощи, которую они позволили ему сосредоточить в своих руках, может породить ту точку зрения на взаимоотношения человека с природой, что их основным, а на самом деле почти единственным содержанием оказывается борьба за власть. Человек согласно этой точке зрения покорил в конце концов природу, просто овладев мощью, достаточной для преодоления физического пространства и времени, управления жизнью и смертью и, наконец, для уничтожения заодно и всей Земли. Но эта идея ошибочна, даже если мы допустим, что извечной мечтой человека было не просто раскрытие тайн природы, а ее покорение, и эта мечта сейчас в значительной мере осуществилась. Так, победа над природой была достигнута в нашем веке, но природа, над которой царствует современный человек, решительно не та, в которой человек жил до научно-технической революции. Действительно, результат, которого добился человек и который обеспечил подъем современной науки, был не чем иным, как преобразованием природы и восприятия человеком действительности.
Важнейшие изменения, происходившие в духовной жизни человека, начиная примерно с XIV в., были связаны с восприятием человеком времени и соответственна пространства.
Давным-давно человек замечал регулярность в окружающем его мире (и, как можно предполагать, размышлял о них). Александр Маршак показал, что уже в Верхнем Палеолите (примерно 30000 лет да н. э.) человек имел нотацию для лунных циклов, которая была, по словам Маршака, "уже хорошо разработанной, сложной и изощренной, являясь обычаем, насчитывающим к тому моменту, судя по всему, тысячелетия"1. Но регулярность Вселенной искали и воспринимали со времен классической античности и почти до наших дней как великую гармонию основ мироздания. Идея систематичности природы в том смысле, как мы ее понимаем, т. е. каждая часть и аспект природы могут быть выделены в подсистему, подчиняющуюся законам, которые поддаются описанию в виде функций времени,-такая идея не могла бы быть даже понятой людьми, воспринимающими время не как совокупность абстрактных единиц (а именно часов, минут и секунд), а как последовательность постоянно сменяющихся событий.
Время дня отмечалось определенными событиями, например расположением солнца над какой-либо скалой или, как сообщает Гомер, началом или концом различных работ - запряганием волов (утро) и распряганием (вечер). Продолжительность определялась сопоставлением с общеизвестными фактами, например со временем, необходимым для того, чтобы пройти хорошо известное расстояние или вскипятить определенное количество воды. Времена года узнавались по наступлению сезонных явлений, например отлета птиц. До тех пор, пока дарвиновская эволюционная теория не начала вливаться в поток общепризнанных идей, т. е. приобретать статус "здравого смысла", люди знали, что окружающий мир - это мир воспроизводящихся растений и животных, разливающихся, пересыхающих и вновь разливающихся рек, морей, пульсирующих согласно великому ритму приливов и отливов, и нескончаемо повторяющегося зрелища неба - существовал всегда, и что его фундаментальный закон - извечная периодичность. Космологическое время так же, как и время, воспринимаемое в повседневной жизни, было поэтому некоторой разновидностью сложных биений, повторения и отражения событий.
Может быть, мы сможем как- то понять это, обратившись, скажем, к великим фугам Баха. Но здесь следует придерживаться особого подхода: мы не должны так, как это принято сейчас, рассматривать Баха как "решателя задач" или каждый из его опусов в "Искусстве фуги" как все более утонченное "решение" задачи, которую он поставил себе изначально, Вместо этого мы должны считать, что Бах постоянно держал в голове весь план работы и относился к своему "Искусству фуги" как к единственному произведению, не имеющему ни начала, ни конца, вечной, как космос, и, как космос, бесконечно сложной в своих связях - циклах, вложенных в циклы, вложенные в циклы. В таком случае мы могли бы найти возможным считать, что жизнь не просто акцентирована музыкой такого рода, но и исполнена ею в грандиозном космологическо-теологическом масштабе к на скромном уровне повседневности. Такое время представляет собой кругооборот циклов и эпициклов в циклах, а не вместилище равномерно текущей последовательности абстрактных моментов, каковым, как мы сейчас "знаем", оно является. Сама же природа состояла, разумеется, из отдельных явлений, которые представляли собой постоянно повторяющиеся метаморфозы самих себя и поэтому были постоянными, вечными. "Все вечное циклично и все цикличное вечно", - сказал Аристотель, и даже Галилей еще верил, что Вселенная вечна и ею правит повторяемость и периодичность.
Дарвиново понимание времени было совершенно иным. Он рассматривал саму природу как процесс, развивающийся во времени, а отдельные явления природы как необратимые превращения. Но он вовсе не был автором той идеи прогресса, которой мы сейчас прониклись. На самом деле он вообще не смог бы прийти к своим идеям, если бы что-то очень похожее на наши современные представления о времени уже не были неотъемлемыми элементами здравого смысла его эпохи.
Каким образом менялось восприятие времени от античности до наших дней, показывает роль другого типа машин (не относящихся к категории машин-протезов) в преобразовании человека из существа, созданного природой и живущего в лоне природы, во властелина природы.
Часы не являются машиной-протезом; их работа не приводит к расширению возможностей мускулов или органов чувств человека, ее результат - часы, минуты и секунды, а сегодня даже микро-, нано- и пикосекунды.
Луис Мамфорд называет часы, а не паровую машину "ключевой машиной современной промышленной эры"2. В блестящей вступительной главе к "Технике и цивилизации" он описывает, как во времена средневековья упорядоченная жизнь монастырей влияла на жизнь соседних общин.
"Монастырь был очагом правильного образа жизни... сама традиция упорядоченности и ревностное поддержание временных последовательностей стали почти второй натурой монастыря... монастыри - одно время под управлением бенедиктинского ордена действовало 40000 монастырей - помогали придавать деятельности человека регулярный коллективный ритм и постоянство машины; таким образом, часы - это не просто средство отслеживания времени, но и инструмент синхронизации времени деятельности людей... к XIII в. относятся вполне определенные свидетельства о механических часах, а в 1370 году в Париже Генрих фон Вик построил хорошо сконструированные "современные" часы. Тем временем появились колокольни, и новые часы, хотя до XIV столетия они не имели циферблата и стрелок, преобразующих ход времени в движение в пространстве, во всяком случае, били. Облака, способные парализовать солнечные часы... не были больше препятствием для слежения за временем: летом и зимой, днем и ночью все слышали урочный бой часов. Вскоре этот инструмент вышел за пределы монастыря, и регулярный звон колоколов внес новую упорядоченность в жизнь ремесленников и торговцев. Колокола башенных часов практически определяли всю городскую жизнь. Слежение за временем перешло в приспособление ко времени, его учету и нормированию. По мере того как это происходило, вечность постепенно переставала служить мерой и центром человеческой деятельности"3.
Далее Мамфорд делает очень существенное замечание о том, как часы "отделили время от происходящих в жизни человека событий и способствовали возникновению убежденности в существовании отдельного мира последовательностей, поддающихся математическому измерению: особого мира науки"4.
Значение этого влияния часов на восприятие мира человеком едва ли можно переоценить. Сегодняшний взгляд на время так глубоко укоренился в нас, настолько стал нашей "второй натурой", что мы, в сущности, не способны теперь установить роль, которую он играет в нашем мышлении. Александр Маршак замечает:
"Понятие процессов, зависящих от времени, выглядит в настоящее время в фундаментальных науках чуть ли не тавтологией, поскольку все процессы - простые и сложные, последовательные и взаимосвязанные, конечные и бесконечные - развиваются или продолжаются и характеризуются измеримыми или поддающимися оценке интенсивностями, скоростями, длительностями, периодичностями и т. д. Науки, изучающие эти процессы, сами, однако, "зависят от времени", поскольку процессы познания и распознавания, планирования, исследования, анализа, сравнения и интерпретации также являются последовательными, взаимосвязанными, развивающимися и кумулятивными"5.
Действительно, каждому старшекласснику известны два фундаментальных уравнения физики F=ma и Е=mс2. Символ а в первом уравнении обозначает ускорение, т. е. изменение скорости во времени, а с во втором уравнении обозначает скорость света, т. е. перемещение света за определенное время.
Я упоминаю здесь часы не просто потому, что они были решающей детерминантой мышления человека - в конце концов, возникновению нового научного рационализма способствовали и многие другие изобретения (например, линии, обозначающие долготу и широту на глобусе), но для того, чтобы показать: одни только машины-протезы не обеспечивают роста власти человека над природой. Часы, несомненно, не являются машиной-протезом; они не увеличивают ни мускульную силу человека, ни возможности его органов чувств. Это автономная машина.
Многие машины являются автоматическими в том смысле, что после запуска они работают сами по себе в течение длительного периода времени. Большая часть автоматических машин нуждается, однако, в предварительной настройке на определенную задачу и последующем управлении или регулировании, осуществляемом при помощи датчиков или человеком-оператором.
Автономной является такая машина, которая, будучи однажды запущена, работает самостоятельно на основе введенной в нее модели какого-либо аспекта реального мира. Часы, в сущности, представляют собой модели планетной системы. Они были первыми и вплоть до появления вычислительной машины оставались единственными действительно важными автономными машинами, построенными человеком.
Там, где для узнавания времени человек использовал часы, его распорядок повседневной жизни перестал основываться исключительно на таких явлениях, как, скажем, расположение солнца над определенными скалами или пение петуха, и стал базироваться на состоянии автономно действующей модели некоторого явления природы. Различным состояниям этой модели были присвоены названия, и таким образом они были овеществлены. Вся же совокупность этих состояний наложилась на существующий мир и изменила его так же, как могли бы изменить его катаклизмы, приводящие к перестройке "географии" или климата. Теперь человек для того, чтобы жить в этом мире, должен был сформировать новое сознание. Часы создали без преувеличения новую действительность; именно это я имел в виду, когда говорил раньше, что человек подготовил почву для развития современной науки не иначе, как с помощью преобразования природы и восприятия человеком действительности.
Важно понять, что эта вновь созданная реальность была и остается убогим вариантом прежней, так как она основывается на отказе от того непосредственного опыта, который составлял основу и фактически сущность прежней действительности. Чувство голода в качестве побудительной причины еды было отвергнуто; вместо этого человек ест тогда, когда некоторая абстрактная модель достигает определенного состояния, т. е. когда стрелки часов указывают на определенные метки на циферблате (здесь очень знаменателен также этот антропоморфизм [Прим. перев.: Английское слово "face", употребленное здесь автором, имеет несколько значений, в том числе "лицо" и "циферблат"]); подобным же образом обстоят дела с сигналами отхода ко сну, пробуждения и т.
д.
Этому отказу от непосредственных ощущений суждено было стать одной из основных черт современной науки. Он наложил отпечаток на западно-европейскую культуру не только благодаря часам, но и множеству измерительных приборов, особенно сообщающих о явлениях, для контроля которых они были предназначены, посредством указателей, а позиции последних в конечном счете переводились в цифровую форму. Сначала постепенно, затем все быстрее и, справедливость требует сказать, все более обязательно данные восприятия действительности должны были представляться в числовом виде, чтобы приобрести законный статус в глазах здравого смысла. Сегодня считается, что в результате невероятно сложных действий, часто с колоссальными совокупностями чисел, можно получить новые аспекты действительности. Для их обоснования прибегают к сопоставлению вновь выведенных чисел с показаниями еще большего количества измерительных приборов, являющихся связующим звеном между человеком и природой и порождающих еще большее количество чисел.
"Человек науки должен превыше всего стремиться к исключению личного элемента из своих суждений", - писал Карл Пирсон в 1892 г.6. Лишь очень немногие из известных мне ученых не согласились бы с этим утверждением. Все же необходимо отдавать отчет в том, что это побуждает человека стремиться к превращению в - бесплотный разум, чтобы самому стать орудием труда, машиной. Так далеко завела человека столь поначалу невинная связь с машинами-протезами и показаниями приборов, И из культуры, сформированной таким образом, изверглась вычислительная машина.
"Каждый мыслитель, - писал Джон Дьюи, - разрушает определенную часть внешне стабильного мира, и никто не может предсказать, что возникнет на этом месте". Так же поступает и каждый изобретатель нового орудия труда или, что равнозначно, находящий новый способ использования старого. Длительная историческая перспектива, помогающая нам понимать классическую античность, средние века или начало современной эпохи, служит нам также при формулировке правдоподобных гипотез, объясняющих новые реальности, возникающие в те времена взамен старой действительности, разрушенной в результате внедрения новых орудий труда.
Но как только мы приближаемся к пониманию самой сути истории, повествующей, с одной стороны, о меняющемся сознании современного человека и, с другой стороны, о развитии современных орудий труда и особенно вычислительной машины, наше перспектива неизбежно нарушается. Мы можем только спроецировать уроки, вынесенные из нашего понимания прошлого, наши правдоподобные гипотезы, касающиеся настоящего и будущего. Эта задача значительно усложняется тем обстоятельством, что влияние на общество современных орудий труда более кардинальное и проявляется значительно быстрее, чем это происходило прежде.
Отчуждение человека от природы в результате появления часов повлияло на человечество в целом, и для этого потребовались века, И даже тогда он должен был синергически сочетаться со множеством других возникающих факторов для того, чтобы проявить свое влияние. Когда появилась паровая машина, время и пространство с точки зрения здравого смысла были уже квантифицированы. Концепция вечной природы, подчиняющейся непреложным законам периодичности, подразумевает установления, выраженные в святых книгах и практиковавшиеся официальными наместниками извечного порядка. Этот квазиконституциональный, а потому ограниченный порядок уже давно был нарушен, например, относительно неограниченной властью денег, т. е. ценности квантифицированной, и особенно квантифицированной ценностью труда человека. Эти и многие другие обстоятельства в совокупности сделали возможным то, что паровая машина в конце концов коренным образом трансформировала общество. Более поздние орудия труда, например телефон, автомобиль, радио, сталкивались с культурой, уже пропитанной тем, что экономисты называют "принципом свиньи": если что-то хорошо, то, чем его больше, тем лучше. Жажда больших возможностей и быстроты коммуникации, часто стимулированная именно новыми устройствами так же, как и новыми методами маркетинга, связанными с ними, обеспечила их быстрое распространение в обществе и его все более быструю трансформацию под их воздействием.
Когда была проложена первая телеграфная линия, соединяющая Техас с Нью-Йорком, высказывались сомнения, будет ли вообще жителям этих мест о чем говорить. Но к тому моменту, когда цифровая вычислительная машина вышла за пределы университетских лабораторий и вступила в американскую деловую, военную и промышленную сферы, сомнений в ее потенциальной полезности не было ни у кого. Напротив, американские менеджеры и технические специалисты согласились с тем, что вычислительная машина появилась вовремя и должна предотвратить катастрофические кризисы. Если бы не своевременное внедрение вычислительной машины, утверждали они, нельзя было бы найти необходимого количества людей для работы в банках, справиться со сложностью проблем коммуникации и материально-технического обеспечения американских вооруженных сил, рассеянных по всему миру, не могли бы функционировать фондовая и товарная биржи. Американская корпорация столкнулась с той же проблемой "командования и управления", с которой сталкиваются ее военные коллеги. И подобно Пентагону ее деятельность становилась все более разнообразной и распространялась по всему миру. Беспрецендентно большие и сложные вычислительные задачи возникли перед американским обществом в конце второй мировой войны, и вычислительная машина, казалось, чуть ли не чудотворно появилась как раз вовремя для того, чтобы справиться с ними.
В действительности в десятилетия, предшествовавшие второй мировой войне, и особенно в военное время, колоссальные управленческие, технологические и научные задачи были решены без помощи ЭВМ. Деятельность основной части промышленности США была скоординирована так, чтобы обеспечить выполнение военных заказов (пищевых продуктов, обмундирования и т. п.) и организовать необходимый транспорт для многочисленных армий, разбросанных по всему земному шару. "Манхеттен-проект" создал атомную бомбу без электронных вычислительных машин, хотя научные и технические задачи, разрешенные в его рамках, требовали, вероятно, больше вычислений, чем астрономические расчеты, выполненные к тому времени.
Объем его управленческой задачи, несомненно, соизмерим с размахом задач проекта "Аполлон", выполненного в 60-е годы. Сегодня, вероятно, многие считают, что проект "Аполлон" невозможно было бы осуществить без помощи ЭВМ. История "Манхеттен-проекта" как будто бы опровергает это убеждение. Существуют мнения о необходимости вычислительных машин для управления крупными корпорациями и войсками, о незаменимости ЭВМ в современных научных вычислениях и фактически о невозможности осуществления в современных условиях научной и коммерческой деятельности без вычислительных машин [прим.авт.: Я уверен в том, что если бы в 1940 г. вычислительные машины имели современные возможности, то технические специалисты, участвовавшие в проекте "Манхеттен", клятвенно уверяли бы, что осуществить проект без ЭВМ тоже было бы невозможно. Мы располагали бы подобными пылкими уверениями авиационных конструкторов времен второй мировой войны, а также менеджеров, занимавшихся тогда материально-техническим обеспечением. Если бы гитлеровская Германия обладала вычислительными машинами, все считали бы сегодня, что только с их помощью нацисты могли контролировать немецкий народ и осуществлять систематическое перемещение миллионов людей в лагеря смерти и их последующее убийство. Но и вторая мировая война, и гибель миллионов людей происходили в то время, когда вычислительных машин еще не было].
Убеждение в необходимости вычислительной машины не совсем ошибочно. Она становится неотъемлемым компонентом любой структуры, как только оказывается настолько интегрированной в эту структуру, настолько тесно связанной с ее различными жизненно важными подструктурами, что вычислительную машину уже нельзя изъять из нее, не разрушив всю структуру полностью. Это, в сущности, тавтология. Польза ее заключается в следующем: она может вновь привлечь наше внимание к возможности того, что некоторые действия человека, например включение вычислительных машин в какую-либо сложную человеческую деятельность, могут привести к необратимым последствиям.
Неправда, что американская банковская система, или фондовая и товарные биржи, или крупные промышленные компании потерпели бы крах, не подоспей "вовремя" вычислительная машина. Правда то, что специфический способ, лежащий в основе развития этих систем, который появился в два последних десятилетия и развивается до сих пор, был бы невозможен без вычислительной машины. Правда то, что если бы вдруг исчезли все вычислительные машины, большая часть современного индустриализированного и милитаризированного мира была бы ввергнута в грандиозный беспорядок, а возможно, и в абсолютный хаос. Вычислительная машина не являлась необходимой предпосылкой выживания современного общества в послевоенный период и позже; восторженное и некритическое принятие вычислительной машины наиболее "прогрессивными" элементами американского правительства, деловых и промышленных кругов быстро сделали ее средством, очень важным для выживания общества в той форме, в определении которой сама вычислительная машина сыграла решающую роль.
В 1947 г. Дж. Форрестер написал для Военно-морского флота США памятную записку "Об использовании электронных цифровых вычислительных машин в качестве автоматических боевых информационных постов". Комментируя в 1961 г. последующее развитие, он писал:
"Вероятно, [в 1947 г.] не нашлось бы и пяти офицеров, осознающих возможность того, что машина способна анализировать имеющуюся информацию, распределять соответствующим образом вооружение, выдавать команды и координировать смежные области военных операций... В течение последующего десятилетия скорость военных операций возросла настолько, что стало ясно: независимо от предполагаемых преимуществ решений, принимаемых человеком, скорость внутренней коммунникации при взаимодействии людей просто не в состоянии справиться с темпами современной вооруженной войны. Эта неспособность к действиям породила стимул"7.
Десятилетие, о котором говорит Форрестер, было наполнено подобными стимулами и выяснениями того, что способность существующих систем взаимодействия людей справляться со все убыстряющимися темпами современной жизни приближается к определенным пределам.
Форрестер рисует картину небольших групп людей, стремящихся действовать быстро, чтобы держать события под контролем, но все больше не успевающих это делать, потому что события происходят слишком быстро, а сделать нужно слишком много. Они достигли предела "внутренней скорости" группы. Вероятно, это же представление можно использовать для описания побудительного стимула в случае групп банковских служащих, в разгаре ночи неистово сортирующих и осуществляющих проводку чеков, штурмующих еще большие горы чеков, клиринг [Прим. перев.: Клиринг - система безналичных расчетов, основанная на зачете взаимных требований и обязательств. Используется во внутренних и международных расчетах. Осуществляется через банки или специальные расчетные палаты] которых в соответствии с законом должен быть выполнен к определенному сроку. Вероятно, все пределы или по крайней мере многие из достигнутых в то десятилетке можно успешно охарактеризовать таким же образом. В конце концов, именно "внутренняя скорость" взаимодействия людей в организации окажется лимитирующим фактором, когда, скажем, автостроительная фирма попытается запустить поточную линию, способную производить астрономическую номенклатуру автомобилей с высокой и постоянной скоростью, или когда, например, какая-либо центральная правительственная организация берет на себя ответственность за "защиту" миллионов клиентов системы социального обеспечения от поползновений к мошенничеству тщательным слежением как за выплатой им государственных пособий, так и за любыми другими доходами, которые они могут (незаконно) получить.
"Невозможность действовать", которая, как указывает Форрестер, "послужила стимулом" увеличения с помощью ЭВМ низкой внутренней скорости взаимодействия людей в организациях или вообще замены его вычислительными машинами, в каких-либо других исторических условиях могла бы стать побудительным мотивом для изменения поставленной задачи, возможно, даже для ее отбрасывания или для перестройки организации взаимодействия людей, ибо присущие ей ограничения рассматривались в конце концов в качестве корня зла.
Быть может, стимул, порожденный в 50- е годы неспособностью военных справиться с возрастающей сложностью воздушной войны, можно было бы перевести не в заботу о выработке методов, позволяющих военным придерживаться их традиционной роли, а в желание изобрести новые формы организации взаимодействия-людей с новыми задачами, связанными с более фундаментальными проблемами, а именно как народы с различными интересами должны уживаться вместе. Но вычислительная машина была использована для создания, как выразился один полковник военно-воздушных сил, "системы слежения, покрывающей территорию, сравнимую со всем американским континентом", т. е. систему противовоздушной обороны SAGE [Прим. перев.: SAGE (semiautomatic ground environment) - полуавтоматическая наземная система управления средствами ПВО]. И естественно, раз "у нас" появилась такая система, мы должны были предполагать, что и "у них" она тоже есть. Следовательно, мы должны были использовать вcе свои технические возможности для разработки наступательного оружия и стратегий, которые позволят преодолеть "нашу" систему обороны, т. е. предполагаемую "их" систему обороны. Далее мы должны были допустить, что и "у них" есть подобное оружие и стратегии, и, следовательно, ..., и так далее, вплоть до сегодняшних баллистических ракет с многоэлементными боеголовками с индивидуальным наведением элементов и маневрирующих противорадиолокационных ракет и противоракет.
Возможно, что культивируемое и пагубное пристрастие человека к личному автомобилю можно было бы удовлетворить наличием выбора из, скажем, сотни видов транспортных средств, существенно отличающихся друг от друга, а не выбором из астрономического числа по существу одинаковых "моделей", отличающихся друг от друга лишь мелочами. Возможно, в самом деле, автомобиль как средство индивидуального транспорта мог бы отойти на второй план, уступив место общественному транспорту при поездках в городах и пассажирскому железнодорожному транспорту между ними.
Но вычислительная машина была использована для автоматизации подачи деталей на поточные линии сборки автомобилей, чтобы люди могли выбирать свои новые автомобили из миллионов тривиальных разновидностей.
Возможно, что социальные службы (например, система социального обеспечения) могли бы управляться людьми, полагающимися на человеческие суждения, если бы организация таких служб ориентировалась на децентрализованные естественные скопления населения типа округа или области с четкими географическими границами. Но вычислительная машина использовалась для автоматизации управления социальных служб и централизации их в соответствии с установленными политическими границами. Если бы ЭВМ не способствовали "увековечению" и "улучшению" существующей системы социального обеспечения (а следовательно, и их философских обоснований), возможно, кто-нибудь мог бы подумать об устранении большей части потребностей в социальном обеспечении с помощью, например, отрицательного подоходного "налога" [Прим. перев.: Негативный подоходный "налог" - выплата суммы из бюджета лицу с недостаточным уровнем дохода]. Само создание чудовищно большого и сложного административного аппарата социального обеспечения, основанного на применении вычислительной машины, вызвало интерес к поддержанию его и, следовательно, к увековечению самой системы социального обеспечения. А подобные интересы вскоре стали служить серьезным препятствием для нововведений, даже когда впоследствии для них накопилось достаточно веских причин.
Другими словами, многие проблемы роста и сложности, настоятельно и неопровержимо требовавшие разрешения в послевоенные десятилетия, могли бы послужить стимулом для социального и политического обновления. Огромное ускорение социальных изобретений, если бы оно началось тогда, казалось бы нам сегодня таким же естественным следствием затруднений, испытывавшихся человеком в те времена, каким кажется тот поток технических изобретений и нововведений, стимулированный фактически.
Да, вычислительная машина действительно появилась "вовремя". Но вовремя для чего? Для того, чтобы спасти - и спасти, сохранив практически незатронутой, а фактически укрепив и стабилизировав - социальные и политические структуры, которые в противном случае могли бы быть либо коренным образом обновлены, либо обречены на разрушение под воздействием требований, которые непременно должны были бы быть к ним предъявлены. Следовательно, вычислительная машина была использована для того, чтобы законсервировать американские социальные и политические институты. Она по крайней мере на время поддержала и создала у них иммунитет против огромного давления в сторону перемен. Точно такой же была ее роль и в других обществах, позволивших вычислительной машине посягнуть на свои институты. В этой связи вспомним Японию и ФРГ.
Изобретение вычислительной машины подвергло риску стабильность части внешне устойчивого мира, поскольку именно это и есть функция любого творческого акта человека. И в соответствии с афоризмом Дьюи никто не мог бы предсказать, что возникло бы на ее месте. Но из множества путей социального обновления, которые она открыла человеку, наиболее роковой явилась возможность отказаться от всяких мыслей о преднамеренных существенных изменениях. Именно такой выбор сделал человек.
Приход вычислительно-машинной революции и начало вычислительно-машинной эры провозглашались много раз. Но если успех революции оценивать в терминах глубины социальных реформ, принесенных ею, то можно считать, что никакой машинной революции нет. И как бы ни определяли нынешнюю эпоху, вычислительная машина - не есть ее эпоним [Прим. перев.: Эпоним - "лицо", от имени которого произведено название народа, местности и т. п.]
Сказать, что вычислительная машина использовалась с самого начала в основном для решения различных задач точно таким же способом, как это делалось всегда, с той лишь разницей, что она делала это быстрее или по каким-либо критериям эффективнее, - не значит выделять ее из ряда других орудий труда.
Очень редко, если вообще это когда-нибудь случалось, орудие труда и совершенно оригинальная задача для него изобретались одновременно. Орудия труда как символы, однако, побуждают воображение поместить их в другую среду, отличную от их родной. В своих новых сферах деятельности, т. е. в качестве новых символов в уже сложившемся образном исчислении, они сами могут быть трансформированы и даже трансформировать прескриптивное по происхождению исчисление. Эти трансформации в свою очередь могут порождать совершенно новые задачи, которые затем стимулируют изобретение до тех пор буквально невообразимых орудий труда.
В 1804 г. в Уэльсе, через сто лет после того, как первые стационарные паровые машины Ньюкомена и Севери [Прим. перев.: Томас Ньюкомен (Newcomen) (1663-1729.) - английский изобретатель, один из создателей теплового двигателя. В 1705 г. приступил к постройке пароатмосферной поршневой машины, которая была впервые использована для откачки воды из рудника в 1712г. Томас Севери (Savery) (1650-1715) - английский инженер, один из создателей теплового двигателя, Севери - автор первой практически действовавшей водоподъемной паровой установки. Ее описание было опубликовано им в 1696 г., а в 1698 г. взят патент. Ричард Тревитик (Trevithik) (1771-1833) - английский изобретатель. Создал безрельсовую паровую повозку (1801-1803 гг.) и первый паровоз для рельсового пути, который был испытан им в 1804г.] стали широко применяться в Англии, например, для откачки воды из шахт, Тревитик поставил паровую машину на платформу, а платформу на рельсы конки. Благодаря тому, что стационарная паровая машина была выхвачена из ее "естественной" среды и помещена в совершенно новую, она трансформировалась в паровоз и положила начало превращению конки в современную железную дорогу. И в связи с этим, поскольку вскоре появилась необходимость предотвращать столкновения поездов, движущихся по одному пути, возник стимул для создания совершенно новой техники сигнализаций. Появились новые задачи, и как реакция на них были изобретены новые орудия труда.
Интересно отметить, что Томас Севери, построивший первую паровую машину (примерно в 1700 г.), практически примененную в промышленности, был также первым, кто использовал термин "лошадиная сила" приблизительно в том смысле, что и мы сейчас. Возможно, термин появился лишь потому, что в те времена, когда паровая машина заменяла лошадей, их было чрезвычайно много, причем не только в своем первом воплощении в качестве стационарного источника энергии, но также, и в своем новом воплощении в качестве паровоза. И все же термин "лошадиная сила", столь часто попрекаемый за его некорректность, вполне мог побудить воображение Тревитика заглянуть туда, куда он в конце концов и двинулся, перебросить в своем воображении мост, соединивший паровую машину и конку и создавший новую целостную сферу деятельности. Изобретательство включает мысленный перенос символов из одной существующей и в общем достаточно развитой сферы деятельности в другую. Следует ожидать, что некоторые "мощные" символы "переживут" этот перенос, оставшись практически неизменными, и будут оказывать влияние в новой сфере деятельности.
У вычислительных машин были свои лошади для замены. До того, как первые современные электронные цифровые вычислительные машины стали доступны обработке коммерческих данных [Прим. перев.: В оригинале "business data processing"] (как ее называют теперь) - т. е. до того, как Бюро переписей Министерства торговли США приобрело в 1951 г. машину UNIVAC I [Прим. перев.: UNIVAC - universal automatic computer - универсальная автоматическая вычислительная машина "Унивак"], во многих американских фирмах имелись большие так называемые "табуляторные". В этих помещениях стояли машины, которые могли перфорировать те же самые перфокарты (сейчас их обычно, хотя часто ошибочно, называют перфокартами IBM), которые находятся в употреблении и до сих пор, сортировать эти перфокарты в соответствии с различными критериями и "табулировать" колоды таких перфокарт, т.
е. представлять содержащуюся в них информацию в виде обширных печатных таблиц. Табуляторные выпускали монбланы административных отчетов для американского правительства и промышленности, используя орды огромных механических чудовищ. Эти машины могли при каждом прогоне колоды перфокарт выполнять над ней лишь одну операцию. Они, например, сортировали колоды по определенному поисковому ключу. Если эту колоду следовало подвергнуть дальнейшей сортировке по другому критерию, его необходимо было вручную ввести в машину и прогнать колоду через машину еще раз. Табуляторные были конками коммерческой обработки данных, а табуляторы - лошадьми.
В принципе даже самые первые появившиеся в продаже электронные вычислительные машины (UNIVAC I), обеспечили возможность применения совершенно новых и гораздо более эффективных методов обработки данных, так же как уже самые первые паровые машины можно было устанавливать на платформы, а платформы - на рельсы. Действительно, во время второй мировой войны и сразу после ее окончания искусство исследования операций и системного анализа, на котором в конечном счете основывается квалифицированное использование вычислительных машин в деловой сфере, уже полностью развилось. И все же деловые круги использовали первые вычислительные машины просто для "автоматизации" своих табуляторных, т. е. для выполнения тех же, что и раньше, операций, только теперь уже автоматически и предположительно более эффективно. Решительный переход от использования вычислительной машины в коммерческой деятельности в качестве простой замены рабочих лошадок - табуляторов к их сегодняшнему статусу универсальной информационной машины начался в тот момент, когда мощь вычислительной машины была наложена на структуру, уже подготовленную исследованием операций и системным анализом.
Здесь необходимо добавить, что, несмотря на то, что железная дорога в Англии сыграла большую роль сама по себе, например обеспечила занятость многих рабочих, она также чрезвычайно увеличила значение многих других средств транспорта.
Подобным образом синергическая комбинация вычислительных машин и системного анализа сыграла решающую роль в развитии и росте индустрии вычислительных машин. Она вдохнула также новую жизнь и в сам системный анализ. На протяжении первого десятилетия серьезного вторжения вычислительной машины в деловую жизнь, когда менеджеры часто считали, что их дело нуждается в ЭВМ, даже если для этого не было достаточных оснований, они также часто подвергали соответствующие операции тщательному и обширному системному анализу для определения, что их новые вычислительные машины должны делать. Очень часто такие исследования вскрывали возможности радикального усовершенствования операций вообще без использования вычислительных машин. Не использовались машины также и в самих этих исследованиях. Иногда ЭВМ внедрялись, несмотря ни на что по соображениям моды или лрестижа.
Побочным результатом такого критического отношения явилось прочное утверждение системного анализа и в меньшей степени исследования операций в качестве методологии для принятия коммерческих решений. По мере того как престиж системного анализа увеличивался благодаря его успехам и одновременно росла мощь вычислительной машины, задачи, за решение которых брались специалисты в области системного анализа, становились все сложнее и вычислительные машины представлялись все более подходящим инструментом для того, чтобы справляться с феноменом сложности. Обычно считается, по крайней мере так кажется постороннему наблюдателю, что системный анализ был поглощен вычислительной машиной. Это ошибочная точка зрения, но весьма показательная. Системный анализ выжил и преуспел как самостоятельная дисциплина. Вычислительная машина снабдила его методы "мускулами". Она усилила их в такой степени, что они превратились в нечто качественно отличное от своих ранних "ручных" прототипов. Последние, естественно, в основном исчезли. Вычислительную же машину теперь нельзя отделять от современных методов системного анализа.
Взаимодействие вычислительной машины и системного анализа поучительно также и с другой точки зрения.
Важно очень ясно понимать, что усиление конкретного метода ("оснащение его мускулами") ничего не вносит в его обоснованность.
Существуют, например, программы ЭВМ, выполняющие с высокой точностью все вычисления, необходимые для составления гороскопа человека, время и место рождения которого известны. Так как вычислительная машина выполняет все рутинные операции над символами, их можно осуществить гораздо быстрее и более детально, чем это обычно делает астролог-человек. Подобное улучшение в методе составления гороскопов не имеет, однако, никакого отношения к обоснованности астрологических предсказаний. Если астрология бессмысленна, то машинизированная астрология тем более бессмысленна.
Далее, иногда некоторые простые методики не годятся для использования в тех областях, в которых они применяются, исключительно из-за их чрезвычайной простоты, а более сложные методики того же самого типа нам пригодны. Это не справедливо в случае астрологии, но может оказаться верным для, скажем, численного прогноза погоды. Здесь количество учитываемых данных и объем вычислений, которые необходимо выполнять, чтобы получить точный прогноз погоды, могут оказаться настолько велики, что ни одна, даже самая большая группа людей абсолютно не в состоянии справиться с этой задачей в какое-либо разумное время. Любое же упрощение, позволяющее свести вычислительную задачу до размеров, доступных человеческим силам, обесценило бы саму методику. В подобных случаях вычислительная машина может помочь в превращении нереальной методики в практичную.
Однако необходимо помнить, что обоснованность методики - это проблема, включающая как саму методику, так и объект ее приложения. Если требуется плохую идею превратить в хорошую, то необходимо установить и устранить источник ее слабости. Человеку, проваливающемуся в люк, вряд ли станет легче, если он сможет падать быстрее или эффективнее.
Может показаться странным, даже парадоксальным, что в результате усиления методики выявляются ее слабости и ограниченность.
Удивляться этому не следует. Возможности человеческого разума в отношении "неаккуратного" мышления и поиска различных оправданий, в частности, позволяющих отмахиваться от последствий неаккуратного мышления, поистине огромны. Если какая-то методика требует огромного количества вычислений, а потратить на нее можно лишь ограниченные вычислительные усилия, то несостоятельность такой методики легко оспаривается тем, что из-за вычислительных ограничений она никогда по-настоящему не проверялась. В результате подобных уловок сама методика иммунизируется против критического изучения. Действительно, методику можно укрепить, так как убежденность в том, что в других отношениях безупречная и, вероятно, чрезвычайно мощная методика связана одним-единственным ограничением, побуждает ее ревнителя направлять свои силы на устранение этого ограничения. Если это ограничение имеет исключительно вычислительный характер и для его устранения предлагается использовать вычислительную машину, он просто может запустить программу интенсивного продолжительного "исследования", цель которого - "машинизация" его методики. Подобные программы обычно порождают задачи сугубо вычислительного характера, которые из-за своего объема обычно все в большей степени доминируют в исходной задаче, и, если не проявляется самая тщательная забота о том, чтобы избежать этого, они в конечном счете становятся центром внимания. Чем больше усилий затрачивается на эти первоначально вспомогательные задачи и чем больше их решается, тем тверже становится иллюзия, будто над основной проблемой ведется серьезная работа. Скудость методики, если она действительно не позволяет работать с ней в ее предполагаемой области приложения, скрывается, таким образом, за горой усилий, большая часть которых может сама по себе оказаться вполне успешной. Эти успехи, однако, относятся к искусственной ситуации, не имеющей даже связи с ситуацией, определенной той задачей, к которой исходная методика должна применяться.
Набор задач вместе с соответствующими знаниями, жаргоном и частными методиками, выкристаллизовавшимися вокруг них, материализуется. Чем больше эта совокупность и чем больше человеческой энергии вложено в ее создание, тем более реальной она кажется. А чем труднее было решать подзадачи и чем больше технических достижений принесло их решение, тем значительнее считается исходная методика.
Мы обсудили роль, которую орудия труда играют в воспроизведении человеком мира в своем воображении и в оттачивании им своих методик. Орудия труда, однако, играют также и другую связанную с первой роль: они составляют род языка для использующего их общества, языка социального действия, Ниже мы поговорим об. этом подробнее. Здесь ограничимся несколько неполной характеристикой языка. Он состоит из словаря (слов языка) и набора правил, определяющих, каким образом отдельные единицы словаря могут соединяться, чтобы формировались осмысленные предложения. Мы не будем касаться бесчисленных тайн, окутывающих понятие значения. Ограничимся самым узким пониманием значения, т. е. действием, которое некоторое "предложение" в языке орудий труда начинает и доводит до конца.
Обычный язык частично черпает свою выразительную силу в том, что каждое его слово имеет ограниченную область значения. Невозможно сказать что-либо на языке, состоящем, например, исключительно из местоимений. Орудие труда также черпает свою силу в том, что позволяет выполнять (вполне определенные, а не какие-либо иные действия. Молоток, например, должен быть жестким, поэтому его нельзя использовать в качестве веревки. Не могут существовать универсальные орудия труда, как не может быть универсальных слов. Мы знаем, что использование слов, имеющих определенное значение, во всех случаях жизни (например, "like" и "y'know" [Прим. перев.: Слово "like" в английском языке употребляется в различных значениях: а) в качестве предлога - "как", "наподобие", "вроде"; б) в качестве прилагательного - "схожий", "подобный"; в) в качестве причастия - "соответствующий"; г) как глагол - "нравиться", "получать удовольствие".
Автор имеет в виду, очевидно, широкое использование слова "like" в смысле, примерно соответствующем русскому "вроде"; это явление часто проявляется в использовании "like" в качестве суффикса для образования прилагательного из существительного (типа machinelike - машиноподобный). Существует и сленговое употребление "like" в конце фразы для придания предложению неопределенности. Что касается выражения "y'know" (сокращение от "you know") - "вы знаете", то здесь речь идет о засорении устной речи словами-паразитами типа "видите ли", "понимаете ли", "знаете ли"]) скорее обедняет, а не обогащает современный американский английский язык [Прим. перев.: В современном английском языке различают "американский" и "английский" варианты со своими традицией и практикой употребления отдельных слов и выражений, написанием и произношением. Существуют словари "американского английского языка" и "английского языка"]
Возможно, придумывать истинно новые орудия труда так же трудно, как и новые слова. Тем не менее в XX в. изобретено значительное число орудий труда, которые действительно расширили область деятельности общества. Автомобиль и автострада, радио и телевидение, современные медикаменты я методы хирургического вмешательства - это мгновенно приходит в голову. Эти достижения позволили людям осуществлять такие виды деятельности, которые прежде не были возможны. Гораздо реже говорится о том, что созданные обществом новые способы действий часто исключают вообще возможность использования старых способов.
То же самое происходит в обыденном языке. Например, когда слово "inoperative" - [не имеющий законной силы, недействительный, не действующий, неэффективный] - используется на высшем правительственном уровне как эвфемизм слова "lie" [ложь, обман], его нельзя больше употреблять в первоначальном значении. Такие термины, как "free" [свободный] (в сочетании "free world"-[свободный мир], "final solution" [окончательное решение], "defense" [оборона] и "aggression" [агрессия], были в такой степени девальвированы злонамеренно искаженным употреблением, что стали совершенно бесполезными в обыденной речи.
Аналогично автострада дала людям возможность перемещаться между географическими пунктами, которые она соединяет, но из-за побочных эффектов, синергестически порожденных ею самой и другими факторами, она запирает несчастных людей в городах так же, как если бы города были обнесены стенами. Иногда говорят, что средства массовой коммуникации превратили Землю в глобальную деревню и позволили проводить общегосударственные и даже всемирные "сходы". Но в отличие от традиционных городских собраний жителей Новой Англии, которые были (и остаются такими в моем родном городе) практикой политики участия граждан в управлении городом, средства массовой коммуникации по существу не обеспечивают гражданам возможности возразить. Как автострады и автомобили, они позволяют обществу освоить совершенно новые формы социального действия, но в то же время навсегда разрушили ранее доступные виды социального поведения.
Вычислительная машина представляет собой в некотором смысле орудие труда такого же типа. Она помогла ворваться в далекий космос и спасла некоторые социальные институты, находившиеся под угрозой краха в связи со стремительным ростом населения. Но при ее воздействии были закрыты некоторые существовавшие пути... безвозвратно или нет, мы не можем ответить определенно. Существует миф, что вычислительные машины принимают сейчас такие важные решения, которые раньше выносились людьми. Возможно, отдельные подобные примеры и встречаются кое-где в нашем обществе. Но совершенно неверно широко распространенное представление о менеджерах, задающих на входах своих вычислительных машин вопросы типа "Что нам теперь делать?" и затем ожидающих от своих вычислительных машин решения. На самом деле люди переложили обработку информации, на основе которой должны основываться решения, на чрезвычайно сложные вычислительные системы. Они оставили за собой (за редким исключением) право принимать решения, основываясь на результатах этих вычислительных процессов. Люди, таким образом, могут сохранять иллюзию (и часто дело обстоит именно так), что именно они, в конце концов, принимают решения.Но, как мы будем доказывать ниже, вычислительная система, допускающая постановку вопросов только определенного типа, работающая только с определенным типом "данных" и недоступная, даже в принципе, пониманию тех, кто полагается на нее, полностью исключает многие возможности, которые существовали до ее внедрения.
Чтобы понять, каким образом вычислительная машина достигла такого могущества как действующее лицо и как сила, воздействующая на человеческое воображение, мы должны сначала выяснить, откуда проистекает ее мощь и каким образом вычислительная машина делает то, что она делает. Именно этому посвящены две следующие главы.
Откуда возникает мощь вычислительной машины
[прим.авт.: Главы 2 и 3 имеют технический характер. Читатель, чувствующий себя неуверенно, встречаясь с техническим материалом, может либо бегло просмотреть эти главы, либо отложить знакомство с ними до тех пор, пока он не прочтет остальную часть книги.]
Если бы мы увидели нечто чрезвычайно странное, скажем, облако с отчетливо правильными очертаниями, то нам бы захотелось выяснить, что это такое. И если бы нам сказали, что это некая "фуба", то мы бы спросили, что такое "фуба". Существуют, однако, повсюду вокруг нас вещи, которые являются столь неотъемлемой частью нашей жизни, что они не кажутся странными и мы не спрашиваем, что это такое. Так обстоит дело с машинами. Слово "машина" ассоциируется со сложным и в то же время в какой-то степени регулярным движением. Возвратно-поступательное движение иглы швейной машины так похоже на энергичную работу вращающихся толкающих шатунов, приводящих в движение колеса локомотива, и в то же время на тремор пульсирующего спускового механизма самых изящных часов, что подобные образы в достаточной степени дают представление о "машине". В достаточной для того, чтобы у нас больше не было необходимости спрашивать, что такое машина. Итак, машина - это регулярность, сложность, движение, мощь. Однако существует нечто кроме этого, и мы это знаем.
Мы включаем листоштамповочный пресс, и он кромсает руку рабочего, оказавшегося слишком близко. Именно регулярность машины является ее наиболее грозным свойством. Мы даем ей задание, и она, можно быть уверенным, выполняет его правильно, но слепо. Фраза "правосудие слепо" подразумевает, что оно действует почти (как машина, выполняющая свои функции, не обращая внимания на факты, не относящиеся к делу, но представляющие собой тем не менее факты. Для слепого правосудия не имеет значения, богат подсудимый или беден, мужчина он или женщина. Листоштамповочному прессу безразлично, какой материал в его зажимном устройстве - кусок металла или рука рабочего.
Подобно любой машине слепое правосудие и листоштамповочный пресс выполняют только то, для чего они предназначены, и выполняют они это точно.
Правильно работающие машины - не просто послушны закону - они олицетворение закона. Говорить, что определенная машина "работает правильно", значит утверждать, что она представляет собой воплощение некоторого закона, который мы знаем и хотим применить. Мы полагаем, например, что обычная настольная счетная машина служит олицетворением всем известных законов арифметики. Даже если она выдает неверные результаты, наша уверенность в "законности" машины столь сильна, что обычно мы предполагаем ошибку при перфорации данных. Лишь в случае повторных неправильных результатов мы решаем, что "с машиной что-то не так". Мы никогда не допускаем, что арифметические законы отменяются ии изменяются. В равной степени мы никогда не допускаем, что поведение машины своенравно, т. е. не послушно закону. Наоборот, чтобы восстановить ее правильное функционирование, мы пытаемся понять, почему машина ведет себя именно так, как она это делает сейчас, т. е. олицетворением какого именно закона в данном случае она является. Мы бываем удовлетворены, обнаружив, скажем, сломанную шестерню, вызвавшую аномальное поведение машины, и устанавливаем таким образом соответствующий закон машины. Теперь мы понимаем машину, с которой имеем дело, и, следовательно, в состоянии восстановить ее, т. е. преобразовать в ту машину, с которой мы имели дело с самого начала, - олицетворение обычных законов арифметики. В самом деле, часто мы очень огорчаемся, когда получаем машину из ремонта со словами: "Я не знаю, что с ней было. Я просто встряхнул ее и теперь она прекрасно работает". Это признание того, что не понят закон, определяющий поведение сломанной машины, и мы приходим к выводу, что теперь никто не в состоянии выяснить закон, определяющий поведение "отремонтированной" машины. Если мы пользуемся этой машиной, то становимся исполнителями какого-то закона, знать который нам не дано, т.
Одной из его деталей является штанга толкателя - стержень из нелегированной стали, нижняя часть которого насажена на распределительный вал, а верхняя может поднимать выпускной клапан соответствующего цилиндра. Когда в двигателе поворачивается коленчатый вал, то поворачивается также и распределительный вал с кулачками, сочлененными со штангами толкателя. В результате штанга толкателя движется вверх-вниз и точно в необходимый момент открывает и закрывает выпускной клапан цилиндра. В простейших бензиновых двигателях штанга толкателя обеспечивает и энергию, необходимую для перемещения клапана, и соответствующую синхронизацию. В более сложных двигателях, однако, она действует исключительно как устройство, подающее сигнал какому-нибудь другому механизму, уже непосредственно оперирующему клапаном. Можно допустить, что вместо него используется провод, присоединенный одним концом к устройству, определяющему момент, когда газы должны быть вытеснены из цилиндра, и другим - к электродвигателю, сообщающему соответствующее движение клапану. Многие современные автомобильные двигатели оснащены электронными системами впрыскивания горючего, действие которых очень похоже на описанное.
Существует определенный предел числа механических связей в автомобильном двигателе, допускающих замену устройствами передачи информации. В конце концов, двигатель должен передавать механическую энергию на колеса автомобиля. Это условие налагает на конструктора двигателя жесткие ограничения. Инженер вполне может предложить такую внутренне непротиворечивую совокупность законов, другими словами, конструкцию для двигателя, которую тем не менее реализовать было бы невозможно. Такая конструкция могла бы потребовать механической обработки металлов с допусками, например, которые просто нельзя обеспечить современными методами. Могло бы быть и так, что прочности материалов, необходимые для таких двигателей, нельзя было бы получить с помощью современных технологий. Много важнее, однако, что предложенная конструкция может оказаться принципиально нереализуемой из-за нарушений законов физики.
Именно по этой причине терпят неудачу все попытки создавать вечные двигатели. Законы, олицетворяемые некоторой машиной, действующей в реальном мире, должны в силу необходимости являться некоторым подмножеством законов, которым этот мир подчиняется.
Несомненно, абсурдно говорить о реализованной машине, т. е. машине, получившей материальное воплощение, которая не вступала бы во взаимодействие с реальным миром. Если бы она существовала, нам не дано было бы узнать об этом, поскольку для того, чтобы представить свидетельство своего существования, она должна была бы воздействовать на наши чувства, т. е. вступить в контакт с реальным миром. Во всяком случае, подобную машину нельзя было бы использовать, так как разве не понимаем мы "использование" как взаимодействие с внешним миром?
Существуют, однако, обстоятельства, при которых имеет смысл говорить о таких аспектах реальных машин, которые не связаны с их материальными воплощениями. Иногда приходится, например, обсуждать, что некоторая машина либо какая-то часть какой-либо машины должна делать совершенно независимо от того, каким образом или из каких материалов можно было бы создать механизм, реально выполняющий требуемые действия. Например, какой-то элемент бензинового двигателя должен определять, когда следует открывать и закрывать выпускной клапан цилиндра. Эту функцию может выполнять жесткая штанга толкателя или, как я отмечал, провод, соединенный соответствующим образом с датчиком и электродвигателем. Правило, на основе которого подобное устройство должно работать, закон, олицетворением которого оно должно являться, представляет собой некий отвлеченный принцип. Он не зависит от материала и физической реализации, короче говоря, ни от чего, за исключением мысли и здравого смысла. На основе такого правила или, как любят говорить инженеры, "функциональной спецификации" можно получить любое число конструкций, например, одна из них может быть механической, а другая - электрической "штангой толкателя".
Конструкция некоторой машины - это снова некая абстракция. Хорошую конструкцию, скажем, швейной машины можно передать нескольким изготовителям, каждый из которых будет выпускать швейные машины, совершенно не отличимые друг от друга. В таком случае подобная хорошая конструкция в каком-то смысле есть некоторая абстрактная швейная машина. Это машина, которая может производиться, - минус, так сказать, физические компоненты, комплектующее оборудование реальной швейной машины. Конструкция не зависит также и от носителя, на котором она может быть зафиксирована. Синьки чертежей машины не есть ее конструкция. В противном случае конструкция менялась бы при увеличении масштаба чертежа или при выполнении ело в другом цвете. Конструкция - это некоторая абстрактная идея так же, как и функциональная спецификация. Идеи же (скажем, идея машины, совершающей вечное движение) не связаны законами физики [Прим. ред.: По-видимому, трудно назвать идеей мысль, высказывание, предложение, противоречащее законам физики].
Писатели-фантасты беспрестанно выступают, в сущности, с функциональными спецификациями машин, которые могут оказаться физически нереализуемыми, так как нарушают незыблемые физические принципы. Одна из идей, которая появляется снова и снова, - это мгновенная связь через безбрежные пространства. Из физики же известно, что любое послание в какой бы то ни было форме не может быть передано из одного места в другое со скоростью, превышающей скорость света. Поскольку скорость света конечна (она равна приблизительно 300000 км/с), невозможна мгновенная связь даже на небольших расстояниях, по крайней мере с точки зрения современной физики. Бесполезны ли подобные идеи, предлагаемые научными фантастами? Нет. Потому что, хотя тела наши должны функционировать в мире, подчиняющемся естественным законам, наш разум может от него отрешаться. Мы можем перенести игру нашего воображения в мир, устроенный таким образом, что конечность скорости света, например, вообще не являлась бы ограничением для скорости связи.
Это означает не более того, что мы можем участвовать в играх, правила которых создаем сами. Мы можем определять степень соответствия (если оно вообще имеется) правил наших игр любым законам, которым, как мы считаем, подчиняется реальный мир. Игра "Монополия" [Прим. перев.: "Монополия" - настольная игра (типа нашей "вверх - вниз"), очень популярная в западных странах. В ней в условной форме воспроизводятся законы капиталистической экономики: в процессе игры можно продавать и покупать акции, приобретать и терять недвижимость, становиться миллионером и разоряться и так далее. Выигрывает тот, кому в процессе игры удается накопить наибольший "капитал" - фишки, в начале игры равномерно распределенные между ее участниками] могла бы существовать даже в тех мирах, если бы таковые существовали, где алчность не является реальностью.
Критическим свойством системы правил любой игры является полнота и логическая непротиворечивость. Они должны быть полными в том смысле, что для любого предложения о действии в процессе игры они позволяют определить, является оно допустимым или нет. Они должны быть логически непротиворечивы в том смысле, что не существует такого подмножества правил, которое определит допустимость некоторого действия, и одновременно некоторого другого подмножества, определяющего то же самое действие как недопустимое [прим.авт.: Существует множество игр, для которых не были доказаны либо логическая непротиворечивость, либо полнота правил в указанном здесь смысле. Когда в процессе подобных игр в связи с противоречивостью и неполнотой правил возникают затруднения, они обычно разрешаются усовершенствованием действующих правил. По прошествии некоторого времени усовершенствованная указанным образом совокупность правил рассматривается уже как "классическая". (Это наблюдение я позаимствовал у Оливера Селфриджа)]. Совершенно абстрактной игрой является такая, правила которой предусматривают отсутствие контакта с реальным миром, т.
е. игра, реализовать которую можно с помощью одного лишь разума. Шахматы, в которые играют на турнирах, не относятся к та.кой категории игр, поскольку их правила ограничивают время, которое шахматист может затратить на обдумывание своих ходов. Этот временный элемент определяет контакт шахмат с реальным миром и тем самым нарушает чистоту их абстрактности. Если же не учитывать это условие, то шахматы - абсолютно абстрактная игра [Прим. ред.: Это утверждение автора более чем спорно. Фактор времени всегда присущ игре в шахматы и в очных и в заочных соревнованиях. Кроме того, в шахматы играют люди (или машины), знания которых (или степень совершенства шахматных программ) практически полностью определяются реальным миром].
Другой путь сформулировать условие, предусматривающее полноту и логическую непротиворечивость правил игры в указанном смысле, - это потребовать, чтобы любые два арбитра, столкнувшись с одной и той же игровой ситуацией, не смогли не прийти к согласованному суждению. На самом деле "суждение" - неудачный термин, поскольку их решение будет получено в результате использования одной лишь логики. Это, по существу, не что иное, как детерминированный расчет, логический процесс с единственным возможным результатом.
Существует только одна разновидность вопросов, которые имеет смысл ставить арбитру чисто абстрактной игры. Участник игры может описать игровую ситуацию, скажем, расположение фигур на шахматной доске до осуществления рассматриваемого действия и после того, как оно реализовано. Его вопрос должен состоять в том, возможно или невозможно перейти из исходного расположения во второе за один "ход". Участник игры мог бы, например, сказать: "Я объявил шах, а он сделал рокировку. Имеет ли он право так играть?" Или: "Я пошел в пики, а он побил мою карту червами, хотя у него были пики на руках. Имеет ли он право так играть?" Допустимость только подобных вопросов объясняется тем, что правила абстрактной игры определяют лишь, какие игровые ситуации могут быть получены из некоторых других игровых ситуаций за одну "игру" или ход и в некоторых случаях, что представляет собой конфигурация, соответствующая выигрышу.
Это можно выразить на несколько более техническом языке, если называть игровую конфигурацию состоянием игры или просто состоянием и достижение некоторого состояния из некоторого другого состояния - переходом состояний. Пользуясь этой терминологией, правила абстрактной игры можно охарактеризовать как правила перехода состояний.
Bce интересные игры обладают допустимыми правилами перехода состояний. Эти правила позволяют игроку выбрать один из порой значительного числа ходов, когда наступает его очередь играть, за исключением, естественно, сравнительно редких ситуаций форсированного хода. В противном случае игра как таковая стала бы бессмысленной; весь ее ход и, следовательно, исход были бы предопределены даже еще до начала игры. Тем не менее может оказаться, что результат хотя и предопределен, но неизвестен участнику игры, и он хочет выяснить, каков он.
У человека может возникнуть желание узнать, сколько времени будет через 22 часа после 9 часов утра. Чтобы выяснить это, придется обратиться к упрощенному варианту математической игры, известной как "арифметика модулей". Один из способов введения основного правила этой игры сводится к утверждению, что "х по модулю z" представляет собой остаток деления х на z. В нашем случае игрок хотел бы знать, что будут показывать часы через 22 часа после 9, т. е. в 31 час. Его задача заключается в вычислении 31 по модулю 12. (Ответ-7 ч). Давайте, однако, действительно сделаем из этого игру. Расположим друг за другом 12 пустых пепельниц (рис. 2.1). Пусть у нас имеется также множество камешков. Начинает игрок с того, что складывает в кучку столько камешков, "сколько сейчас времени", т. е. в нашем случае 9. Затем он добавляет в эту кучку число камешков, соответствующее "числу часов, прошедших с данного момента", которое он имеет в виду, т. е. в нашем случае 22. Затем он вынимает один камешек из только что сложенной кучки и кладет его в первую пепельницу. Далее, вынув из кучки еще один камешек, он кладет его в следующую пепельницу и так далее вплоть до момента, когда он исчерпает всю кучку либо положит камешек в последнюю пепельницу.
Если в последнем случае в его кучке еще остаются камешки, то он повторяет всю описанную процедуру. В конечном счете исходная кучка будет исчерпана. В этой ситуации следует обратиться к последнему правилу: если какие-то пепельницы пусты, то ответ равен числу непустых пепельниц; если все пепельницы пусты, ответ 12 часов;
если же во всех пепельницах лежит по крайней мере по одному камешку, то игрок вынимает из каждой пепельницы по одному камешку, после чего снова обращается к последнему правилу.
Естественно, все это - просто многословное описание игры, состоящей в сложении двух чисел и последующем делении их суммы на 12 посредством последовательного вычитания. Правила этой игры не являются допустимыми; они не дают игроку возможности выбрать из ряда альтернатив переход из одного состояния игры в следующее. Они как раз, наоборот, точно предписывают, что должен сделать игрок для реализации перехода. Подобный набор правил, т. е. набор правил, точно указывающих игроку, каким образом следует вести себя при переходе из некоторой ситуации в следующую, называется эффективной процедурой.
Понятие эффективной процедуры, или "алгоритма", как ее также называют, в современной математике одно из важнейших. Дело не только в том, что значительная часть математики занимается отысканием эффективных процедур, обеспечивающих получение разнообразных полезных результатов, скажем, деления с выписыванием всех промежуточных шагов; существуют глубокие математические проблемы, связанные с фундаментальной природой самой математики, которые можно ставить и разрешать, сформулировав их как задачи, относящиеся к эффективным процедурам.
Рис. 2.1. Игра с пепельницами для определения времени.
Приведенное определение эффективной процедуры обманчиво просто. Обман заключен в словах "указывает игроку". Игрок, приступающий к решению задачи определения времени на основе только что сформулированных правил, должен сначала эти правила понять. Он должен знать, что значит сложить камешки в кучку, что такое пепельница, как определить, что пепельница пустая (допустим, что в ней лежат не камешки, а пепел) и т.
д. Другими словами, он должен быть в состоянии не только читать правила, но и интерпретировать их именно таким образом, который имел в виду я. И если правила должны "точно" указывать игроку, каким образом ему следует вести себя, то их следует формулировать на языке, позволяющем формировать точные высказывания.
Являются ли, например, эффективными процедурами рецепты поваренной книги? Они совершенно определенно предназначены для того, чтобы указывать человеку, что ему делать во время готовки в каждый следующий момент. Часто, однако, или даже как правило, они испещрены замечаниями типа "добавьте щепотку красного перца", "размешайте до нужного состояния" и "заправьте по вкусу". Разве не все согласятся с тем, что подобные указания далеки от точных? Тем не менее можно представить себе кулинарную академию, наделяющую своих студентов столь высоким кулинарным искусством и вкусом, что даже подобные указания, нечеткие для обычного человека, для них будут точными и однозначными. В таком случае подобные рецепты этой школы служат эффективными процедурами для ее выпускников. Но не обязательно для кого-нибудь еще.
Мое определение эффективной процедуры как некоторого набора правил, точно указывающих игроку, каким образом ему вести себя в каждый очередной момент, оказывается, таким образом, несовершенным по крайней мере в том отношении, что одного этого набора в чистом виде недостаточно. Зная набор правил, указывающих, скажем, как испечь пирог, мы не располагаем какими-либо абсолютными критериями, позволяющими установить, эффективна или нет эта процедура. Это затруднение снимается по крайней мере для кулинарных рецептов, если выполнены два условия: 1) существует некоторый язык, на котором можно сформулировать точные и однозначные правила приготовления пищи; 2) все люди абсолютно одинаковы во всем, что имеет хоть какое-либо отношение к кулинарии. Эти условия не независимы друг от друга, поскольку один из способов для всякого человека стать подобным кому бы то ни было еще заключается в том, что все будут идентично интерпретировать язык кулинарии.
С помощью этой системы кодирования можно транслитерировать [Прим. перев.: Транслитерация - передача текста, написанного с помощью одной алфавитной системы, средствами другой алфавитной системы] правила, заданные табл. 2.1, в правила, заданные табл. 2.3.
Каждое правило записывается на отдельной строке, а столбцы разделяются пустыми промежутками. Ничего не изменится, если исключить пустые промежутки и соединить строчки в одну длинную строку, состоящую из иксов, единиц и нулей. Эта строка будет представлять собой полное описание нашей суммирующей машины!
Мы сформировали систему записи, позволяющую описывать некоторую машину. Ее алфавит состоит из трех элементов: "X", "0" и "1". Строки, записанные с помощью этой нотации, естественно, не будут иметь смысла, пока мы не укажем, каким образом их следует
X1X | X0X | Х111Х | X1X | X1X |
X1X | XXX | X11X | X0X | X1X |
X1X | X1X | X1X | X1X | X1X |
X11X | X0X | X11X | X0X | X1X |
X11X | XXX | X111Х | X0X | X1X |
X11X | X1X | X11111X | X0X | X0X |
X111X | X0X | Х111Х | X0X | X1X |
X111X | XXX | X1111X | X0X | X0X |
X111X | X1X | Х11111Х | X0X | X0X |
X1111X | X0X | Х1111Х | X0X | X0X |
X1111X | XXX | X1X | XXX | X0X |
X1111X | X1X | X111111X | X1X | X1X |
X11111X | X0X | Х11111Х | X0X | X0X |
X11111X | XXX | X1X | XXX | X0X |
X11111X | X1X | X1X | X1X | X1X |
X111111X | X0X | XX | X0X | X0X |
X111111X | XXX | XX | XXX | X0X |
X111111X | X1X | Х111Х | X1X | X1X |
интерпретировать. Для этого было бы достаточно описать машину (или, еще лучше, построить ее), входами которой служили бы два информационных потока: один, содержащий должным образом закодированное описание нашей суммирующей машины, а другой - исходную конфигурацию иксов, нулей и единиц, с которой заданная указанным описанием суммирующая машина должна оперировать. Эти две так называемые цепочки символов, естественно, можно разместить на одной ленте. Когда мы будем иметь подобную машину, у нас появится право называть нашу систему нотации языком, поскольку имеется некоторая реализация его правил трансформации.
Одним из грандиознейших триумфов человеческого разума является доказательство в 1936 г. английским математиком Аланом М. Тьюрингом возможности построения подобной машины и, более того, указание способа ее построения1. На самом деле он доказал много больше, но об этом мы скажем позже. Я не имею возможности подробно описать машину, построенную в соответствии с принципами, сформулированными Тьюрингом, поэтому скажу о ней кратко.
Представим себе магнитофон типа использованного нами в суммирующей машине. В данном случае он также снабжен набором реле, позволяющих представлять состояния. Из-за того, что данная машина много сложнее нашей суммирующей машины, необходимо представлять много больше состояний и, следовательно, требуется больше реле (но это уже подробности). Лента, которая придается нашей новой машине, имеет следующую организацию (читаем справа налево):
участок, содержащий описание нашей суммирующей машины в предложенной системе нотации;
участок, содержащий данные, с которыми должна работать суммирующая машина, например, "X11X0X111Х";
участок для хранения текущего состояния суммирующей машины; участок (произвольной длины) "чистой" ленты, т. е. содержащий нули.
Информация, содержащаяся на ленте, имеет следующую структуру:
чистая лента | текущее состояние | текущий символ | данные | описание машины |
Для того чтобы увидеть, как эта машина работает, необходимо задать какое-нибудь описание суммирующей машины, соответствующий набор данных и несколько условий. Например, начальным состоянием суммирующей машины всегда является 1; X, занимающий крайнее правое положение в наборе ее данных, представляет собой маркер, указывающий начало расположенных слева данных. Кроме того, требуется бумага для оперативных записей. Это все, чем располагает машина. Она перемещает ленту вперед и назад, считывает данные, делает отметки на своей ленте оперативной памяти и просматривает участок ленты, содержащий описание машины, отыскивая информацию, указывающую, что делать дальше.
Таким образом, в очень медленном темпе, шаг за шагом, и чрезвычайно точно имитируется работа нашей исходной суммирующей машины, т. е. машины, заданной новой машине через описание на ленте последней. Следовательно, машина олицетворяет правила, указывающие, каким образом интерпретируются цепочки иксов, единиц и нулей, предлагаемые ей нами.
Машину, которая перемещает ленту вперед и назад, считывая или изменяя метки на каждом такте в одной ячейке ленты и переходя из одного состояния в другое и так далее, теперь называют машиной Тьюринга. Описание такой машины является полным при условии, что для каждого ее допустимого состояния и для каждого символа, который может оказаться под ее считывающей головкой, это описание указывает, какой символ следует записать, в какое состояние должен произойти переход и в каком направлении машина должна передвинуть ленту. Можно в качестве особого условия оговорить, что всякая машина такого типа начинает свою работу из первого состояния (назовем его состоянием 1), причем лента расположена таким образом, что крайний правый записанный на ней символ располагается под головкой считывания (записи). Мы пользовались здесь языком, алфавит которого насчитывает три символа, с помощью их мы описывали нашу суммирующую машину. Если бы мы были щедрее, т. е. воспользовались алфавитом большего объема, наша машина могла бы быть проще - она имела бы меньше состояний. Правила же оказались бы более сложными. Существует, таким образом, множество возможных реализаций нашей суммирующей машины - по меньшей мере, по одной на каждый существенно новый алфавит, который мы могли бы выбрать. Минимальный объем алфавита, который можно использовать, равен двум - суммирующая машина типа нашей должна иметь большое число состояний, чтобы работать со столь ограниченным алфавитом. Минимальное число состояний, которое подобная суммирующая машина должна была бы иметь, равно двум, но такая машина должна оперировать большим алфавитом.
Существует важное различие между двумя рассматриваемыми машинами.
Наша суммирующая машина - специализированная, она может сложить два любых числа, но больше она ничего не может делать. Второй машине в качестве входной информации требуется закодированное описание некоторой машины и некоторое множество данных, с которым описанная указанным образом машина должна работать. В сущности, описание машины, задаваемое второй машине, представляет собой некоторую программу, преобразующую последнюю в ту машину, которую она должна имитировать. Естественно, возникает вопрос: "Какого рода машины можно имитировать подобным способом?"
Я показал, что понимается под формальным языком: некоторый алфавит; некоторое множество правил построения, определяющее длину построенных с помощью этого алфавита цепочек символов, которые являются правильными выражениями в данном языке; некоторое множество правил трансформации таких выражений. Я отмечал также возможность создания машин, являющихся реализацией таких правил трансформации и способных, следовательно, выполнять процедуры, представленные на соответствующих языках. Кроме того, мы рассмотрели некоторую машину, воспринимающую описания других машин и способную имитировать их поведение. Таким образом, мы усилили идею того, что понимается под имитацией В данном контексте. Обратите внимание, что я ни в какой связи не говорил о переводе с одного языка на другой. Наша имитирующая машина не начинает свою работу с перевода задаваемых нами правил трансформации, т. е. закодированного описания нашей суммирующей машины, на свой собственный или какой-то другой язык. Она обращается за консультацией (мы пользуемся словом "интерпретирует") к этому набору правил трансформации каждый раз, когда ей приходится определять, что должна делать имитируемая машина. Таким образом, на каждый шаг имитируемой машины должно приходиться множество шагов (машины) имитирующей.
Сейчас наша цель - создание надежной основы для нашего понятия эффективной процедуры. Мы стремимся к некоторому единственному языку, на котором можно выражать эффективные процедуры по крайней мере в том смысле, что с его помощью можно описывать все наши процедурные языки и снабжать, таким образом, процедуры однозначными интерпретациями.
Теперь можно убедиться в том, что правила трансформации языков можно реализовывать в виде машин. Следовательно, наша задача сводится к обоснованию возможности выбора единственного алфавита и языка, построенного на его основе, с помощью которого мы действительно сможем описывать все языки, привлекаемые нами для записи процедур.
Можно создать язык с алфавитом, состоящим всего лишь из двух символов ("0" и "1"), с помощью которого возможно описать любую машину Тьюринга. Теперь нам известно, что язык включает не только алфавит, подобно тому, как игра не исчерпывается теми принадлежностями, которые используются при ее реализации. Должны быть заданы также правила трансформации. В данном контексте я предполагаю, что правила трансформации языка, о котором идет речь, должны быть реализованы в виде некоторой машины Тьюринга, аналогичной рассмотренной нами имитирующей машине. Я утверждаю, следовательно, что существует некоторая машина Тьюринга, оперирующая с некоторой лентой, содержащей только единицы и нули, способная имитировать любую другую машину Тьюринга, какой бы она ни была. Эту так называемую универсальную машину, Тьюринга, как и вообще все машины Тьюринга, можно описать на языке множества пятерок уже знакомого нам вида: текущее состояние, считываемый символ, следующее состояние, записываемый символ, направление перемещения ленты. Эти пятерки, в свою очередь, можно записать на языке, который указанная машина Тьюринга по определению допускает. Следовательно, универсальная машина Тьюринга способна воспринимать некоторое свое описание и имитировать себя.
В действительности на основе одного и того же двухсимвольного алфавита можно построить много языков, т. е. много универсальных машин Тьюринга, реализующих правила трансформации цепочек, составленных из этих двух символов. Можно, естественно, и расширить этот алфавит и построить много универсальных машин Тьюринга, соответствующих каждому из таких расширений. Однако сейчас нас интересует собственно принцип, а именно: существует некоторая машина Тьюринга U (на самом деле, некоторый класс машин), обладающая состоящим из двух символов "0" и "1" алфавитом, которая при задании произвольной процедуры, записанной на произвольно точном и однозначном языке, и некоторой машины Тьюринга L, реализующей правила трансформации этого языка, может имитировать процесс исполнения этой процедуры машиной Тьюринга L.
Здесь мы перефразировали один из поистине замечательных результатов, опубликованных Тьюрингом в его блестящей работе 1936 г.
В математике имеется множество доказательств существования. Однако есть колоссальная разница между способностью доказать, что нечто существует, и способностью построить это нечто. Тьюринг доказал, что его универсальная машина существует, показав, каким образом она строится. Следует иметь в виду, что он создал эту монументальную работу в 1936 г. - примерно за десять лет до того, как были построены первые современные вычислительные машины. Они имеют мало общего с описанной машиной Тьюринга. Многие из них могут, например, оперировать одновременно целым рядом магнитных лент, и, что более существенно, большинство их имеют очень большую память. С функциональной точки зрения механизм памяти современной ЭВМ аналогичен набору реле, каждое из которых может быть либо включено (замкнуто), либо выключено (разомкнуто). Множество, состоящее из десяти таких реле, может принимать 1024 различных состояния. Нередко современные вычислительные машины среднего размера имеют более миллиона таких элементарных компонентов памяти и могут, следовательно, принимать 21000000 состояний. Это невообразимо большое число (Земля, например, весит меньше 21000 фунтов [Прим. перев.: фунт - английская мера массы (веса), 1 фунт эквивалентен 453,592 г.]). И все же, в принципе, любая современная вычислительная машина - это машина Тьюринга. Более того, любая современная вычислительная машина, за исключением очень небольшого числа специализированных машин, - это универсальная машина Тьюринга. И практически это означает, что любая современная вычислительная машина может, по крайней мере принципиально, имитировать любую другую современную вычислительную машину.
Имеется еще один пробел, который нам предстоит заполнить. Если даже допустить, что любая вычислительная машина в сущности может делать то же, что и любая другая вычислительная машина, то остается еще вопрос о том, что вообще могут делать вычислительные машины, т.
е. для осуществления каких процедур можно реализовать машины Тьюринга, и, следовательно, машины Тьюринга, поддающиеся имитации на универсальных машинах Тьюринга и, значит, поддающиеся имитации на современных вычислительных машинах. Тьюринг дал ответ и на этот вопрос: можно построить машину Тьюринга для реализации любого процесса, который было бы естественно назвать эффективной процедурой.
Этот тезис, называемый часто тезисом Черча (по имени логика Алонзо Черча), сформулировавшего его в ином, чем Тьюринг, контексте, не может быть доказан, поскольку содержит слово "естественно". Здесь у нас возникает в некотором смысле круг в доказательстве [Прим. перев.: Круг в доказательстве - логическая ошибка, состоящая в том, что доказываемый тезис обосновывается с использованием в данном доказательстве того же самого тезиса в качестве одного из оснований. Понятие круга в доказательстве - частный случай общего понятия порочного круга (или ложного круга), другим частным случаем которого является понятие круга в определении (когда, например, термин "А" определяется через термин "В", а "В" - через "А")]: любой процесс, поддающийся описанию в терминах машины Тьюринга, является эффективной процедурой и наоборот. Однако реальную интуитивную силу этой идее придает факт, что доказана эквивалентность четырех совершенно различных и независимо друг от друга полученных формулировок концепции "эффективной вычислимости" вычислимости в формализме Тьюринга и, следовательно, друг другу. Как замечает М. Минский, "доказательство эквивалентности двух или нескольких определений всегда производит неотразимый эффект, если эти определения отражают различные опыт и мотивацию"2 [Прим. перев.: В переводе цитируемой книги М. Минского на русский язык смысл этой фразы передан неверно]
Хотя мы и вынуждены полагаться на интуицию, давая определение, что "естественно" называть эффективной процедурой. Но можем точно и однозначно указывать, что именно эффективная процедура предписывает нам делать.
По крайней мере, в принципе, можно закодировать алфавит языка, на котором записывается процедура, с помощью всего лишь двух символов: "0" и "1". В таком случае правила, образующие процедуру, можно переписать в новой нотации. В конечном счете, некоторой универсальной машине Тьюринга, оперирующей на алфавите из нулей и единиц, можно задать правила трансформации языка процедуры в виде закодированных соответствующим образом пятерок. Заданная процедура предписывает нам делать то, что делает проинструктированная таким образом машина Тьюринга, имитируя "машину", описание которой мы ей задали. Если, в принципе, мы понимаем, как работает машина Тьюринга (а, как мы убедились, для достижения этого понимания требуется очень немного сведений), и располагаем некоторым описанием универсальной машины Тьюринга, о котором шла речь, то нам детально известно, что процедура предписывает нам делать.
Подобный способ узнавания очень несовершенен. Так, мы не считаем, что досконально знаем какой-то город, или хотя бы имеем представление о нем, опираясь только на факт наличия подробной карты этого города. В отличие от этого, если мы достаточно хорошо понимаем тот язык, на котором записывается некоторая процедура, чтобы иметь представление о его правилах трансформации, то, вероятно, мы понимаем, что предписывают нам делать правила, сформулированные на этом языке.
Однако эти возражения, справедливые сами по себе, не имеют отношения к существу дела. Тезис Тьюринга следующий: можно реализовать в виде некоторой машинной программы любую процедуру, которую "естественно" назвать эффективной. Таким образом, всякий раз, когда мы считаем, что понимаем некоторое явление в том смысле, что нам известны правила, определяющие его поведение, мы должны уметь воспроизвести свое понимание в виде некоторой программы вычислительной машины. Тьюринг доказал, что все вычислительные машины (за исключением небольшого числа вычислительных машин специальных типов, которые нас не интересуют) взаимно эквивалентны, т.
е. все они универсальны. Следовательно, всякий отказ правильно с технической точки зрения работающей вычислительной машины вести себя в точности так, как, по нашему мнению, мы ее запрограммировали, нельзя приписать какой-либо особенности используемой конкретной вычислительной машины. Причина ошибки должна заключаться: 1) в том, что (мы при записи правил поведения на формальном языке, используемом соответствующей вычислительной машиной, допустили небрежность; 2) в первоначальной экспликации [Прим. перев.: Экспликация (латинское explicatio - разъяснение, развертывание) - в математической логике способ развертывания какого-либо исходного понятия, которое еще не является вполне точным, в научно обоснованное понятие. В данном случае речь идет о замене интуитивного понятия (понимания!) строгим понятием (пониманием) ("экспликация" по Р. Карнапу)] (в любой форме) того, что мы имели в виду; 3) в том, что наше понимание имеет какие-то изъяны. Чаще всего дело заключается в последнем. Мы остановимся на этом несколько подробнее позже. Здесь же необходимо лишь заметить, что дефект нашего понимания может принимать следующие две формы.
Во-первых, хотя в целом наша теория может быть правильна, некоторые ее детали ошибочны. Мы можем, скажем, ошибаться, утверждая, что если то-то и то-то верно, то из этого следует то-то и то-то. Наше мышление, вероятно убаюканное чистой риторикой доводов, которые мы представляем себе сами, позволяет нам часто проходить мимо таких ошибок без малейших сомнений. Однако вычислительная машина в этом отношении совершенно неумолима. Она следует той логике, которую мы ей задали и которая может приводить к совершенно иным следствиям, чем процессы мышления, складывающиеся под влиянием стремлений достичь определенных результатов. В самом деле, одна из наиболее убедительных причин использования вычислительных машин - возможность обнаруживать слабые места в наших рассуждениях. В этом отношении вычислительные машины - безжалостные критики.
Во-вторых, ущербность нашего понимания может заключаться в том, что хотя понимаем мы правильно, но еще не в состоянии формализовать понятое.
Например, мы в состоянии с большой уверенностью предсказывать, что будет делать какое-нибудь животное при самых разнообразных обстоятельствах. Но наша способность предсказывать, возможно значительная и надежная, может основываться на интуитивных представлениях, которые мы просто не в состоянии адекватно эксплицировать. И все-таки мы иногда вынуждены так или иначе претворить наши идеи в формальный вид. Программа ЭВМ, основанная на построенной таким образом формальной системе, очевидно, будет вести себя плохо. В этом случае беда заключается не в том, что теория, воспроизводимая программой, содержит ошибки в деталях, а в том, что эта теория ошибочна в целом - в своих утверждениях о явлениях, которых она касается. Не всегда ясно, с каким именно дефектом вы имеете дело, когда запрограммированная вычислительная машина ведет себя неподобающим образом. Обычно наблюдается очень сильное стремление считать, что в целом с соответствующими теориями все в порядке, и в тех случаях, когда они работают плохо, должны существовать легко поддающиеся устранению ошибки в деталях. Нам придется позже подробнее остановиться на подобных проблемах.
Выше мы говорили об идее универсальности вычислительных машин. Теперь следует поставить вопрос: означает ли универсальность вычислительных машин, что они могут "делать все, что угодно". Этот вопрос на самом деле сводится к следующему: "Может ли все, что мы захотим сделать, быть описано в терминах эффективной процедуры?" Ответ на этот вопрос - "нет".
Во-первых, существует ряд вопросов, которые можно поставить и для которых можно доказать невозможность получения ответа с помощью какой бы то ни было эффективной процедуры. Например, мы захотим выяснить, остановится ли какая-то созданная нами машина (например, суммирующая), если она начала работу с некоторым определенным набором данных. Это удобно выяснить с помощью некоторой тестирующей машины, позволяющей для любой машины и любого предложенного последней набора данных устанавливать, остановится ли когда-нибудь эта машина, работая с заданным набором данных.
Но машину такого рода построить нельзя. Этот и множество подобных "неразрешимых" вопросов кладут некоторый предел тому, что вычислительные машины могут делать. Это, естественно, логическое ограничение, являющееся препятствием не только для вычислительных машин, но и для всякого вычисляющего - будь то человек или механическое устройство. Следует также отметить, что все множество неразрешимых проблем не так уж интересно с практической точки зрения; все вопросы такого рода чрезвычайно общи. Если мы имеем дело с каким-то определенным вычислительным процессом и хотим выяснить, закончится он когда-нибудь или нет, то обычно можно построить некоторую процедуру, позволяющую установить это. Но невозможно иметь некоторую машину или, что то же самое, эффективную процедуру, позволяющую отвечать на этот вопрос для любой процедуры в общем случае.
Во-вторых, некоторая эффективная процедура может в принципе позволить выполнить определенные вычисления, но для этого требуется так много времени, что процедура оказывается практически бесполезной. Например, обратимся к шахматам. Учитывая правило, согласно которому игра прерывается, если некоторая позиция на доске возникает три раза, можно определенно считать, что шахматы - конечная игра. Следовательно, в принципе возможно написать некоторую процедуру порождения списка всех партий, ход за ходом, которые вообще могут быть разыграны. Для завершения этого вычислительного процесса потребовалась бы, однако, вечность даже при использовании самых быстрых вычислительных машин, которые только можно себе вообразить. Это пример практически бесполезной процедуры. В самом деле, до сих пор мы обсуждали процедуры так, как будто время, необходимое для их реализации, т. е. для завершения соответствующей вычислительной задачи, несущественно. Подобный подход приемлем до тех пор, пока мы занимаемся абстрактными играми. В реальной жизни время имеет значение. Следует, в частности, иметь в виду, что, когда одна вычислительная машина имитирует другую, она должна на каждый такт работы имитируемой машины затратить множество сопряженных со значительными затратами времени тактов своей работы.
Если бы это было не так, мы бы отдали все свои силы созданию максимально дешевой универсальной машины Тьюринга, и, поскольку она могла бы имитировать любую более дорогую машину, она вскоре вытеснила бы с рынка все остальные вычислительные машины.
В-третьих, можно написать некоторую процедуру, реализуемую машиной Тьюринга, т. е. эффективную процедуру, но такую, в число правил которой не входит эффективное правило остановки. Процедура "начинайте с нуля, прибавьте единицу и, если сумма больше нуля, снова прибавьте единицу, и так далее" явно не остановится никогда. Можно было бы в этой процедуре вместо "если сумма больше нуля, снова прибавьте единицу" поставить "если сумма меньше нуля, остановитесь, в противном случае снова прибавьте единицу" и снабдить ее таким образом правилом остановки. Вычислительный процесс, выполняемый в соответствии с этой процедурой, никогда, однако, не вступит в контакт с этим правилом остановки, т. е. соответствующая машина Тьюринга никогда не примет состояния "сумма меньше нуля". Эта процедура в определенном смысле ущербна. Не всегда, очень мягко выражаясь, легко определить, свободна или нет от дефектов такого или подобного рода реальная процедура, написанная для реальных вычислительных машин.
И, наконец, мы подходим к наиболее неприятному моменту в вопросе, что вычислительные машины могут и не могут делать. Я снова и снова повторяю, что эффективная процедура - это некоторый набор правил, указывающих на точном и однозначном языке, что следует делать для перехода от одной ситуации к следующей. Я утверждаю, что некоторый язык точен и однозначен только в том случае, когда его алфавит и правила трансформации сами могут быть представлены в точных и однозначных терминах. И я повторяю тезис Чёрча (и Тьюринга): для любой такой экспликации какого бы то ни было языка существует некоторая машина Тьюринга, поддающаяся имитации с помощью универсальной машины Тьюринга. Я утверждаю далее, что, в сущности, любая современная вычислительная машина представляет собой универсальную машину Тьюринга.
Отложив все проблемы, связанные с неразрешимыми формально задачами, процедурами, не имеющими (конца и ущербными, мы неизбежно сталкиваемся с вопросом: сводимы ли все процессы принятия решений, используемые человеком, к эффективным процедурам и, следовательно, поддаются ли они машинной реализации?
Мы убедились в том, что сама идея эффективной процедуры неотъемлемо связана с идеей языка. Разве не странно, что я потратил столько времени на обсуждение языка безо всякого упоминания о значении? Причина, позволившая мне избегать конфронтации с понятием "значение", заключается в том, что обсуждались исключительно формальные языки или, как я говорил, абстрактные игры. Дело не в том, что значение вообще че играет никакой роли в подобных языковых играх.
Оно играет свою роль, но эта роль полностью погружена в правила трансформации языка. Напомним, что в алгебре можно преобразовать ас+bc в (а+b)с. Мы имеем право сказать, что эти два выражения означают одно и то же, или, выразив это по-другому, что использованное нами преобразование сохраняет "значение" исходного выражения. Если выразить это снова по-другому, то при подстановке вместо a, b и с чисел оба выражения дадут после выполнения указанных арифметических операций один и тот же результат. (Последнее, кстати, свойственно не всем алгебрам. Элементарная алгебра специально построена так, чтобы ее правила трансформации были совместимыми с правилами трансформации формального языка, называемого нами арифметикой.)
Действительно, особенностью формальных языков, их сущностью является то обстоятельство, что все их правила трансформации - сугубо синтаксические, т. е. описывают допустимые преобразования цепочек символов в данном языке, в том числе замену символов и введение новых символов (например, ")" и "(") независимо от того, какую интерпретацию подобные символы могут иметь вне рамок собственно языка. Можно, например, исписать алгебраическими преобразованиями целые страницы, слепо следуя алгебраическим правилам и не имея никакого понятия даже о том, что числа допустимо подставлять вместо маленьких букв и нельзя вместо скобок, т.
е. не давая используемым символам абсолютно никакой интерпретации.
Не так обстоит дело с естественным языком. Рассмотрим английское предложение: "I never met a man who is taller than John" (Я никогда не встречал мужчины, который был бы выше Джона). Его можно преобразовать в предложение "I never met a taller man than John" (Я никогда не встречал более высокого мужчины, чем Джон). Это преобразование совершенно очевидно сохраняет значение исходного предложения. Если применить это же правило трансформации к предложению "I never met a man who is taller than Maria" (Я никогда не встречал мужчины, который был бы выше Марии), то мы получим предложение "I never met a taller man than Maria" (Я никогда не встречал более высокого мужчины, чем Мария), и, следовательно, в этом случае правило неприменимо. Примененное нами правило не является чисто синтаксическим. Оно касается не только формы неинтерпретированных цепочек символов, но также и их значений.
Мы убедились в том, что на некотором определенном уровне рассмотрения нет существенной разницы между языком и машиной, олицетворяющей его правила трансформации. Мы отметили также, что, хотя законы, олицетворениями которых служат абстрактные машины, не обязательно должны быть логически совместны с законами физического мира, однако законы, реализуемые машинами, вступающими во взаимодействие с реальным миром, должны волей-неволей составлять подмножество законов, которым подчиняется физический мир.
Если мы хотим продолжать отождествление языков с машинами, даже обсуждая естественный язык, то необходимо признать, что какие бы машины не ставились в соответствие естественным языкам, они ближе к машинам, преобразующим и распределяющим энергию, чем к рассматриваемым нами абстрактным машинам, т. е. их законы должны принимать во внимание реальный мир. В самом деле, требования, предъявляемые к ним, являются более жесткими, чем те, которые предъявляются к "настоящим" машинам. И хотя законы настоящих машин - просто подмножества законов физики, законы некоторой естественноязыковой машины должны каким-то образом соответствовать внутренним реальностям личности каждого говорящего на данном языке, скрытым в ней или проявляющимся открыто в то время, когда он говорит.
В естественном языке в этой связи возникают трудности, поскольку мы должны знать, например, к каким "значениям" X и Y можно применять правило трансформации, обеспечивающее переход от фразы "I never met an X who is taller than Y" (Я никогда не встречал X, который был бы выше Y) к фразе "I never met a taller X than Y". (Я никогда не встречал более высокого X, чем Y). Это явно не такое правило, которое в равной степени может применяться к любым неинтерпретированным цепочкам символов.
Это затруднение даже серьезнее, чем может показаться с первого взгляда. Дело в том, что невозможно даже определить область применимости этого правила (а существует множество подобных) с помощью, скажем, перечней местоимений и существительных мужского и женского рода и мужских и женских имен, использование которых позволило бы соответствующим образом усовершенствовать правило.
Рассмотрим другую разновидность уже приводившегося примера - предложение "I never met a smarter man than George" (Я никогда не встречал более способного мужчины, чем Джордж). Представим себе детективный роман, в первой главе которого становится ясно, что разыскиваемым преступником является некто, выдающий себя за того, кем он не является. Опытный детектив разоблачает самозванца, скажем, в десятой главе. Одиннадцатая глава отводится объяснению читателю, который не смог прийти к выводам детектива на основании улик, разбросанных по всей книге, каким именно образом детективу удалось обнаружить виновного. Поэтому в одиннадцатой главе детектив объясняет, что он случайно услышал, (как на литературном вечере, посвященном творчеству английского писателя Джорджа Элиота, мистер Арботнот заметил: "Я никогда не встречал более способного мужчины, чем Джордж". Мистер Арботнот добился приглашения на вечер, убедив хозяйку дома в том, что он - специалист по английской литературе девятнадцатого века. Детектив подумал, что всякий, знающий хоть что-нибудь об английской литературе, должен знать, что Джордж Элиот - это псевдоним Мэри Энн Эванс - женщины.
Замечание мистера Арботнота было, следовательно, "грамматически неправильным" - так же, как математическое выражение х/у грамматически неправильно при у=0. Таким образом, мистер Арботнот не мог быть тем, за кого он себя выдавал.
Хорошая детективная история (может быть, нам следовало бы сказать "честная") - это такая, в которой читатель всю информацию, необходимую для выяснения истины, например "кто это сделал", получает до того, как выясняется, каким образом детектив пришел к своим заключениям. Вся суть детективного романа часто сводится к снятию неоднозначности того, что было сказано одним из героев где-то вначале. Сама возможность обнаружения неоднозначности, а следовательно, установление того, что ее необходимо устранить, и возможность раскрытия тайны зависят от знания читателем реального мира и от той особенности естественного языка, что его правила применяются к цепочкам символов, интерпретируемых в контексте реального мира. Историю подобного типа нельзя понять, обращаясь к чисто формальным средствам. Достаточно интересно, что первую главу этого детективного произведения невозможно перевести на другой язык, если переводчик не заметит и не поймет роковую ошибку мистера Арботнота и, таким образом, не поймет развязку, содержащуюся в последней главе.
Мы еще вернемся к роли контекста в понимании естественного языка как людьми, так и машинами. Пока мы заняты более ограниченной проблемой, по крайней мере более ограниченной в той постановке, которую мы рассматриваем здесь: сводимость процессов принятия решений у человека к эффективным процедурам, следовательно, к вычислимым процессам.
Естественно, существуют реализуемые человеком процессы принятия решений, которые можно ясно и однозначно описать даже на естественном языке. Мы описывали здесь игры, как на естественном языке, так и в терминах "конструкций" машин, которые, в свою очередь, описывались нами на естественном языке. В самом деле, мы не могли бы понять машину Тьюринга или эффективную процедуру, сформулированную в терминах машины Тьюринга, т.
е. как некоторую программу некоторой универсальной машины Тьюринга, не представляя себе, что значит, если одна ячейка ленты расположена рядом с другой, что значит считывать какой-то символ из некоторой ячейки ленты или записывать его на ней, что значит, если лента перемещается на одну ячейку вправо или влево, и т. п.
Особенно удивительно то, что мы невероятно мало должны знать для возможности обращаться в принципе ко всей математике. В обыденной жизни мы даем друг другу указания, т. е. описываем другим людям процедуры, которые, хотя, может быть, технически и неоднозначны (потенциально допускают различные интерпретации), во всех практических смыслах представляют собой эффективные процедуры. Они основываются на исключительно широко используемых словарях, элементы которых, появляясь в сугубо специфическом контексте, имеют эффективно-однозначные интерпретации. Во многих беседах на профессиональные и технические темы используются почти исключительно такие словари.
Задача преобразования подобных процедур в эффективные в техническом смысле процедуры - это по существу задача формализации базы знаний, лежащей в основе общепринятой интерпретации соответствующих словарей. Чем выше уровень стандартизации этих словарей и чем уже контекст их использования, тем выше вероятность решения задачи. Действительно, в конце концов, если каждый символ из некоторого множества символов обладает эффективной однозначной интерпретацией в некотором определенном контексте и если цепочки подобных символов преобразуются лишь согласно правилам, которые сами порождаются этим же контекстом, то в формальном смысле проблема интерпретации каждого символа вообще не возникает. Язык, ограниченный таким образом, - действительно формальный. Следовательно, его правила потенциально реализуемы посредством некоторой машины Тьюринга.
Однако остается еще много решений, принимаемых нами в повседневной жизни, для которых невозможно четко описать ни один процесс принятия решений. Как решить, какое слово нужно писать следующим? Возможно, наша неспособность в этом отношении всецело определяется тем, что мы до сих пор не добились адекватного понимания человеческого языка, сознания, мозга и символической логики.
В конце концов, поскольку все могут научиться имитировать универсальные машины Тьюринга, мы по определению сами есть универсальные машины Тьюринга. Это означает, что мы по крайней мере универсальные машины Тьюринга. (Даже некоторая реализованная физически машина Тьюринга - это не только машина Тьюринга; она может быть в то же время, например, настольной подставкой для книг или пресс-папье.)
Мы присоединяемся к Майклу Поляни, утверждающему, что мы знаем больше, чем можем выразить3. В результате мы попадаем в замкнутый круг. Наш вопрос имеет вид: "Что человек может сообщить вычислительным машинам?" Таким образом, под выражением "сообщить" мы понимаем "задавать эффективную процедуру". Теперь вопрос, который нас занимает, принимает вид: "Поддается ли все, что мы захотели бы сделать, описанию в виде эффективной процедуры?" Таким образом, утверждать, что существуют вещи, которые мы знаем, но не в состоянии выразить, не значит, отвечать на наш вопрос; это просто переориентация нашего внимания с понятия "сообщение", на котором до сих пор мы пытались сосредоточиться, на понятие "знание". Мы убедимся в том, что это очень уместный и имеющий решающее значение переход и проблема "что мы можем заставить сделать вычислительную машину" - это, в конечном счете, проблема "каким знанием мы можем снабдить вычислительную машину". Именно это и будет нашей основной темой в большинстве последующих частей книги. Вспомним, кстати, что мы уже затрагивали эту проблему; выше говорилось, что располагать картой города - не значит знать город. Так же умение изложить правила игры в шахматы не есть знание шахмат. Квалифицированный шахматист знает больше, чем может рассказать. Я не утверждаю сейчас (хотя и считаю, что это так), что мы никогда не найдем способ эксплицировать его шахматные знания целиком; я утверждаю лишь, что в этом случае мы имеем дело с примером знания, являющегося эффективным, несмотря на то, что в настоящее время оно не может быть сообщено.Если бы было верно, что шахматные знания квалифицированного шахматиста не поддаются полностью выражению, это значило бы, что никакая вычислительная машина никогда не сможет играть как квалифицированный шахматист. Отнюдь нет. Об этих проблемах говорится далее.
Как работают вычислительные машины
С чисто формальной точки зрения современные вычислительные машины - это просто машины Тьюринга, которые работают с алфавитом, состоящим из двух символов ("0" и "1"), и способны принимать астрономическое число состояний. Аналогично, однако, можно было бы сказать, что поскольку и велосипед, и современный пассажирский самолет - транспортные средства для перевозки людей, они идентичны с формальной точки зрения. Современные вычислительные машины отличаются от рассмотренных машин Тьюринга способами построения и управления ими.
Многим известно, что вычислительная машина может сравнивать фамилии, напечатанные на кредитных карточках, с фамилиями, зафиксированными каким-то образом в памяти вычислительной машины. Многие до сих пор считают, что вычислительные машины - по существу, машины, способные в большом объеме выполнять арифметические расчеты, т. е. что они являются просто автоматическими настольными счетными машинами, обладающими очень большим быстродействием. Хотя это убеждение оправдано с чисто формальной точки зрения, значительно целесообразнее признать, что вычислительная машина - это в сущности устройство для обработки символов. Среди символов, которыми вычислительная машина может оперировать, имеются такие, которые люди, а в определенном смысле даже вычислительные машины интерпретируют как числа. До сих пор значительная часть машинного времени большинства вычислительных машин посвящалась заданиям нечислового характера.
Для объяснения только что сказанного необходимо обратиться к собственно символам и их интерпретации. При этом следует также объяснить, каким образом символы могут быть представлены, особенно "внутри" вычислительных машин.
Давайте, по крайней мере, здесь ограничимся символами, используемыми для создания текста. К ним относятся прописные и строчные буквы английского алфавита, знаки препинания и специальные символы типа используемых в математике, например скобки и знаки суммирования и равенства. Пробел (или интервал) также рассматривается как отдельный символ.
В противном случае было бы нелегко писать предложения, составленные из отдельных слов. Книги, состоящие из верениц одних этих символов, могут заставлять нас смеяться и плакать, могут поведать нам историю философии, отдельного человека или народа и могут научить нас самым разнообразным вещам, в том числе и математике. В частности, они могут научить нас строить алгоритмы, т. е. эффективные процедуры, а также снабдить нас наборами правил, образующими алгоритмы. Таково, хотя и не формальное, представление о том, какая информация нас интересует. Следует согласиться, что символы, которые мы имеем в виду, способны быть носителями информации. Каким же образом символы представляются и обрабатываются в вычислительных машинах?
Допустим, что алфавит, с которым мы хотели бы иметь дело, включает 256 различных символов - число, явно достаточное для того, чтобы в него вошли все упоминавшиеся символы.
Представим себе, что имеется колода из 256 карт, на каждой из которых напечатан определенный символ нашего алфавита, причем, естественно, каждой карте соответствует свой символ. Сколько вопросов, допускающих ответы "да" и "нет", необходимо задать для того, чтобы при случайном выборе одной карты из колоды можно было определить, какой знак на ней напечатан? Очевидно, решение можно найти, задав самое большее 256 вопросов. Можно каким-то образом упорядочить символы и начать с вопроса, не есть ли это первый символ нашего упорядочения, например "это прописная буква А?". Получив ответ "нет", мы спрашиваем далее, не есть ли это второй символ упорядочения, и так далее.
Если, однако, это упорядочение известно и нам, и тому, кто нам отвечает, то имеется значительно более экономный способ организации опроса. Мы опрашиваем, находится ли отыскиваемый нами символ в первой половине набора. Независимо от ответа выделяем набор из 128 символов, среди которых находится тот, который нам нужен. Мы снова спрашиваем, находится ли искомый символ в первой половине этого меньшего набора, и так далее.
Продолжая действовать таким способом, мы непременно установим, какой символ напечатан на выбранной карте, задав ровно восемь вопросов. Мы смогли бы фиксировать ответы, получаемые на наши вопросы, ставя "1" В тех случаях, когда ответ "да", и "0" - в случае "нет". В таком случае соответствующая запись будет содержать восемь так называемых бит, каждый из которых является либо "1", либо "0". (Говоря о записи числа в десятичной системе счисления, мы рассматриваем числа 0, 1,..., 9 как десятичные цифры. Наша же система записи допускает лишь два символа: "0" и "1"; мы называем их битами.)
Итак, эта восьмибитовая цепочка является однозначным представлением знака, который мы отыскиваем. Более того, каждый из знаков, образующих это множество, обладает некоторым единственным восьмибитовым представлением в одном и том же упорядочении.
На самом деле, существуют общепринятые соглашения относительно упорядочиваний именно таких наборов знаков и их индивидуального кодирования. (То, что эти соглашения признаются не абсолютно всеми, в данном случае нас не интересует, по крайней мере сейчас.)
В последние годы специфические коды, используемые в вычислительных машинах, выпускаемых компанией IBM, заняли положение, очень близкое к общемировому промышленному стандарту. В рамках этого соглашения цепочка из восьми бит, представляющая некоторый знак (алфавита, насчитывающего 256 знаков), называется байтом, а последовательность из четырех байтов - словом.
Мы убедились в том, что всякий текст можно представить некоторой цепочкой единиц и нулей. Чтобы выполнять какую-либо полезную работу с информацией, закодированной в виде цепочек бит, необходимо иметь возможность манипулировать ими некоторым регулярным способом, т. е. играть с ними в какие-то игры. Теперь нам известны "фигуры" игр, играть в которые у нас может возникнуть желание. Единственное, что остается, - это установить правила. Однако прежде, чем заняться этим, позвольте мне сказать несколько слов относительно "электрических" аспектов представления цепочек бит и обращения с ними.
Всегда можно сказать, протекает через некоторый проводник электрический ток или нет. Рассмотрим проводник, соединенный с источником электрической энергии и соответствующим образом подключенным выключателем. Если выключатель включен, то по проводнику течет электрический ток, в противном случае - нет. Предположим, что выключатель связан с каким-то механизмом, который регулярно его включает и выключает; скажем, в течение одной секунды выключатель остается включенным, затем на одну секунду выключается и так далее. В таком случае электрический ток в проводнике можно рассматривать как некоторую последовательность импульсов (рис. 3.1). Обычный дверной электрический звонок - генератор импульсов. Когда к нему поступает энергия, т. е. при нажатии кнопки звонка, выключатель включается. Электрический ток, проходящий через проводник, заставляет молоточек звонка перемещаться, что приводит к выключению выключателя. Затем выключатель снова включается и т. д.
Современная вычислительная машина - это, несомненно, некоторый электрический прибор, точно так же, как им является дверной электрический звонок. Нажимая на кнопку звонка, мы считаем, что звонок "включен", хотя он в каком-то смысле сам включается и выключается в то время, как кнопка остается нажатой. Можно считать, что работающая вычислительная ма-
Рис. 3.1. Последовательность импульсов прямоугольной волны
шина так же включается и, находясь в этом состоянии, включается и выключается последовательностью импульсов типа описанной выше. В этом случае с принципиальной точки зрения время работы вычислительной машины состоит из периодов двух типов: бездействия, когда она в некотором роде "выключена", и активности, на протяжении которого происходит все то, что должно происходить. В сущности, рассмотренная регулярная последовательность импульсов исполняет роль часов. Состояние "отсутствия тока" в проводнике, по которому эта последовательность передается, сигнализирует период бездействия, а наличие тока-активный период.
Для того чтобы понять происходящее внутри вычислительной машины, представим себе полную карту железных дорог какого-нибудь континента, где существующие линии железных дорог представлены проводниками, а каждая железнодорожная станция - парой небольших неоновых лампочек. Взглянув на эту схему, состоящую из проводников и лампочек, в период бездействия, мы заметим, что светятся только некоторые лампочки. В очередной активный период некоторые светившиеся лампочки выключаются, а некоторые темные зажигаются; остальные лампочки находятся в том же состоянии, в котором они были в предшествующий период. Вот и все. Затем наступает очередной период бездействия. В активный период лампочки не мигают. Каждая из них либо сохраняет свое прежнее состояние, либо изменяет его точно один раз, т. е. выключается, если она была включена, или включается, если она была выключена.
Механизм, который мы представили как пару неоновых лампочек, представляет собой электронную схему, состоящую из двух идентичных элементов. Электрический ток может циркулировать по каждому из элементов независимо, т. е. в сущности каждый элемент может независимо нести некоторый импульс. В то же время только один из элементов пары может пропускать ток в любой фиксированный момент. Этот механизм имеет два входных проводника, по одному на каждый элемент. Когда в активный период на элемент, не проводящий в данный момент тока, подается импульс, в этом элементе индуктируется ток, а ток, циркулирующий в другой части механизма, прерывается. Таким образом, этот механизм может переходить из одного состояния в другое и обратно; одна из его "половин" всегда "включена", другая "выключена", причем "половины" постоянно меняются местами. Этот механизм называется триггером. Элементы триггера также снабжены выходящими из них проводниками, каждый из которых, естественно, передает электрический ток, т. е. импульс, во время активного периода, когда соответствующая половина триггера находится в состоянии "включено".
Роль триггера в схеме вычислительной машины заключается в "запоминании" того, на какую из двух его половин в последний раз был подан импульс. Триггер - это устройство для хранения одного бита информации.
Теперь появилась другая возможность объяснить, что именно происходит в вычислительной машине в активный период: большое число триггеров изменяет свое состояние. Однако назначение вычислительной машины состоит в обработке информации, а не просто в передаче ее из одного места в другое. Обработка информации - это, как мы уже установили, в сущности, проблема преобразования. Итак, любой отдельно взятый проводник, ведущий от одного элемента какого-либо триггера к элементу какого-то другого триггера, может за один активный период передать самое большее один импульс. Следовательно, любые преобразования, которые необходимо произвести в один активный период, должны являться результатом выполняемых на "электрическом" уровне операций над строкой импульсов, поступающих параллельно, а не над потоками импульсов, следующих один за другим.
Представим себе колоссальную телефонную сеть, в которой каждый телефон постоянно соединен с другими; у этих телефонов нет диска для набора. Все абоненты смотрят телевизионную программу по одному каналу, и как только начинается передача рекламы, т. е. активный период, они спешат к своим телефонам и сообщают: "единица" или "ноль" - в зависимости от того, что написано на листе блокнота, прикрепленного к аппарату. Они также слышат то, что сообщают им в зависимости от услышанного и записывают в свои блокноты 1 или 0. Один телефон может одновременно быть источником сообщения для нескольких принимающих аппаратов и, кроме того, служить приемником для нескольких передатчиков. Тем не менее сигнал, поступающий в каждый приемник, должен быть однозначной "единицей" или "нулем". Следовательно, необходимы операторы (электронные устройства), расположенные вдоль проводников, связывающих между собой принимающие аппараты, и наделенные функциями формирования единственного сигнала (1 или 0) из потенциального множества входных сигналов.
Такие устройства называются вентильными схемами.
Рассмотрим три разновидности вентильных схем, каждая из которых обладает своей функцией. Простейшей является вентильная схема (рис. 3.2), передающая
Рис. 3.2. Вентильная схема НЕТ
"единицу" при поступлении на нее "нуля" и наоборот. Это вентиль "НЕТ". Его работа описывается следующими выражениями:
НЕТ (0) = 1, |
НЕТ (1)= 0. |
Вентиль имеет один вход А и один выход В. Вентильная схема "И" (рис. 3.3) имеет два входа и один выход. Она передает "единицу" в том и только том случае, если оба ее входа - "единицы"; в противном случае эта схема передает "нуль". Работа вентиля "И" описывается следующими выражениями:
И (0, 0)=0, |
И (0, 1)=0, |
И (1, 0)=0, |
И (1, 1) = 1. |
Вентильная схема "ИЛИ" (рис. 3.4) также имеет два входа и один выход. Она передает "единицу" всякий раз, когда любой из ее входов или оба входа сразу яв-
Рис. 3.3. Вентильная схема И |
Рис. 3.4. Вентильная схема ИЛИ |
ляются "единицами"; в противном случае она передает "нуль". Работа этой вентильной схемы описывается следующими выражениями:
ИЛИ (0, 0)=0, | ИЛИ (0, 1) = 1, |
ИЛИ (1, 0) = 1, | ИЛИ (1, 1) = 1 |
Заинтересованный читатель может проследить прохождение импульсов через систему вентилей (рис. 3.5), представляющую схему, элементами которой служат вентильные схемы "И", "ИЛИ" и "НЕТ", а функцией-арифметическое сложение двух двоичных цифр.
Сложение в двоичной системе счисления аналогично сложению в десятичной системе, но намного проще. Десятичная сумма 2 и 3 равна 5. Десятичная сумма 7 и 8 также равна 5, но имеет место еще "перенос" единицы, которая прибавляется к сумме соседнего слева столбца, какой бы она ни была. В двоичной системе существуют только две цифры: 0 и 1, Правила сложения чрезвычайно просты, а именно:
0+0 = 0, |
0+1 = 1, |
1+0 = 1, |
1+1 = 0 и переносится 1. |
Итак, изображенный здесь однобитовый двоичный сумматор имеет три входа: A, В и С и два выхода: S и D.
А и В представляют два бита, которые должны быть сложены, а С - перенос, который мог бы быть порожден аналогичным сумматором, находящимся, так сказать, справа от изображенного здесь. S - полученная сумма, D - перенос.
На самом деле читателю не нужно прослеживать импульсы, проходящие через сумматор. Важно лишь понять, что комбинации, составленные из вентильных
Рис. 3.5. Схема однобитового сумматора;
представлены входные данные и полученный результат
схем трех описанных типов, позволяют реализовать правила трансформации информации. Отметим также, что вся схема помещена в коробку, которая имеет три входа (А, В и С) и два выхода (S и D); эта коробка представляет собой некий блок. Мы объединили простые элементы, чтобы создать более сложный элемент. Теперь можно объединить, скажем, 32 подобных сумматора и сформировать 32-битовый сумматор. Этот сумматор окажется некоторым элементом. И создание, и программирование вычислительных машин - именно такой процесс формирования больших объектов из меньших.
Вернемся снова к нашей воображаемой телефонной сети, но теперь будем считать, что вентильные схемы участвуют в беседах (если это можно так назвать) абонентов между собой. Можно представить себе трех абонентов А, В и С, берущих в нужный момент времени свои телефоны и сообщающих 1, 0 и 0 соответственно. Если они связаны с абонентами S и D представленной выше схемой, то абонент S будет слышать "1", a D - "0", и каждый из них запишет услышанное в своем блокноте.
Конечно, в настоящих вычислительных машинах роль таких "абонентов" выполняют триггеры, а периоды вещания чрезвычайно коротки. Таким образом, в вычислительных машинах результаты вычислений, т. е. преобразований, которым подвергается информация во время активных периодов, хранятся в триггерах. В них они пережидают периоды бездействия, чтобы затем подвергаться дальнейшим преобразованиям в следующие периоды активности.
Мы уже отмечали, что однобитовые сумматоры можно соединять так, чтобы формировать 32-битовый сумматор.
Входами такого сумматора служат два набора по 32 триггера каждый (переносы - внутреннее дело многокаскадного сумматора), выходом также служит набор из 32 триггеров. Можно считать, что каждый из этих наборов в периоды бездействия содержит 32-битовое двоичное число. Каждое, естественно, должно являться упорядоченным множеством, т. е. таким, в котором некоторый бит - первый, другой - второй и так далее. Подобный набор триггеров называется регистром. Он является еще одним примером элемента, полученного в результате объединения более "элементарных" элементов. Можно ли, однако, сказать, что всякий n-битовый регистр содержит n-битовое число? Нет, по крайней мере не при любых обстоятельствах. Дело в том, что интерпретация, которую можно дать строке бит, содержащейся в некотором регистре, зависит от того, какие элементы соединены с этим регистром и, следовательно, какие операции можно осуществлять с его содержимым. Если два регистра соединены лишь с элементами, выполняющими арифметические операции, т. е. если вычислительная машина оперирует с содержащейся в этих регистрах информацией исключительно как с числами, то это числа - по крайней мере до тех пор, пока они обрабатываются в вычислительной машине. Чтобы понять, что символы естественного языка подчиняются аналогичным ограничениям, достаточно вспомнить случаи, когда одно и то же слово выполняет в одной ситуации роль числительного, в другой наречия, а в третьей - неинтерпретированной цепочки знаков [Прим. перев.: В качестве примера указанных ограничений автор приводит английские фразы со словом one - "один" (имя существительное), "один, единственный, какой-то" (имя прилагательное), "этот, тот (самый)" (в грамматическом значении указательного местоимения); отмечается, что это слово в одном случае обозначает число, в другом - некоторое слово, а в третьем является интерпретированной цепочкой знаков]
Действующая вычислительная машина вовлечена в тщательно продуманную и очень сложную игру.
е. состояния восьми его триггеров, и наоборот.
Теперь представим себе комплекс почтовых ящиков в жилом доме, снабженный одним секретным замком. Чтобы достать что-то из определенного почтового ящика или положить в него что-то, в первую очередь необходимо набрать на замке адрес соответствующего ящика. Память вычислительной машины снабжена точно таким же устройством: регистром. (Регистра на 20 бит было бы достаточно для снабжения адресами 1048576 ящиков.) Такой адресный регистр целесообразно рассматривать как часть центрального процессора вычислительной машины, несмотря на то, что он соединен и с памятью вычислительной машины и с ее центральным процессором. Рассмотрение адресного регистра в качестве части центрального процессора помогает, однако, осознать, что его содержимое является объектом машинной обработки. Им могут быть, например, промежуточные результаты какой-либо длинной последовательности арифметических вычислений, и его можно использовать, по сути дела, как порядковые числа.
Наличие адресов у памяти современных вычислительных машин - одно из их наиболее важных свойств. Чтобы оценить колоссальную разницу, которую возможность адресации определяет в одном только способе поиска в памяти, рассмотрим следующую задачу, Пусть в каком-то городке число абонентов телефонной сети составляет несколько меньше 10000. Телефонная книга города содержит перечень всех абонентов, составленный в алфавитном порядке, и, естественно, номера их телефонов. Кроме того, для каждого абонента указан порядковый номер его позиции в книге. Например
1 Аабан Джон 369-6244
.
.
.
1423 Джонс Уильям 369-0043
Мы хотим узнать, являются ли последние четыре цифры номера телефона любого абонента порядковым номером любого другого абонента, чей телефонный номер аналогично соответствует порядковому номеру первого абонента. Если взять, скажем, приведенную запись для Джона, то встречается ли, например, запись 43 Бейкер Макс 369-1423, удовлетворяющая указанным условиям?
Простой способ решения этой задачи состоит в просмотре всех записей, начиная с первой, и выяснении того, составляют ли очередная запись и запись с порядковым номером, соответствующим четырем последним цифрам входящего в состав первого телефонного номера, искомую пару.
Ответ будет "да", если мы обнаружим одну такую пару, и - "нет", если после изучения всего списка мы подобной пары не найдем. Худший из возможных случаев тот, в котором вообще нет пар. В такой ситуации к каждой записи приходится обращаться по крайней мере дважды.
Допустим, что телефонная книга записана на ленте того типа, который требуется для рассмотренных нами машин Тьюринга. При этом нужно следить не только за движением ленты, связанным со счетными функциями, но каждую запись придется просмотреть гораздо больше двух раз. Так, в нашем примере для самой первой записи потребовалось бы посмотреть ее, 6242 записи между ней и записью 6244 и саму запись 6244. В классической машине Тьюринга нельзя было бы просто прокрутить часть ленты, разделяющей соответствующие записи, а пришлось бы реально прочесть и интерпретировать каждую запись. Тот же принцип объясняет крайнее раздражение, которое некоторые люди испытывают, когда им говорят, что они упомянуты в большой книге, не снабженной указателем. Им приходится читать всю книгу.
Пример с телефонной книгой свидетельствует не только о том, что наличие адреса увеличивает эффективность поиска, но и показывает, что при некоторых обстоятельствах оно вообще исключает необходимость поиска. Дело в том, что на вопрос, образует ли конкретный абонент с другим абонентом пару указанного типа, ответ можно получить непосредственно, не прибегая к поиску среди не относящихся к этим абонентам данных. Входит ли, например, мистер Аабан в подобную пару? Чтобы выяснить это, обратимся сразу к абоненту с номером 6244. Если четыре последние цифры номера его телефона "0001", то ответ - "да", в противном случае - "нет". Имея в виду сказанное, обратимся снова к наборам из пяти элементов, определяющим некоторую машину Тьюринга Т и являющимся, следовательно, программой для универсальной машины Тьюринга, имитирующей машину Т. Напомним, что в общем виде такой набор из пяти элементов задается как
(текущее состояние, текущий символ, очередное состояние, очередной символ, направление).
В принципе, машина Тьюринга, находящаяся в некотором состоянии, скажем, 19 и просматривающая некоторый символ, например "1", должна прочесть все введенные в ее программу наборы из пяти элементов, все время задаваясь, так сказать, вопросом, является ли считываемая пятерка (правило) той самой пятеркой, которая применима к состоянию 19. Когда машина обнаруживает пятерку, соответствующую ее текущему состоянию и просматриваемому символу, она перезаписывает этот символ, передвигает ленту и (возможно) изменяет свое состояние. Затем поиск начинается снова. Однако если пятерки хранятся в адресуемой памяти, то поиска подходящей пятерки можно избежать или по крайней мере уменьшить его продолжительность. Допустим, что все пятерки, связанные с некоторым определенным состоянием, требуют, скажем, 100 байт памяти, и начало первой пятерки приходится на регистр 1000. В таком случае набор, соответствующий состоянию 19, будет содержаться в памяти, начиная с регистра с номером 1000+(19-1) x 100, т. е. регистра 2800. Таким образом, понятие состояния полностью переходит в понятие адреса, по крайней мере в данном контексте.
В реальных вычислительных машинах данные также хранятся в адресуемой памяти. Эта рационализация позволяет избавиться и от ограничения, состоящего в том, что немедленный доступ обеспечен лишь к данным, размещенным непосредственно рядом с теми, которые в данный момент просматриваются. Обсуждение использования адресуемости при составлении реальных программ для вычислительных машин начнем с небольшой практической задачи.
Требуется вычислить квадратные корни чисел. (Это означает, что если задано некоторое число, скажем, 25, то требуется определить, какое число, умноженное само на себя, даст заданное. Квадратный корень из 25 равен 5, так как 5 x 5 - 25.) Допустим, что у нас есть добросовестный слуга (человек), без устали исполняющий любую данную ему команду. Известен алгоритм вычисления квадратных корней из положительных чисел. Если задано число n, то его квадратный корень вычисляется следующим образом:
в первую очередь высказывается предположение, причем всегда одно и то же, а именно 1; осуществляется поиск лучшего варианта при помощи:
а) умножения первого варианта приближения самого на себя, б) сложения заданного числа n с полученным произведением, в) деления полученной суммы на удвоенное значение первого приближения
(Исаак Ньютон доказал, что этот вычислительный процесс всегда приводит к получению лучшего приближения, за исключением, естественно, случая, когда предыдущее приближение уже само являлось точным решением);
если разность между предыдущим приближением и улучшенным приближением в контексте нашей задачи достаточно мала, то мы останавливаемcя на последнем. В противном случае вычисляется очередной лучший вариант.
Эта процедура обосновывается следующим образом. Допустим, что извлекается квадратный корень из 25 и исходным предположением является, скажем, 4. Нам известно, что эта величина слишком мала, так как 4 x 4=16. Если разделить заданное число, т. е. 25, на значение нашего предположения, то частное будет больше искомого результата, который в данном примере равен 5. Следовательно, значения частного и исходного допущения служат границами искомого результата. Взяв в таком случае среднее из этих двух значений, получим следующее приближение, причем, более того, приближение более точное, чем то, на основе которого оно вычислено. Мы можем итеративно продолжать этот прием до тех пор, пока не получим результат, настолько близкий к правильному, насколько мы этого хотим.
Наш слуга, однако, не гений. Он привык иметь дело с бланками налоговых деклараций, в которых требуется подсчитать что-то и записать результат в такую-то строчку или прямоугольник. Поэтому мы подготовили "рабочий лист", в основе которого лежат указанные процедуры.
Служащий работает в небольшой кабине, снабженной прорезями для приема и выдачи материалов. Как только полоска бумаги с написанным на ней числом появляется во входной прорези, он яростно принимается за работу. Закончив ее, записывает результат на бумаге и подает ее в выходную прорезь.
Единственная начальная команда, которая ему дается, - выполнить команду, содержащуюся в строке 101 рабочего листа, и продолжать выполнять команды в том порядке, как они записаны на листе, до тех пор, пока он не дойдет до содержащейся на листе команды прекратить делать это. Он получит к тому же добрый совет пользоваться для записей только карандашом и иметь хорошую резинку для стирания; он должен использовать то небольшое место на рабочем листе, которое ему предоставлено, чтобы многократно делать соответствующие записи. (Читатель не должен пытаться доводить вычисления в данном примере до победного конца. Может, однако, оказаться полезным довести вычисления до получения двух уточненных приближений значения квадратного корня из 25.) Отметим важную роль, которую играет прямоугольник А. В сущности, это регистр, содержащий промежуточные результаты вычислений. Отметим также, что ни одна команда не содержит обращения более, чем к одному номеру строки. Команды, обладающие этим свойством, называются одноадресными.
Можно выполнять, например, сложения (для чего требуются два операнда), запоминая сначала один операнд в прямоугольнике A, затем прибавляя другой операнд к содержимому прямоугольника А и помещая снова сумму в прямоугольник А. Строки 121, 123 и 124 служат в качестве временных запоминающих регистров.
Указания по извлечению квадратного корня
(Рабочий лист)
Получите число через входную прорезь и запишите его в строку 121. Перенесите содержимое строки 122 в прямоугольник А. Перенесите содержимое прямоугольника А в строку 123. Перенесите содержимое строки 123 в прямоугольник А. Сложите содержимое строки 123 с содержимым прямоугольника А и запишите результат в прямоугольник А. Перенесите содержимое прямоугольника А в строку 124. Перенесите содержимое строки 123 в прямоугольник А. Умножьте содержимое прямоугольника А на содержимое строки 123 и запишите результат в прямоугольник А. Сложите содержимое прямоугольника А с содержимым строки 121 и запишите результат в прямоугольник А. Разделите содержимое прямоугольника А на содержимое строки 124 и запишите результат в прямоугольник А. Перенесите содержимое прямоугольника А в строку 124. Вычтите содержимое строки 123 из содержимого прямоугольника А и запишите результат в прямоугольник А. Запишите абсолютную величину содержимого прямоугольника А в прямоугольник А. Вычтите содержимое строки 125 из содержимого прямоугольника А и запишите результат в прямоугольник А. Если содержимое прямоугольника А больше нуля, переходите к строке 118. Поместите содержимое строки 124 в выходную прорезь. Стоп. Перенесите содержимое строки 124 в прямоугольник А. Перенесите содержимое прямоугольника А в строку 123. Перейдите к строке 105. 0. 1,0. 0. 0. 0,001.
Прямоугольник А
И, наконец, обратим внимание на то, что и команды, и: запоминание промежуточных результатов организованы таким образом, что использованный рабочий лист можно использовать снова. При втором и последующих использованиях прямоугольник А и строки 121, 123 и 124 содержат числа, не имеющие отношения к новой задаче. Последние, однако, не будут препятствовать новому циклу вычислений.
Здесь мы следуем почти повсеместно принятой практике программирования. В то время как в большинстве общественных туалетов имеется табличка, призывающая пользующихся ими оставлять туалет после себя в том же виде, какой он имел до использования, мы приняли прямо противоположное правило. Мы говорим: "Приведите рабочее пространство в то состояние, которое вы считаете необходимым для начала настоящей работы".
Мы всегда запоминаем "предыдущее приближение", например в строке 123. После использования рабочего листа эта строка содержит последнее "предыдущее приближение" последнего завершенного цикла вычислений. Новое вычисление, для которого последнее зафиксированное "предыдущее приближение" не имеет абсолютно никакого значения, начинается с переноса "1", нашего стандартного первого приближения, в строку 123 (см. строки 102 и 103).
Вычислительная процедура обсуждаемого нами типа называется стандартной программой, но почему это так, судя по всему, никому не известно. Мы говорим о начале подобного вычислительного процесса, как о входе в программу, завершив же выполнение последнего шага программы, говорим, что выходим из программы. Маленькие стандартные программы типа приведенной здесь редко используются интенсивно и как подпрограммы, и сами по себе. В самом деле, сколько раз может потребоваться знание квадратного корня некоторого числа вне рамок решения какой-то большей вычислительной задачи? Такой задачей может оказаться, например, вычисление корней квадратного уравнения вида ах2+bх+с=0. Искомые корни определяются с помощью следующей формулы:
В данном случае задача определения корней квадратного уравнения включает в качестве подзадачи вычисление квадратного корня из некоторого числа. Можно составить рабочий лист, очень похожий на предыдущий, который определит действия человека-вычислителя при решении задачи в целом. Однако, поскольку уже есть рабочий лист, указывающий порядок вычисления квадратных корней, разумнее предложить человеку, решающему большую задачу, использовать готовый рабочий лист при решении соответствующей подзадачи, когда он с ней столкнется, т. е. после вычисления величины (b2-4ас). Таким образом, стандартная программа вычисления квадратного корня становится подпрограммой большей стандартной программы. Естественно, эта большая стандартная программа может снова оказаться подпрограммой еще большей стандартной программы и так далее. Я снова подчеркиваю, что большая часть вычислительных машин и вычислений связаны с построением больших иерархических структур из меньших. Описанная стандартная программа извлечения квадратного корня может выполнять роль подпрограммы некоторой большей процедуры именно потому, что мы позаботились о том, чтобы она сама возвращалась в исходное состояние, т. е. приводила себя перед каждым использованием в надлежащий вид.
Проницательный читатель должен заметить, что я обошел молчанием проблему управления, которая несомненно будет преследовать нас, если наши слуги-вычислители в самом деле столь незатейливы, педантичны и лишены воображения при интерпретации подаваемых им команд, как мы описывали. Мы предположили (и будем настаивать на этом предположении), что служащий знает, как прибавить некоторое число, считанное из определенной строки, к содержимому прямоугольника A, как перенести сумму в прямоугольник A, как определить, больше нуля или нет некоторое число, содержащееся в прямоугольнике A, и так далее, - другими словами, он знает достаточно для того, чтобы интерпретировать и выполнять все команды, содержащиеся в рабочем листе процедуры извлечения корня. Но как проинструктировать кого-то, получившего аналогичную подготовку, но работающего с большими задачами, каким образом заключить "подконтракт" со своими подзадачами?
Можно избежать столкновения с этим вопросом, допустив, что вычислитель знает, как извлекать квадратные корни, так же, как мы допускаем, что ему известно, каким образом следует складывать и вычитать. Следует ли нам, однако, предполагать, что ему уже известно, как определяются корни квадратных уравнений? Если мы продолжим подобные допущения, то дойдем до предположения об отсутствии необходимости в вычислительных машинах вообще. В таком случае мы постулируем, что для составления рабочего листа, соответствующего какой угодно вычислительной процедуре, единственное, что требуется написать: "выполняйте процедуру". Можно считать что люди умеют складывать, вычитать и так далее. Если, однако, мы хотим, чтобы они выполняли более сложные задачи обработки символов, то необходимо описать им соответствующие процедуры в таких категориях, которые они уже понимают. С другой стороны, мы не хотим снова и снова описывать часто используемые процедуры. Каждая стандартная программа - это потенциально подпрограмма какой-то большей стандартной программы. Следовательно, написав однажды какую-то определенную стандартную программу, желательно ввести ее в некую библиотеку подпрограмм, из которой ее можно было бы при необходимости вызывать.
В каждой библиотеке существуют определенные правила заказа книг из книгохранилища: читатель заполняет бланк заказа, передаёт его библиотекарю и так далее. Наш случай, однако, требует несколько иного подхода, отличающегося от того, который практикуется в обычных библиотеках с выдачей книг на дом. Мы хотим, чтобы наши работники не только смотрели на рабочий лист, соответствующий заданной вычислительной задаче, но и выполняли работу. Допустим, повар довел приготовление блюда по какому-то рецепту до определенного состояния, а затем предпочел, чтобы специалист, воспользовавшись ингредиентами, уже приготовленными поваром, выполнил ту часть работы, которой он особенно славится. Повар мог бы отдыхать, пока работает специалист, и вернуться к своему занятию лишь после того, когда он передаст ему свое кулинарное произведение.
Предположим, что таких специалистов много. Каким образом повар передаст управление кухней именно нужному специалисту, как установит, что специалист использует именно необходимые ингредиенты, и где он обнаружит результаты работы специалистов? Вот один из способов выяснить все это.
Повар оставляет все ингредиенты, которые специалист должен использовать, в снабженных последовательной нумерацией шкафчиках: первый - в шкафчике 119, следующий - в 120 и так далее. В следующем после содержащего последний ингредиент шкафчике он оставляет номер помещения, в котором он будет находиться, пока специалист работает. На плите он оставляет номер того шкафчика, в котором находится первый ингредиент. И, наконец, повар нажимает на кнопку звонка, установленного в помещении специалиста, местонахождение которого ему известно.
Специалист прекрасно знает правила повара. Услышав звонок, он направляется на кухню, находит на плите номер шкафчика, содержащего первый ингредиент, и приступает к своим таинствам. Закончив, он оставляет блюдо на плите, звонит в помещение, адрес которого он находит в первом шкафчике, расположенном после шкафчиков, содержащих ингредиенты, и уходит.
Для работы этой системы необходимо лишь, чтобы повар и любой специалист, которого пригласят, знали условия. Повар должен точно знать, сколько ингредиентов требуется приглашенному специалисту (повару не хотелось бы, чтобы кто-нибудь, совершенно лишенный воображения, получил вместе с прочими ингредиентами записку с адресом повара), а также адрес специалиста, которого ему нужно пригласить.
Так же, как к нашему рабочему листу, можно обратиться к фактически идентичным правилам вызова подпрограмм.
Обратимся, например, к следующей части рабочего листа. Этот фрагмент - элемент другой большей стандартной программы. На шаге, к которому мы обращаемся, число, квадратный корень которого требуется найти, находится в прямоугольнике А. Данный элемент стандартной программы вызывает подпрограмму извлечения квадратного корня, обеспечивая в то же время возвращение управления к основной программе.
Перенесите содержание строки 680 в прямоугольник А. Замечание. Строка 680 содержит число, квадратный корень которого следует определить.
Перенесите содержание прямоугольника А в строку 512. Замечание. Строка 512-"шкафчик", в который помещен первый, в данном примере - единственный, ингредиент.
Перенесите число "512" в прямоугольник А.
Замечание. Прямоугольник А выполняет роль склада. Теперь специалисту следует сказать, где он должен начинать искать ингредиенты.
Начинайте работу со строки 98.
Замечание. Подпрограмма извлечения квадратного корня начинается со строки 98.
Замечание. Эта строка выполняет роль хранилища числа, из которого должен быть извлечен квадратный корень.
514.
Замечание. Эта строка содержит адрес строки, которой специалист должен передать управление после того, как он закончит свою работу.
Здесь помещается очередная команда большей программы.
Замечание. Когда эта команда появляется, значение квадратного корня числа, помещенного в строку 680, находится в прямоугольнике А.
Рабочий лист специалиста приведен выше. Однако придется модифицировать его, чтобы учесть рассматриваемые правила. Исходный рабочий лист предлагает работнику взять число, с которым он будет оперировать, из "входной прорези". Теперь номер строки, содержащей эту информацию, находится в прямоугольнике А. Итак, мы записываем:
Перенесите содержимое прямоугольник А на строку 126.
Перенесите содержимое строки, номер которой содержится в строке 126, в строку 121.
Замечание. Этот прием называется косвенной адресацией. Первоначально стандартная программа была подготовлена для работы с некоторым числом, содержащимся в строке 121. Этот способ позволяет обойтись без внесения изменений в стандартную программу.
Прибавьте 1 к содержимому прямоугольника А и поместите сумму в прямоугольник А.
Замечание. Исполнение команд, заданных строками 98 и 99, не повлияло на содержимое прямоугольника А. Поэтому прямоугольник А содержит теперь "513" - номер строки, вызывающей программы, содержащей адрес, по которому следует осуществить возвращение; в нашем примере в строке 513 содержится "514".
Перенесите содержимое прямоугольника А в адресную часть строки 117.
Замечание. Строка 117 представляла собой команду останова, но, как показано ниже, заменим ее. Поскольку все команды являются командами одноадресными, термин "адресная часть" применительно к командам однозначен.
Перепишем теперь строки 116 и 117 следующим образом.
Перенесите содержимое строки 124 в прямоугольник А
Замечание. Оставляем "блюдо", т. е. квадратный корень заданного числа в прямоугольнике А.
Начинайте работу со строки 0.
Замечание. Символ "0" в этой строке будет, конечно, заменен, как только будет выполнена команда строки 101; другими словами, замена будет производиться при каждом обращении к данной подпрограмме.
Моя цель заключалась в демонстрации одного из множества возможных способов вызова подпрограммы. Хотя приведенный здесь специфический способ работает, он не столь эффективен, как некоторые другие, и его не следует считать стандартным. Принципиальным является то обстоятельство, что некоторая стандартная программа, однажды написанная, может стать элементом какой-то большей стандартной программы. Эту большую стандартную программу можно снова рассматривать как некоторую подпрограмму еще большей стандартной программы и так далее. Одна из причин важности построения подобных вычислительных (т. е. предназначенных для обработки символов) структур заключается в том, что они освобождают разработчика большей системы высшего уровня от необходимости точно знать, каким образом (с помощью какого алгоритма) стандартная подпрограмма низшего уровня выполняет свои функции. Ему следует знать, как он может ее заполучить, в чем состоят правила ее вызова и какова функциональная связь ее выхода и входа. Таким образом, стандартная подпрограмма - это нечто напоминающее временами довольно сложный юридический документ, скажем, договор об аренде дома: вы заполняете все пробелы, подписываете его и отправляете. Все подписавшие такой документ справедливо считают, что юридические последствия именно таковы, какими они их считают.
Иногда, однако, начинаются неприятности из- за того, что вы полагаетесь на стандартные формы документов, "идея" которых как будто ясна, но текст, набранный мелким шрифтом, у вас не хватило времени прочесть. Ниже я остановлюсь на подобных обстоятельствах подробнее.
Человек, в обязанности которого входит составление различных рабочих листов описанного выше типа, быстро устанет из-за необходимости много писать. Довольно скоро он придумает сокращения. Никакая существенная информация не будет утрачена, если, например, строку
(103. Перенесите содержимое строки 123 в прямоугольник А)
исходного рабочего листа представить в следующем сокращенном виде:
(103. GET 123),
или если строку
(105. Прибавьте содержимое строки 123 к содержимому прямоугольника А и запишите результат в прямоугольник А)
представить в сокращенном виде:
(105. ADD 123)
[Прим. перев.: Как отмечает автор, в качестве сокращений использованы английские глаголы (GET - взять, ADD - прибавить); краткость написания этих глаголов позволяет использовать их в качестве сокращений без изменений. Мы увидим в табл. 3.1, что для обозначения операций используются и сокращения, образованные другими способами (части слов, согласные)]
Подобные сокращения (в сущности, это просто глаголы) можно придумать для всех операций, упоминающихся в исходном рабочем листе, и использовать их для кодирования процедуры в целом, как показано в табл. 3.1.
Процедура, закодированная таким образом, еще может быть прочитана человеком. Однако для нас важнее то, что подобный код превосходно читается вычислительной машиной. Неверно считать, что вычислительная машина не прочтет исходный рабочий лист, написанный по-английски. В конце концов мы убедились в том, что любой текст можно свести к цепочке из нулей и единиц. Но приведенный в табл. 3.1 код, взятый без соответствующего комментария, имеет жесткий формат и, следовательно, легко поддается декодированию. Каждая строка представляет одну команду для вычислительной машины, причем каждая команда состоит из двух частей: операции, подлежащей выполнению, например "ADD", и адреса операнда.
Прямоугольник А больше в явном виде не упоминается. Очевидно, что в прямоугольнике А к моменту, когда в нем возникает необходимость, содержится соответствующий, быть может, не упоминающийся операнд, а результат любой операции, скажем, сумма, полученная при сложении каких-либо чисел, заносится в него. С точки зрения вычислительной машины (противоположной точке зрения человека) этот код все еще чересчур пространен. Операционную часть кода
101 | INP121 | Возьмите из "ввода" число и перенесите его в строку 121 |
102 | GET 122 | Возьмите начальное приближение |
103 | STO123 | Введите его как "предыдущее приближение" в строку 123 |
104 | GET 123 | Возьмите "предыдущее приближение" |
105 | ADD 123 | Удвойте его |
106 | STO 124 | Перенесите "удвоенное предыдущее приближение" в строку 124 |
107 | GET 123 | Возьмите "предыдущее приближение" |
108 | MPY 123 | Умножьте его на него же |
109 | ADD 121 | Прибавьте к результату заданное число |
110 | DIV 124 | Разделите результат на "удвоенное предыдущее приближение" |
111 | STO 124 | Введите "новое приближение" в строку |
112 | SUB 123 | Вычтите "предыдущее приближение" из "нового приближения" |
113 | ABS | Возьмите полученный результат с плюсом |
114 | SUB 125 | Вычтите из последней величины значение допустимого отклонения |
115 | JGZ 118 | Если результат больше нуля, пропустите следующие два шага |
116 | OUT 124 | Передайте на "вход" новое приближение |
117 | STP | Стоп |
118 | GET 124 | Возьмите "новое приближение" |
119 | STO 123 | Перенесите его на место, занимаемое "предыдущим приближением" |
120 | JMP 105 | Вернитесь к началу "цикла" |
121 | 0 | Здесь должно храниться задаваемое число |
122 | 1,0 | Здесь должно храниться "первое предыдущее приближение" |
123 | 0 | Здесь должно храниться "предыдущее приближение" |
124 | 0 | Здесь должно храниться "новое приближение" |
125 | 0,001 | Здесь должно храниться значение допустимого отклонения |
команды, например ADD, можно заменить единственным символом размером в один байт. (Напомним, что существует 256 различных символов такого типа.) Единственное ограничение, которое вызывается этим обстоятельством, состоит в том, что нельзя рассчитывать более чем на 256 встречных операций, т. е. таких операций, которые не требуют представления исполнителю дополнительных объяснений. Операции такого рода называются непроизводными.
Продолжая перевод вычислительной процедуры нашего примера в машинный код, допустим, что код размером в один байт для команды ADD имеет вид "00110101". Таким образом, если длина некоторой команды, хранящейся в какой-то конкретной вычислительной машине, составляет четыре байта, т. е. 32 бита, то реальный машинный код для строки 105 рабочего листа будет иметь следующий вид:
00110101000000000000000001111011.
Вся стандартная программа в закодированном виде представляется массивом, состоящим из 25 подобных строк.
Мы проиллюстрировали, каким образом некоторую вычислительную задачу можно представить в виде процедуры, выполняемой людьми, и каким образом можно такую процедуру перевести в некоторую нотацию, которая, хотя и является зашифрованной, легко обрабатывается вычислительной машиной. Мы, однако, немного схитрили. Предписание, которым был снабжен наш верный слуга-вычислитель, предлагало ему выполнять команды, содержащиеся в рабочем листе, в том порядке, в котором они написаны, пока какая-то специальная команда не укажет ему, что следует изменить режим работы. Мы, естественно, предполагаем, что он понимает и знает, каким образом следует выполнять непроизводные операции, вызываемые командами рабочего листа. Но, кроме того, мы безмолвно подразумеваем, что он помнит ту позицию рабочего листа, с которой работает, даже тогда, когда занят выполнением, например, какой-то продолжительной процедуры деления. В действительности, организация в программе потока управляющих команд-это задача совершенно отдельная и отличная от задачи выполнения непроизводных операций.
Итак, в рабочий лист следует ввести еще один прямоугольник Р (для счетчика команд), в котором всегда содержится номер строки (т. е. адрес) выполняемой команды. В таком случае приходится назначать "координатора", его обязанность - сообщать исполнителю, в какой строке он может обнаружить соответствующую команду, т. е. строку, адрес которой хранится в прямоугольнике Р. Когда исполнитель сообщает координатору, что предписанная команда выполнена, тот прибавляет 1 к содержимому прямоугольника Р, фиксирует в нем новое значение счетчика и сообщает исполнителю очередное задание. В результате появления команды, нарушающей естественную последовательность управления, приходится заменять содержимое прямоугольника Р адресом той команды, очередь выполнения которой наступает. Например, в результате выполнения строки
(120. Переходите к работе со строкой 105)
исполнитель переносит число 105 в прямоугольник Р и немедленно приступает к выполнению команды, записанной в строке 105, не сообщая координатору о том, что он кончил выполнение предыдущей команды.
В реальных вычислительных машинах работа разделяется в еще большей степени. Существуют компоненты, обеспечивающие выполнение каждой из встроенных или непроизводных операций, которыми оснащена вычислительная машина. Эти компоненты, хотя и могут совместно использовать отдельные схемы, по существу независимы. Кроме того, имеются компоненты, обеспечивающие доступ к памяти вычислительной машины. Многие вычислительные машины оснащены небольшими специализированными вычислительными устройствами, единственным назначением которых является управление обменом информацией между вычислительной машиной и внешним миром.
Не будем останавливаться на подобных подробностях, поскольку это увело бы слишком далеко от наших главных задач. Я выделяю, однако, идею управления ходом выполнения программы, так как это действительно важная концепция. Обратите внимание на две линии, расположенные сбоку программы (см. табл. 3.1). Они иллюстрируют управление ходом выполнения программы или, иначе говоря, структуру данной программы.
Вообще говоря, интерес к столь маленькой программе определяется тем обстоятельством, что она включает условный переход. Совершает программа в процессе исполнения еще одну итерацию или нет, зависит от результата выполнения команды, содержащейся в строке 115. Если при появлении этой команды прямоугольник А содержит число, большее нуля, то осуществляется еще одна итерация. В противном случае, совершив еше несколько шагов, программа останавливается.
Способность вычислительных машин выполнять команды условного перехода, т. е. изменять последовательность управления в программах в зависимости от результатов тестов, осуществляемых над промежуточными результатами ими же выполненных вычислений, это одно из важнейших свойств вычислительных машин, поскольку всякую эффективную процедуру можно свести всего лишь к последовательности команд (т. е. высказываний типа "делайте это" или "делайте то"), перемежаемых командами условного перехода. Более того, требуются только бинарные команды условного перехода (вида "если то-то и то-то верно, то делайте это; в противном случае делайте то"). Если решение, устанавливающее истинность или ложность того-то и того-то, само предполагает реализацию сложных процедур, то его тоже можно представить с помощью команд и бинарных (предусматривающих два варианта разветвления) команд условного перехода.
Итак, мы сделали довольно точный эскиз, тем не менее всего лишь эскиз того, что представляет собой программа и каким образом вычислительная машина ее выполняет. В процессе обсуждения мы преобразовали очень многословный рабочий лист в весьма компактный код, а затем редуцировали и этот код, переведя его в жесткий формат цепочки бит. По ходу дела мы считали, что ни одно из этих усечений не сопровождалось потерей какой-либо существенной информации. Иначе говоря, цепочка из нулей и единиц, являющаяся конечным продуктом всех преобразований, означает то же самое, что и исходный рабочий лист. Чтобы установить, так ли это, следует выяснить, что означает каждый из них.
Что такое составленный нами рабочий лист? Для неграмотного человека он может означать возможность сделать бумажный самолетик, а для матери, думающей, что его составил ее десятилетний ребенок, он означает, что ребенок - будущий гений. В нашем контексте этот лист - некоторый набор команд. Следовательно, его значение для нас представляет собой определенное действие, выполняемое кем-то, понимающим эти команды, когда он им следует. Значением машинного кода в таком случае должна быть работа вычислительной машины, интерпретировавшей этот код в качестве команд и их выполняющей. Мы уверены в том, что знаем, как будет вести себя человек, выполняющий написанные на рабочем листе команды, поскольку они выражены на языке, понятном и ему, и нам. Что будет делать вычислительная машина, получив приготовленный нами код, полностью зависит от ее конструкции. Последняя определяет значение всякой цепочки из нулей и единиц, заданной вычислительной машине. Если определенная цепочка бит, сформированная нами, должна значить для вычислительной машины то же самое, что рабочий лист для вычислителя-человека, то вычислительная машина должна быть оснащена компонентами, функционально эквивалентными каждой из тех операций, которые мы предлагали выполнить вычислителю-человеку, и каждому из средств, предоставленных нами в его распоряжение.
Я очень тщательно следил за тем, чтобы при этом обсуждении, касающемся исполнителей, координаторов, прямоугольников А и Р и так далее, соответствующие средства и функции были бы аналогичны компонентам и функциям настоящих вычислительных машин. В самом деле, настоящие вычислительные машины действительно располагают прямоугольниками А - регистрами, называемыми накапливающими сумматорами, и прямоугольниками Р - регистрами, называемыми счетчиками команд. Настоящие вычислительные машины действительно хранят команды в последовательно пронумерованных регистрах и они действительно организуют управление примерно описанным способом. Современные вычислительные машины значительно сложнее и в структурном, и в функциональном отношениях, чем мой примитивный эскиз.
Но описанные фундаментальные принципы работы действительно служат отправной точкой для понимания даже современных вычислительных машин.
Говоря о машинах Тьюринга, я утверждал, что язык - это некоторая игра, реализуемая с помощью определенного алфавита и подчиняющаяся некоторому набору правил трансформации, олицетворением которых и является вычислительная машина. Это утверждение справедливо и для современных ЦВМ. Процедуры, как мы убедились, могут быть закодированы цепочками бит, формат которых определяется рядом особенностей конструкции той вычислительной машины, для которой они предназначены. Словарь непроизводных элементов, доступный программисту, определяется операциями, встроенными в вычислительную машину. Например, какая-то конкретная вычислительная машина оснащена встроенной функцией извлечения квадратного корня в качестве одной из ее непроизводных операций. В языке, сопоставленном этой вычислительной машине, будет содержаться код операции, соответствующий этой функции, т. е. глагол, означающий "взять квадратный корень". В языке, определенном какой-то другой вычислительной машиной, у которой "взять квадратный корень" не входит в ее набор непроизводных операций, функцию извлечения квадратного корня можно реализовать только с помощью некоторой подпрограммы, т. е. некоторого глагольного оператора, составленного из более элементарных термов.
Я снова хочу подчеркнуть, что любая вычислительная машина определяет некоторый язык - свой машинный язык. Во всех современных ЭВМ машинные языки основаны на алфавите, который представляет собой множество, состоящее из двух символов - 0 и 1. Словари же и правила трансформации этих языков имеют множество вариаций.
Работают ли в таком случае программисты вычислительных машин на языке машины, для которой они составляют программу? Другими словами, неужели они действительно формируют сложные процедуры на языке длинных цепочек бит? Мы убедились в том, что нетрудно преобразовать выражение (ADD 123) непосредственно в цепочку бит
00110101000000000000000001111011.
Вычислительная машина - это превосходное устройство для обработки символов. Довольно просто сформировать процедуру, преобразующую некоторую программу типа приведенной в табл. 3.1 в соответствующую цепочку бит. В действительности подобные процедуры можно приспособить для выполнения вполне "земных", но часто отнюдь не тривиально простых учетных задач, например, таких, как точное задание распределения памяти.
Программы, выполняющие работу такого рода, т. е. перевод программ, записанных с помощью представленной в табл. 3.1 нотации, на машинный язык, называются ассемблерами. Язык, на котором записана преобразуемая программа, и с которого осуществляется трансляция, называется языком ассемблера.
Людям, естественно, значительно легче читать программы, написанные на языке ассемблера, чем на машинном. Поскольку ассемблеры сами по себе являются довольно сложными программами, их также пишут на языке ассемблера-на том, который они сами транслируют. В этом вовсе нет никакого парадокса. Ассемблер представляет собой некоторую процедурную реализацию точно определенных правил, указывающих, каким образом следует преобразовывать выражения, сформированные на основе какого-то определенного алфавита, в выражения, основанные на много более ограниченном алфавите. Следовательно, ассемблер определяет некоторый язык - свой язык ассемблера. Поскольку ассемблер предназначен для перевода любого допустимого текста, написанного на языке ассемблера, на машинный язык, нет ничего таинственного в его способности транслировать с тем же успехом и текст, являющийся его собственным определением.
Я указывал выше, что программа преобразует вычислительную машину в некоторую другую вычислительную машину. Универсальная вычислительная машина, загруженная, например, только программой извлечения квадратного корня, преобразуется в специализированную вычислительную машину, способную вычислять исключительно квадратные корни. Ассемблер, таким образом, также преобразует ту вычислительную машину, в которую он загружен.
Это преобразование, вызываемое ассемблером, имеет важное следствие: программист, составляющий программу для вычислительной машины, пользуясь исключительно ассемблером, совершенно не должен изучать язык, определяемый самой вычислительной машиной - ее машинный язык. Существенно, что в каком-то смысле он никогда не видит той машины, с которой он в действительности имеет дело; он видит некоторый символьный артефакт, который для него и есть машина, и работает с ним.
Программистам не потребовалось много времени, чтобы осознать следующее: возможности вычислительной машины при обработке символов можно использовать и для трансляции языков еще более "высоких уровней". Обратимся, например, к следующему отрывку текста на языке ассемблера:
GET a
ADD b
STO с
Располагая даже теми минимальными сведениями, которые были изложены ранее, можно понять, что этот отрывок представляет собой закодированное алгебраическое выражение с=а+b.
Очевидно, что чрезвычайно простая процедура обеспечит трансляцию алгебраического выражения в приведенный выше отрывок текста на языке ассемблера. Теперь, не обращая особого внимания на детали, можно сказать, что следующий ниже фрагмент представляет закодированную процедуру извлечения квадратного корня, которой мы уже посвятили так много времени.
Процедура SQRT (n):
Возьмите допустимое отклонение = 0,001;
Возьмите предыдущее приближение = 0;
Возьмите новое приближение = 1;
До тех пор пока |предыдущее приближение - новое приближение| > допустимого отклонения,
делайте:
предыдущее приближение=новое приближение;
новое приближение = (предыдущее приближение ** 2 + n ) / 2 * предыдущее приближение;
Конец;
Результат = новое приближение;
Конец процедуры SQRT.
[Прим. перев.: Название процедуры извлечения корня SQRT - аббревиатура, образованная на основе соответствующего английского термина]
Трансляция этой процедуры на язык ассемблера осуществляется сравнительно просто. В сущности на нескольких предыдущих страницах мы именно этим и занимались.
Значительно труднее, однако, написать процедуру, обеспечивающую трансляцию на язык ассемблера любой программы, записанной на языке, одним из примеров которого служит приведенный выше текст. С первого взгляда может показаться, то эта трудность возникает в связи с явной сложностью данного языка по сравнению с предельной простотой языков ассемблера. Верно, что программа-транслятор должна иметь возможность оперировать с очень большим разнообразием синтаксических форм, многие из которых, особенно при появлении в различных комбинациях, являются источником действительно сложных технических проблем. И все же не эти проблемы вызывают наибольшие затруднения.
Что имеют в виду, когда говорят о предъявленной процедуре как об "образце текста" некоторого языка? Какого языка? Первоочередной и намного более сложной является задача просто построения языка "более высокого уровня". Правила образования и трансформации некоторого языка (так же, как и игра) являются в конечном счете настолько же системой ограничений, запретов, насколько и системой разрешений. Сам факт, что основные строительные элементы, используемые при разработке программ на языке ассемблера, предельно элементарны, обеспечивает программисту колоссальное число степеней свободы. Фактически язык ассемблера для некоторой конкретной машины - это мнемоническая транслитерация [Прим. перев.: Транслитерация - передача текста, написанного с помощью одной алфавитной системы, средствами другой алфавитной системы] ее машинного языка. Следовательно, разработчик языка ассемблера вряд ли сталкивается с проблемами значения. Разработчик же языка более высокого уровня должен определить характер и число степеней свободы, предоставляемых авторам, пишущим программы на этом языке. Каждая степень свободы, используемая автором некоторого выбора, - это в самом прямом смысле узурпация степени свободы программиста, который вынужден использовать результат этого выбора. Рассмотрим очень простой пример: d=a+b*с, где "*"-оператор умножения.
Программист может написать на ассемблере либо
GET а
ADD b
MPY c
STO d
что означает умножение с на сумму а и b и запоминание результата в а, либо
GET b
MPY с
ADD a
STO d
что означает сложение а с произведением b и с и запоминание соответствующей суммы в d. Высказывание на языке более высокого уровня, т.е. d=a+b*с, может иметь только одну интерпретацию, которая должна быть определена особенностями конструкции транслятора, следовательно, разработчиком языка. Естественно, это неэквивалентно утверждению, что экспрессия [Прим. перев.: Экспрессия (лингв.) - выразительно-изобразительные качества речи, отличающие ее от обычной (или стилистически нейтральной) и придающие ей образность и эмоциональную окраску] языка высшего уровня неизбежно ограничена. Язык может, например, допускать две различные интерпретации, представляемые выражениями d=(a+b)*с и d=a+(b*с) соответственно.
Проблема, хотя этот чрезвычайно простой пример лишь едва затрагивает ее, заключается не В том, какие процедуры поддаются представлению на языке высшего уровня (большинство подобных языков на самом деле универсальны в тьюринговском смысле), а в том, какой стиль программирования определяет язык. Эйбрахам Маслоу, психолог, заметил как-то: "Человеку, не имеющему ничего, кроме молотка, весь мир кажется гвоздем". Язык - это тоже своего рода инструмент, и он тоже, в действительности очень сильно, определяет то, каким представляется мир носителю языка.
Программист-одиночка, пишущий программу для решения задачи, сугубо относящейся к его конкретной исследовательской проблеме, мало заботится о том, каким образом его программа могла бы структурировать чье бы то ни было, кроме его собственного, представление о мире. Языки высшего уровня, однако, в двух очень важных отношениях предназначены в чрезвычайно значительной степени для роли языков общественных: для использования очень многими программистами в качестве языков, с помощью которых они программируют свои машины, а также в качестве языков, с помощью которых авторы могут представлять друг другу созданные ими процедуры.
На самом деле успех конкретного языка программирования высшего уровня оценивается в основном, так сказать, тем, насколько он доминирует на рынке, т. е. в какой степени из-за него оказались забытыми конкурирующие способы выражения.
Вся история развития наук о поведении в последнее время показывает, какое глубокое влияние успехи применения математики в физике оказали на дисциплины, достаточно далекие от физики. Множество психологов и социологов десятилетиями обсуждают свои проблемы, пользуясь, например, языком дифференциальных уравнений и статистики. Вначале они могли считать привлекаемые ими исчисления просто удобной системой стенографии для описания тех явлений, с которыми они имели дело. Однако по мере того, как они на основе элементов, заимствованных первоначально из чужеродных сфер, строили все более сложные концептуальные системы, давали им названия и обращались с ними как с элементами еще более развитых систем мышления, эти концептуальные схемы перестали служить исключительно способами описания и превратились подобно молотку Маслоу в детерминанты их мировоззрения. Таким образом, создание массового языка - это серьезная задача, чреватая целым рядом последствий и обремененная, следовательно, исключительно высокой ответственностью. Позже я вернусь еще к этой проблеме.
Сейчас я хотел бы обратить внимание на то, что язык, программирования высшего уровня типа представленного предыдущим фрагментом - это, по существу, формальный язык. Значения написанных на нем выражений определяются, естественно, его правилами трансформации, которые, в свою очередь, реализованы в процедурах, переводящих их на язык ассемблера и в конечном счете на машинный язык. Следовательно, если необходимо указать значение определенной программы, написанной на языке высшего уровня, то придется в конечном счете обратиться к ее представлению на машинном языке и даже к соответствующей вычислительной машине. Ответ будет следующим: "Эта программа значит то, что данная вычислительная машина делает с данным кодом".
Однако практически на такие вопросы подобным образом не отвечают. Дело в том, что транслятор сам является некоторой программой и, следовательно, преобразует вычислительную машину, которая им снабжена, в совершенно другую вычислительную машину, а именно в такую, для которой данный язык является ее машинным языком. Существует, таким образом, не только эквивалентность формальных языков и абстрактных игр, но и эквивалентность формальных языков и вычислительных машин. Иначе говоря, существуют важные сферы рассуждений, в которых исчезают различия между языками и их машинными реализациями.
Чтобы эта мысль не казалась замечанием "чисто" философского характера, имеющим небольшое практическое значение, я должен немедленно отметить, что большинство сегодняшних программистов не только действительно рассматривает используемые ими языки как соответствующие машины (буквально так), но многие, может быть большинство из них, не имеют никакого понятия о машинном языке своей вычислительной машины и о характере и структуре трансляторов, служащих посредниками между ними и их вычислительными машинами. Я говорю это не в осуждение. В конечном счете формальный язык высшего уровня - это некоторая абстрактная машина. Не следует обвинять человека за то, что он пользуется языком или машиной, в большей степени соответствующей его задачам, чем какая-то другая машина, только потому, что первая в каком-то отношении проще. Наше наблюдение, однако, поднимает одну важную проблему: если сегодняшние программисты в основном незнакомы с подробностями структуры используемых ими реальных машин, языков и трансляторов, обрабатывающих составленные ими программы, то им также, в основном, должны быть неизменны аргументы, которые я здесь приводил, и, в частности, аргументы, относящиеся к универсальности вычислительных машин и природе эффективных процедур. Как же тогда эти программисты осознают мощь вычислительной машины?
Их убежденность в том, что вычислительная машина может, так сказать, все, т. е.
их правильное интуитивное представление о том, что доступные им языки в некотором нетривиальном смысле универсальны, проистекает в основном из их представления о возможности запрограммировать любую процедуру, если она им вполне понятна. Последнее основывается на их опыте, подтверждающем богатые возможности подпрограмм и сводимость сложных процессов принятия решений к иерархиям двоичных выборов (предусматривающих разветвление на два варианта).
Подпрограмма - это, как я отмечал, такая программа, для понимания связи входа и выхода которой мы не обязаны понимать, каким образом задаваемые входные данные преобразуются в ней в данные, воспроизводимые на выходе. Программист, сталкиваясь с трудной подзадачей, всегда может рассчитывать для ее решения на существование соответствующей стандартной подпрограммы. Возможно, он обнаружит ее в какой-нибудь библиотеке программ. Но даже если ему не удастся найти подпрограмму, он может заняться этой подзадачей после того, как разработает стратегию решения своей основной задачи. Если, скажем, основная задача - создание программы, позволяющей вычислительной машине играть в шахматы, то несомненно потребуется подпрограмма выбора хода при заданных расположении фигур на доске и указании, кому ходить - белым или черным. Входом подобной подпрограммы должно являться некоторое представление положения фигур на шахматной доске и, скажем, "0" (при ходе белых) или "1" (при ходе черных). Выходом этой подпрограммы будет конфигурация фигур, воспроизведенная с помощью того же представления, что и входная конфигурация. После того как программист выбрал подходящие представления, что может оказаться также нетривиальной задачей, он вполне может "пользоваться" подпрограммой порождения хода в процессе дальнейшей разработки основной программы так, как если бы указанная подпрограмма уже существовала. Если он - член какой-то группы программистов, то вполне может описать искомую взаимосвязь входа и выхода подпрограммы своему коллеге, который затем эту подпрограмму и напишет.
В любом случае он может продолжить свой стратегический анализ и даже программирование основной задачи, не держа постоянно в голове подробности, относящиеся к низшим уровням.
Я уже отмечал, что и вычислительные машины и вычислительные процессы конструируются по принципу: большие объекты - из меньших. Подпрограммы дают в некотором смысле возможность с тем же успехом утверждать обратное. Дело в том, что с их помощью очень большие и сложные задачи можно разбивать на меньшие, каждую из них на еще меньшие и так далее. Иначе никто не решился бы взяться за решение столь грандиозных задач, как организация управления воздушным движением с помощью вычислительных машин или моделирование на вычислительной машине деятельности крупных предприятий. Конечно, далеко не нова идея решения задачи посредством разделения ее на меньшие и решения последних разделением и так далее. До пришествия вычислительных машин, однако, гигантские иерархические системы решения задач должны были полагаться на людей, реализующих планы генеральных стратегов. Люди же, в отличие от вычислительных машин, не вполне надежные исполнители даже наиболее точных инструкций.
Ощущение могущества, которое испытывает программист ЭВМ, порождается главным образом его уверенностью в том, что его команды будут безусловно выполнены, а его способность создавать произвольно большие программные структуры снимает ограничения по крайней мере с размера тех задач, которые он может решать.
Наконец, я могу истолковать то ошибочное впечатление, которое, несомненно, вызвало одно место в начале гл. 2: "Машины делают только то, для чего они предназначены, и делают они это точно". Теперь нам известно, каким образом можно проинструктировать машину для выполнения различных операций. Если отнестись серьезно к утверждению, что программа преобразует одну вычислительную машину в другую, то теперь понятно, каким образом можно "заставить" машину сделать что-то. Однако может создаться впечатление, что программы обязательно имеют вид (иногда несколько замаскированный) последовательности команд, которые должны выполняться более или менее последовательно.
Я уже приводил противоположные свидетельства. Наборы из пяти элементов, определяющие поведение классической машины Тьюринга, не должны ни иметь какого-то специфического упорядочения, ни выполняться последовательно. Типичные пять элементов такого рода, представленные в форме правила некоторой игры, выглядят так: "Если вы находитесь в состоянии u и символ, который вы в данный момент считываете, - х, то поступайте следующим образом ... ".
Машина Тьюринга буквально ищет на своей ленте правило, применимое к текущей ситуации. Порядок, в котором эти правила записаны, не имеет никакого отношения к результирующим характеристикам "вход - выход" машины.
В этой связи следует сделать два важных замечания. Первое относится к идее поиска правила. Машина Тьюринга осуществляет линейный поиск применимого правила. Информация на ее ленте размещена в линейном порядке. Однако на современных вычислительных машинах реализуются и иные режимы поиска. Можно, в частности, написать программы, предназначенные для "вычисления" правил поиска. Следовательно, точно так же, как программист может знать процедуру вычисления квадратных корней чисел и не знать значения квадратного корня некоторого конкретного числа, не говоря уже обо всех числах, которые можно ввести в его процедуру, он может знать, каким образом задается конструкция правила поиска, но не знать ни одного из тех правил, которые соответствующая конструкция может порождать. Вычислительная машина, следующая правилам, которые она отыскала, реализовав вычисленный указанным образом режим поиска, действительно делает только то, что ей было предписано делать. Это "предписывание", однако, является по крайней мере одним (возможно, и много большим числом) шагом, уводящим от первоначального "предписывателя", т. е. программиста. Ниже я вернусь к значению этого обстоятельства.
Второе замечание связано с тем, каким образом правила, отдаленно напоминающие пять элементов машины Тьюринга, можно задавать вычислительной машине.
Очевидно, что правила можно ввести в виде программ приведенного выше вида. Оставим на время вычислительные машины и посмотрим, как человек попытается ответить на вопрос: "Чему равна площадь блюда?". В первую очередь он предположит, что блюдо, о котором его спрашивают,-последнее упоминавшееся блюдо. Поэтому он начнет искать в своей памяти последнее упоминание о блюде. Если упоминание имело вид: "Площадь блюда такая-то", он сможет быстро ответить на вопрос. В противном случае он начнет искать в своей памяти утверждения вида "площадь того-то и того-то равна...", т. е. какие-нибудь хранящиеся в ней сведения о том, как отвечают на вопросы о площади чего бы то ни было. Допустим, он находит утверждение: "Площадь круга равна квадрату радиуса круга, взятому пи раз". Он может подумать: "Если у блюда есть радиус, оно может иметь форму круга и тогда можно применить это правило". Если окажется, что последнее упоминание о блюде "радиус блюда равен 10", то дальнейшее очевидно. Ниже приведен текст записи "беседы" с вычислительной машиной, проведенной с помощью пульта управления, оборудованного электрической пишущей машинкой (строки, напечатанные только прописными буквами, являются ответами вычислительной машины) 1 [Прим. перев.: Мы приводим здесь перевод этого текста, поскольку он сохраняет смысл реплик и тем самым познавательную ценность данного примера].
Площадь круга равна квадрату его радиуса, умноженному на пи.
Площадь шара равна квадрату его диаметра, умноженному на пи.
Площадь квадрата равна длине его стороны в квадрате.
Диаметр некоторого объекта равен удвоенному радиусу этого объекта.
Радиус мяча равен 10. Чему равна площадь поверхности мяча?
ДОПУЩЕНИЕ О ТОМ, ЧТО МЯЧ - ЭТО КРУГ, ЛОГИЧНО;
СЛЕДУЕТ ЛИ МНЕ ПРОДОЛЖАТЬ?
Нет.
ДОПУЩЕНИЕ О ТОМ, ЧТО МЯЧ - ЭТО И ШАР, И ОБЪЕКТ, ЛОГИЧЕСКИ НЕПРОТИВОРЕЧИВО; СЛЕДУЕТ ЛИ МНЕ ПРОДОЛЖАТЬ?
Да.
ПЛОЩАДЬ ПОВЕРХНОСТИ МЯЧА РАВНА 1256,6359.
Чему равен диаметр мяча?
ОН РАВЕН 20.
Радиус блюда равен 10.
Чему равна площадь блюда?
ДОПУЩЕНИЕ О ТОМ, ЧТО БЛЮДО - КРУГ, ЛОГИЧЕСКИ НЕПРОТИВОРЕЧИВО; СЛЕДУЕТ ЛИ МНЕ ПРОДОЛЖАТЬ?
Да.
ПЛОЩАДЬ БЛЮДА РАВНА 314,15899.
Радиус глобуса равен 10.
Глобус - это шар.
Шар - это объект.
Чему равна площадь поверхности глобуса?
ОНА РАВНА 1256,6359.
Длина стороны тарелки равна 10.
Чему равна площадь тарелки?
ДОПУЩЕНИЕ О ТОМ, ЧТО ТАРЕЛКА - КВАДРАТ, ЛОГИЧЕСКИ НЕПРОТИВОРЕЧИВО; СЛЕДУЕТ ЛИ МНЕ ПРОДОЛЖАТЬ?
Да.
ПЛОЩАДЬ ТАРЕЛКИ РАВНА 100.
Когда я говорю "прибор", я имею в виду тарелку.
Чему равна утроенная длина стороны прибора?
ОНА РАВНА 30.
Пожалуйста, назовите ее "х".
Пусть f(x) равняется "x" в квадрате минус "х".
Вычислите значение f(x).
ОНО РАВНО 870.
Программу, побуждающую вычислительную машину выполнять эти действия, лучше рассматривать не как набор команд вида "если так, то делай так", а как совокупность приемов установления фактов. Эти правила используются для того, чтобы установить, каким образом утверждения, которые можно вводить в машину, соотносятся с теми вопросами, которые ей могут быть заданы. Следовательно, поведение вычислительной машины определяется задаваемыми ей утверждениями (например, "глобус - это шар") в той же мере, что и ее командами.
Часто повторяемый трюизм, что вычислительная машина может делать только то, что ей сказано делать, оказывается, таким образом, подобно большинству трюизмов, касающихся сложных вопросов, по меньшей мере, проблематичным. Существует много способов "сказать" что-то вычислительной машине.
Столь же проблематична идея о том, что можно написать программу, реализующую все, что вы "полностью понимаете". Понимать что-то всегда - значит понимать это на некотором определенном уровне. Актуарий [Прим. перев.: Актуарий - специалист-статистик, работающий в области страхования] использует довольно сложные математические средства, обоснования которых он почти наверняка не понимает или они его совершенно не интересуют.
Всякий, разменивающий деньги, использует арифметику, но лишь очень немногие знают или интересуются великолепной системой аксиом, положенной в основу арифметики. В сущности, все мы постоянно пользуемся подпрограммами, соотношение входа и выхода которых мы считаем известным, а детали их устройства нас не интересуют и мы редко о них задумываемся. Понимать что-то достаточно хорошо, чтобы быть в состоянии составить соответствующую программу для вычислительной машины, не значит понимать проблему глубоко. В практической деятельности невозможно добиться исчерпывающего понимания. Программирование является скорее неким тестом на понимание. Оно напоминает в этом отношении письменное изложение; часто, когда мы считаем, что понимаем какую-то проблему и пытаемся описать ее, сам процесс написания обнаруживает недостаточность этого понимания даже перед нами самими. Наше перо выписывает слова "потому что" и неожиданно замирает. Мы думали, что понимаем "причину" какой-то проблемы, но обнаружили, что не понимаем ее. Мы начинаем предложение с "очевидно" и убеждаемся в том, что то, что мы собирались написать, совсем не очевидно. Иногда мы соединяем две части предложения словом "следовательно", но затем видим, что цепь наших рассуждений ошибочна. В программировании дело обстоит подобным же образом. В конечном счете, программирование - это тоже письменное изложение. Но дело в том, что в ординарном случае, излагая свои мысли на бумаге, мы иногда скрываем недостаточность понимания и логические несообразности, неосознанно используя безмерную гибкость естественного языка и его неотъемлемую неоднозначность. Именно это обилие выразительных средств естественного языка позволяет иногда расцвечивать речь и создает впечатление (естественно, ложное), что оно способно столь же блестяще представлять нашу недостойную логику.
Вычислительная машина, интерпретатор написанных на языках программирования текстов, обладает иммунитетом к соблазнам чистой риторики. Слов же типа "очевидно" нет в словарях непроизводных элементов любой вычислительной машины.
Вычислительная машина - безжалостный критик. Поэтому утверждение о том, что вы понимаете проблему достаточно хорошо для ее запрограммирования, является прежде всего утверждением о том, что вы понимаете эту проблему применительно к очень конкретным обстоятельствам. Во всяком случае, это может оказаться просто хвастовством, которое легко разоблачить эмпирически.
Обратная сторона медали - уверенность в том, что невозможно запрограммировать проблему, если вы не понимаете ее как следует. При этом игнорируется тот факт, что программирование аналогично любой форме письменного изложения: это, скорее, эмпирическая, чем не эмпирическая деятельность. Вы программируете так же, как пишете, не потому, что понимаете, но для того, чтобы понять. Создание программы - творческий акт. Написать программу - значит обнародовать законы для мира, который вы сначала должны создать в своем воображении. И очень редко творец, кто бы они ни был - архитектор, романист или кто-то еще, обладает столь связной картиной мира, возникающего в его воображении, что ему удается создать законы этого мира, избежав критики с его стороны. Именно ее и может обеспечить вычислительная машина.
Критикой, естественно, следует уметь пользоваться. Во многих случаях "критика" ЭВМ имеет очень резкий характер и ее нельзя игнорировать: программа вообще не работает или выдает явно неправильные результаты. В таком случае ясно, что что-то необходимо изменить. Вычислительные машины весьма эффективны в обнаружении чисто технических, т. е. лингвистических, программистских, ошибок, но испытывают затруднения там, где нужно выявить скрытую причину неприятностей, например, установить, какая именно скобка поставлена неправильно. В самом деле, многие программисты считают свое ремесло трудным из-за того, что им приходится иметь дело с языками, обладающими жесткими синтаксическими правилами. Поэтому раздаются настойчивые требования создать системы программирования на естественном, например английском языке. Программисты, придерживающиеся такой точки зрения, вероятно, никогда не имели дела с действительно трудной задачей и.
следовательно, не испытывали потребности в самой серьезной критике со стороны вычислительной машины. Верно, что прежде, чем начинать писать, следует сначала выучить синтаксические правила выбранного языка. Кроме того, нужно тщательно продумать то, что вы собираетесь выразить. Литературная критика не сводится к выискиванию ошибок произношения и технических нарушений правил грамматики, ее задача - решение более существенных проблем. Литературный критик должен много знать.
Истинная причина чрезвычайной трудности программирования заключается в том, что во многих случаях вычислительной машине ничего не известно о тех аспектах реального мира, с которыми ее программа должна иметь дело. Она находится в положении, скажем, учителя английского языка, которого снабдили наставлением для пилота самолета и оставили одного за рычагами управления самолета посреди чистого неба. Он может иметь очень высокую квалификацию специалиста в области грамматики, но о том, как пилотировать самолет, не знать ничего. Поэтому наставление лучше составить в терминах, достаточно элементарных для того, чтобы даже не имеющий никакого отношения к авиации школьный учитель смог бы его понять. Хотя намного легче было бы писать наставление пилоту, рассчитанное на специалиста в области аэродинамики, который тоже не умеет пилотировать самолет, но знает теорию полета. Очень сложно на самом деле объяснить что-нибудь в терминах словаря непроизводных элементов, не имеющего ничего общего с тем, что должно быть объяснено. Тем не менее большинство программ составляется именно так. Возникающие трудности связаны с синтаксической жесткостью не в большей степени, чем, например, трудность написания хорошего сонета сопряжена с твердостью формы, предписываемой этой стихотворной формой. Чтобы написать хороший сонет или хорошую программу, необходимо знать, что вы хотите сказать. При этом полезно, чтобы у критика и у вас была общая база знаний по соответствующей проблеме.
Мы познакомились с программой, частично состоящей из утверждений, заданных на естественном языке.
Их можно сообщать программе в разное время, и набор утверждений может, следовательно, разрастись до очень больших размеров. В таком стиле в определенном смысле программировать проще, чем в обычно используемой более ортодоксальной манере. С помощью подобных методов программирования можно встраивать в вычислительную машину базу знаний. Такая система программирования показывает, что можно обойти жесткость формы, сопутствующую обычно программированию.
Не следует, однако, слишком полагаться на это. Перечень основных физических формул поможет нерадивому студенту решить массу задач из учебника по физике, но не даст ему тем не менее понимания физики-теории, которую он смог бы осмысливать. Точно так же набор утверждений типа приведенных нами позволит вычислительной машине решать некоторые задачи. Это, однако, никоим образом не свидетельствует о владении программистом или вычислительной машиной теорией или понимании ими чего-нибудь, выходящего за пределы способа использования набора "фактов", приводящего к получению определенных выводов. Правильная работа вычислительной машины часто рассматривается как свидетельство понимания ею или человеком, составившим для нее программу, теории, положенной в основу работы вычислительной машины. Подобное заключение не является само собой разумеющимся и чаще оказывается совершенно ошибочным. Связь между пониманием и написанием остается для программирования такой же проблематичной, какой она всегда была для любой иной формы письменного изложения.