ином уровне, чем новичок, и оперирует другим набором понятий. Почти все бывают удивлены, узнав, что во время партии мастер редко заглядывает вперед дальше, чем новичок — более того, мастер обычно рассматривает всего лишь горстку возможных ходов. Трюк заключается в том, что его восприятие доски подобно фильтру, глядя на позицию, он буквально не видит плохих ходов, подобно тому, как любители не видят ходов, противоречащих правилам. Любой, кто хотя бы немного играл в шахматы, организует свое восприятие таким образом, что диагональные ходы ладьей, вертикальное взятие пешками и тому подобное просто не приходят ему в голову. Подобно этому, мастера создали высшие уровни организации в их восприятии позиции; в результате, рассматривать плохие ходы для них так же маловероятно, как для большинства людей — рассматривать незаконные ходы. Это можно назвать явной обрезкой гигантского разветвленного дерева возможностей. С другой стороны, неявная обрезка включает рассмотрение хода и, после поверхностного анализа, решение этот ход больше не анализировать.
Это различие приложимо также и к другим видам интеллектуальной деятельности — например, к занятиям математикой. Способный математик обычно не обдумывает всяческие ложные пути к доказательству нужной теоремы, как это могли бы делать менее одаренные люди; скорее, он «нюхом чувствует» многообещающие пути и сразу направляется по ним.
Компьютерные шахматные программы, основанные на заглядывании далеко вперед, не научены думать на высшем уровне; стратегией таких машин была «грубая сила» просчета вариантов, в надежде таким образом сокрушить любое сопротивление. Однако оказалось, что эта стратегия не работает. Может быть, когда-нибудь и удастся создать такую программу, которая, основываясь только на грубой силе — умению считать варианты — действительно сможет обыгрывать лучших человеческих игроков. Однако это будет небольшим выигрышем в области интеллекта, по сравнению с открытием того, что важнейшей составляющей разума является его умение создавать многоуровневые описания сложных схем, таких, как шахматные доски, телевизионные экраны, печатные страницы или картины.
Обычно нам не приходится держать в уме больше одного уровня понимания ситуации. Более того, как мы уже сказали ранее, различные описания одной и той же системы бывают настолько далеки друг от друга концептуально, что у нас не возникает проблемы одновременного восприятия обоих; они просто хранятся в разных мысленных отделениях. Трудности возникают тогда, когда одна и та же система допускает два или более описаний, в чем-то похожих друг на друга. Тогда нам бывает трудно, думая о системе, не смешивать различные уровни — и при этом мы легко можем запутаться.
Вне сомнения, это происходит, когда мы думаем о нашей собственной психологии — скажем, когда мы пытаемся понять мотивы различных человеческих поступков. В структуре человеческого разума есть множество уровней — безусловно, это система, которую мы пока понимаем недостаточно хорошо. Существуют сотни соперничающих друг с другом теорий, объясняющих различное поведение; они основаны на предположениях о том, насколько глубоко в этой иерархии уровней расположены те или иные психологические «силы». Поскольку в настоящее время мы используем почти один и тот же язык для описания различных уровней, это приводит к немалой путанице и, наверняка, к рождению множества ложных теорий. Например, мы говорим о стимулах — сексе, власти, славе, любви — понятия при этом не имея, где именно в структуре человеческого интеллекта они зарождаются. Я не буду останавливаться на этом подробно; скажу лишь, что наше непонимание того, кто мы есть, безусловно связано с тем фактом, что мы состоим из большого количества уровней и используем один и тот же язык для описания нас самих на разных уровнях.
Существует еще одно место, где многие уровни описания сосуществуют в единой системе и все уровни концептуально близки один к другому. Я имею в виду компьютерные системы. Работающую компьютерную программу можно рассматривать на нескольких уровнях. На каждом уровне описание дается на языке вычислительных машин, что делает все описания в какой-то мере схожими — в то же время между нашим восприятием разных уровней есть крайне важные различия. На низшем уровне описание настолько сложно, что его можно сравнить с описанием образа на экране телевизора в виде набора точек; однако для определенных целей нужен именно такой взгляд на вещи. На высшем уровне описание представлено в форме крупных блоков и воспринимается совершенно по-другому, несмотря на то, что многие понятия повторяются как на низшем так и на высшем уровнях. Блоки описания на высшем уровне можно сравнить с блоками шахматного мастера и с блочным описанием образа на экране: они суммируют в сжатой форме те вещи, которые на низших уровнях представлены как отдельные. (См. рис. 57.)
Рис. 57. Идея «укрупнения» группа предметов воспринимается как единый «блок» Граница этого блока работает как клеточная мембрана или национальная граница, она устанавливает индивидуальность группы предметов внутри нее. В зависимости от контекста, внутренняя структура блока может приниматься во внимание или игнорироваться.
Чтобы предмет нашего разговора не стал слишком абстрактным, обратимся к конкретным фактам из области вычислительной техники; для начала бросим взгляд на то, что представляет собой компьютерная система на низшем уровне. Низший уровень? Не совсем, конечно — но я не буду здесь говорить об элементарных частицах, так что для нас это будет низшим уровнем.
В основании компьютерной системы находится память, центральный процессор (ЦП), и некоторые вводно-выводные устройства. Сначала давайте опишем память. Она состоит из отдельных физических единиц, называемых словами. Для конкретности скажем что в памяти есть 65 536 слов (это типичное число — 2 в 16-ой степени). Слово далее подразделяется на то что мы будем считать атомами информатики — биты. В типичном слове — около тридцати шести битов. Физически бит представляет собой магнитный «выключатель» который может быть в одном из двух положений.
00X0XXX0X00XX00X0XXXXXX0XX00XXX0000
— слово из 36 битов —
Вы можете называть эти положения «вверх» и «вниз», или «x» и «o», или «1» и «0». Последнее — общепринятое название, оно вполне адекватно, но может запутать читателя, заставив его думать, что на самом деле в памяти компьютера хранятся числа. Это неверно. У нас столько же оснований думать о наборе из тридцати шести битов, как о числе, как и считать, что два четвертака — это цена мороженого. Так же, как деньги могут быть использованы по-разному так и слово в памяти может выполнять разные функции. Строго говоря, иногда эти тридцать шесть битов действительно могут представлять число в двоичной записи. В другой раз они могут представлять тридцать шесть точек на экране телевизора, или же несколько букв текста. Наша интерпретация слова в памяти целиком зависит от той роли, которую это слово играет в использующей его программе. Разумеется, оно может играть несколько ролей — как нота в каноне.
Существует еще одна интерпретация слова, о которой я пока не упоминал слово может интерпретироваться как команда. Слова памяти содержат не только данные, на основании которых действует компьютер, но и программу, действующую на эти данные. Существует ограниченное количество операций, которые могут быть выполнены центральным процессором — ЦП — и часть некоего слова (обычно несколько первых битов) интерпретируются как название типа команды, которая должна быть выполнена. Что же означают остальные биты в слове-команде? Чаще всего, они говорят, на какие другие слова памяти надо воздействовать. Иными словами, остальные биты являются указателем на какое-либо другое слово (или слова) памяти. Каждое слово в памяти имеет свое расположение, как дом на улице; это расположение называется адресом. Память может иметь одну «улицу» или много «улиц» — они называются страницами. Таким образом, адрес любого слова — это номер страницы (если память подразделена на страницы) и его расположение на этой странице. Итак, «указатель» — это часть команды, содержащая числовой адрес какого-либо слова (или слов) в памяти. На указатель нет никаких ограничений, так что команда может даже указывать сама на себя — в этом случае, когда она действует, она изменяет саму себя.
Откуда компьютер знает, в какой момент надо выполнять ту или иную команду? Об этом заботится ЦП. В нем есть специальный указатель, который указывает (то есть хранит соответствующий адрес) на следующее слово-команду. ЦП извлекает это слово из памяти и копирует его на специальное слово в самом ЦП. (Слова в ЦП обыкновенно называют не словами, а регистрами.) После этого ЦП выполняет эту команду. Команда может вызывать любую из большого количества возможных операций; типичные операции включают:
ДОБАВИТЬ слово, указанное в команде, к регистру. (В этом случае данное слово интерпретируется как число.)
НАПЕЧАТАТЬ слово, указанное в команде, в виде букв. (В этом случае данное слово интерпретируется не как число, а как строчка букв.)
ПЕРЕЙТИ к слову, указанному в команде. (В этом случае ЦП интерпретирует данное слово, как следующую команду.)
Если первоначальная команда не содержит явного указания поступить иначе, ЦП просто обращается к следующему слову и интерпретирует его, как команду. Иными словами, ЦП предполагает, что он должен двигаться вдоль по «улице» последовательно, как почтальон, интерпретируя слово за словом как команды. Однако это последовательное движение может быть прервано некоторыми командами, такими как, например, ПЕРЕХОД.
Вы только что прочитали очень краткий обзор машинного языка. В этом языке типы существующих операций составляют конечный репертуар, который не может быть расширен. Таким образом любая программа, какой бы большой и сложной она не была, должна состоять из этих типов команд. Рассматривать программу, написанную на машинном языке, это все равно что рассматривать молекулу ДНК атом за атомом. Если вы вернетесь к рис. 41, где изображена последовательность нуклеотидов молекулы ДНК (и имейте в виду, что в каждом нуклеотиде около двух дюжин атомов) и представите себе, что вам надо записать, атом за атомом, ДНК крохотного