Читаем Гёдель, Эшер, Бах. Эта бесконечная гирлянда полностью

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

Перейдем теперь на более высокую ступень иерархии уровней описания программ — уровень языка ассемблера. Между машинным языком и языком ассемблера дистанция не так уж велика; скорее, это маленький шажок. Главное здесь то, что между командами на языке машины и командами на языке ассемблера существует взаимно однозначное соответствие. Язык ассемблера представляет отдельные команды машинного языка в виде «блоков», так что, желая например, записать команду сложения, вместо последовательности битов «010111000» вы пишете просто ДОБАВИТЬ, и вместо того, чтобы давать адрес в двоичном коде, вы можете указать на слово в памяти, назвав его по имени. Следовательно, программа на языке ассемблера — это что-то вроде программы на машинном языке, сделанной более удобной для людского чтения. Машинную версию программы можно сравнить с деривацией ТТЧ, записанной в туманной нотации Гёделевых номеров, в то время как версия на языке ассемблера сравнима с изоморфной деривацией ТТЧ, записанной в более легкой для понимания первоначальной нотации самой ТТЧ. Или, возвращаясь к образу ДНК: разница, существующая между машинным языком и языком ассемблера подобна разнице между определением нуклеотидов при помощи их кропотливого, атом за атомом, описания и определением нуклеотидов по именам (как, например, «A», «G», «С» или «Т»). Подобная операция «превращения в блоки» представляет собой огромную экономию труда, хотя концептуально почти ничего при этом не меняется.

Программы, переводящие программы

Возможно, что самое важное в языке ассемблера — не его отличие от машинного языка, которое не столь уж велико, но сама идея того, что программы вообще могут быть написаны на различных уровнях. Ведь компьютерная аппаратура построена так, чтобы «понимать» программы на машинном языке — последовательности битов — а не буквы и не числа в десятичной записи! Что происходит, когда в эту аппаратуру вводится программа на языке ассемблера? Это напоминает попытку заставить клетку узнать бумажку с записанном буквами нуклеотидом, вместо самого нуклеотида со всеми его химическими компонентами. Что делать клетке с этой бумажкой? Что делать компьютеру с программой на языке ассемблера?

Здесь мы подошли к главному: возможно написать на машинном языке программу-переводчик. Эта программа, под названием ассемблер, берет имена, десятичные числа и другие сокращения, которые программист может легко запомнить, и превращает их в монотонные, но необходимые последовательности битов. После того, как программа на языке ассемблера собрана (то есть переведена), она — точнее, ее эквивалент на машинном языке — выполняется компьютером. Однако здесь это лишь вопрос терминологии; программа какого уровня выполняется машиной? Вы не ошибетесь, сказав, что выполняется программа на машинном языке поскольку в выполнении любой программы всегда задействована аппаратура — но вполне разумно также предположить, что выполняется программа на языке ассемблера. Например, вполне можно сказать: «В данный момент ЦП выполняет команду „ПЕРЕХОД“», вместо того, чтобы говорить «В данный момент ЦП выполняет команду „111010000“». Пианист, играющий ноты G-E B-E-B-G. в то же время играет арпеджио в ми миноре. Нет причин отказываться от описания вещей с точки зрения высших уровней. Таким образом, можно считать, что программа на языке ассемблера выполняется одновременно с программой на машинном языке то, что происходит в ЦП, можно описать двумя способами.

Языки высших уровней, компиляторы и интерпретаторы

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

Перейти на страницу:

Похожие книги

Простая одержимость
Простая одержимость

Сколько имеется простых чисел, не превышающих 20? Их восемь: 2, 3, 5, 7, 11, 13, 17 и 19. А сколько простых чисел, не превышающих миллиона? Миллиарда? Существует ли общая формула, которая могла бы избавить нас от прямого пересчета? Догадка, выдвинутая по этому поводу немецким математиком Бернхардом Риманом в 1859 году, для многих поколений ученых стала навязчивой идеей: изящная, интуитивно понятная и при этом совершенно недоказуемая, она остается одной из величайших нерешенных задач в современной математике. Неслучайно Математический Институт Клея включил гипотезу Римана в число семи «проблем тысячелетия», за решение каждой из которых установлена награда в один миллион долларов. Популярная и остроумная книга американского математика и публициста Джона Дербишира рассказывает о многочисленных попытках доказать (или опровергнуть) гипотезу Римана, предпринимавшихся за последние сто пятьдесят лет, а также о судьбах людей, одержимых этой задачей.

Джон Дербишир

Математика