-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathpreface-3.tex
121 lines (114 loc) · 11.8 KB
/
preface-3.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
\chapter*{Предисловие к первому изданию}
\markboth{Предисловие к первому изданию}{Предисловие к первому изданию}
\addcontentsline{toc}{chapter}{Предисловие к первому изданию}
\thispagestyle{empty}
\epigraph
{Компьютер подобен скрипке. Представьте себе новичка,
который сначала испытывает проигрыватель, затем скрипку. Скрипка,
говорит он, звучит ужасно. Именно этот аргумент мы слышали от наших
гуманитариев и специалистов по информатике. Компьютеры, говорят они,
хороши для определенных целей, но они недостаточно гибки. Так же и
со скрипкой, и с пишущей машинкой, пока Вы не научились их
использовать.
\index{ru}{Минский, Марвин||Marvin Minsky||n|}
\index{en}{Marvin Minsky||Минский, Марвин||n|}
}
{Марвин Минский.\\
<<Почему программирование --- хороший способ
выражения малопонятных и туманно сформулированных идей>>}
<<Структура и интерпретация компьютерных программ>>~--- это
вводный курс по информатике в Массачусетском Технологическом
институте (MIT). Он обязателен для всех студентов MIT на
специальностях <<электротехника>> и <<информатика>>, как одна из четырех частей
<<общей базовой программы обучения>>, которая включает еще два курса по
электрическим схемам и линейным системам, а также курс по
проектированию цифровых систем. Мы принимали участие в развитии этого
курса начиная с 1978 года и преподавали этот материал в его
нынешней форме начиная с осени 1980 года шестистам--семистам студентам в
год. Большая часть этих студентов не имела почти или совсем никакого
формального образования в области вычислительной техники, хотя у многих была возможность
общения с компьютерами, а некоторые обладали значительным опытом в
программировании либо проектировании аппаратуры.
Построение этого вводного курса по информатике отражает
две основные задачи. Во-первых, мы хотим привить слушателям идею,
что компьютерный язык~--- это не просто способ заставить компьютер
производить вычисления, а новое формальное средство выражения
методологических идей. Таким образом, программы должны писаться для
того, чтобы их читали люди, и лишь во вторую очередь для выполнения машиной.
Во-вторых, мы считаем, что основной материал, на который должен быть
направлен курс этого уровня,~--- не синтаксис определенного языка
программирования, не умные алгоритмы для эффективного вычисления
определенных функций, даже не математический анализ алгоритмов и
оснований программирования, но методы управления интеллектуальной
сложностью больших программных систем.
Наша цель~--- развить в студентах, проходящих этот
курс, хороший вкус к элементам стиля и эстетике
программирования. Они должны овладеть основными методами управления
сложностью в большой системе, уметь прочитать
50-ти страничную программу, если она написана в хорошем стиле. Они
должны в каждый данный момент понимать, чего сейчас не следует читать и
что сейчас не нужно понимать. Они не должны испытывать страха
перед модификацией программы, сохраняя при этом дух и стиль исходного
автора.
Все эти умения ни в коем случае не исчерпываются
компьютерным программированием. Методы, которым мы учим и из которых
мы черпаем, одни и те же в любом техническом проектировании. Мы
управляем сложностью с помощью построения абстракций, скрывающих,
когда это нужно,
детали. Мы управляем сложностью путем установления
стандартных интерфейсов, которые позволяют нам строить системы из
единообразных, хорошо понимаемых кусков способом <<смеси и стыковки>>. Мы
управляем сложностью с помощью построения новых языков для описания
проекта, каждый из которых концентрирует внимание на определенных
деталях проекта и уводит его от других.
В основе нашего подхода к предмету лежит убеждение, что
<<компьютерная наука>> не является наукой и что ее значение мало
связано с компьютерами. Компьютерная революция~--- это революция в том,
как мы мыслим и как мы выражаем наши мысли. Сущность этих изменений
состоит в появлении дисциплины, которую можно назвать
{\em компьютерной эпистемологией},~--- исследования
структуры знания с императивной точки зрения, в противоположность
более декларативной точке зрения классических математических
дисциплин. Математика дает нам структуру, в которой мы можем точно
описывать понятия типа <<что такое>>. Вычислительная наука дает нам
структуру, в которой мы можем точно описывать понятия типа
<<как>>.
В преподавании мы используем диалект языка
программирования Лисп. Мы не учим формальной стороне языка, поскольку
в этом не возникает нужды. Мы просто его используем, и студенты
схватывают его за несколько дней. В этом состоит одно из больших
преимуществ лиспоподобных языков: в них очень мало способов строить
составные выражения и нет почти никакой синтаксической структуры. Все
формальные детали могут быть описаны за час, как правила шахмат.
Спустя некоторое время мы забываем о формальных свойствах языка
(поскольку их нет) и продолжаем говорить о настоящих вопросах;
определяем, что именно мы хотим вычислить, как мы будем разбивать
задачу на куски разумного размера и как потом будем работать с
этими кусками. Еще одно преимущество Лиспа состоит в том, что он поддерживает
(но не навязывает) больше крупномасштабных стратегий разбиения
программ на модули, чем любой другой известный нам язык. Можно
строить абстракции процедур и данных, можно использовать функции
высших порядков, чтобы охватить общие шаблоны их использования, можно
моделировать локальное состояние с использованием присваивания и
изменения данных, можно связывать части программы с помощью потоков и
задержанных вычислений, и можно с легкостью реализовывать встроенные
языки. Все это включено в диалоговое окружение с превосходной
поддержкой пошагового проектирования, построения, тестирования и
отладки программ. Мы благодарны всем поколениям кудесников Лиспа
начиная с Джона Маккарти, которые создали замечательный инструмент
непревзойденной силы и красоты.
\looseness=-1
Scheme, тот диалект Лиспа, который мы используем, пытается
совместить силу и красоту Лиспа и Алгола. От Лиспа мы
берем метаязыковую мощь, которой он обязан простоте своего
синтаксиса, единообразное представление программ как объектов данных,
выделение данных из кучи с последующей их утилизацией сборщиком
мусора. От Алгола
мы берем лексическую область действия и блоковую структуру, подаренные
нам первопроходцами проектирования языков программирования из комитета по
Алголу. Мы хотим упомянуть Джона Рейнольдса и Питера Ландина,
открывших связь Чёрчева лямбда-исчисления со структурой языков
программирования. Мы также отдаем дань признательности математикам,
разведавшим эту область за десятилетия до появления на сцене
компьютеров. Среди этих первопроходцев были Алонсо Чёрч, Беркли Россер,
Стефен Клини и Хаскелл Карри.