Насосы интуиции и другие инструменты мышления Деннетт Дэниел
Большая часть нашей манифестной картины мира не записана в нашем генетическом коде, а каким-то образом сформирована в раннем детстве. Слова для нас – очень важная категория сущего. Они выступают в качестве проводников манифестной картины мира, но вполне возможно, что способность классифицировать некоторые события мира как слова и желание говорить хотя бы отчасти генетически унаследованы – подобно способности птицы на лету ловить насекомых или желанию осы строить гнездо. Даже в отсутствие грамматики, которая связывает их в предложения, слова могут использоваться в качестве ярлыков, помогающих создать категории внутри манифестной картины мира: мама, песик, печенье. Могли бы вы сформулировать ясный образ халявы, ошибки или обещания – не говоря уже об оглушительном успехе или холостяке, – не прибегая к помощи слов, которыми я только что их назвал? Изучив список любимых инструментов мышления Дага Хофштадтера, мы уже увидели, как термины структурируют и организуют наше сознание, обогащая наши личные манифестные картины мира вещами – пороховыми бочками, пустыми словами и обратной связью, – заметить которые в ином случае практически невозможно.
17. Народная психология
Вероятно, самым важным паттерном в рамках нашей манифестной картины мира следует считать паттерн народной психологии, который служит опорой для многих других значимых для нас категорий. Я предложил этот термин в его текущем значении в 1981 г., однако он, очевидно, и ранее появлялся в работах Вильгельма Вундта, Зигмунда Фрейда и других мыслителей (Volkspsychologie), где описывал определенную черту немецкого национального характера (дух немецкого народа – не будем в это углубляться). Как и многие другие, я этого не учел и предложил использовать термин “народная психология” для обозначения присущего каждому из нас таланта видеть в людях вокруг нас – а также в животных, и в роботах, и даже в ничем не примечательных термостатах – агентов, имеющих информацию о мире, в котором они функционируют (убеждения), и цели (желания), которых они стремятся достичь, и выбирающих наиболее рациональный порядок действий с учетом своих убеждений и желаний.
Некоторые исследователи предпочитают называть народную психологию “теорией сознания” (theory of mind), но этот термин кажется мне некорректным, поскольку он отметает вопрос о том, откуда у нас этот талант, наталкивая на мысль, что мы разработали и успешно применяем некоторую теорию. Подобным образом мы сказали бы, что у вас есть велосипедная теория, если вы умеете ездить на велосипеде, и теория питания, которая объясняет вашу способность не умирать с голоду и не есть песок. На мой взгляд, это не слишком удачный способ мыслить об этих навыках. Поскольку никто не возражает, что человек обладает талантом к интерпретации, но никто не знает точно, как ему удается быть настолько компетентным, думаю, лучше пока отказаться от слова “теория” и использовать несколько более нейтральный термин. Академическая, или научная, психология тоже занимается объяснением и прогнозированием сознания людей, и в рамках нее действительно существуют различные теории: бихевиоризм, когнитивизм, нейровычислительные модели, гештальтпсихология и др. Чтобы преуспеть в сфере народной психологии, нам не нужно традиционное образование. По аналогии, народная физика – это талант ожидать, что жидкости потекут, не имеющие опоры предметы упадут, горячие вещества обожгут нас, вода утолит нашу жажду, а под лежачий камень вода не затечет. Весьма интересен вопрос, каким образом наш мозг так легко генерирует все эти ожидания, которые почти всегда оказываются верными, даже если мы никогда не изучали физику.
Народная психология – это то, что “всем известно” о собственном сознании и сознании окружающих: люди чувствуют боль, голод и жажду и умеют отличать одно от другого, они помнят события прошлого, многое предугадывают, видят все на расстоянии видимости, слышат все на расстоянии слышимости, обманывают и обманываются, понимают, где они находятся, узнают друг друга и так далее. Уверенность, с которой мы делаем эти предположения, поражает, ведь на самом деле мы крайне мало знаем о том, что творится в головах у этих людей (не говоря уже о животных). Мы настолько уверены во всем этом, что нам приходится специально дистанцироваться от происходящего, чтобы вообще заметить, что мы это делаем.
Художники и философы соглашаются в одном: перед ними стоит задача “сделать привычное необычным”[18]. Великие проявления творческого гения заставляют нас вырваться из плена привычности и выпрыгнуть к новым горизонтам, где мы сможем взглянуть на знакомые, будничные вещи новыми глазами. Ученые совершенно с этим согласны. Моментом откровения для Ньютона стал тот миг, когда он задался странным вопросом, почему яблоко упало с дерева на землю. (“Почему бы ему не упасть? – спрашивает любой, кто далек от гениальности. – Оно ведь тяжелое!” Как будто такого объяснения достаточно!) Если вы зрячий, но общаетесь с несколькими слепыми друзьями, вероятно, вы подтвердите, что все равно время от времени указываете руками на вещи или очерчиваете контуры предметов перед их невидящими глазами, чтобы ваши друзья поняли то, что понимаете вы. “По умолчанию” в присутствии другого человека вы ожидаете, что вы оба видите одно и то же, слышите одно и то же, чувствуете одни и те же запахи. Вы едете по шоссе со скоростью девяносто километров в час и нисколько не переживаете по поводу машины, которая на той же скорости едет вам навстречу по соседней стороне дороги. Откуда вы знаете, что не случится аварии? Сами того не сознавая, вы предполагаете, что водитель (которого вы даже не видите и почти наверняка не знаете) хочет жить и знает, что для этого ему следует держаться правой стороны дороги. Обратите внимание, что вам стало бы гораздо тревожнее, если бы по радио сообщили, что в этот день на вашем шоссе тестируют новый беспилотный автомобиль. Да, он создан быть безопасным, и разработали его в Google, но вы гораздо более уверены в рациональности и компетентности среднего водителя-человека, чем в способностях хваленого робота (если только все это происходит не субботним вечером).
Откуда “все знают” народную психологию? Неужели это все-таки теория сознания, которую человек постигает в детстве? Можно ли сказать, что некоторые ее элементы мы знаем с рождения, или же мы учим ее полностью – но как и когда? В последние тридцать лет этим темам посвящалось огромное количество исследований. Я полагаю (даже после тридцати лет исследований), что это не столько теория, сколько практика – некий способ познания мира, настолько естественный для человека, что в нашей голове, должно быть, есть какая-то генетическая основа для него. Отчасти он постигается “с молоком матери”, поэтому, если бы вы выросли в полной изоляции от людей, в народной психологии вы бы не преуспели (и нажили бы множество других серьезных проблем), но человек испытывает сильное желание считать агентами объекты, которые двигаются беспорядочно (не как маятник или мяч, катящийся с горы). Мне нравится пример, который используется для демонстрации этого желания на вводном курсе психологии: в 1944 г. Фриц Хайдер и Марианна Зиммель создали короткий анимационный фильм (используя покадровую анимацию), где два треугольника и круг перемещаются по экрану, то заходя на огороженную территорию, то выходя обратно. Геометрические фигуры совсем не похожи на людей (или животных), но считать их взаимодействие лишенным смысла (purposeful) практически невозможно: нам кажется, что ими руководят вожделение, страх, смелость и гнев. Этот старинный фильм можно найти на многих сайтах, например на http://www.psychexchange.co.uk/videos/view/20452/.
Мы рождаемся с “детектором агентов” (Barrett 2000; см. также Dennett 1983), который заводится с пол-оборота. Когда он допускает ошибку, что часто случается в напряженных ситуациях, мы видим призраков, гоблинов, чертей, лепреконов, фей, гномов, демонов и подобных существ, хотя на самом деле это просто ветки, обрушившиеся стены или скрипящие двери (Dennett 2006a). С детских лет мы без труда и без отчета считаем других агентами, причем эти агенты не просто счастливы, рассержены, озадачены или испуганы, но посвящены в тайну, или гадают, куда свернуть, или даже не хотят принимать предлагаемые условия. Это не операция на мозге и не высшая математика – это просто. На мой взгляд, сила народной психологии и простота ее использования объясняются лежащими в ее основе упрощающими допущениями. Народная психология напоминает идеализированную научную модель – максимально абстрактную и свободную от всего лишнего. Я называю эту модель интенциональной установкой.
18. Интенциональная установка
Пока все просто. Почти все мы хороши в народной психологии[19]. У нас талант считать, что другие (как и мы сами) обладают сознанием, и обычно мы не прикладываем к этому усилий, как не прикладываем усилий к тому, чтобы дышать. Мы без всяких задних мыслей зависим от этого таланта, и он почти никогда нас не подводит. Почему народная психология дается нам так просто? Как она работает? Здесь нам стоит сделать паузу и возвести очередной уровень лесов, которые существенно облегчат нам жизнь, когда мы двинемся дальше.
Как работает народная психология? Чтобы разобраться в этом, посмотрим, как она работает, когда мы применяем ее не к людям. Допустим, вы играете в шахматы с компьютером. Вы хотите победить, и единственный способ приблизить победу – попытаться предугадать ответные ходы компьютера: “Если я пойду слоном, компьютер его съест; если же я пойду пешкой, компьютеру придется передвинуть ферзя…” Откуда вам знать, что сделает компьютер? Вы заглядывали в него? Изучали его шахматную программу? Конечно нет. Вам это и не нужно. Вы делаете уверенные предсказания на основе вполне очевидных допущений, что компьютер
1. “знает” правила и “умеет” играть в шахматы;
2. “хочет” победить, а также
3. “увидит” эти возможности, как видите их вы, и поступит соответствующим образом (то есть рационально).
Иначе говоря, вы считаете компьютер хорошим шахматистом – или, по крайней мере, не шахматистом-идиотом, играющим себе во вред. Иначе иначе говоря, вы обращаетесь с ним так, словно это человек, наделенный сознанием. И совсем иными словами, используя народную психологию, чтобы предвидеть и понимать его ходы, вы принимаете интенциональную установку.
Интенциональная установка – это стратегия интерпретации поведения объекта (человека, животного, предмета, чего угодно) в качестве рационального агента, который “выбирает”, как “действовать”, “руководствуясь” своими “убеждениями” и “желаниями”[20]. Пугающие кавычки, в которые заключены эти термины, привлекают внимание к тому факту, что ряд их стандартных коннотаций можно отбросить, чтобы использовать их главные характеристики – их роль в практическом мышлении, а следовательно, в предсказании поведения практических мыслителей. Все, что поддается эффективному и подробному предсказанию из интенциональной установки, по определению представляет собой интенциональную систему. Как мы увидим, множество удивительных и сложных объектов, не имеющих мозгов, ушей, глаз или рук, а следовательно, не имеющих сознания, все равно можно считать интенциональными системами. Главный фокус народной психологии, так сказать, находит применение и за пределами мира человеческого взаимодействия. (Мы увидим, как его применить не только в компьютерных технологиях и когнитивной нейронауке, но и в эволюционной биологии и биологии развития – и это только самые важные сферы.)
Я предлагаю просто отложить неудобный вопрос о том, что на самом деле обладает сознанием и представляет собой надлежащее вместилище для интенциональной установки. Каким бы ни был верный ответ на этот вопрос – если верный ответ на него вообще существует, – он не отменит того факта, что интенциональная установка прекрасно работает для предсказаний в других сферах и лишь немногим лучше функционирует в повседневной жизни, где мы применяем народную психологию при взаимодействии с другими людьми. Этот мой шаг раздражает некоторых философов, которые готовы бить тревогу, потому что им важно первым делом дать четкие определения сознанию, убеждению и желанию и лишь потом идти дальше. Определите термины, сэр! И не подумаю. Это преждевременно. Сначала я хочу изучить силу и спектр применения этого ловкого фокуса, интенциональной установки. Увидев, на что она годится и почему, мы сможем вернуться и спросить себя, нужны ли нам еще эти строгие, формальные определения. Я выбираю этот путь, чтобы раздробить сложную проблему, вместо того чтобы попытаться проглотить (и переварить) все разом. Многие инструменты мышления, о которых я расскажу в этой книге, хорошо помогают с дроблением задач, позволяя приблизительно нащупать несколько “фиксированных” точек и составить общее представление об очертаниях проблемы. В книге “Пространство для маневра” (1984a) я сравнил свой метод с работой скульптора, который сначала высекает в мраморе общую форму статуи, а затем работает осторожно, сдержанно, руководствуясь принципом последовательного приближения. Очевидно, многим философам этот способ не подходит – они предпочитают четко определить (по крайней мере, так им кажется) границы своих проблем и возможных решений, прежде чем выдвигать какие-либо гипотезы.
Давайте посмотрим, в чем заключается сила интенциональной установки, сравнив ее с тактикой прогнозирования. Начнем с определения трех основных установок (в рамках которых можно выделить подкатегории, но здесь нужды в этом не возникает): физической установки, конструктивной установки и интенциональной установки.
Физическая установка – это используемый в физических науках стандартный трудоемкий метод предсказаний, который предполагает применение всех известных нам законов физики и имеющихся данных о строении исследуемых объектов. Предсказывая, что выпущенный у меня из руки камень упадет на землю, я использую физическую установку. Как правило, физическая установка – единственная работающая стратегия для интерпретации неодушевленных нерукотворных объектов, однако, как мы увидим, существует ряд исключений. Любой физический объект, будь он создан природой или человеком, одушевлен или неодушевлен, подчиняется законам физики, а следовательно, его поведение, в принципе, может объясняться и прогнозироваться из физической установки. Неважно, что именно я выпускаю из руки – будильник или золотую рыбку, – я делаю одинаковое предсказание о падении этого предмета, опираясь на одинаковые основания. Обычно физическая установка не дает оснований предполагать, что будильник или золотая рыбка поведет себя более интересным образом.
Поведение будильников, которые представляют собой сконструированные объекты (в отличие от камней), также поддается прогнозированию более затейливым образом – прогнозированию из конструктивной установки. Допустим, я посчитал новый объект будильником. Я могу сделать вывод, что если я нажму несколько кнопок определенным образом, то через некоторое время будильник издаст громкий звук. Мне не нужно выводить конкретные физические законы, которые объясняют эту удивительную закономерность; я просто полагаю, что объект сконструирован особым образом – такие конструкции мы называем будильниками – и будет выполнять заявленную функцию. Прогнозы из конструктивной установки сопряжены с большим риском, чем прогнозы из физической установки, поскольку нам необходимо учитывать ряд дополнительных допущений:
1. что объект действительно сконструирован именно так, как я думаю, а также
2. что он будет функционировать в соответствии со своей конструкцией – иными словами, что он не даст сбой.
Иногда при конструировании объектов возникают ошибки, а иногда сконструированные объекты ломаются. Камень не может функционировать неправильно, поскольку его функция вообще не определена, а если он сломается надвое, в результате появятся два камня, а не один, расколотый пополам. Когда сконструированный объект относительно сложен (к примеру, цепная пила в сравнении с топором), умеренная цена риска более чем компенсируется невероятной простотой прогнозирования ее поведения. Никто не станет опираться на фундаментальные законы физики при прогнозировании поведения цепной пилы, имея в своем распоряжении удобную схему ее движущихся частей.
Еще более рискованной и изменчивой представляется интересующая нас интенциональная установка – подвид конструктивной установки, в котором сконструированный объект считается своего рода агентом, имеющим убеждения и желания и наделенным достаточной рациональностью, чтобы совершать необходимые действия на основании этих убеждений и желаний. Будильник так прост, что нам, строго говоря, нет нужды обращаться к этому затейливому антропоморфизму, чтобы понять, почему он ведет себя именно так, а не иначе, но если артефакт устроен гораздо сложнее будильника, использование интенциональной установки приносит больше пользы – и становится практически обязательным. Чтобы не упустить ничего важного, давайте пошагово разберем механизм принятия интенциональной установки на уже знакомом нам примере играющего в шахматы компьютера:
Сначала перечислим все возможные ходы, которые доступны компьютеру, когда наступает его очередь ходить (обычно их несколько десятков).
Затем проранжируем все возможные ходы от лучшего (самого разумного, самого рационального) к худшему (самого глупого, самого бесперспективного).
Наконец, сделаем предсказание: компьютер сделает лучший ход.
Возможно, вам будет сложно однозначно определить лучший ход (компьютер может “проанализировать” ситуацию лучше вас!), но почти всегда вы сумеете отбросить все ходы, кроме четырех-пяти самых разумных, что и так дает вам огромные возможности для прогнозирования. Вы могли бы повысить точность прогнозирования и заранее определять, какой именно ход сделает компьютер – ценой огромных усилий и временных затрат, – вернувшись в конструктивную установку. Для этого вам нужно получить “исходный код” программы (см. лаву 27) и “смоделировать его вручную”, сделав миллионы миллиардов крошечных шагов, которые компьютер предпримет, решая, как ответить на задуманный вами ход. Так вы точно поймете, как поступил бы компьютер, если бы вы сделали свой ход, но отведенное на раздумье время истекло бы задолго до того, как вы достигли бы результата: вам не хватило бы и целой жизни! Слишком много информации! И все же использовать конструктивную установку гораздо проще, чем вернуться к физической установке и попробовать описать поток электронов, возникающий после нажатия на клавиши компьютера. Таким образом, физическая установка совершенно непрактична при прогнозировании и объяснении ходов компьютера, а конструктивная установка требует слишком большого труда, если только не использовать другой компьютер (а это жульничество). Используя интенциональную установку, человек увиливает от трудоемкого сбора информации и расчетов и делает рискованное, но правдоподобное предположение: компьютер поступит “рационально”, то есть найдет и сделает лучший ход (учитывая, что он хочет победить и знает положение и вес всех фигур на доске). Во многих ситуациях, особенно если лучший ход для компьютера так очевиден, что он считается “вынужденным” или “элементарным”, интенциональная установка позволяет предсказать ход почти со стопроцентной точностью без особенного труда.
Очевидно, что интенциональная установка эффективно работает при прогнозировании поведения играющего в шахматы компьютера, поскольку он был сконструирован с целью “обдумывать” и выбирать лучшие ходы в рамках в высшей степени рационалистической игры в шахматы. Если компьютерная программа управляет нефтеперерабатывающим заводом, почти столь же очевидно, что она будет предпринимать различные шаги, анализируя условия, которые в большей или меньшей степени диктуют ее поведение с учетом ее общего целевого назначения. Здесь важно, что программа по умолчанию считается совершенной или рациональной, хотя, если программист был некомпетентен, она редко будет работать именно так, как должна работать в конкретных обстоятельствах, по мнению экспертов. Если информационные системы (или системы контроля) сконструированы хорошо, логика их действий распознаваема и в высокой степени предсказуема, даже если авторы программ, вопреки устоявшимся нормам, не снабдили исходный код “комментариями”, объясняющими логику работы сторонним наблюдателям. (Подробнее об этих компьютерных тонкостях позже.) Чтобы прогнозировать поведение системы, нам ничего не нужно знать о компьютерном программировании; нам нужно лишь понимать, каковы рациональные требования, предъявляемые к управлению нефтеперерабатывающим заводом.
Теперь мы видим, как и зачем интенциональная установка работает для прогнозирования нашего поведения. Воспринимая друг друга в качестве интенциональных систем, мы даем себе возможность не углубляться в детали процессов, происходящих у нас в голове, и бессознательно полагаемся на факт, что в удивительно точном первом приближении люди рациональны. Неожиданно оказавшись в новом человеческом сценарии, обычно мы понимаем его без труда, даже не отдавая себе отчета, благодаря нашей врожденной способности понимать, во что должны верить люди (истину о том, что им известно) и чего они должны желать (что для них хорошо).
Никто не спорит, что мы выдвигаем очень точные гипотезы, используя народную психологию, однако споры о том, чем объясняется этот дар, не утихают. Может, мы заучиваем десятки или сотни тысяч “законов природы” наподобие
“Если человек бодрствует, его глаза открыты и он стоит лицом к автобусу, он склонен полагать, что перед ним стоит автобус” и
“Всякий раз, когда люди полагают, что могут получить выгоду по низкой цене, они склонны сотрудничать с другими, даже с незнакомцами”?
Или же эти грубо отесанные законы генерируются по запросу присущим нам чувством, что именно таковы рациональные ответы в соответствующих обстоятельствах? Я считаю, что верно второе. Хотя огромное количество стереотипных моделей поведения действительно описывается подобными обобщениями (которые, в принципе, могут усваиваться постепенно в течение всей нашей жизни), достаточно сложно создать научно-фантастический сценарий такой новизны, чтобы он шел вразрез с любыми прогнозами и никто просто не мог бы представить, каким могло бы быть поведение людей в описываемых обстоятельствах. Возникает закономерный вопрос: “Что бы ты сделал, если бы такое случилось с тобой?” На него есть куча бесполезных ответов вроде: “Я бы сразу свалился замертво”, – но среди них находится и характерно рациональный: “Надеюсь, я бы догадался, что стоит сделать Х”. Наблюдая за героями, которые в этих нестереотипных обстоятельствах поступают на редкость разумно, мы без труда понимаем, что они делают и почему. Подобно нашей способности понимать новые предложения родных языков – предложения, которые мы никогда прежде не слышали, – наша способность понимать огромное множество человеческих взаимодействий свидетельствует о наличии генеративной способности, в некоторой степени от рождения присущей нормальным людям.
Мы столь же естественно и безотчетно распространяем интенциональную установку на животных. Без нее не обойтись, если мы хотим поймать коварного зверя, но она также полезна, если мы пытаемся организовать свое понимание поведения более простых животных и даже растений. Моллюск ведет себя рационально, опираясь на свое ограниченное представление о мире. Нас не удивляет, что деревья, которые чувствуют постепенное приближение конкурентов (поскольку все больше попадающего на них солнечного света отражается от высоких зеленых объектов поблизости), перераспределяют ресурсы, чтобы расти быстрее. В конце концов, в таких обстоятельствах для растения это умный ход. В мире артефактов примитивную интерпретацию из интенциональной установки выдерживает даже презренный термостат: он хочет поддерживать температуру на заданном уровне, часто измеряет температуру, чтобы иметь актуальное представление о ней, сравнивает полученное значение с заданной температурой и действует соответствующим образом. Именно так можно объяснить работу термостата ребенку, не вдаваясь в технические подробности.
Простая теория интенциональных систем объясняет, как и почему мы понимаем поведение огромного количества сложных объектов, считая их агентами. Нельзя сказать, что эта теория непосредственно объясняет работу внутренних механизмов, которые каким-то образом достигают предсказанного рационального ориентира. Интенциональная установка дает “спецификацию” интенциональной системы, технические требования к ее работе – к примеру, что она должна распознавать, запоминать и делать, – а осуществляют это техническое задание инженеры (или эволюция и развитие, если в качестве интенциональной системы выступает живой организм). Дайте мне агента, который понимает разницу между долларовыми и 10-долларовыми купюрами, умеет давать сдачу и определять фальшивки, а также готов и способен круглосуточно доставлять покупателям необходимые продукты. Эта характеристика из интенциональной установки может быть как описанием торгового автомата, так и примитивной должностной инструкцией продавца круглосуточного магазина. При этом совершенно неважно, какое строение имеет искомая сущность и какими еще талантами она наделена.
Такая равнозначность, или нейтральность, не баг, а фича, как выражаются программисты. Как мы увидим в последующих трех главах, она позволяет теории интенциональных систем играть основополагающую роль при наведении мостов через пропасть смятения между нашими сознаниями и мозгами. Не углубляясь в тонкости, можно сказать, что она позволяет нам увидеть сходства между “реальными” убеждениями (убеждениями личностей) и “всего лишь” их имитацией (характерной для торговых автоматов, животных, маленьких детей и, что особенно важно, субличностных фрагментов личностей). Чтобы делать прогнозы, мы можем использовать интенциональную установку и давать спецификацию компетенций подсистем мозга, еще не зная, как именно реализованы эти компетенции. Мы анализируем большую, сложную “реальную” личность, разбивая ее на множество субличностных агентов, имеющих собственные задачи и методы, а затем анализируем этих субличностных агентов, разбивая их на множество еще более простых и глупых агентов. В итоге мы получаем интенциональные системы, которые достаточно просты, чтобы без труда описать их из интенциональной установки. Перекидывая мост через пропасть между народной психологией на личностном уровне и субличностной активностью нейронных сетей, мы задействуем воображение, которому идет на пользу это принципиальное послабление условий, выдвигаемых философами для убеждений и желаний (настоящего, взрослого) человека. Где на пути от человека к неодушевленным объектам “настоящие” убеждения и желания уступают место “мнимым”? Как мы увидели в главе 15 и как увидим снова, применив несколько других инструментов мышления, это стремление провести черту безосновательно.
Интенциональная установка широко применяется в информатике и психологии животных, и теория интенциональных систем объясняет почему. Некоторые теоретики эволюционной биологии утверждают, что обходятся без нее, но на самом деле они обманывают себя, как мы увидим в разделе об эволюции[21].
19. Личностное и субличностное
Ваши глаза не видят – видите вы. Ваш рот не наслаждается вкусом шоколадного торта – наслаждаетесь вы. Ваш мозг не злится из-за острой боли в плече – злитесь вы. Ваша рука не подписывает контракт – подписываете вы. Ваше тело может чувствовать возбуждение, но влюбляетесь все равно вы. Это не просто “грамматические” тонкости вроде того, как мы говорим “идет дождь”, когда на улице гроза, вместо того чтобы сказать “гроза идет дождем”. И это не просто вопрос единства определений. Люди часто отмахиваются: “Разве это не просто игра в слова?” – имея в виду, что обычно не так уж важно, как именно мы “определяем термины”. Но порой определения имеют решающее значение, и это как раз один из таких случаев. Мы говорим о личностях и о том, что они могут делать и выносить, опираясь на ряд важных фактов.
На первый взгляд, существуют вещи, которые под силу делать целой личности, но не под силу ни одному из ее фрагментов. Это почти так, но воображение подсказывает нам жутковатую мысль, что в таком случае личность (грубо говоря) представляет собой фрагмент человеческого тела, а именно полноценно функционирующий мозг. (Обладаете вы мозгом – или вы и есть мозг? Ответить на этот вопрос не так легко.) Если отрубить мне руки, я все равно смогу подписать контракт (держа ручку ногой или отдав указание голосом), но если прекратить работу моего мозга, никакие действия моих рук и ног нельзя будет приравнять к подписанию контракта. Если выколоть мне глаза, я потеряю способность видеть, но смогу вернуть ее, установив глазные протезы, которые уже не кажутся элементом научной фантастики. Что если “ампутировать” некоторые части моего мозга? Если удалить затылочную кору, оставив невредимыми глаза и зрительный нерв, я стану “кортикально слеп”, но, возможно, сохраню остаточное зрение (к примеру, знаменитое “слепозрение”). Несомненно, ампутировав немного больший фрагмент мозга, мы сможем избавиться от слепозрения, сохранив вам жизнь. Нам нравится мысль, что в процессе постепенного исключения остальных чувств – слуха, осязания, обоняния и вкуса – можно урезать мозг до вместилища вас, обнаружив таким образом, где находится личность, и поняв, что она собой представляет. Эта мысль интересна, но ошибочна. Многочисленные функции мозга так тесно переплетаются и так активно взаимодействуют, что места, “где все сходится” в единое сознание, просто не существует[22]. Если уж на то пошло, многие способности, склонности, предпочтения и причуды, которые делают вас вами, зависят от других особенностей вашего тела, а не только от мозга; и неизменно популярный философский мысленный эксперимент о пересадке мозга (кем бы предпочли стать вы – “донором” или “реципиентом”?) основан на искажающей реальность идеализации. Как я однажды сказал, “нельзя отсечь меня от моего тела, оставив чистый срез” (1996a, p. 77).
Вероятно, главное свойство интернета – его децентрализация. У него нет ни штаб-квартиры, ни головного офиса, на который можно сбросить бомбу, чтобы его отключить. Его составные части характеризуются высоким запасом мощности и оперативной гибкостью, поэтому при отключении одной из частей он “выходит из строя с достоинством”, если выходит из строя вообще. У умного компьютера HAL из “Космической одиссеи 2001 года” был “логический центр памяти” – комната, полная банков данных. Отсоединив их один за одним, Дэйв выключил HAL навсегда. У интернета подобного центра нет. Хотя природа не наделила нас таким высоким уровнем распределенной неуязвимости, в своем теле вы в значительной степени децентрализованы, а отдельные части вашего тела имеют запас оперативной гибкости. Ваш мозг на удивление пластичен (способен к трансформации), поэтому вы можете и дальше быть собой, стремиться к мечтам, проклинать врагов, плести интриги, переживать трагедии и триумфы после отсечения важных, но не “жизненно важных” частей тела. Именно поэтому вы можете обладать способностями, которыми не обладает ни одна из ваших частей. Эту мысль можно также вывернуть наизнанку: единственный способ понять, какими способностями обладают части живого тела, – это проанализировать, какой вклад они вносят в работу всей грандиозной системы.
Вот еще несколько примеров. Ваш мозг не понимает русский – его понимаете вы. Ваш мозг не считает шутку смешной – так считаете вы. Даже если работа соответствующих структур мозга обусловливает ваше понимание и восприятие, эти структуры не могут функционировать должным образом без тренировки и поддержки, которую им годами оказывают органы чувств, конечности и другие эффекторы[23].
Получается, что мы не просто так считаем личность – этого выносливого, сознательного, рационального агента, которому принадлежит тело, – субъектом большинства наших ежедневных атрибуций: это вы сделали ошибку, победили в гонке, влюбились в Лесли, научились сносно говорить по-французски, хотите поехать в Бразилию, предпочитаете блондинок, оклеветали кого-то. (См. также главу 62.) Вы проголодались, устали и рассердились – и все благодаря субличностным элементам и ничему более.
Но что это за элементы? Неужели человеческое тело состоит из них, как из кирпичиков? Ответом будет да, если мыслить на уровне мельчайших частиц – атомов. И нет – на любом другом уровне, от молекул, клеток и выше. Белки – рабочие лошадки ваших клеток – это невероятно компетентные и проницательные маленькие роботы. Мы можем назвать их наноботами. Нейроны, которые отвечают за распространение и переключение сигналов в мозге, а также за его адаптивность, можно считать более многофункциональными и умелыми роботами – назовем их микроботами. Они формируют коалиции, соревнуются и сотрудничают друг с другом в рамках более крупных структур, коммуницируют, подавляют друг друга, анализируют поток информации от органов чувств, пробуждают дремлющие информационные структуры “в памяти” (которая не имеет отдельного места в мозге) и руководят сложными каскадами сигналов, приводящих в движение мускулы.
Все уровни выше простейших атомных кирпичиков в некоторой степени характеризуются субъектностью. Иными словами, они поддаются интерпретации в качестве интенциональных систем. На молекулярном уровне (двигательные белки, ферменты, осуществляющие коррекцию ДНК, контроллеры триллионов шлюзов в клеточных мембранах и т. п.) их компетенции сильно “роботизированы”, но все равно поразительны, будто армии марширующих метел в “Ученике чародея” или демон Максвелла, если взять два вымышленных примера. На клеточном уровне отдельные нейроны демонстрируют большую склонность к экспериментам: они ищут более надежные связи и меняют принципы своей активации на основании недавнего опыта. Они напоминают скорее узников или рабов, чем обычные машины (вроде белковых наноботов); их можно представить в качестве запертых в камерах близоруких нервных клеток, вовлеченных в массовые проекты, которых им не понять, но готовых совершенствоваться, меняя принципы своего функционирования. На высших уровнях близорукость отступает, а группы клеток – пучки, колонки, ганглии, “ядра” – получают специализированные роли, зависимые от все большего количества условий, включая условия внешнего мира. Здесь степень субъектности становится выше, поскольку “выполнение работы” требует немалой рассудительности и даже умения принимать решения.
Эти агенты подобны белым воротничкам – аналитикам и управленцам, имеющим конкретные обязанности. Как и все белые воротнички, они не лишены здоровой соревновательности и готовы принять все, с чем сталкиваются в процессе своей деятельности, и даже подмять под себя соседей или тех, кто состоит с ними в контакте. На этом уровне компетентности выступающие в качестве агентов субличностные элементы представляют собой умные кирпичики, и мы начинаем понимать – по крайней мере, в общих чертах, – как сложить из них цельную, способную к пониманию личность. (“Требуется сборка”, как написано на коробке с деталями велосипеда, но нам хотя бы не нужно резать и гнуть металл, делать гайки и болты.)
Представить немыслимое – как личность может состоять из (одних лишь) бездумных молекул – можно двумя способами: пойти от частного к общему, как мы только что поступили, или от общего к частному, начав с цельной личности и изучая, каково наименьшее число очень умных гомункулов, способных договориться между собой и выполнять все задачи, которые необходимо выполнять, чтобы личность продолжала функционировать. Первым по пути от общего к частному прошел Платон. Он предположил, что душа состоит из трех частей-агентов, аналогичных правителям, стражам и работникам, или разумному, яростному и страстному началу, но за прошедшие с тех пор два тысячелетия было выявлено немало причин, по которым его анализ нельзя считать удачным. Предложенное Фрейдом около ста лет назад деление на Ид, Эго и Супер-Эго было несколько лучше, но активные попытки поделить сознание на подсознания начались только после изобретения компьютера и появления науки об искусственном интеллекте (ИИ), задача которой изначально заключалась в анализе когнитивных способностей цельной (взрослой, сознательной, использующей язык) личности путем представления ее в качестве огромной сети субличностных специализированных элементов, таких как генератор целей, поисковик воспоминаний, оценщик планов, анализатор восприятия, анализатор предложений и так далее.
20. Каскад гомункулов
В старом как мир стремлении понять сознание мыслители часто поддавались искушению представить внутреннего агента, маленького человечка – homunculus по-латыни, – который сидит в диспетчерской мозга и выполняет всю умную работу. Если представить человеческую нервную систему, скажем, в виде огромного телефонного коммутатора (философы обожали этот прием еще в 1950-х и 1960-х), возникнет проблема работающего с ним оператора: можно ли считать, что его сознание представляет собой телефонный коммутатор меньшего размера, имеющий собственного оператора, сознание которого, в свою очередь, сравнимо с… Эта бесконечная регрессивная последовательность обрекает на провал любую теорию, предполагающую наличие центрального гомункула.
Но, может, проблема не во введении гомункула как такового, а во введении центрального гомункула? В своей первой книге “Содержание и сознание” (1969) я допустил серьезную ошибку, не удержавшись от насмешки. Я написал:
“Человечек внутри мозга”, “дух в машине” Райла не решает проблему сознания. Хотя нельзя исключить, что аналогии с “письменностью мозга” найдется какое-нибудь полезное применение, кажется, что она лишь заменяет маленького человечка целым комитетом. [p. 87]
И чем же плох этот комитет? (Ага! Вот и критика моей попытки доведения до абсурда!) В итоге я пришел к выводу (в книге “Мозговые штурмы”, 1978a), что идея заменить человечка внутри мозга целым комитетом не так уж плоха – пожалуй, это одна из лучших идей когнитивной науки. Такой была классическая стратегия символического искусственного интеллекта GOFAI (“старый добрый искусственный интеллект”; Haugeland 1985), которая получила название гомункулярного функционализма:
Отталкиваясь от определенным образом описанной проблемы, программист ИИ фактически считает компьютер антропоморфным: если компьютер решит проблему, программист скажет, что создал компьютер, который может [например] понимать вопросы на русском языке. На первом и высшем уровне конструкции компьютер разбивается на две подсистемы, каждая из которых получает определенным образом описанную задачу. Программист составляет схему блоков оценки, устройств памяти, селекторов, контроллеров и тому подобных элементов. Это многочисленные гомункулы… Каждый гомункул, в свою очередь, делится на меньших гомункулов, но – что важнее – на менее умных гомункулов. Достигнув уровня, на котором гомункулы представляют собой не более чем суммирующие и вычитающие устройства, а их интеллект ограничивается способностью по команде выбирать большее из двух чисел, гомункулы превращаются в функционеров, которых можно заменить машиной. [p. 80]
Большой плюс этой стратегии заключается в том, что она опровергает возражение о бесконечном регрессе. Гомункулярный функционализм позволяет обойти губительный бесконечный регресс и заменить его конечным, который в итоге приводит нас, как мы только что заметили, к операторам, задача коих настолько проста, что их можно заменить машинами. Главное было отказаться от мысли, что всю работу делает центральный оператор, и распределить задачи между небольшими, менее умными агентами, работа которых также распределяется между другими агентами, и так далее.
Таким образом, идя от общего к частному, классический GOFAI позволил нам сделать большой шаг вперед, однако предложенная им бюрократическая система организации вышла хотя и эффективной, но излишне механистичной! Может, нам и показалось, что мы избавились от короля или директора, но у нас все равно осталась армия руководителей среднего звена, подчиняющихся множеству вице-президентов (взаимодействия которых формируют высший уровень системы) и отдающих приказы своим подчиненным, которые, в свою очередь, делегируют задачи нижестоящим конторским работникам, и так далее. Существование этой гиперэффективной организации, где ни один элемент не работает вхолостую, где не происходит искусственного раздувания штатов, а все приказы беспрекословно выполняются, в основном обусловливалось тем фактом, что огромные компьютеры, на которых разрабатывались ранние модели ИИ, по сегодняшним стандартам были медленными и маломощными, а люди хотели как можно быстрее получить результат. Чтобы произвести впечатление на инвестора, нужно было создать такой ИИ, которому для ответа на простой вопрос не нужно думать часами. Он должен был работать четко. Кроме того, на создание тысяч строк кода требуется немало времени, а если вы сумели разбить итоговую цель – к примеру, научить компьютер отвечать на вопросы о лунных камнях, диагностировать болезни почек или играть в шахматы – на серию решаемых задач и знаете, как создать для них программы, которые затем можно будет интегрировать в рабочую систему, вы получите свой “экспериментальный образец”[24] при целесообразно низких временных и финансовых затратах.
Обратите внимание, что компьютеры всегда конструируются таким образом, чтобы потребности и производительность практически не зависели друг от друга. Аппаратное обеспечение распределяет электрический ток щедро и беспристрастно, поэтому ни одна из микросхем не рискует оказаться обделенной. На программном уровне великодушная диспетчерская система распределяет машинные циклы в зависимости от приоритизации задач, и хотя приоритет процессам может присваивать специальный распределительный механизм, в итоге получается организованная очередь, а не беспорядочная борьба за выживание. Как сказал бы Маркс, “от каждого по способностям, каждому по потребностям”. Специалист по теории вычислительных систем Эрик Баум метко назвал эту иерархию системой “политбюро”. Возможно, смутное понимание этого факта лежит в основе типичного человеческого представления о том, что компьютер ни к чему не может проявлять участие. И проблема не в том, что он сделан из неправильных материалов – разве можно сказать, что кремний не подходит для проявления участия в той степени, в которой подходит углерод? – а в том, что его внутренняя организация не предполагает наличия рисков и возможностей и потому компьютер и не должен проявлять участие.
Нейроны не такие. Обычные клетки, из которых состоят наши тела, вероятно, можно сравнить с послушными рабами – наподобие самоотверженных, бесплодных рабочих муравьев, которые живут в колонии, выполняют стереотипные задачи и существуют в относительно неконкурентной (марксистской) среде. Но клетки мозга – как я теперь думаю – ожесточенно конкурируют на рынке. За что? Чего может желать нейрон? Энергии и ресурсов, чтобы жить дальше – прямо как его одноклеточные предки-эукариоты и более дальние кузины, бактерии и археи. Нейроны – это своего рода биологические роботы; они явно не наделены сознанием в полной мере. Не забывайте, это эукариоты, подобные грибкам и дрожжевым клеткам. Если отдельные нейроны сознательны, то сознательна и нога спортсмена! Но нейроны, как и их безмозглые одноклеточные кузины, представляют собой весьма компетентных агентов в борьбе за существование – только не между пальцами ваших ног, а в конкурентной среде мозга, где победу одерживают клетки, способные более эффективно устанавливать связи и участвовать в более важных процессах на уровне виртуальных машин, где различаются масштабные человеческие стремления и цели. Многие подсистемы нервной системы организованы в качестве оппонентных процессов, втянутых в войны между подподсистемами, каждая из которых стремится перетянуть одеяло на себя. (К примеру, наши эмоции можно представить в качестве соперничающих бурь, стремительно вытесняющих друг друга, мешающих друг другу или вступающих в сговор против другой бури.) На мой взгляд, оппонентная динамика эмоций и та роль, которую они играют в контроле над нашим сознанием, определяются экономным характером нейрохимии, сдерживающим склонность отдельных нейронов к конкуренции. (Обратите внимание, что нейроны все равно умеют работать в команде в рамках более крупной организации, в отличие от более радикально эгоистичных агентов, раковых клеток. Нобелевский лауреат биолог Франсуа Жакоб, как мне помнится, сказал, что любая клетка мечтает разделиться на две. Нейроны же стремятся сохранить активность и влиятельность, но не мечтают о размножении.) С такой точки зрения способность животных разумно контролировать свое поведение все равно остается моделируемым процессом – как транзакция на бирже, – но, как сказал нейробиолог Себастьян Сеунг (2007), нейроны эгоистичны и стремятся максимизировать свою прибыль во всех валютах, которые только доступны в мозге. Что же нейроны покупают, отдавая дофамин, серотонин и окситоцин? Они приобретают большее влияние в сетях, в которые вовлечены, а вместе с ним и большую безопасность. (Тот факт, что мулы бесплодны, не мешает им добывать себе пропитание, а следовательно, нейроны также могут руководствоваться инстинктами самосохранения, унаследованными от способных к размножению предков.)
Итак, если идти от частного к общему, вдохновляясь нейробиологией, гомункулярный функционализм начинает казаться все более точной моделью работы мозга, поскольку порождаемые им хаотичные и конкурентные “вычислительные архитектуры” выглядят убедительнее с биологической точки зрения: мы начинаем понимать, какие эволюционные процессы ответственны за построение этих архитектур как на стадии зародыша, так и во взрослой жизни. Кроме того, мы можем проследить их происхождение от более простых нервных систем, состоящих из менее квалифицированных гомункулов, которые лишь вроде как обладают восприятием, дают друг другу сигналы и имеют память[25].
21. Оператор “вроде как”
Зачем нам вообще оператор “вроде как”? Дело в том, что, разбирая – или собирая – комплект все более компетентных уровней, мы должны знать о каждом уровне два факта: что он собой представляет и что он делает. Чтобы понять, что он собой представляет, достаточно описать структурную организацию элементов, из которых он состоит, при условии что элементы, насколько нам известно, функционируют именно так, как положено. Чтобы понять, что он делает, нужно проанализировать (когнитивную) функцию, которую он (вроде как) выполняет, причем выполняет достаточно хорошо, чтобы на следующем уровне мы могли сказать, что имеем в своем распоряжении компетентный кирпичик, выполняющий только эту функцию – выполняющий ее вроде как, чего нам вполне достаточно. Это ключ к решению невероятно сложного вопроса о том, как сознание вообще может состоять из материальных механизмов. На заре компьютерной эры этот потенциал разглядел Алан Тьюринг, который больше всех заслуживает признания за изобретение компьютера. Он брал безмозглые фрагменты механизмов, не имеющие никакой искры сознания, и составлял из них более компетентные механизмы, которые, в свою очередь, могли стать фрагментами еще более компетентных механизмов – и так далее, без очевидных ограничений. Оператор “вроде как” когнитивной науки примерно соответствует дарвиновскому градуализму эволюционных процессов (подробнее об этом в части VI). До бактерий существовали вроде как бактерии, до млекопитающих – вроде как млекопитающие, до собак – вроде как собаки и так далее.
Нам не обойтись без дарвиновского градуализма, чтобы объяснить огромную разницу между обезьяной и яблоком, а без градуализма Тьюринга не обойтись, чтобы объяснить огромную разницу между человекоподобным роботом и карманным калькулятором. Обезьяна и яблоко состоят из одних и тех же базовых ингредиентов, по-разному структурированных и используемых в многоуровневом каскаде различных функциональных компетенций. Не существует четкой границы, отделяющей вроде как обезьяну от обезьяны. Как человекоподобный робот, так и карманный калькулятор сделаны из одинаковых базовых, бездумных, бесчувственных кирпичиков Тьюринга, но мы составляем из них более крупные, более компетентные структуры, которые затем становятся элементами еще более компетентных структур на более высоких уровнях, и в конце концов добираемся до таких (вроде как) умных фрагментов, что их можно назвать понимающими. Мы используем интенциональную установку, чтобы отслеживать убеждения и желания (или “убеждения” и “желания”, или вроде как убеждения и вроде как желания) (вроде как) рациональных агентов на каждом уровне, начиная с простейших бактерий, через все схемы распознавания, сигнализации, сравнения и запоминания, которые включает в себя мозг животных, от морских звезд до людей-астрономов. Не существует четкой границы, отделяющей истинное понимание, и это верно даже в случае с людьми. Маленький ребенок вроде как понимает собственную фразу “мой папа – врач”, а я вроде как понимаю формулу E=mc2. Некоторые философы противятся этому антиэссенциализму (см. главу 43): либо вы верите, что снег белый, либо нет; либо вы наделены сознанием, либо нет; ничто нельзя считать аппроксимацией психического феномена; здесь либо все, либо ничего. Для таких мыслителей свойства сознания остаются неразрешимой загадкой, поскольку сознание “совершенно” и совершенно не похоже ни на что из того, что можно найти в сугубо материальных механизмах.
22. Чудо-ткань
В превосходной книге об индийской уличной магии “Сеть магии. Чудеса и уловки в Индии” Ли Сигел (1991) пишет:
“Я пишу книгу о магии”, – объясняю я, и меня спрашивают: “О настоящей магии?” Под настоящей магией люди подразумевают чудеса, чудотворные деяния и сверхъестественные силы. “Нет, – отвечаю я, – о фокусах. Не о настоящей магии”. Иными словами, настоящей магией называют магию, которая на самом деле не настоящая, а настоящую магию, которую действительно можно творить, настоящей никто не считает. [p. 425]
“Настоящая магия” – по определению, скажете вы – чудесна. Она нарушает законы природы. Многие люди хотят верить в настоящую магию. Повторяя трюки самопровозглашенных ясновидцев вроде Ури Геллера, фокусник, скептик и охотник за привидениями Джеймс Рэнди показывает, что поразительные эффекты нельзя считать настоящей магией, поскольку на самом деле это лишь фокусы. Но некоторых людей этим не убедить. Много лет назад на обсуждении после представления в Виннипеге один из зрителей обвинил Рэнди в двойном обмане: якобы Рэнди был таким же ясновидцем, как и Геллер, но специально притворялся простым фокусником, чтобы разоблачать двуличность более известного Геллера и забирать себе частичку его славы! Сложно опровергнуть такое обвинение, не объяснив всем присутствующим, в чем именно состоит секрет фокусов, чего Рэнди, уважая традиции фокусников всего мира, делать не спешит. (Первыми секреты фокусов стали раскрывать Пенн и Теллер. Их осудили многие коллеги по цеху, но в итоге они сумели доказать, что традиционное табу можно нарушить, не испортив при этом шоу иллюзионистов.)
Подобное стремление верить в настоящую магию свойственно многим людям, рассуждающим на тему взаимосвязи сознания и мозга. Некоторым, включая немалое количество нейробиологов и физиологов – и философов, – хотя бы на подсознательном уровне привлекательна мысль, что так или иначе динамические свойства нервной ткани могут творить чудеса, то есть каким-то образом сдерживать скрытые силы, неизвестные науке. Возможно, они правы, но не стоит считать так по умолчанию. Правило таково: никакой чудо-ткани!
Вот что нам известно практически наверняка: ни в одной компьютерной программе не задействованы необъяснимые с точки зрения физики феномены – ни невообразимые ранее силовые поля, ни таинственные квантовые проделки, ни жизненный порыв. Ни в одном компьютере, безусловно, нет чудо-ткани. Мы точно знаем, как компьютеры выполняют основные задачи и как из этих простых задач складываются все более сложные, и можем объяснить сконструированные компетенции, не оставляя никаких тайн. Хотя виртуозность сегодняшних компьютеров не перестает нас поражать, сами компьютеры – как машины – просты, как открывашки. Они показывают фокусы, но не “настоящую магию”.
Это ценный факт – настолько ценный, что он удостоится подробного анализа в следующем разделе. Его ценность заключается в том, что всякий раз, создавая компьютер, который казался чудесным, мы получаем доказательство, что его можно сконструировать без использования чудо-ткани. Возможно, мозг делает все иначе – возможно, даже с чудо-тканью (возможно, Рэнди – настоящий ясновидец, как и Геллер!), – но у нас нет основания этому верить. Таким образом, компьютеры выступают в качестве разоблачителей мифов, и это прекрасный повод настаивать на создании компьютерных моделей всего, что мы пытаемся понять, будь то ураганы, ипотечные пузыри, ВИЧ или человеческое сознание.
Термин “чудо-ткань” представляет собой инструмент мышления, напоминающий дубинку полицейского: он используется в карательных целях, чтобы не давать людям строить безосновательные теории. Как и дубинкой, им можно злоупотреблять. Он дополняет другой инструмент мышления – бритву Оккама и потому обеспечивает некоторый научный консерватизм, которому порой свойственна близорукость. Мой любимый пример этого привел один из отцов современной генетики Уильям Бэтсон. Вот что он сказал не так уж давно, в 1916 г.:
Свойства живых организмов некоторым образом связаны с материальной основой, возможно, в некоторой степени с ядерным хроматином [хромосомами]; и все же непостижимо, чтобы частицы хроматина или любого другого вещества, каким бы сложным оно ни было, обладали бы теми силами, которые должны приписываться нашим факторам или генам. Предположение, что частицы хроматина, неотличимые друг от друга и практически гомогенные во всех известных опытах, могут в своей материальной природе содержать все свойства жизни, переходит границы даже самого убежденного материализма. [p. 91]
Он просто не мог представить ДНК. Мысль о том, что в каждой человеческой клетке может находиться три миллиарда спаренных оснований в двойной спирали, никак не укладывалась у него в голове. К счастью, другие биологи не разделяли пессимизма Бэтсона и в конце концов открыли, как именно происходит, казалось бы, чудесная передача генетической информации от поколения к поколению, за которую, как выяснилось, отвечают весьма необычные молекулы. Однако на пути к этому открытию они придерживались правила: никакой чудо-ткани. Из генетики они знали, какими компетенциями должен обладать искомый элемент, и сделали своей задачей создание физически возможной модели того, что будет обладать этими компетенциями.
Сегодня перед нами стоит подобная задача. Экспериментальная психология дает нам все более подробный каталог компетенций и уязвимостей сознания – триумфов восприятия и неловкостей заблуждения, скорости усвоения языка и условий переключения внимания, вожделения, страха и радости, – и теперь, как “убежденные материалисты”, мы должны выяснить, как мозг все это делает, не прибегая к постулату о чудо-ткани.
По мере того как растет наше понимание, представления о чудо-ткани меняются. Когда в середине 1980-х появились “коннекционистские” и другие “нейросетевые” модели[26], они продемонстрировали наличие у маленьких пучков нейронов способности к обучению и распознаванию паттернов, о которых всего несколькими годами ранее не могло быть и речи. Мы до сих пор не знаем, как именно мозг использует вычислительные мощности, демонстрируемые этими полуреалистичными моделями – и использует ли он их вообще, – но теперь можно постулировать коннекционистскую компетенцию нейронной сети, которую вы пока не можете объяснить, если открыто заявляете об этом, а компетенция явно не выходит за рамки известного диапазона возможностей. (Может, Рэнди исполняет фокус не точно так же, как Геллер, но мы имеем все основания предположить, что существует вариация метода Рэнди, которая объясняет способности Геллера, а это подсказывает нам, как глубже изучить задействованные процессы.) Главное возражение против существования чудо-ткани заключается в том, что она дает нам не способ решить проблему, а повод сдаться, предположив, что эту загадку разрешить так и не удастся.
23. В диспетчерской робота
У роботов нет чудо-ткани (фактически по определению), поэтому они представляют собой стерильную платформу для мысленных экспериментов наподобие этого:
Однажды утром вы просыпаетесь в незнакомой кровати в странной комнате без окон. Две стены этой комнаты сплошь покрыты разноцветными мигающими огоньками, а две другие стены – тысячами кнопок. На огоньках и кнопках есть номера, но нет ярлыков. На тумбочке лежит адресованная вам записка:
Доброе утро! Вас накачали снотворным, похитили и доставили сюда, в ваш новый дом. В холодильнике есть еда, в углу комнаты ванная – с удовлетворением физических потребностей проблем не возникнет. Вы заперты в диспетчерской гигантского робота. Загораясь, каждый огонек дает богатую и актуальную информацию о ситуации: эти огоньки – выходные сигналы сложнейшим образом организованной системы анализаторов нейронной сети, которая работает с данными, получаемыми через видеоглаза робота, снимающими изображение высокой четкости, через снабженные микрофонами уши и через тактильные и обонятельные датчики. Кнопки управляют действиями робота, которые скоординированы между собой и могут быть исполнены в любую секунду.
Робот живет в опасном мире, где сталкивается с большим количеством рисков и возможностей. Его будущее в ваших руках, а потому, само собой, и ваше будущее зависит от того, насколько успешно вы будете вести своего робота по миру. Если он будет уничтожен, электричество в этой комнате отключится, еда в холодильнике закончится и вы умрете. Удачи!
Ситуация не из приятных. Затаив дыхание, вы начинаете экспериментировать и нажимать на кнопки, чтобы проверить, что получится. Вы нажимаете на желтую кнопку под номером 4328 и замечаете, что в этот момент гаснет голубой огонек номер 496. Может, вы заставили робота почесаться или “съесть” что-нибудь, чтобы удовлетворить его метаболические потребности? Вы нажимаете на кнопку номер 4328 второй раз, и зажигаются другие огоньки. Что изменилось в мире? Что это означает? Вам страшно, потому что вам сказали, что эти огоньки передают огромное количество информации, но что именно показывает каждый из огоньков и какие именно приказы отдает каждая из кнопок?
Вот бы огоньки и кнопки были подписаны! Если бы все они были снабжены ярлыками на знакомом вам языке, вероятно, вы смогли бы решить проблему. Или было бы в комнате хоть одно окно, из которого можно было бы выглянуть, чтобы проверить, что случилось, когда вы нажали на кнопку! Есть ли у робота руки и ноги? Будь в комнате окно, вы могли бы попытаться сопоставить события во внешнем мире с миганием огоньков на стенах. Поскольку окна нет, вам доступно огромное количество информации, которую вы не в состоянии интерпретировать. Вы можете запустить сотни действий робота, но у вас нет надежды узнать, чего добьется этими действиями ваш робот.
Похоже, проблема неразрешима. Каким бы умным и изобретательным вы ни были, вы не сможете узнать, за что отвечают огоньки и кнопки на стенах, имея в своем распоряжении лишь перечисленные данные. Однако если вы не можете решить эту проблему, мы сталкиваемся с парадоксом, поскольку описанная ситуация есть не что иное, как ситуация, в которой существует ваш мозг! Он заперт в комнате без окон – в вашем черепе, – где миллионы входных линий непрерывно передают информацию о внешнем мире и состоянии вашего тела, а миллионы выходных линий стимулируют мускулы сокращаться и расслабляться. Ваш мозг не может открыть в вашем черепе окно и посмотреть, что происходит снаружи и провоцирует сигналы, поступающие в вашу зрительную кору. (Да и зачем вашему мозгу такое окно? В отличие от вас, у него нет глаз, за исключением тех глаз, сигналы от которых он получает и пытается истолковать, и нет воспоминаний о том, как выглядят объекты внешнего мира.)
Возможно, подумаете вы, стоящая перед мозгом задача проще, ведь, когда вы смотрите, к примеру, на утку, рисунок возбуждения – мигающие огоньки – на поверхности зрительной коры действительно принимает форму утки[27]! Это имело бы смысл, если бы мы могли предположить, что ваш мозг, как и вы сами, знает, как выглядит утка, но откуда ему это знать?
Как ваш мозг вообще может узнать хоть что-нибудь, если первым делом ему нужно “расшифровать” все сигналы? И как именно расшифровать? Перевести на турецкий? Ярлыки на турецком никак вам не помогут, если только вы не понимаете турецкий. Должен ли ваш мозг понимать язык, чтобы извлекать пользу из входящих данных? Как мы уже видели, мысль о том, что мозг наделен внутренним языком, который ему не приходится учить – ментализом, или языком мышления (Fodor 1975, 2008), – весьма привлекательна. Кажется, она позволяет сделать шаг в верном направлении, но, пока нет объяснения, как именно работает этот язык и как он сформировался, заявлять о его существовании – все равно что придумывать проблеме новое название, при этом ее не решая. Мы знаем, что мозг каким-то образом справляется со своей задачей: он довольно точно определяет, какие команды необходимо отдать в соответствии с обстоятельствами и возможностями, о которых сигнализирует входящий поток данных. И мы знаем, что имеющееся у мозга решение – каким бы оно ни было – не может точь-в-точь походить на язык (наподобие русского или турецкого), потому что, в отличие от наших родных языков, оно не усваивается нами в детстве. Какой язык ближе к языку мышления – письменный (воспоминания в таком случае должным образом записываются в архивах мозга) или устный? Сколько “слов” в лексиконе ментализа – тысячи, миллионы или миллиарды? Имеет ли значение порядок слов? Есть ли грамматические правила? Может ли один фрагмент мозга истолковать сообщение другого фрагмента неправильно?
Если гипотеза о языке мышления говорит о наличии в диспетчерской гомункула, который понимает язык (как вы, когда читаете ярлыки огоньков и кнопок внутри гигантского робота), то она просто откладывает задачу выяснить, как аппарат обучения и понимания может состоять из ничего не понимающих фрагментов. А если она не говорит о наличии гомункула, который занимается дешифровкой сообщений, то система, какой бы она ни была, вообще не слишком похожа на язык. Поскольку никто еще не объяснил в деталях, как работает такой язык мышления и как он усваивается в процессе развития и получения опыта, вероятно, лучше не обманываться и не тешить себя надеждой, что мы делаем успехи, когда на самом деле это, вероятно, не так.
Этот насос интуиции показывает нам, что ваш мозг находится в принципиально иных условиях, чем вы в диспетчерской робота. Его задача – должно быть – отчасти решается заранее, поскольку некоторые входящие сигналы “сцеплены” с исходящими командами, благодаря чему мозг имеет фору при выявлении и подтверждении других соответствий. Таким образом, подчеркивается широко распространенное убеждение, что при рождении наш мозг представляет собой не “чистый лист” (Pinker 2002), а уже под влиянием естественного отбора сформирован таким образом, чтобы вмещать в себя различные предпочтения, ожидания и ассоциации. А поскольку некоторые соответствия установлены заранее, в ярлыках они не нуждаются.
Прежде чем достичь понимания, необходимо пройти стадию компетентности без понимания. Так устроена природа. Бактерии обладают множеством удивительных компетенций, которые им вовсе не нужно понимать; их компетенции прекрасно служат им, но сами они остаются полными невеждами. Деревья обладают компетенциями, которые дают им выгоду, но им не нужно знать зачем. Весьма компетентен и сам процесс естественного отбора – он создает структуры выдающейся оригинальности и эффективности, но ровным счетом ничего не понимает.
Понимание того рода, которым наделены мы, взрослые люди, лишь недавно появилось на эволюционной арене. В нем задействованы структуры, компетенция которых сопровождается и поддерживается минимальным полупониманием, или псевдопониманием, – тем полупониманием, что характерно для рыб и червей. Эти структуры созданы таким образом, чтобы в большинстве случаев вести себя соответствующе, хотя им нет нужды понимать, почему их поведение считается соответствующим.
Альтернативный путь, предполагающий помещение в диспетчерскую полнофункционального Понимателя, обрабатывающего все входящие и исходящие сигналы, гарантированно ведет в тупик. Почему? Потому что, если способность к пониманию необъяснима, фактически вы кладете в основу своей теории чудо-ткань, настоящую магию, а если она все же объяснима – в категориях процессов, действий и сил, которые сами не обладают способностью к пониманию, – вы проехали свой поворот и вернулись к началу с теми из нас, кто пытается объяснить, как понимание вырастает из компетентности.
IV.
Интерлюдия о компьютерах
Перерыв. Как вы, вероятно, заметили, я уже несколько раз упоминал компьютеры, а впереди разговоров о компьютерах будет еще больше. Без сомнения, компьютеры – это самые мощные инструменты мышления, которые имеются в нашем распоряжении, и не только потому, что они справляются со многими скучнейшими интеллектуальными задачами, но и потому, что многие концепции, предложенные специалистами по теории вычислительных систем, тоже можно использовать в качестве инструментов мышления. Сегодня мы все плаваем в море компьютерного жаргона – программное и аппаратное обеспечение, ширина полосы пропускания, гигагерцы, – и многие из вас, безусловно, неплохо понимают значения всех этих модных словечек. Мои студенты всякий раз понимающе кивают, когда я использую эти термины на занятиях, однако я обнаружил, что понимают они далеко не все и порой озадачивают меня, совершенно неправильно толкуя то, что я пытаюсь им объяснить. В связи с этим я хочу научить вас писать программы для простейшего компьютера в мире.
Если вы сейчас не пожалеете времени и сил, чтобы усвоить несколько базовых навыков, впоследствии ваши затраты окупятся сполна, поскольку вы гораздо лучше поймете изложенное далее. (Если же вы в компьютерах собаку съели, мой способ объяснения некоторых тонкостей может пригодиться вам в разговоре с непрофессионалами. Или просто листайте дальше.) Приводимые далее упражнения я тестировал на сотнях студентов, которые боялись компьютеров как огня, и результаты меня радовали: даже те, кто предпочитал заучить наизусть страницу телефонного справочника, только бы не решать никаких головоломок, чувствовали удовольствие и даже некоторое удовлетворение, когда этот простой до идиотизма компьютер справлялся с задачей. Выполнив упражнения, вы узнаете семь секретов силы компьютеров.
24. Семь секретов силы компьютеров
Компьютеры наделены силами, которые несколько веков назад показались бы чудесными – “настоящей магией”. При этом, хотя многие компьютерные программы невероятно сложны, все они состоят из шагов, которые в полной мере объясняются очень простыми словами. В работе компьютеров нет места чудесам. Само это отчасти обусловливает ценность компьютеров в качестве инструментов мышления, и потому возможность объяснить – в общих чертах – принцип работы компьютера весьма интересна с философской точки зрения. Никому не помешает на элементарном уровне разобраться, как компьютеры творят свою “магию”. В этой главе фокус будет разоблачен.
Для начала мы представим себе простейший компьютер – регистровую машину – и проанализируем его возможности и принцип работы. Затем мы увидим, что машина Тьюринга и машина фон Неймана (например, ваш ноутбук) ничем не отличаются от регистровых машин, только работают более эффективно. (Все, что под силу вашему ноутбуку, под силу и регистровой машине, но не обольщайтесь – на это у нее могут уйти столетия.) После этого мы разберем, как “архитектуры” других компьютеров могут повысить скорость работы и производительность нашей базовой регистровой машины. Само собой, интереснее и полезнее всего будет изучить архитектуру человеческого мозга.
Погодите-ка. Неужели я только что сказал, что ваш мозг – это просто гигантский компьютер? Нет, пока я такого не сказал. Я говорю, что если ваш мозг представляет собой гигантский компьютер, то найдется способ полностью объяснить его работу, не оставив никаких тайн, но только если мы сумеем обнаружить этот способ. Мы обратимся к обратному проектированию: будем изучать сложную систему, чтобы выяснить, каким образом она функционирует. Обратное проектирование позволяет нам понять, как сердце качает кровь и как легкие поглощают кислород и отдают углекислый газ. Нейробиология делает попытку применить обратное проектирование к мозгу. Мы знаем, зачем нам нужен мозг – чтобы предвидеть, направлять нас, запоминать и усваивать информацию, – но теперь нам нужно понять, каким образом он это делает.
Споры на эту тему не утихают. Писатель Том Вулф (2000) заострил внимание на больном месте, которое провоцирует ожесточенные баталии, озаглавив свое эссе “Мне жаль, но ваша душа скончалась”. Если мы намереваемся вступить на эту опасную территорию – не тратя времени на разглагольствования и разоблачения, – нам нужны инструменты получше. Прежде чем добросовестно взяться за вопрос, таит ли и использует ли наш мозг не поддающиеся пониманию или чудесные феномены, недоступные никаким компьютерам, нам нужно понять, на что способны компьютеры и как именно они функционируют. Единственный удовлетворительный способ продемонстрировать, что наш мозг не тождественен – и не может быть тождественен – компьютеру, заключается в том, чтобы показать либо (1) что ряд его “подвижных частей” участвует в процессах обработки информации, в которых не могут участвовать компьютеры, либо (2) что простые процессы, в которых задействованы его части, не могут быть сконструированы, агрегированы и организованы на компьютерный манер, чтобы сымитировать знакомые и любимые нами умения сознания.
Некоторые эксперты – не только философы, но и нейробиологи, психологи, лингвисты и даже физики – утверждают, что “компьютерная метафора” для описания работы человеческого мозга или сознания категорически неверна, а мозгу – что важнее – под силу такие вещи, на которые не способны компьютеры. Обычно, но не всегда, такая критика предполагает весьма наивное представление о том, что такое компьютер или каким он должен быть, и в итоге лишь доказывает очевидную (и не относящуюся к делу) истину, что мозг умеет делать множество вещей, которых не умеет ваш ноутбук (учитывая ограниченное количество его преобразователей и эффекторов, ничтожный объем памяти и низкую скорость работы). Если оценивать эти громкие скептические заявления о возможностях компьютеров в принципе, нужно понимать, откуда в принципе берется вычислительная мощность, как она используется и как может использоваться.
Блестящую идею создания регистровой машины на заре компьютерной эры предложил логик Хао Ван (1957), между прочим, студент Курта Гёделя и философ. Это изящный инструмент мышления, который вам стоит иметь в своем наборе. Он далеко не так известен, как должен бы[28]. Регистровая машина – это идеализированный, воображаемый компьютер (который вполне можно сконструировать), состоящий из некоторого (конечного) числа регистров и блока обработки данных.
Регистры – это ячейки памяти, каждая из которых имеет уникальный адрес (регистр 1, регистр 2, регистр 3 и так далее) и может содержать одно целое число (0, 1, 2, 3…). Каждый регистр можно представить в виде большого ящика, содержащего произвольное количество бобов, от 0 до …, вне зависимости от размеров ящика. Обычно мы считаем, что в ящике может содержаться любое целое число, поэтому ящики, само собой, должны быть бесконечно большими. Для наших целей подойдут и просто очень большие ящики.
Блок обработки данных имеет всего три простых компетенции, три “инструкции”, которым он может “следовать” пошагово, выполняя одну зараз. Любая последовательность этих инструкций представляет собой программу, и каждой инструкции присвоен номер, чтобы ее идентифицировать. Инструкции таковы:
Конец работы. Машина может остановиться или выключиться.
Инкремент регистра n (прибавить 1 к содержимому регистра n; положить один боб в ящик n) и переход на следующий шаг, шаг m.
Декремент регистра n (отнять 1 от содержимого регистра n; вынуть один боб из ящика n) и переход на следующий шаг, шаг m.
Инструкция “декремент” работает точно так же, как инструкция “инкремент”, но между ними есть одно принципиально важное различие: что делать, если в регистре n содержится число 0? Машина не может отнять 1 от этого содержимого (в регистрах не могут содержаться отрицательные числа; боб из пустого ящика не вынуть), поэтому, оказавшись в безвыходном положении, машина должна сделать “переход”. Иными словами, она должна обратиться к другому фрагменту программы, чтобы получить следующую инструкцию. В связи с этим каждая инструкция “декремент” должна определять, к какому фрагменту программы обращаться, если в текущий момент в регистре содержится 0. Таким образом, полное определение инструкции “декремент” звучит так:
Декремент регистра n (отнять 1 от содержимого регистра n), если это возможно, и переход на шаг m ИЛИ, если декрементировать регистр n невозможно, переход на шаг p.
Теперь снабдим все возможности регистровой машины короткими названиями: Кон, Инк и Деп (декремент-или-переход).
На первый взгляд может показаться, что такая простая машина не способна ни на что особенно интересное, ведь она умеет лишь класть боб в ящик или вынимать боб из ящика (если там есть боб – и переходить к другой инструкции, если его нет). Но на самом деле она может производить такие же вычисления, которые умеет производить любой другой компьютер.
Начнем с простого сложения. Допустим, вы хотите, чтобы регистровая машина прибавила содержимое одного регистра (скажем, регистра 1) к содержимому другого регистра (регистра 2). Таким образом, если в регистре 1 содержится [3], а в регистре 2 содержится [4], мы хотим, чтобы в итоге программа сделала так, чтобы содержимое регистра 2 стало равняться [7], потому что 3 + 4 = 7. Вот программа, которая справится с этой задачей, написанная на простом языке РПА (регистровое программирование на ассемблере):
Первые две инструкции образуют простой цикл, в рамках которого регистр 1 декрементируется, а регистр 2 инкрементируется снова и снова, пока регистр 1 не опустеет. Это “заметит” блок обработки данных, который в результате сделает переход на шаг 3, останавливающий программу. Блок обработки данных не может сказать, каково содержимое регистра, если только это содержимое не 0. Если снова представить ящики с бобами, можно сказать, что блок обработки данных слеп и не видит, что находится в регистре, пока он не опустеет, потому что отсутствие содержимого он может определить на ощупь. Несмотря на то что, в принципе, он не может сказать, каково содержимое регистров, если задать ему программу 1, он всегда будет прибавлять содержимое регистра 1 (какое бы число ни содержалось в регистре 1) к содержимому регистра 2 (какое бы число ни содержалось в регистре 2), а затем останавливаться. (Вы понимаете, почему так должно происходить всегда? Разберите несколько примеров, чтобы удостовериться.) Вот любопытный способ на это взглянуть: регистровая машина мастерски умеет складывать числа, не зная, какие именно числа она складывает (а также что такое числа и что такое сложение)!
а. Сколько шагов потребуется регистровой машине, чтобы сложить 2 + 5 и получить 7, выполняя программу 1 (считая Кон отдельным шагом)?
б. Сколько шагов потребуется машине, чтобы сложить 5 + 2?
(Какой из этого можно сделать вывод?)[29]
Этот процесс можно изобразить наглядно, построив так называемый граф потока. Каждый кружок обозначает инструкцию. Число в кружке обозначает адрес регистра, с которым необходимо произвести манипуляции (а не содержимое регистра), “+” обозначает инструкцию Инк, а “–” – инструкцию Деп. Программа всегда начинается с , альфы, и завершается, когда достигает , омеги. Стрелки показывают переход к следующей инструкции. Обратите внимание, что каждая инструкция Деп имеет две исходящих стрелки, одну для направления, в котором двигаться, если декрементировать содержимое регистра возможно, а другую – если невозможно, потому что содержимое регистра 0 (переход на ноль).
Теперь давайте напишем программу, которая просто перемещает содержимое одного регистра в другой регистр:
Вот граф потока:
Обратите внимание, что первый цикл этой программы очищает регистр 5, так что, каким бы ни было его содержимое в самом начале, оно никак не повлияет на то, что окажется в регистре 5 ко второму циклу (циклу сложения, в ходе которого содержимое регистра 4 прибавляется к 0 в регистре 5). Этот начальный шаг называется обнулением регистра и представляет собой весьма употребительную стандартную операцию. Вы постоянно будете использовать ее, чтобы готовить регистры к использованию.
Третья простая программа копирует содержимое одного регистра в другой регистр, оставляя изначальное содержимое нетронутым. Изучите граф потока, а затем саму программу:
Это явно не самый очевидный способ копирования, поскольку мы осуществляем операцию, сначала перемещая содержимое регистра 1 в регистр 3, затем делая копию в регистре 4 и, наконец, перемещая эту копию обратно в регистр 1. Но это работает. Всегда. Каким бы ни было содержимое регистров 1, 3 и 4 в самом начале, когда программа остановится, содержимое регистра 1 останется на месте, а копия этого содержимого – в регистре 3.
Если принцип работы этой программы вам не очевиден, возьмите несколько чашек, чтобы сделать регистры (подпишите номер каждой чашки, ее адрес), и горстку монеток (или бобов) и “вручную смоделируйте” весь процесс. Положите по несколько монеток в каждый из регистров и обратите внимание, сколько именно монеток в положили в регистр 1 и регистр 3. Если вы будете в точности следовать программе, когда вы закончите, количество монеток в регистре 1 будет таким же, каким оно было изначально, и такое же количество монеток будет лежать в регистре 3. Очень важно, чтобы вы усвоили базовый принцип работы регистровой машины и вам не пришлось больше ломать над ним голову, поскольку мы собираемся использовать этот новый навык в дальнейшем. Выделите несколько минут и станьте регистровой машиной (как актер может стать Гамлетом).
Я замечаю, что некоторые мои студенты совершают простую ошибку: им кажется, что при декрементировании регистра монетку, которую они только вынули из регистра n, нужно положить в какой-нибудь другой регистр. Нет. Декрементированные монетки просто возвращаются в общую кучу, в ваш “бесконечный” запас монеток для использования в этих простых операциях сложения и вычитания.
Научившись перемещать, копировать и обнулять содержимое регистров, мы можем улучшить нашу программу сложения. Программа 1 помещает верный ответ на задачу на сложение в регистр 2, но в процессе уничтожает изначальное содержимое регистров 1 и 2. Возможно, нам нужна более сложная программа сложения, которая сохраняет эти значения для последующего использования, помещая ответ в другой регистр. Попробуем прибавить содержимое регистра 1 к содержимому регистра 2, поместить ответ в регистр 3 и оставить содержимое регистров 1 и 2 нетронутым.
Вот граф потока, показывающий, как этого добиться:
Проанализируем циклы, чтобы понять, что делает каждый из них. Сначала мы обнуляем регистр ответа, регистр 3, а затем обнуляем дополнительный регистр (регистр 4), который станет временным хранилищем, или буфером. После этого мы копируем содержимое регистра 1 в регистры 3 и 4 и перемещаем это содержимое обратно из буфера в регистр 1, восстанавливая его (и в процессе обнуляя регистр 4, чтобы снова использовать его в качестве буфера). Затем мы повторяем эту операцию с регистром 2, фактически прибавляя содержимое регистра 2 к содержимому, которое мы уже переместили в регистр 3. Когда программа останавливается, буфер 4 снова оказывается пуст, ответ находится в регистре 3, а два числа, которые мы складывали, – на своих изначальных местах, в регистрах 1 и 2.
Вот написанная на РПА 13-шаговая программа, которая переводит всю информацию с графа потока на язык, понятный блоку обработки данных:
Я не буду советовать вам вручную смоделировать эту программу, используя чашки и монетки. Жизнь коротка, поэтому, когда вы усвоите все базовые процессы, вам можно будет пользоваться вспомогательным устройством RodRego, регистровой машиной, которую можно скачать по ссылке http://sites.tufts.edu/rodrego/.
Есть версии RodRego для Windows и для Mac. Мы разработали этот инструмент мышления более двадцати лет назад в Мастерской учебных программ, и с тех пор сотни студентов и других заинтересованных людей воспользовались им, чтобы поднатореть в программировании регистровых машин. Вводя программы на РПА, вы можете наблюдать за их исполнением, выбирая режим с цифрами или бобами в регистрах. На той же странице представлена анимированная PowerPoint-презентация, в которой показан путь блока обработки данных по графу потока при совершении, к примеру, операции сложения. Эта анимация позволяет увидеть, как инструкции РПА соотносятся с кружками графа потока.
Теперь обратимся к вычитанию. Вот первый фрагмент графа потока для вычитания содержимого регистра 2 из содержимого регистра 1 и помещения ответа в регистр 4. Можете сказать, что с ним не так?
Такая программа сработает, только если содержимое регистра 1 больше содержимого регистра 2. Но что если это не так? Регистр 1 “обнулится” на середине цикла вычитания, когда вычитание еще не будет закончено. И что тогда? Мы не можем просто велеть компьютеру завершить выполнение программы, поскольку ответ в регистре 4 окажется неверным (0). Мы не можем использовать это обнуление, чтобы начать новый процесс, который сначала возвращается на половину цикла и отменяет временное декрементирование регистра 2. На этом этапе содержимое регистра 2 (а не регистра 1) даст нам верный ответ, если мы интерпретируем его в качестве отрицательного числа, так что вы можете просто переместить это содержимое в регистр 4 (который уже обнулен) и где-нибудь обозначить, что число в ответе отрицательное. Логично зарезервировать для этой задачи отдельный регистр – скажем, регистр 3. В самом начале его необходимо обнулить вместе с регистром 4, а затем поставить в регистре 3 “метку”, определяющую, положительное число в ответе или отрицательное, при условии что 0 означает +, а 1 означает –. Ниже представлен граф потока с комментариями, объясняющими, что происходит на каждом шаге цикла. (Вы можете добавлять такие комментарии в свои программы РПА, ограничивая их знаками #. Они предназначены для вас и других людей; RodRego их просто проигнорирует.)
а. Напишите РПА-программу для этого графа потока. (Обратите внимание: поскольку программа разветвляется, вы можете пронумеровать шаги несколькими способами. Неважно, какой из них вы выберете: главное, чтобы на верные следующие шаги указывали команды безусловного перехода.)
б. Что происходит, когда программа пытается вычесть 3 из 3 или 4 из 4?
в. Какая возможная ошибка предотвращается обнулением регистра 3 перед попыткой вычитания на шаге 3 вместо шага 4?
Умея складывать и вычитать, мы легко можем разработать программы для умножения и деления. Чтобы умножить n на m, нужно просто прибавить n к самому себе m раз. Мы можем запрограммировать компьютер сделать это, используя один регистр как счетчик, который считает от m до 0, осуществляя одну операцию декрементирования по завершении каждого цикла сложения.
а. Нарисуйте граф потока (и напишите РПА-программу) для умножения содержимого регистра 1 на содержимое регистра 3, поместив ответ в регистр 5.
б. (По желанию)[30] Используя копирование и перемещение, улучшите программу умножения, созданную в задаче а: когда она закончит работу, изначальное содержимое регистра 1 и регистра 3 восстановится, так что вы сможете легко проверить исходные данные и ответы на правильность по завершении программы.
в. (По желанию) Нарисуйте граф потока и напишите РПА-программу, которая изучает содержимое регистра 1 и регистра 3 (не разрушая их!) и записывает адрес (1 или 3) регистра с большим содержимым в регистр 2 или помещает 2 в регистр 2, если содержимое регистров 1 и 3 равно. (После выполнения этой программы содержимое регистра 1 и регистра 3 должно остаться неизменным, а регистр 2 должен показывать, равно ли их содержимое, а если нет, то в каком из регистров содержимое больше.)
Деление можно выполнять подобным образом, снова и снова вычитая делитель из делимого и считая, сколько раз мы можем провести эту операцию. Остаток – при наличии – можно поместить в специальный регистр для остатка. Но здесь обязательно нужно ввести важную меру предосторожности: на ноль делить нельзя (или можно?), поэтому перед началом деления необходимо провести простую проверку делителя, попробовав его декрементировать. Если его получилось декрементировать, нужно один раз его инкрементировать (чтобы восстановить его исходное значение), а затем провести деление. Если же в регистре ноль, после неудачной попытки декремента нужно поднять тревогу. Можно сделать это, зарезервировав регистр для метки ошибка: 1 в регистре 5 может означать “тревога! Меня только что попросили поделить на ноль!”.
Ниже представлен граф потока для деления содержимого регистра 1 на содержимое регистра 2, помещения ответа в регистр 3 и остатка в регистр 4 и резервирования регистра 5 для “сообщения об ошибке” (1 означает “меня попросили поделить на ноль”).
Изучите граф и обратите внимание, что ноль в делителе прерывает операцию и выдает сообщение об ошибке. Кроме того, заметьте, что регистр 4 служит двум целям: он не только выполняет роль копии делителя для восстановления делителя после каждой следующей операции вычитания, но и зарезервирован для потенциального остатка. Если регистр 1 обнуляется, прежде чем регистр 4 получает возможность вернуть свое содержимое обратно в регистр 2 для следующей операции вычитания, это содержимое и становится остатком, оказавшемся на своем месте.
секрет 1. Компетентность без понимания. Нечто – например, регистровая машина – может точно выполнять арифметические действия, не понимая, что делает.
Регистровая машина не тождественна сознанию. Она ничего не понимает, но вроде как понимает три простые вещи – Инк, Деп и Кон – в том смысле, что всякий раз слепо выполняет три этих “инструкции”. Само собой, это не настоящие инструкции, а лишь вроде как инструкции. Они кажутся нам инструкциями, и регистровая машина выполняет их так, как если бы они были инструкциями, так что нам более чем удобно называть их инструкциями.
Как вы теперь видите, эффективность регистровой машины объясняется существованием инструкции Деп, декремент-или-переход. Только эта инструкция позволяет компьютеру “замечать” (вроде как замечать) что-то в мире и использовать свои наблюдения для выбора следующего шага. Фактически существованием этой команды условного перехода объясняется эффективность всех компьютеров с хранимой в памяти программой, на что Ада Лавлейс обратила внимание еще в девятнадцатом веке, когда написала блестящий комментарий к описанию аналитической машины Чарльза Бэббиджа, которая стала прототипом всех компьютеров[31].
Когда вы наловчитесь собирать программы по частям, это станет для вас обычным делом. Однажды написав арифметические программы, мы можем использовать их снова и снова. Допустим, мы пронумеруем их: ADD станет операцией 0, SUBTRACT – операцией 1, MULTIPLY – операцией 2 и так далее. COPY может стать операцией 5, MOVE – операцией 6 и т. д. Теперь мы сможем использовать регистр, чтобы хранить в нем инструкцию, обозначая ее присвоенным номером.
упражнение 4 (по желанию)
Нарисуйте граф потока и напишите РПА-программу, которая превращает регистровую машину в простой карманный калькулятор, следующим образом:
а. Используйте регистр 2 для операции:
0 = ADD
1 = SUBTRACT
2 = MULTIPLY
3 = DIVIDE
б. Поместите числа, с которыми будут производиться манипуляции, в регистры 1 и 3.
(Таким образом, 3 0 6 будет означать 3 + 6; 5 1 3 будет означать 5–3; 4 2 5 будет означать 4 * 5; а 9 3 3 будет означать 9 3.) Затем поместите результаты операции в регистры 4–7, используя регистр 4 для знака (где 0 означает +, а 1 означает –), регистр 5 для численного ответа, регистр 6 для возможного остатка в случае деления, а регистр 7 для сообщения об ошибке ввода (либо требовании делить на ноль, либо неопределенной операции в регистре 2).
Обратите внимание, что в этом примере содержимое регистров (которое всегда представляет собой число) используется для обозначения четырех совершенно разных вещей: числа, арифметической операции, знака числа и метки ошибки.
секрет 2. Что именно обозначает число в регистре, определяет созданная нами программа.
Используя уже созданные структурные элементы, можно конструировать более сложные операции. Если запастись терпением, можно нарисовать граф потока и написать программу для возведения в квадрат – SQUARE – числа из регистра 7, или программу для вычисления среднего – FIND THE AVERAGE – содержимого регистров 1–20, или программу для разложения на множители – FACTOR – содержимого регистра 6 и помещения 1 в регистр 5, если 5 – искомый простой множитель, или программу сравнения – COMPARE – содержимого регистра 3 и регистра 4 и помещения большего содержимого в регистр 5, если только – UNLESS – оно не ровно в два раза больше, потому что в таком случае необходимо поместить метку в регистр 7. И так далее.
Особенно полезна программа, которая будет осуществлять поиск – SEARCH – по содержимому регистров, чтобы проверить, есть ли среди них регистр с конкретным содержимым, и поместить адрес этого регистра в регистр 101. (Как она будет работать? Поместите искомое число – TARGET – в регистр 102, а копию искомого числа – в регистр 103. Обнулите регистр 101, а затем, начиная с регистра 1, вычитайте содержимое регистров из содержимого регистра 103 [после инкрементирования регистра 101], ища нулевую разность. Если регистр 1 не дал нулевой разницы, переходите к регистру 2 и так далее. Если в каком-либо из регистров найдется искомое число, остановите программу; адрес этого регистра окажется в регистре 101.) Благодаря примитивной “чувствительности”, заключенной в инструкции Деп, – ее способности “замечать” нули, когда она пытается декрементировать регистр, – “глаза” регистровой машины можно обратить на нее саму, чтобы она изучала собственные регистры, перемещала между ними содержимое и меняла операции в зависимости от того, что и где она обнаруживает.
секрет 3. Поскольку число в регистре может означать что угодно, регистровая машина, в принципе, может быть сконструирована таким образом, чтобы “замечать” что угодно, или “отличать” любой признак либо черту, которую можно связать с числом – или несколькими числами.
К примеру, черно-белое изображение – любое черно-белое изображение, включая изображение этой страницы, – может быть представлено в виде огромного количества регистров, по одному регистру на пиксель, где 0 означает белую точку, а 1 – черную. Теперь напишите для регистровой машины программу, которая будет искать среди тысяч изображений изображение прямой черной горизонтальной линии на белом фоне. (Не пытайтесь сделать это на самом деле. Жизнь коротка. Просто более или менее живо представьте весь сложный и трудоемкий процесс, который справится с этой задачей.) Сконструировав – в воображении – определитель горизонтальных линий, определитель вертикальных линий и определитель полуокружностей, представьте, как скомпоновать эти фрагменты с несколькими другими полезными распознавателями (возможно, их понадобятся десятки) и написать программу, которая будет находить (заглавную) букву “А” в сотнях разных шрифтов! Программы оптического распознавания символов (OCR) – один из относительно недавних триумфов компьютерного программирования – могут сканировать печатные страницы и достаточно точно преобразовывать их в текстовый файл (в котором каждый буквенный или численный символ представлен числом в кодировке ASCII, так что по тексту можно осуществлять поиск, а также подвергать его другим чудесам текстовой обработки, не используя ничего, кроме арифметики.) Может ли программа OCR читать? Не то чтобы. Она не понимает, что видит. Она вроде как читает, и это удивительно полезная способность, которую можно добавить в нашу богатую коллекцию структурных элементов.
секрет 4. Поскольку число может означать что угодно, оно может означать инструкцию или адрес.
Числом в регистре можно обозначать инструкцию, например em>ADD, SUBTRACT, MOVE или SEARCH, и адреса (регистров в компьютере), поэтому мы можем хранить всю последовательность инструкций в ряде регистров. Если наша основная программа (программа А) велит машине переходить от регистра к регистру, выполняя содержащиеся в регистре инструкции, тогда в эти регистры можно поместить и вторую программу, программу Б. Когда машина начинает выполнение программы А, первым делом она обращается к регистрам, которые велят ей выполнять программу Б, что машина и делает. Это означает, что можно раз и навсегда поместить программу А в центральный блок обработки данных регистровой машины, зарезервировав для нее ряд регистров (она может стать “встроенной программой”, вшитой в ПЗУ – постоянное запоминающее устройство), а затем использовать программу А, чтобы запускать программы Б, В, Г и так далее, в зависимости от того, какие числа мы помещаем в обычные регистры. Устанавливая программу А на нашу регистровую машину, мы превращаем эту машину в компьютер с хранимой в памяти программой.
Программа А наделяет регистровую машину способностью добросовестно выполнять любые инструкции, которые мы помещаем (по номерам) в регистры. Любая подлежащая выполнению программа состоит из упорядоченной последовательности чисел, к которым по порядку обращается программа А, исполняющая инструкции, обозначенные этими числами. Если разработать систему, которая будет унифицировать эти инструкции (к примеру, присваивать им имена одинаковой длины – скажем, двузначные), можно будет считать всю серию чисел, составляющих программу Б, скажем
86, 92, 84, 29, 08, 50, 28, 54, 90, 28, 54, 90
одним большим и длинным числом:
869284290850285490285490
Это число одновременно представляет собой уникальное “имя” программы, программы Б, и саму программу, которая пошагово выполняется программой А. Вот другая программа:
28457029759028752907548927490275424850928428540423
и третья:
8908296472490284952498856743390438503882459802854544254789653985,
но самые интересные программы имеют гораздо более длинные имена, включающие миллионы знаков. Программы, хранимые в памяти вашего ноутбука, например текстовый процессор и браузер, представляют собой именно такие длинные числа, состоящие из многих миллионов (двоичных) знаков. Программа размером 10 мегабит – это последовательность из восьмидесяти миллионов нулей и единиц.
секрет 5. Всем возможным программам в качестве имени может быть присвоено уникальное число, которое затем можно считать списком инструкций для универсальной машины.
Блестящий теоретик и философ Алан Тьюринг вывел эту схему, используя другой простой воображаемый компьютер, который движется по разделенной на ячейки бумажной ленте. Поведение этого компьютера зависит (ага! – условный переход) от того, считывает он ноль или единицу из той ячейки, которую обрабатывает в данный момент. Машина Тьюринга умеет только менять бит (стирать 0, записывать 1 – и наоборот) или оставлять бит нетронутым, а затем перемещаться влево или вправо на одну ячейку и переходить к следующей инструкции. Думаю, вы согласитесь, что создание программ сложения, вычитания и других функций для машины Тьюринга при использовании только двоичных чисел 0 и 1 вместо всех натуральных чисел (0, 1, 2, 3, 4, 5 и т. д.) и перемещении лишь на одну ячейку зараз – гораздо более трудоемкий процесс, чем наши упражнения с регистровой машиной, но смысл при этом одинаков. Универсальная машина Тьюринга – это устройство с программой А (если хотите, встроенной), которая позволяет ему “считывать” программу Б с бумажной ленты и затем выполнять ее, используя остальную информацию с ленты в качестве вводных данных для программы Б. Регистровая машина Хао Вана способна выполнить любую программу, которую можно свести к арифметике и условным переходам, и таковы же возможности машины Тьюринга. Обе машины обладают чудесной способностью брать номер любой другой программы и выполнять этот номер. Вместо того чтобы конструировать сотни разных вычислительных машин, каждая из которых будет прошита для выполнения конкретной сложной задачи, достаточно создать единственную многоцелевую универсальную машину (с предустановленной программой А) и заставить ее исполнять наши запросы, пополняя ее программами – программным обеспечением, – создающими виртуальные машины.
Иными словами, универсальная машина Тьюринга представляет собой универсальный имитатор. То же самое можно сказать и о менее известной универсальной регистровой машине. И о вашем ноутбуке. Ваш ноутбук не делает ничего такого, что не могла бы сделать универсальная регистровая машина, и наоборот. Но не обольщайтесь. Никто не говорит, что все машины работают с одинаковой скоростью. Мы увидели, как ужасно медленно наша регистровая машина выполняет такую кропотливую операцию, как деление, которое она – мама дорогая! – осуществляет путем последовательного вычитания. Неужели нет способа ускорить процесс? Конечно есть. Фактически история компьютеров со времен Тьюринга до сегодняшнего дня – это как раз история поиска все более быстрых способов делать то, что делает регистровая машина, и ничего более.
секрет 6. Все усовершенствования компьютеров с момента изобретения воображаемой машины Тьюринга, движущейся по бумажной ленте, просто ускоряют их работу.
К примеру, Джон фон Нейман создал архитектуру для первого серьезного работающего компьютера, и чтобы ускорить его работу, он расширил окно головки записи-чтения машины Тьюринга, чтобы она читала зараз не один бит, а много. Многие ранние компьютеры читают 8-битные, 12-битные и даже 16-битные “слова”. Сегодня часто используются 32-битные слова. Это все еще узкое место – узкое место фон Неймана, – но оно в 32 раза шире узкого места машины Тьюринга! Прибегнув к некоторому упрощению, можно сказать, что слова по очереди копируются – COPY – из памяти в особый регистр (регистр инструкции), где эта инструкция читается – READ – и исполняется. Как правило, слово состоит из двух частей, кода операции (например, ADD, MULTIPLY, MOVE, COMPARE, JUMP-IF-ZERO) и адреса, который говорит компьютеру, к какому регистру обращаться за содержимым для проведения операции. Таким образом, 10101110 11101010101 может говорить компьютеру выполнять операцию 10101110 на содержимом регистра 11101010101, всегда помещая ответ в специальный регистр, называемый аккумулятором. Существенное различие между регистровой машиной и машиной фон Неймана заключается в том, что регистровая машина может осуществлять операции на любом регистре (само собой, только операции Инк и Деп), а машина фон Неймана выполняет всю арифметическую работу в аккумуляторе и просто копирует и перемещает – COPY и MOVE – содержимое в регистры памяти (или накапливает его – STORE – в этих регистрах). Все эти дополнительные перемещения и копирования окупаются возможностью осуществлять большое количество аппаратно-реализованных базовых операций. Иначе говоря, существует одна электронная схема для операции ADD, другая – для операции SUBTRACT, третья – для операции JUMP-IF-ZERO и так далее. Код операции напоминает код города в телефонной системе или индекс в почтовом адресе: он отправляет то, над чем работает, в верное место для исполнения. Так программное обеспечение встречается с аппаратным.
Сколько примитивных операций содержится сегодня в настоящих компьютерах? Сотни и даже тысячи. Кроме того, как в старые добрые времена, компьютер может быть наделен сокращенным набором команд (работать на архитектуре RISC): такой компьютер умеет выполнять лишь несколько десятков примитивных операций, но при этом работает молниеносно. (Если инструкции Инк и Деп можно исполнять в миллион раз быстрее, чем аппаратно-реализованную операцию ADD, будет целесообразно составить программу ADD, используя Инк и Деп, как мы делали ранее, и для всех операций сложения, предполагающих менее миллиона шагов, мы останемся в выигрыше.)
Сколько регистров содержится сегодня в настоящих компьютерах? Миллионы и даже миллиарды (но все они конечны, так что огромные числа должны распределяться по большому числу регистров). Байт состоит из 8 бит. Имея на своем компьютере 64 мегабайта RAM (оперативной памяти), вы имеете шестнадцать миллионов 32-битных регистров – или их эквивалент. Мы знаем, что содержимое регистров может обозначать не только положительные целые числа. Действительные числа (например, , 2 или ) хранятся в форме чисел “с плавающей запятой”. Эта форма представления разбивает число на две части, мантиссу и порядок, как в экспоненциальной записи (“1,495 1041”), что позволяет компьютеру производить арифметические действия, чтобы работать с числами (в приближенном представлении), которые натуральными не являются. Операции с плавающей запятой – это обычные арифметические операции (в частности, умножение и деление) над числами с плавающей запятой, и самый быстрый суперкомпьютер, который можно было купить двадцать лет назад (когда я написал первую версию этой главы), имел производительность более 4 мегафлопс (от англ. floating point operations per second), то есть мог выполнять более 4 миллионов операций с плавающей запятой в секунду.
Если вам этого мало, можно параллельно подключить друг к другу большое количество таких машин, чтобы все они работали одновременно, а не последовательно, не ожидая в очереди результатов для их последующей обработки. Функционал параллельного компьютера не отличается от функционала последовательного компьютера, но работает он быстрее. Фактически большинство параллельных машин, изучавшихся в последние двадцать лет, было виртуальными машинами, смоделированными на стандартных (непараллельных) машинах фон Неймана. Было разработано параллельное аппаратное обеспечение особого назначения, а конструкторы вычислительных машин изучают стоимость и перспективы расширения узкого места фон Неймана и ускорения проходящего сквозь него трафика всевозможными способами – с использованием сопроцессоров, кэш-памяти и различных других подходов. Сегодня японский компьютер Fujitsu K имеет производительность 10,51 петафлопс, то есть более десяти тысяч триллионов операций с плавающей запятой в секунду.
Возможно, этого почти достаточно, чтобы смоделировать вычислительную активность вашего мозга в реальном времени. Ваш мозг – образцовый параллельный процессор, имеющий около сотни миллиардов нейронов, каждый из которых представляет собой сложного маленького агента, имеющего конкретную задачу. Полоса пропускания зрительного “нерва”, по которому визуальная информация передается из глаза в мозг, составляет несколько миллионов каналов (нейронов). Но нейроны работают гораздо медленнее компьютерных микросхем. Нейрон может изменить состояние и отправить сигнал (фактически свою вариацию инструкции Инк или Деп) за несколько миллисекунд – тысячных, а не миллионных и не миллиардных долей секунды. Компьютеры перемещают биты со скоростью, близкой к скорости света, поэтому чем меньше компьютер, тем быстрее он работает: свет преодолевает 30 см примерно за одну миллиардную долю секунды, поэтому если вы хотите, чтобы два процесса коммуницировали быстрее, они должны проистекать ближе друг к другу.
секрет 7. Больше секретов нет!
Вероятно, самое удивительное свойство компьютеров заключается в том, что они составляются – простыми шагами – из элементов (операций), которые также предельно просты, а потому им просто негде хранить секреты. В них нет ни эктоплазмы, ни “морфических резонансов”, ни невидимых силовых полей, ни неизвестных прежде законов физики, ни чудо-ткани. Вы знаете, что если вы сумели написать компьютерную программу, которая моделирует какой-либо феномен, то эта модель не задействует ничего, кроме различных конфигураций арифметических операций.
Что насчет квантовых компьютеров, которые сейчас на пике популярности? Разве квантовые компьютеры умеют что-то такое, что не умеют обычные? И да и нет. Они умеют одновременно решать множество задач и вычислять множество значений, благодаря “квантовой суперпозиции”, причудливому и необычному свойству, которое гласит, что ненаблюдаемая сущность может одновременно пребывать во “всех возможных” состояниях, пока наблюдение не приведет к “коллапсу волновой функции”. (Подробнее об этом почитайте в своей любимой научно-популярной книге по физике или на познавательном сайте.) По сути, квантовый компьютер не что иное, как последняя и весьма впечатляющая инновация – можно сказать, квантовый скачок – в скорости обработки данных. Машина Тьюринга, движущаяся по бумажной ленте, и регистровая машина, неутомимо инкрементирующая и декрементирующая отдельные регистры, крайне ограничены в том, что они могут сделать за короткое время – минуты, часы или дни. Суперкомпьютер вроде Fujitsu K может делать все то же самое в триллионы раз быстрее, но для решения некоторых задач, особенно из области криптографии, этой скорости все равно недостаточно. Именно в этой сфере может пригодиться сверхбыстрый квантовый компьютер – если, конечно, люди сумеют решить невероятно сложные инженерные проблемы, возникающие при попытке создания стабильного и практичного квантового компьютера. Возможно, создать его так и не удастся, и тогда нам придется довольствоваться какими-то квадриллионами флопс.
25. Виртуальные машины
Реальные машины состоят из материальных подвижных частей и, как правило, называются в соответствии с задачами, для выполнения которых они сконструированы. Дизайн газонокосилок, открывашек и кофемолок бывает разным. Порой в основе их работы даже лежат разные физические принципы, но кое-что остается неизменным: машины, которые называются одинаково, выполняют более или менее одинаковую работу. Возможно, некоторые из них выполняют ее лучше других, но все зависит от предпочтений пользователя. Домовладелец может выбрать медленную газонокосилку, которая работает тише; владелец кафе может выбрать кофемолку, которая имеет больше степеней помола, пускай пользоваться ею и сложнее. Некоторые машины универсальны: надев другую насадку, можно превратить дрель в пилу или шлифовальную машинку. Компьютеры тоже универсальны, но могут делать не десяток, а целую тучу разных вещей. Вместо того чтобы надевать для выполнения каждой задачи новую насадку, вы открываете новую программу – очень длинную последовательность нулей и единиц, – которая ставит все необходимые внутренние переключатели в нужное положение, чтобы выполнить задачу. Каждая схема настройки – это уникальная машина, уникальная виртуальная машина, машина “из инструкций”, а не из подшипников, шестеренок, блоков и проводов. В компьютерах инструкции могут заменять блоки и шестеренки, потому что вместо хлебного теста, целлюлозы и стальных болванок компьютеры обрабатывают информацию, а информацию всегда можно перевести в двоичный код, состоящий из нулей и единиц, единственный код, который компьютер может – и имеет необходимость – “читать”. Микросхемы на кремниевых подложках манипулируют триллионами этих нулей и единиц, временно открывая и закрывая шлюзы, переводя потоки информации к той или иной микросхеме и таким образом контролируя, что с ней происходит. Миллионы крошечных элементов аппаратного обеспечения, которые могут принимать одно из двух состояний – 0 или 1, – это единственные “подвижные части” машины, и от настроек тысяч или миллионов этих крошечных элементов зависит то, какой именно машиной является компьютер в конкретный момент времени.
Виртуальной называется машина, которая возникает, когда определенный набор инструкций (а точнее, дипозиций) применяется к реальной машине, обладающей высокой пластичностью, то есть машине, взаимодействующие элементы которой могут пребывать в большом количестве разных состояний. Поскольку виртуальная машина работает с информацией, она может выполнять ту же задачу, что и компьютер, в котором роль “подвижных частей” играют изменения состояния аппаратного обеспечения, производя все эти изменения в представлениях этих подвижных частей. Вы можете выполнять деление столбиком, записывая процесс карандашом на бумаге, но деление столбиком дается вам особенно хорошо, так что вы можете производить его “в уме”, просто представляя – или воображая – цифры на листе или классной доске. Поскольку речь идет об информации, результат всегда один: вы получаете ответ. Напротив, если вы представите себе бутерброд с ветчиной, почувствовав голод, настоящего бутерброда это не заменит. Компьютеры так хорошо справляются с информационной работой “в уме” (представляя машину, которая выполняет работу), что практически невозможно сказать, с какой машиной вы при этом имеете дело – с “особой”, “аппаратно-реализованной”, ориентированной на выполнение конкретной задачи по обработке информации машиной или же с виртуальной машиной, работающей на многоцелевой микросхеме. К примеру, подавляющее большинство крошечных, дешевых компьютерных микросхем, которые используются сегодня в лифтах, кондиционерах, машинах, холодильниках и пультах дистанционного управления, на самом деле представляют собой многоцелевые компьютеры, способные выполнять вариации всех программ, установленных на вашем ноутбуке, но обреченных всю жизнь выполнять единственную относительно простую программу (программу регулировки зажигания, цикла разморозки и т. д.), “вшитую” в ПЗУ, и эта программа ограничивает все их выдающиеся способности одним-двумя трюками. Это дешевле изготовления микросхем специального назначения, разработанных для выполнения только этих простых задач.
Концепция виртуальной машины – один из лучших стимуляторов воображения, которые пришли к нам из компьютерной науки. Она успела доказать свою состоятельность в сфере информатики, и теперь ее пора применять в других сферах. Я использую этот термин в более широком смысле (и в свое время я объясню почему), поэтому не лишним будет узнать, каково его изначальное – как скажут некоторые, истинное – значение. Термин предложили специалисты по теории вычислительных систем Джеральд Попек и Роберт Голдберг (1974). Изначально он означал “эффективный, изолированный дубликат реальной машины” – дубликат, состоящий из… инструкций. Реальная машина – назовем ее А – это настоящий аппарат, сконструированный из кремниевых чипов, проводов и тому подобного, а виртуальная машина – это компьютерная программа (выполняющаяся на другой реальной машине, машине Б), которая полностью имитирует аппаратное обеспечение машины А: она может работать немного медленнее, потому что ей приходится составлять все базовые операции машины А из базовых операций, доступных на ее собственном аппаратном обеспечении, машине Б, но при этом выполняет те же самые программы. Программа, написанная для выполнения на аппаратном обеспечении А, должна без проблем выполняться и на аппаратном обеспечении Б, если на аппаратном обеспечении Б работает виртуальная машина, имитирующая машину А.
Этот фокус удивительно полезен – и не только из-за явной экономии, которую он предполагает: скажем, у вас нет компьютера на Mac OS, но есть дорогое программное обеспечение, работающее только на Mac OS. В таком случае вы можете написать виртуальную машину (ВМ), имитирующую Mac OS на вашем компьютере на Windows, и тогда программы для Mac OS будут работать на вашем компьютере при запущенной ВМ Mac OS. Ваш компьютер на Windows будет “притворяться” компьютером на Mac OS, но программы ничего не поймут! Представьте человека, который сломал руку. Ему наложили гипс, который сильно ограничивает подвижность руки, а его вес и форма также требуют корректировки остальных движений тела. Теперь представьте мима (скажем, Марселя Марсо), который изображает человека с загипсованной рукой. Если мим хорош в своем деле, движения его тела будут ограничиваться ровно так же: у него на руке виртуальный гипс – и он “практически виден”. Компьютер на Windows, имитирующий компьютер на Mac OS с применением ВМ Mac OS, должен быть неотличим – для программного обеспечения, работающего на нем, и для стороннего наблюдателя – от настоящего компьютера на Mac OS.
В реальности все обычно наоборот. Хотя и есть сконструированные ВМ Mac OS, работающие на Windows, насколько мне известно, это скорее баловство, чем настоящее, практичное программное обеспечение. Напротив, для Mac OS созданы надежные, удобные в использовании ВМ Windows, которые позволяют владельцам компьютеров на Mac OS запускать любые программы, написанные для Windows. Большинство программ сегодня создается без привязки к конкретному аппаратному обеспечению, но с привязкой к конкретным операционным системам (которые, в свою очередь, работают на разном аппаратном обеспечении). Первая причина расширить определение виртуальной машины – необходимость включить в него виртуальные имитации операционных систем. Операционная система тоже представляет собой своеобразную виртуальную машину, позволяя немного разному аппаратному обеспечению выполнять одни и те же программы, но операционная система – это исключительно программное обеспечение; она не имитирует настоящее аппаратное обеспечение, но создает – фактически задавая конкретные условия – воображаемую машину, которая подчиняется определенным правилам, принимает определенные данные и так далее.
Другая причина расширить определение заключается в том, что одной из самых популярных и широко распространенных виртуальных машин сегодня является виртуальная машина Java, или JVM, которая, подобно операционной системе, не имитирует никакую аппаратно-реализованную машину, а существует только в форме программно-реализованной машины. Именно изобретению Java интернет в основном обязан своей универсальностью: Java позволяет скачивать с сайтов маленькие программы – Java-апплеты, – которые дают возможность разгадывать кроссворды, играть в судоку, изучать карты, увеличивать фотографии, играть в игры с людьми с другого конца света, а также решать множество “серьезных” вычислительных задач. Создавая программы на языке программировании Java, веб-дизайнер не должен знать, кто именно придет к нему на сайт – пользователи Mac OS, Windows (или Linux), – поскольку Java-апплет всегда запускается на JVM, сконструированной специально для работы на компьютере на Mac OS, Windows или Linux. Соответствующая JVM автоматически скачивается и за несколько секунд устанавливается на ваш компьютер, а затем Java-апплет, как по волшебству, выполняется на этой JVM. (Возможно, вы замечаете, как на ваш компьютер скачиваются обновления Java, а возможно, и не замечаете этого! В идеале вы можете забыть о том, какая JVM установлена у вас на компьютере, и ожидать, что каждый посещаемый вами сайт либо будет использовать Java-апплеты, которые уже работают на вашей JVM, либо соответствующим образом обновит Java для корректной работы.)
Таким образом, в соответствии с моим расширенным определением термина, виртуальной машиной можно считать практически любую компьютерную программу, поскольку она представляет собой программное обеспечение – систематический список инструкций, – при запуске превращающее универсальный компьютер в машину конкретного назначения, которую можно было бы сконструировать и подключить в качестве аппаратного обеспечения. Алан Тьюринг сделал блестящий вклад в науку – и оказал огромную услугу человеческой цивилизации второй половины двадцатого века, – предложив идею “универсального” компьютера (сегодня мы называем его универсальной машиной Тьюринга), который можно превратить в любой другой компьютер, созданный для конкретной цели, просто установив и запустив соответствующую программу! (Если вы решили пропустить главу 24, то имейте в виду: в ней об этом говорится подробнее.) Не нужно создавать все возможные конфигурации аппаратного обеспечения – хватит и одной, ведь все остальное сделает программное обеспечение. Со времен Тьюринга нам известно, что можно взять сложную штуковину – аппаратное обеспечение, – обладающую большой пластичностью – регулируемыми ячейками “памяти” или регистрами, – и поместить в эти ячейки памяти набор инструкций, при выполнении которых эта штуковина превратится в любой компьютер, какой нам под силу ясно вообразить.
Машина Тьюринга – или ноутбук – выполняет по одной инструкции зараз и переходит к следующей инструкции, но “параллельные” компьютеры могут выполнять много (миллионов) инструкций одновременно. Регистр – это любой фрагмент аппаратного обеспечения, который может пребывать в том или ином состоянии (например, в состоянии нуля или единицы в случае с компьютерными битами, но состояний может быть и больше двух), пока не получит команду изменить состояние. Любая система регистров, которая может производить определенные элементарные операции на основании этих состояний (к примеру, менять состояние регистра или использовать состояние регистра, чтобы определить, какую операцию выполнять дальше), может и настраивать свои регистры таким образом, чтобы “вычислить функцию” или “исполнить программу”. Получается, что на любом подобном аппаратном обеспечении может работать виртуальная машина, созданная для использования этих простых шагов. Этот фокус можно проворачивать не один, а много раз, устанавливая виртуальные машины на виртуальные машины на виртуальных машинах… на аппаратном обеспечении.
Рассмотрим шахматную программу, написанную на высокоуровневом языке программирования Common Lisp, запущенную на операционной системе Windows 7, запущенной на компьютере. Этот компьютер притворяется машиной Windows, которая притворяется машиной Lisp, которая притворяется машиной для игры в шахматы. Если рассмотреть детали программы на высшем уровне, они будут более или менее понятны подкованному в компьютерах и шахматах наблюдателю (“Ага! Эта подпрограмма генерирует все возможные ответы на перемещение слона, а затем запускает подпрограмму оценки, которая…”). Настоящий программный код той же программы – последовательность нулей и единиц, которая помещается в регистр инструкций аппаратного обеспечения, – напротив, способен свести любого с ума, поэтому мы благоразумно сосредотачиваем внимание на высших уровнях. На каждом уровне мы видим лес за деревьями, поскольку детали низших уровней весьма кстати скрыты от наших глаз. Параллель между каскадом виртуальных машин на компьютере и каскадом гомункулов в гомункулярнофункционалистском представлении о сознании не просто совпадение. Именно необычайный успех виртуальных машин, которые помогли нам понять, как решать немыслимые ранее задачи (бронирование авиабилетов, игру в шахматы, прогнозирование погоды, письмо под диктовку и т. д.), дает повод надеяться, что мы сумеем провернуть подобный – всего лишь подобный – фокус, когда осуществим обратное проектирование мозга.
В таком случае, возможно, сходства мозга людей, говорящих по-французски, несмотря на все наблюдаемые анатомические различия, лучше всего объяснить на уровне виртуальной машины: все франкоговорящие люди имеют в голове ту или иную версию ФВМ, французской виртуальной машины, системы взаимосвязанных диспозиций, или микропривычек, каким-то образом хранящихся в миллиардах регистров мозга. Мозг русскоговорящих людей будет отличаться наличием подобной системы надежных шаблонов, РВМ. Если сказать франкоговорящему человеку: Donnez-moi le sel, s’il vous plait, – ФВМ гарантированно проконтролирует то же самое поведение, которое у русскоговорящего человека можно вызвать посредством введения в РВМ в его голове следующих данных: “Передай мне соль, пожалуйста”. Как же создаются ФВМ и РВМ, которые функционируют в нашем мозге?
Мы пока не знаем, как описать разные уровни активности мозга людей, играющих в шахматы или говорящих по-французски[32]. Несомненно, не стоит и надеяться на появление подробной схемы наподобие той, что позволяет программистам создавать свои творения на высшем уровне, имея полную уверенность, что компилятор (программа, которая берет инструкции высшего уровня и преобразует их в код, понятный аппаратному обеспечению) выдаст работающую программу. Но теперь у нас есть прекрасный экспериментальный образец: мы знаем по крайней мере один способ объяснить высокоуровневые способности машины с триллионами подвижных частей, не прибегая к концепции чудо-ткани.
26. Алгоритмы
В книге “Опасная идея Дарвина” (1995а) я предложил такой взгляд на великую идею Дарвина:
Жизнь на Земле рождалась на протяжении миллиардов лет посредством ветвления единственного древа – Древа жизни – под воздействием тех или иных алгоритмических процессов.
И что же такое алгоритм? Существует несколько конкурирующих определений этого термина, и мое, пожалуй, самое широкое. Далее следует переработанный фрагмент моей книги.
Дарвин открыл силу алгоритма. Алгоритм – это формальный процесс определенного типа, который должен – по идее – выдавать определенный результат всякий раз, когда он “запущен” или инстанцирован. Алгоритмы нам не в новинку. Они не были в новинку и во времена Дарвина. Многие знакомые арифметические операции, например деление в столбик и сведение баланса, на самом деле представляют собой алгоритмы. Алгоритмами также являются процедуры принятия решений при игре в крестики-нолики и расстановке слов по алфавиту. Относительно новыми можно назвать теоретические рассуждения математиков и логиков двадцатого века о природе и силе алгоритмов в целом – именно эти рассуждения позволили нам в ретроспективе оценить открытие Дарвина и привели к рождению компьютера, которое, в свою очередь, привело к еще более глубокому и осмысленному пониманию силы алгоритмов в целом.
Термин “алгоритм” восходит через латынь (algorismi) и раннеанглийский (algorism и ошибочной производной algorithm) к имени персидского математика Аль-Хорезми, в девятом веке написавшего книгу об арифметических операциях, которая в одиннадцатом веке была переведена на латынь либо Аделардом Батским, либо Робертом Честерским. Представление об алгоритме как надежной и в некоторой степени “механической” процедуре существовало веками, но в современной трактовке термин более или менее закрепился в 1930-х гг., когда его использовали в своей новаторской работе Алан Тьюринг, Курт Гёдель и Алонзо Черч. Нам важны три ключевых свойства алгоритмов, причем дать каждому из них определение непросто.