А теперь вернёмся чуть-чуть назад, к главе об игре Конвея "Жизнь". Как вы помните, глава эта заканчивалась описанием удивительной машины Тьюринга, созданной на основе сложнейшей конфигурации клеток "Жизни". Эта машина Тьюринга умела удваивать последовательность единиц на ленте. Что если - теоретически, конечно, - мы зададим интерпретатору APL "проиграть" только что разобранную нами программу с начальной матрицей, представляющей собой конфигурацию Ренделла для машины Тьюринга ?
Ответ прост - достаточно терпеливый интерпретатор APL (с поистине безразмерной памятью) воспроизведёт необходимое число поколений "Жизни", которые и будут результатом вычислений машины Тьюринга, умеющей удваивать последовательность единиц. Простота такого ответа, тем не менее, заключает в себе нечто не поддающееся осмыслению: гигантская работа сложнейшего, но отлаженного как часы, механизма, после невообразимых затрат компьютерных ресурсов, памяти и времени, приведёт в конечном итоге к копированию последовательности единиц.
Зачем нам понадобился этот гипотетический эксперимент ? Только что вы увидели бесполезный, но очень наглядный пример виртуальных машин - вложенных друг в друга концепций, языков, относящихся к самым разным областям, множество взаимодействующих между собой миров. А настоящей машиной из всего этого чудовищного нагромождения является только hardware - компьютер из "железа" в самом низу описанной пирамиды. Вся компьютерная наука, всё программирование основано на такого рода пирамидах:
Слои пирамиды - это и в самом деле никак не связанные между собой миры. Каждый из них создавался вне зависимости от другого и в большинстве случаев даже в неведении о существовании другого мира. Так, Тьюринг придумал свою машину задолго до появления на свет правил "Жизни". Ренделл конструировал конфигурацию машины Тьюринга без какой-либо мысли о том, что кто-то будет экспериментировать с ней, пользуясь языком APL. Айверсон придумал APL не для того, чтобы на нём запускали программу "Жизнь", а разработчики процессора, вполне возможно, не имели ни малейшего понятия о языке APL.
Что же позволяет всем этим мирам - слоям пирамиды - взаимодействовать и слаженно работать друг с другом ? На этот вопрос можно ответить двумя словами: универсальность и интерфейс.
Каждый из "слоёв" пирамиды - универсален. На компьютере общего назначения можно запрограммировать всё, что угодно - точнее, любой вычислимый алгоритм - в частности - интерпретатор языка APL (Машина - настоящая или виртуальная, способная воспроизвести любой вычислимый алгоритм, называется Turing-complete). На APL можно написать любую программу (опять же в рамках "вычислимости алгоритма"), в частности - игру "Жизнь". В свою очередь, "Жизнь" - универсальна в том смысле, что на ней, как доказано, можно имитировать любое вычисление, доступное обычному компьютеру (то есть, она тоже Turing-complete) - таким образом с помощью определённой конфигурации удалось создать машину Тьюринга. А машина Тьюринга говорит сама за себя - это и есть универсальный компьютер. В качестве простейшего его применения мы можем копировать на нём последовательности единиц.
Но универсальность всех этих машин не имела бы смысла, если бы каждая из них не обладала строго определённым набором правил, известных людям, использующим эту машину - интерфейсом.
Так, набор машинных команд - это интерфейс процессора. Набор функций и синтаксических правил APL - это его интерфейс. Три правила игры "Жизнь" - это и есть интерфейс игры "Жизнь", и так далее.
Такая универсальность и строго заданный интерфейс и есть та движущая сила, которая позволяет строить нам "концептуальные компьютерные пирамиды" любой высоты и сложности, а значит - создавать всё новые и новые модели для описания мира и вводить всё новые уровни абстракции.
Немецкий математик Герман Вейль в своей книге "Математическое мышление" пишет:
«Подходя к решающему шагу математической абстракции, мы забываем то, что в действительности обозначают математические символы... Существует множество операций, которые можно выполнить, используя эти символы, без того, чтобы задумываться над тем, что они обозначают».
Именно абстракция - это то ключевое слово, которое отличает компьютер от всех других машин, созданных человеком. Компьютер позволяет нам - программисту или пользователю - абстрагироваться от той простой функциональности, которая изначально в него заложена. А как всем хорошо известно, компьютер умеет не более, чем манипулировать последовательностями нулей и единиц. Но делает он это так универсально, что, работая на компьютере, мы не задумываемся над тем, что на самом деле происходит в этом "чёрном ящике" - мы всегда имеем дело с неким приложением, программой, которую компьютер выполняет в данный момент. Это может быть простейший калькулятор - и тогда нам кажется, что мы работаем с калькулятором (хотя на самом деле - это наш компьютер "притворяется" калькулятором); или это может быть сложный редактор текстов - и мы пребываем в иллюзии, что редактируем текст на какой-то специально предназначенной для этого машине (а на самом деле это тот же самый компьютер, который "делает вид", что он редактор текстов).
Знаменитый компьютерный учёный Дэвид Гелернтер[1], в своей книге "The Muse in the Machine" вводит понятие виртуальной машины[2], чтобы высказать эту же мысль:
«Идея виртуальной машины глубока и удивительна. Она стоит в ряду самых значительных понятий в истории технологии... В чем же значение этой идеи ? Большинство машин есть то, что они есть. Тостер – это тостер. Его возможности определены способом, которым он был сконструирован. Отличие компьютера от всех остальных машин фундаментально. Компьютер – это машина, которая может имитировать другие машины: его характеристики и функциональность определяются не тем способом, которым он создан, а характеристиками той машины, которую он в данный момент представляет – то есть, той программой, которую он выполняет».
Современный компьютер стал универсальным инструментом именно тогда, когда он доказал свою возможность быть не только мощным калькулятором, но и машиной для обработки символьной информации – текстов, документов, графики, цвета, музыки и видео[3]. Каждая следующая революция в компьютерном мире связана с прибавлением нового уровня абстракции в общении человека с машиной. Возможность обработки данных, представленных в виде списков и других контейнеров произвольного (а не только числового) содержания проложила дорогу базам данных. Разработки в области графического представления данных позволили реализовать новый вид пользовательского интерфейса. В свою очередь изобретение мыши и многооконной системы открыло возможность для работы с компьютером людям, далеким от программирования и технических специальностей. Графические редакторские программы произвели переворот в книгопечатании, дизайне и моделировании. Придание компьютеру мультимедийных возможностей превратило его в универсальный развлекательный центр, совмещающий в себе телевизор и аудиосистему. Компьютерные сети вместе с системой структурирования документов и возможностью их графического представления привели к возникновению World Wide Web, которая в свою очередь кардинально изменила способы общения людей между собой.
Тот же Дэвид Гелернтер, но уже в другой своей книге «The Aesthetics of Computing» пишет:
“Software отличается от всего остального. Киберпространство отличается от физического пространства. Гравитация, которая тянет вниз наше воображение, когда мы сталкиваемся с этими новыми, странными понятиями – это и есть компьютер, старомодное физическое устройство. Цель software – преодолеть силу этой гравитации, и каждый ключевой шаг в истории software был шагом удаления от компьютера, забывания о самой машине и ее физическом устройстве и ограничениях...”
Абстрагируйтесь на время от того, что вы сидите около физического устройства и смотрите в экран. Представьте себе невероятность того, что происходит внутри компьютера: сигналы, посланные в определённом порядке, заданном исключительно мыслью, создают символы. Символы, составленные определённым образом манипулируют символами же, переставляя их в соответствии с алгоритмами - то есть, нематериальными идеями, способными действовать в виртуальном (не физическом) пространстве. Эти алгоритмы населяют каждый из уровней пирамиды абстракций, положенных один на другой и связанных между собой всё теми же символами, перемещающимися из одного уровня в другой, каждый раз превращаясь во что-то новое, всё более удалённое от первоначально заданного уровня.
Символы и алгоритмы - идеи - обитающие внутри компьютера, живут своей собственной, в большинстве случаев скрытой от нас жизнью. И иногда, подобно настоящим живым организмам, они начинают творить зло. С этой стороной жизни компьютерных обитателей мы познакомимся в следующей главе.
[1] Дэвид Гелернтер стал одной из жертв печально известного борца с технологическим прогрессом, так называемого Унабомбера: открыв письмо-бомбу, посланную ему Унабомбером, Гелернтер пострадал от взрыва и стал инвалидом.
[2] Очень важно не путать понятие универсальной виртуальной машины, которое используется в этом контексте с теми виртуальными машинами, которые ещё появятся в курсе, например в главах о Java и Forth. Эти виртуальные машины - на самом деле просто программы, созданные для строго определённых целей. Придёт время, и вы узнаете, для каких именно целей.
[3] Возможность обработки компьютером символьной, а не только числовой информации предвидела ещё Ада Лавлейс.