Х. Абельсон, Дж. Дж. Сассман, Дж. Сассман - Структура и интерпретация компьютерных программ (1108516), страница 4
Текст из файла (страница 4)
Он обязателен для всехстудентов MIT на специальностях «электротехника» и «информатика», как одна из четырех частей «общей базовой программы обучения», которая включает еще два курса поэлектрическим схемам и линейным системам, а также курс по проектированию цифровыхсистем. Мы принимали участие в развитии этого курса начиная с 1978 года и преподавали этот материал в его нынешней форме начиная с осени 1980 года шестистам–семистамстудентам в год. Большая часть этих студентов не имела почти или совсем никакого формального образования в области вычислительной техники, хотя у многих былавозможность общения с компьютерами, а некоторые обладали значительным опытом впрограммировании либо проектировании аппаратуры.Построение этого вводного курса по информатике отражает две основные задачи. Вопервых, мы хотим привить слушателям идею, что компьютерный язык — это не простоспособ заставить компьютер производить вычисления, а новое формальное средство выражения методологических идей.
Таким образом, программы должны писаться для того,чтобы их читали люди, и лишь во вторую очередь для выполнения машиной. Во-вторых,мы считаем, что основной материал, на который должен быть направлен курс этогоуровня, — не синтаксис определенного языка программирования, не умные алгоритмы16Предисловие к первому изданиюдля эффективного вычисления определенных функций, даже не математический анализалгоритмов и оснований программирования, но методы управления интеллектуальнойсложностью больших программных систем.Наша цель — развить в студентах, проходящих этот курс, хороший вкус к элементамстиля и эстетике программирования.
Они должны овладеть основными методами управления сложностью в большой системе, уметь прочитать 50-ти страничную программу,если она написана в хорошем стиле. Они должны в каждый данный момент понимать,чего сейчас не следует читать и что сейчас не нужно понимать. Они не должны испытывать страха перед модификацией программы, сохраняя при этом дух и стиль исходногоавтора.Все эти умения ни в коем случае не исчерпываются компьютерным программированием. Методы, которым мы учим и из которых мы черпаем, одни и те же в любом техническом проектировании. Мы управляем сложностью с помощью построения абстракций,скрывающих, когда это нужно, детали. Мы управляем сложностью путем установлениястандартных интерфейсов, которые позволяют нам строить системы из единообразных,хорошо понимаемых кусков способом «смеси и стыковки».
Мы управляем сложностью спомощью построения новых языков для описания проекта, каждый из которых концентрирует внимание на определенных деталях проекта и уводит его от других.В основе нашего подхода к предмету лежит убеждение, что «компьютерная наука» неявляется наукой и что ее значение мало связано с компьютерами.
Компьютерная революция — это революция в том, как мы мыслим и как мы выражаем наши мысли. Сущностьэтих изменений состоит в появлении дисциплины, которую можно назвать компьютерной эпистемологией, — исследования структуры знания с императивной точки зрения,в противоположность более декларативной точке зрения классических математическихдисциплин. Математика дает нам структуру, в которой мы можем точно описывать понятия типа «что такое».
Вычислительная наука дает нам структуру, в которой мы можемточно описывать понятия типа «как».В преподавании мы используем диалект языка программирования Лисп. Мы не учимформальной стороне языка, поскольку в этом не возникает нужды. Мы просто его используем, и студенты схватывают его за несколько дней. В этом состоит одно из больших преимуществ лиспоподобных языков: в них очень мало способов строить составныевыражения и нет почти никакой синтаксической структуры. Все формальные детали могут быть описаны за час, как правила шахмат.
Спустя некоторое время мы забываем оформальных свойствах языка (поскольку их нет) и продолжаем говорить о настоящихвопросах; определяем, что именно мы хотим вычислить, как мы будем разбивать задачуна куски разумного размера и как потом будем работать с этими кусками. Еще одно преимущество Лиспа состоит в том, что он поддерживает (но не навязывает) больше крупномасштабных стратегий разбиения программ на модули, чем любой другой известный намязык. Можно строить абстракции процедур и данных, можно использовать функции высших порядков, чтобы охватить общие шаблоны их использования, можно моделироватьлокальное состояние с использованием присваивания и изменения данных, можно связывать части программы с помощью потоков и задержанных вычислений, и можно с легкостью реализовывать встроенные языки. Все это включено в диалоговое окружение с превосходной поддержкой пошагового проектирования, построения, тестирования и отладкипрограмм.
Мы благодарны всем поколениям кудесников Лиспа начиная с Джона Маккарти, которые создали замечательный инструмент непревзойденной силы и красоты.Предисловие к первому изданию17Scheme, тот диалект Лиспа, который мы используем, пытается совместить силу икрасоту Лиспа и Алгола.
От Лиспа мы берем метаязыковую мощь, которой он обязанпростоте своего синтаксиса, единообразное представление программ как объектов данных, выделение данных из кучи с последующей их утилизацией сборщиком мусора.От Алгола мы берем лексическую область действия и блоковую структуру, подаренныенам первопроходцами проектирования языков программирования из комитета по Алголу.Мы хотим упомянуть Джона Рейнольдса и Питера Ландина, открывших связь Чёрчева лямбда-исчисления со структурой языков программирования. Мы также отдаем даньпризнательности математикам, разведавшим эту область за десятилетия до появленияна сцене компьютеров.
Среди этих первопроходцев были Алонсо Чёрч, Беркли Россер,Стефен Клини и Хаскелл Карри.БлагодарностиМы хотели бы поблагодарить множество людей, которые помогли нам создать этукнигу и этот курс.Наш курс — очевидный интеллектуальный потомок «6.321», замечательного курса покомпьютерной лингвистике и лямбда-исчислению, который читали в MIT в конце 60-хДжек Уозенкрафт и Артур Эванс мл.Мы очень обязаны Роберту Фано, который реорганизовал вводную программу MITпо электротехнике и информатике, сосредоточившись на принципах технического проектирования.
Он вдохновил нас на это предприятие и написал первую программу курса,из которого развилась эта книга.Стиль и эстетика программирования, которые мы пытаемся привить читателю, вомногом были разработаны совместно с Гаем Льюисом Стилом мл., который вместе сДжеральдом Джеем Сассманом участвовал в первоначальной разработке языка Scheme.В дополнение к этому Дэвид Тёрнер, Питер Хендерсон, Дэн Фридман, Дэвид Уайзи Уилл Клингер научили нас многим из приемов функционального программирования,которые излагаются в данной книге.Джон Мозес научил нас структурировать большие системы. Благодаря его опыту ссистемой символьных вычислений Macsyma мы стали понимать, что необходимо избегать усложненности структур управления и в первую очередь заботиться о такой организации данных, которая отражает реальную структуру моделируемого мираМарвин Минский и Сеймур Пэйперт сильно повлияли на формирование нашего подхода к программированию и к его месту в нашей интеллектуальной жизни.
Благодаря иммы понимаем, что вычисление дает нам средство выражения и исследования мыслей, которые иначе были бы слишком сложны, чтобы с ними можно было точно работать. Ониподчеркивают, что способность писать и изменять программы дает студенту мощноесредство, с помощью которого исследование становится естественной деятельностью.Кроме того, мы полностью согласны с Аланом Перлисом в том, что программирование — это огромное удовольствие и что нам нужно стараться поддерживать радостьпрограммирования. Часть этой радости приходит от наблюдения за работой великих мастеров. Нам выпало счастье быть учениками у ног Билла Госпера и Ричарда Гринблатта.Трудно перечислить всех тех, кто принял участие в развитии программы нашего курса.
Мы благодарим всех лекторов, инструкторов и тьюторов, которые работали с нами впрошедшие пятнадцать лет и потратили много часов сверхурочной работы на наш предмет, особенно Билла Сиберта, Альберта Мейера, Джо Стоя, Рэнди Дэвиса, Луи Брэйда,Эрика Гримсона, Рода Брукса, Линна Стейна и Питера Соловитца. Мы бы хотели особоотметить выдающийся педагогический вклад Франклина Турбака, который теперь пре-Благодарности19подает в Уэллесли: его работа по обучению младшекурсников установила стандарт, накоторый мы все можем равняться. Мы благодарны Джерри Сальтцеру и Джиму Миллеру, которые помогли нам бороться с тайнами параллельных вычислений, а также ПитеруСоловитцу и Дэвиду Макаллестеру за их вклад в представление недетерминистскихвычислений в главе 4.Много людей вложило немалый труд в преподавание этого материала и в другихуниверситетах.
Вот некоторые из тех, с кем мы тесно общались в работе: это ДжекобКацнельсон в Технионе, Хэрди Майер в Калифорнийском университете в Ирвине, ДжоСтой в Оксфорде, Элиша Сэкс в университете Пердью и Ян Коморовский в Норвежскомуниверситете Науки и Техники. Мы гордимся коллегами, которые получили наградыза адаптацию этого предмета в других университетах: это Кеннет Йип в Йеле, БрайанХарви в Калифорнийском университете в Беркли и Дон Хаттенлохер в Корнелле.Эл Мойе дал нам возможность прочитать этот материал инженерам компании ХьюлеттПаккард и устроил производство видеоверсии этих лекций.