Х. Абельсон, Дж. Дж. Сассман, Дж. Сассман - Структура и интерпретация компьютерных программ (1108516), страница 3
Текст из файла (страница 3)
Поскольку большие программы вырастают из малых, нам необходимо обзавестисьарсеналом программных структур, в правильности которых мы можем быть уверены —их можно назвать идиомами — и научиться объединять их в структуры большего размера с помощью организационных методов, ценность которых также доказана. Эти методыподробно обсуждаются в книге, и их понимание существенно для участия в прометеевском предприятии под названием «программирование». Для умения создавать большие,значительные программы нет лучшего помощника, чем свободное владение мощнымиорганизационными методами.
И наоборот: затраты, связанные с написанием большихпрограмм, побуждают нас изобретать новые методы уменьшения веса функций и деталей, входящих в эти программы.В отличие от программ, компьютеры должны повиноваться законам физики. Если мыхотим, чтобы они работали быстро — по нескольку наносекунд на смену состояния, —электроны в их цепях не должны проходить большие расстояния (более полуметра).При этом тесно сконцентрированные в пространстве приборы излучают тепло, котороенужно куда-то отводить: так развилось изысканное инженерное искусство, призванноенаходить равновесие между обилием функций и плотностью расположения устройств.Так или иначе, аппаратура всегда работает ниже того уровня, на котором мы бы хотели программировать. Процессы, посредством которых наши программы на Лиспе переводятся в «машинные» программы, сами являются абстрактными моделями, которыемы воплощаем в программах.
Их изучение и реализация многое дают для пониманияорганизационных методов, направленных на программирование произвольных моделей.Разумеется, так можно смоделировать и сам компьютер. Подумайте об этом: поведениемельчайшего переключателя моделируется квантовой механикой, которая описываетсядифференциальными уравнениями, точное поведение которых фиксируется в численныхприближениях, представленных в виде компьютерных программ, которые выполняютсяна компьютере, составленном из ... — и так без конца!Раздельное выделение трех групп явлений — не просто вопрос тактического удобства. Хотя эти группы и остаются, как говорится, в голове, но, проводя это разделение,мы позволяем потоку символов между тремя группами двигаться быстрее.
В человеческом опыте с этим потоком по богатству, живости и обилию возможностей сравнитсяразве что сама эволюция жизни. Отношения между разумом человека, программами икомпьютером в лучшем случае метастабильны. Компьютерам никогда не хватает мощности и быстродействия. Каждый новый прорыв в технологии производства аппаратурыведет к появлению более масштабных программных проектов, новых организационныхпринципов и к обогащению абстрактных моделей. Пусть каждый читатель время от времени спрашивает себя: «А зачем, к чему все это?» — только не слишком часто, чтобыудовольствие от программирования не сменилось горечью философского тупика.Предисловие11Из тех программ, которые мы пишем, некоторые (но всегда меньше, чем хотелось бы)решают точные математические задачи, такие, как сортировка последовательности чиселили нахождение их максимума, проверка числа на простоту или вычисление квадратногокорня.
Такие программы называются алгоритмами, и об их оптимальном поведении известно довольно много, особенно в том, что касается двух важных параметров: временивыполнения и потребления памяти. Программист должен владеть хорошими алгоритмами и идиомами. Несмотря на то, что некоторые программы сопротивляются точнойспецификации, в обязанности программиста входит оценивать их производительность ивсе время пытаться ее улучшить.Лисп — ветеран, он используется уже около четверти века. Среди живых языковпрограммирования старше него только Фортран.
Эти два языка обслуживали нуждыважных прикладных областей: Фортран — естественно-научных и технических вычислений, а Лисп — искусственного интеллекта. Обе эти области по-прежнему важны, апрограммисты, работающие в них, настолько привязаны к этим двум языкам, что Лиспи Фортран вполне могут остаться в деле еще по крайней мере на четверть столетия.Лисп изменяется. Scheme, его диалект, используемый в этой книге, развился из первоначального Лиспа и отличается от него в некоторых важных отношениях: в частности,используются статические области связывания переменных, а функции могут возвращать в качестве значений другие функции.
По семантической структуре Scheme так жеблизка к Алголу 60, как и к ранним вариантам Лиспа. Алгол 60, который уже никогдане будет живым языком, продолжает жить в генах Scheme и Паскаля. Пожалуй, труднонайти две более разные культуры программирования, чем те, что образовались вокругэтих двух языков и используют их в качестве единой валюты. Паскаль служит для построения пирамид — впечатляющих, захватывающих статических структур, создаваемыхармиями, которые укладывают на места тяжелые плиты.
При помощи Лиспа порождаются организмы — впечатляющие, захватывающие динамические структуры, создаваемыекомандами, которые собирают их из мерцающих мириад более простых организмов. Организующие принципы в обоих случаях остаются одни и те же, за одним существеннымисключением: программист, пишущий на Лиспе, располагает на порядок большей творческой свободой в том, что касается функций, которые он создает для использованиядругими.
Программы на Лиспе населяют библиотеки функциями, которые оказываютсянастолько полезными, что они переживают породившие их приложения. Таким ростомполезности мы во многом обязаны списку — исконной лисповской структуре данных.Простота структуры списков и естественность их использования отражаются в удивительной общности функций. В Паскале обилие объявляемых структур данных ведет кспециализации функций, которая сдерживает и наказывает случайное взаимодействиемежду ними. Лучше иметь 100 функций, которые работают с одной структурой данных, чем 10 функций, работающих с 10 структурами.
В результате пирамиде приходитсянеподвижно стоять тысячелетиями; организм же будет развиваться или погибнет.Чтобы увидеть эту разницу, сравните подачу материала и упражнения в этой книге стем, что Вы найдете в любом вводном тексте, авторы которого используют Паскаль. Неподдавайтесь ошибочному впечатлению, будто этот текст может усвоить лишь студентMIT — представитель специфической породы, которая только там и встречается. Нет;именно такова должна быть всякая серьезная книга, посвященная программированию наЛиспе, вне зависимости от того, где и кто по ней учится.Учтите, что это текст о программировании, в отличие от большинства книг по Лиспу,12Предисловиекоторые используются для подготовки работников в области искусственного интеллекта.
В конце концов, основные программистские заботы вычислительной инженерии иискусственного интеллекта стремятся к взаимопроникновению по мере того, как соответствующие системы увеличиваются в объеме. Это объясняет рост интереса к Лиспуза пределами искусственного интеллекта.Как и можно было ожидать, глядя на цели, которые ставят перед собой исследователив области искусственного интеллекта, область эта порождает множество значительныхпрограммистских задач.
В других программистских культурах такой наплыв задач рождает новые языки. В самом деле, в любой большой программной задаче один из важныхпринципов организации состоит в том, чтобы ограничить и изолировать потоки информации в отдельных модулях задачи, изобретая для этого язык. По мере приближенияк границам системы, где мы — люди — взаимодействуем чаще всего, эти языки обычно становятся все менее примитивными. В результате такие системы содержат сложныефункции по обработке языка, повторенные по многу раз. У Лиспа же синтаксис и семантика настолько просты, что синтаксический разбор можно считать элементарной задачей.Таким образом, методы синтаксического разбора не играют почти никакой роли в программах на Лиспе, и построение языковых процессоров редко служит препятствием дляроста и изменения больших Лисп-систем.
Наконец, именно эта простота синтаксиса исемантики возлагает бремя свободы на всех программистов на Лиспе. Никакую программу на Лиспе больше, чем в несколько строк длиной, невозможно написать, не населивее самостоятельными функциями. Находите новое и приспосабливайте; складывайте истройте новыми способами! Я поднимаю тост за программиста на Лиспе, укладывающегосвои мысли в гнезда скобок.Алан Дж. ПерлисНью-Хейвен, КоннектикутПредисловие ко второмуизданиюВозможно ли, что программы не похожини на что другое, что они предназначенына выброс; что вся штука состоит в том,чтобы всегда видеть в них мыльныйпузырь?Алан Дж.
ПерлисМатериал этой книги был основой вводного курса по информатике в MIT начиная с1980 года. К тому времени, как было выпущено первое издание, мы преподавали этотматериал в течение четырех лет, и прошло еще двенадцать лет до появления второгоиздания. Нам приятно, что наша работа была широко признана и включена в другиетексты. Мы видели, как наши ученики черпали идеи и программы из этой книги ина их основе строили новые компьютерные системы и языки.
Буквально по старомуталмудическому каламбуру, наши ученики стали нашими строителями. Мы рады, что унас такие одаренные ученики и такие превосходные строители.Готовя это издание, мы включили в него сотни поправок, которые нам подсказаликак наш собственный преподавательский опыт, так и советы коллег из MIT и другихмест.
Мы заново спроектировали большинство основных программных систем в этойкниге, включая систему обобщенной арифметики, интерпретаторы, имитатор регистровых машин и компилятор; кроме того, мы переписали все примеры программ так, чтобылюбая реализация Scheme, соответствующая стандарту Scheme IEEE (IEEE 1990), быласпособна выполнять этот код.В этом издании подчеркиваются несколько новых тем. Самая важная из них состоитв том, что центральную роль в вычислительных моделях играют различные подходы ковремени: объекты, обладающие состоянием, параллельное программирование, функциональное программирование, ленивые вычисления и недетерминистское программирование. Мы включили в текст новые разделы по параллельным вычислениям и недетерминизму и постарались интегрировать эту тему в материал книги на всем ее протяжении.Первое издание книги почти точно следовало программе нашего односеместровогокурса в MIT.
Рассмотреть весь материал, включая то, что добавлено во втором издании, в течение семестра будет невозможно, так что преподавателю придется выбирать.В нашей собственной практике мы иногда пропускаем раздел про логическое програм-14Предисловие ко второму изданиюмирование (раздел 4.4); наши студенты используют имитатор регистровых машин, номы не описываем его реализацию (раздел 5.2); наконец, мы даем лишь беглый обзоркомпилятора (раздел 5.5). Даже в таком виде курс остается интенсивным. Некоторыепреподаватели предпочтут ограничиться первыми тремя или четырьмя главами, оставляя прочий материал для последующих курсов.Сайт World Wide Web http://mitpress.mit.edu/sicp предоставляет поддержкупользователям этой книги. Там есть программы из книги, простые задания по программированию, сопроводительные материалы и реализации диалекта Лиспа Scheme.∗∗ В настоящее время (август 2005 г.) на сайте имеется также полный текст англоязычного издания.
— прим.перев.Предисловие к первому изданиюКомпьютер подобен скрипке. Представьтесебе новичка, который сначалаиспытывает проигрыватель, затемскрипку. Скрипка, говорит он, звучитужасно. Именно этот аргумент мыслышали от наших гуманитариев испециалистов по информатике.Компьютеры, говорят они, хороши дляопределенных целей, но они недостаточногибки. Так же и со скрипкой, и спишущей машинкой, пока Вы ненаучились их использовать.Марвин Минский.«Почему программирование — хорошийспособ выражения малопонятных итуманно сформулированных идей»«Структура и интерпретация компьютерных программ» — это вводный курс по информатике в Массачусетском Технологическом институте (MIT).