Вы здесь

ГЕДЕЛЬ, ЭШЕР, БАХ: эта бесконечная гирлянда

ГЕДЕЛЬ, ЭШЕР, БАХ: эта бесконечная гирлянда
Компьютеры — супергибкость или супержесткость?

Одной из основной целей в нашем стремлении к высшим уровням всегда было желание сообщать компьютеру о том. чего мы от него хотим, самым естественным для нас образом. Безусловно, конструкции высшего уровня в языках компиляторах ближе к категориям, в которых обычно думают люди, чем конструкции низшего уровня, такие, как в машинных языках. Но в этом стремлении к легкости общения с компьютерами мы обычно забываем об одном из аспектов «естественности», — а именно, том факте, что общение между людьми имеет намного меньше ограничений, чем общение между человеком и машиной. Например, мы зачастую произносим бессмысленные словосочетания, ища, как бы получше выразить свою мысль, кашляем в середине фразы, перебиваем друг друга, используем двусмысленные описания и «неправильный» синтаксис, придумываем выражения и искажаем смысл — но наши сообщения обычно все же достигают цели. В языках программирования, напротив синтаксис должен быть стопроцентно строгим, в них не должно быть двусмысленных выражений и конструкций. Интересно, что печатный эквивалент кашля разрешен, но только если он предварен условным знаком (например, словом КОММЕНТАРИЙ), после него также должен иметься условный знак (например, точка с запятой). Ирония в том, что эта небольшая уступка гибкости создает свои проблемы: если точка с запятой (или любой другой условный знак, отмечающий конец комментария) встречается внутри комментария, программа переводчик интерпретирует ее, как сигнал окончания комментария, после чего следует полная неразбериха.

Представьте, что в программе определена процедура под названием ПОНИМАНИЕ, и эта процедура затем вызвана семнадцать раз. Если в восемнадцатый раз это слово ошибочно написано ПОМИНАНИЕ, горе программисту! Компилятор взбунтуется и напечатает весьма неприятное послание ОШИБКА, сообщая, что он никогда не слыхал ни о каком ПОМИНАНИИ. Часто, когда компилятор обнаруживает подобную ошибку, он пытается продолжить работу, но из-за отсутствия у него поминания, он не может понять, что имел в виду программист. На самом деле, он может даже вообразить, что тот имел в виду нечто совершенно другое, и начать действовать согласно этой ошибочной интерпретации. В результате, остальная программа будет усеяна посланиями «ошибка», потому что компилятор — а не программист — запутался. Вообразите, какая путаница получится, если, переводя с английского на русский, переводчик услышит фразу по-французски и попытается переводить остальной английский текст, как французский! Компиляторы часто запутываются таким жалким образом. C'est la vie.

Может быть, это звучит как приговор компьютерам, — но я вовсе не имел это в виду. В некотором смысле, такое положение вещей необходимо. Если подумать, для чего обычно используются компьютеры, становится ясно, что они выполняют весьма определенные и точные задания, которые слишком сложны для людей. Чтобы мы могли доверять компьютерам, необходимо, чтобы они совершенно точно, без следа двусмысленности, понимали, что от них требуется. Необходимо также, чтобы компьютер делал не больше и не меньше того, что ему приказано. Если между компьютером и программистом стоит программа, предназначенная угадывать, чего тот хочет или имеет в виду, то весьма вероятно, что, когда программист попытается сообщить машине задачу, она будет понята совершенно неверно. Таким образом важно, чтобы программы высшего уровня хотя и удобные для людей, тем не менее были бы недвусмысленными и точными.

Как предвосхитить желания пользователя

Несмотря на это, возможно создать язык программирования который допускает некоторый тип неточности и программу, переводящую его на низшие уровни. Можно сказать, что программа-переводчик при этом будет пытаться интерпретировать нечто, сделанное «вне правил языка». Но если в языке допускаются некие «нарушения» правил, подобные нарушения уже нельзя назвать настоящими нарушениями, поскольку они включены в правила! Если программисту разрешено допускать определенный тип ошибок, он может использовать эту черту, зная, что при этом он оперирует строго в рамках правил, несмотря на видимость обратного. Иными словами, если пользователь знает о всех трюках, делающих программу-переводчика более гибкой и удобной для пользования, то он знает и предел, который он не может перейти; следовательно, ему эта программа все равно кажется жесткой и негибкой, хотя она и дает ему гораздо большую свободу по сравнению с ранними версиями, не включавшими «автоматическую компенсацию человеческих ошибок.»

По отношению к «эластичным» языкам подобного типа может быть две альтернативы: (1) пользователь знает о встроенных в язык и в программу-переводчика уступках; (2) пользователь о них не знает. В первом случае, язык может быть использован для точного сообщения программ, поскольку программист может предсказать, как компьютер будет интерпретировать программы, написанные на этом языке. Во втором случае, в языке есть скрытые черты, могущие выкинуть что-нибудь непредсказуемое с точки зрения пользователя, не знающего о том, как работает программа-переводчик. Результатом этого могут быть грубые ошибки в интерпретации программы, поэтому такой язык не годится для использования компьютеров за их быстроту и надежность.

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

Одна из основных областей исследования в сегодняшней науке об искусственном интеллекте называется автоматическим программированием; автоматическое программирование работает над созданием языков еще более высоких уровней, языков, переводящие программы которых смогут проделывать хотя бы некоторые из следующих удивительных вещей: обобщать на основе примеров, исправлять типографские или грамматические ошибки, пытаться понять двусмысленные описания, при помощи упрощенной модели пытаться угадывать, что на уме у пользователя, задавать вопросы, когда машине что-то непонятно, использовать человеческий язык и т. д. Может быть, со временем удастся найти компромисс между гибкостью и строгостью.

Прогресс искусственного интеллекта — это прогресс языка

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

«Пространство» всех новых программ настолько обширно, что никто не может представить себе всех возможностей. Каждый язык высшего уровня предназначен для исследования определенных районов «программного пространства», таким образом, используя данный язык, программист оказывается в соответствующем районе. Язык не заставляет его писать программы именно такого типа, но облегчает для него выполнение определенных задач. Близость к понятию и небольшой толчок — вот все, что обычно требуется здесь для крупного открытия; именно поэтому исследователи стремятся к языкам еще более высоких уровней.

Программирование на разных языках подобно сочинению музыкальных произведений в различных тональностях, особенно если вы работаете на клавиатуре. Если вы уже выучили или написали произведения во многих ключах, каждая клавиша будет иметь для вас свою собственную эмоциональную окраску. Некоторые мелодии кажутся естественными в одном ключе, но неловкими в другом. Таким образом, ваше направление определяется выбором тональности. В некотором роде, даже энгармонические тональности, такие как до-диез и ре-бемоль, весьма отличаются по настроению. Это говорит о том, что система нотации может играть важную роль в том, как будет выглядеть конечный продукт.

«Стратифицированная» схема искусственного интеллекта показана на рис. 59; внизу лежат компоненты аппаратуры, такие, как транзисторы, а на вершине расположены «думающие программы». Эта иллюстрация взята из книги «Искусственный интеллект» Патрика Генри Винстона (Patrick Henry Winston, «Artificial Intelligence»), она представляет собой общепринятый среди специалистов взгляд на искусственный интеллект. Хотя я согласен с идеей, что ИИ должен быть стратифицирован подобным образом, мне не кажется, что с таким небольшим количеством уровней возможно получить думающие программы.

РИС. 59. Для создания думающих программ необходимо построить серию уровней аппаратуры и программного обеспечения, чтобы избежать мучений работы со всеми процессами только на низшем уровне. Описания одного и того же процесса на разных уровнях весьма отличаются друг от друга, и только самый высший уровень представлен в блоках, достаточно крупных для нашего понимания. [Взято из книги «Искусственный интеллект» П. Г. Винстона (Р.Н. Winston, «Artificial Intelligence»).]

Между уровнем машинного языка и уровнем, на котором может быть достигнут настоящий интеллект, должна, по-моему убеждению, лежать еще дюжина (или даже несколько дюжин!) уровней, каждый следующий из которых, базируясь на предыдущем, в то же время был бы более гибким. Сейчас мы с трудом можем себе вообразить, как это будет выглядеть…

Параноик и операционная система

Схожесть уровней в компьютерной системе может привести к странному их смешению. Однажды я был свидетелем того, как пара моих приятелей — оба новички в компьютерном деле — забавлялись на терминале с программой «PARRY». PARRY — это печально известная программа, симулирующая параноика весьма простеньким образом: она выдает заранее заготовленные английские фразы, выбранные из широкого репертуара. Правдоподобие достигается тем, что программа может определить, какие именно «заготовки» могут звучать разумно в ответ на фразы, введенные в компьютер человеком.

В какой-то момент PARRY надолго задумалась, и я объяснил друзьям, что задержка, скорее всего, связана с большой нагрузкой на систему разделения времени. Я сказал им, что они могут узнать, сколько человек подключены к системе в данный момент; для этого нужно напечатать специальный символ «контроль», который пойдет прямо в операционную систему, минуя PARRY. Один из моих приятелей нажал на соответствующую клавишу, после чего некие данные о статусе операционной системы отпечатались на экране поверх фраз PARRY. При этом PARRY об этом понятия не имела, поскольку это программа, «понимающая» только в скачках и пари, но ничего не знающая об операционных системах, терминалах и специальных символах контроля. Для моих друзей, однако, PARRY и операционная система были одним и тем же — «компьютером», загадочным, аморфным, далеким существом, которое отвечало на то, что они печатали. Так что для них было вполне естественно, когда один из них с улыбкой напечатал «Почему вы пишете поверх того, что на экране?» Идея о том, что PARRY может ничего знать об операционной системе, при помощи которой она действует, была непонятна моим друзьям. Идея что «мы» знаем все о «нас самих» казалась им настолько естественной из их опыта людских контактов, что они просто распространили ту же идею на компьютер — в конце концов, он же был достаточно умен, чтобы «разговаривать» с ними по-английски! Их вопрос похож на то, как если бы вы спросили кого-нибудь: «Почему вы сегодня производите так мало красных кровяных шариков?» Люди не знают об этом уровне — «уровне операционных систем» — их тела.

Главная причина этого смешения уровней была в том, что общение со всеми уровнями компьютерной системы происходило на одном и том же экране, на одном и том же терминале. Хотя наивность моих друзей может показаться преувеличенной, даже опытные компьютерные специалисты часто допускают подобные ошибки, когда несколько уровней сложной системы бывают одновременно представлены на одном и том же экране. Они забывают, кто их «собеседник» и печатают что-то, не имеющее смысла на данном уровне, хотя и вполне приемлемое на другом. Может показаться, что хорошо было бы заставить саму систему сортировать уровни — интерпретировать команды согласно тому, какая из них «имеет смысл». К несчастью, подобная интерпретация требует от машины немалой толики здравого смысла и совершенного знания намерений программиста, а это требует настолько развитого искусственного интеллекта, которого на сегодняшний день у компьютеров нет.

Граница между аппаратурой и программным обеспечением

Путаница может также возникнуть из-за того, что одни уровни гибки, а другие — строги и жестки. Например, в некоторых компьютерах есть замечательные программы-редакторы, которые позволяют переводить куски текста из одного формата в другой, почти так же, как жидкость может быть перелита из одного сосуда в другой. Узкую страницу можно превратить в широкую, и наоборот. При такой мощи можно ожидать, что поменять шрифт, скажем, на курсив, также не представит никакого труда. Однако у программы может быть только один шрифт, что делает подобные изменения невозможными. Бывает также, что нужный шрифт можно получить на экране, но не на принтере — или наоборот. Долго работая с компьютерами, легко избаловаться и считать, что программированию должно поддаваться все; не должно быть негибких принтеров, имеющих только один шрифт, или даже конечный набор шрифтов, шрифты должны определяться пользователем! Но достигнув этой степени гибкости, мы начинаем расстраиваться, что принтер не печатает разноцветными чернилами на бумаге любой формы и размера или что он не чинит сам себя…

Проблема в том, что в какой-то момент вся эта гибкость должна, используя фразу из главы V, «коснуться дна». Должен существовать жесткий уровень аппаратуры, на котором основано все остальное. Он может быть спрятан под гибкими уровнями так глубоко, что немногие пользователи чувствуют ограничения, налагаемые аппаратурой — однако эти ограничения неизбежны.

В чем именно состоит разница между программным обеспечением и аппаратурой? Это разница между программами и машинами — между длинными и сложными последовательностями команд и физическими аппаратами, которые эти команды выполняют. Я сказал бы, что программное обеспечение — это «то, что можно передать по телефону», а аппаратура — это «все остальное». Пианино — это аппаратура, а ноты — программное обеспечение. Телефонный аппарат — это аппаратура, а телефонный номер — программное обеспечение. К сожалению, это полезное различие далеко не всегда так ясно.

В нас, человеческих существах, тоже есть аспекты «аппаратуры» и «программного обеспечения» и разница между ними для нас настолько естественна, что мы перестаем ее замечать. Мы привыкли к негибкости нашей физиологии: то, что мы не можем усилием воли вылечить себя от всех болезней или заставить расти у нас на голове волосы любого цвета — лишь два простых примера. Однако мы можем «перепрограммировать» наш мозг, чтобы оперировать в рамках новых понятий. Удивительная гибкость интеллекта кажется почти несовместимой с тем фактом, что наш мозг сделан из «аппаратуры», подчиняющейся строгим правилам, аппаратуры, которую невозможно изменить. Мы не можем заставить наши нейроны реагировать быстрее или медленнее, не можем «поменять проводку» у себя в мозгу, не можем изменить внутренность нейрона — короче, у нас нет никакого выбора относительно нашей «аппаратуры» — и тем не менее, мы можем контролировать собственные мысли.

Страницы


В нашей электронной онлайн библиотеке вы можете бесплатно и без регистрации прочитать «ГЕДЕЛЬ, ЭШЕР, БАХ: эта бесконечная гирлянда» автора Хофштадтер Даглас на телефоне, андроиде, айфоне, айпаде. Сейчас вы находитесь в разделе „Часть II“ на странице 9. Приятного чтения.