Структура и интерпретация компьютерных программ книга обзор

Обновлено: 07.07.2024

г ладк о с тыкуются с др угими п рограммами при созд ании еще более кр упных п рограмм.

П рограммист д олже н рав но стремиться и к со верш енств у в дет алях, и к сораз мерности

сл ожно го ц елого. В книге, к отор ую Вы де ржите в руках, сло вом « прог раммиро вание» мы

б у де м обозна чать прежд е всего созд ание, вып олнение и изуче н ие программ, написанных

на о дно м из диале ктов языка Лисп и пред назна ченных для вып олнения на ц ифров ом

ко мпьютере. Исп ользов ан ие Лисп а не ограничивает нас в том, чт

П ро двигаяс ь по матер иалу этой книги , мы б у де м встречаться с тре мя групп ами яв-

ле ни й: чел овечес к и й р азум, со во купности ко мпьютерных программ и к омпьютер. Всякая

ко мпьютер ная прог рамма — э то по рожд енная чело веческим разумо м мо д ель реально го

либо умоз рительного проц есса. Эти п роц ессы, возникаю щие из нашего опыта и мысли,

много ч исл енны, сл о жны в д еталях, и мы всег д а понима ем их лишь частично. Р едк о

быв ает так, что ко мпьютерны е про граммы отобр ажают их к нашему ок ончательно му

у д овл етво рению. Т аким обр азом, х отя наши прогр ам м ы пред став ляют собо й тщатель-

но сработ анные дис кретные со вок упности символ ов, мозаики п ерепл етенных функц ий ,

они не прерыв но р азвиваются: мы из меняем их по ме ре того, как наше воспр и ятие мо-

д ели пр иобрета ет все большую глубину , расшир яется и обобщается, д о тех по р, по ка

мо д ель не д остигнет , нак онец , мет аста бильного состо яния в рамках сл едую щей мо д ел и,

над к о торо й нам пред стоит биться. Ра достн ое возб ужд ение, сопутств ую щее компь ютер-

ном у прогр аммированию, прои схо дит из посто ян ного раскр ытия в гол ов е и в компь ютере

все нов ых выраж енных в ви де программ механизм ов и из вз рыва воспр ия тия, кото рый

они по ро ждают . И ску сство выр ажает н аши мечты. К омпь ютер испо л няет и х по д в ид ом

П ри всей св оей мощности, к омпь ютер требов ател ен и пр идирчив. Ему нужны верны е

прогр аммы, и то, что мы хотим ему сказать, д олжно быть выраж ено точно в кажд ой

мел очи. К ак и при всяко й др угой р аботе с символ ами , мы убеж дае мся в пра вильности

Как изучать Структуру и Интерпретацию Компьютерных Программ (SICP)

СИКП — не книга про языки программирования или разработку программного обеспечения, не книга по ООП, функциональному программированию или паттернам проектирования.

СИКП — книга об информатике (computer science). Восприятии компьютеров как абстрактных машин, используемых для манипулирования данными. Несмотря на то, что книга впервые опубликована в 1979, она до сих пор не потеряла свою актуальность и не потеряет в будущем. СИКП неизменно находится в топе лучших книг по обучению программированию на протяжении десятков лет.

This is one of the great classics of computer science. I bought my first copy 15 years ago, and I still don’t feel I have learned everything the book has to teach. — Paul Graham.

Стоит ли её читать? Однозначно стоит всем разработчикам на любых языках программирования с любым опытом. СИКП — достаточно сложная книга, поэтому появилось руководство, которое вы прямо сейчас читаете.

Очень краткое содержание

Абстракция с помощью функций

  1. Элементы программ
    • Выражения
    • Вычислительные стратегии
    • Подстановочная модель вычислений
  2. Функции и процессы порождаемые ими
    • Линейная рекурсия и итерация
    • Древовидная рекурсия
  3. Функции высшего порядка
    • Функции как аргументы
    • Функции как обобщения
    • Функции как возвращаемые значения

Абстракция с помощью данных

  1. Введение в абстракцию данных
    • Барьеры абстракции
    • Что такое данные?
  2. Иерархические данные и свойство замыкания
    • Представление последовательностей
    • Иерархические структуры
    • Последовательности как стандартные интерфейсы
  3. Символьные данные
    • Цитирование
  4. Множественные представления абстрактных данных
    • Тегирование данных
    • Программирование управляемое данными. Аддитивность.

Модульность, Объекты и Состояние

  1. Присваивание и локальное состояние
    • Преимущества присваивания
    • Недостатки присваивания
  2. Модель с окружениями
    • Правила вычисления
    • Применение
    • Фреймы как репозитории локального состояния
  3. Моделирование с изменяемыми данными
    • Изменяемый список
    • Представление очереди
    • Представление таблиц
  4. Многозадачность
  5. Потоки

Метаязыковые абстракции

Вычисление с помощью регистровых машин

Рекомендации

Первое, что нужно понимать: СИКП — не просто книга. Это университетский курс, записанный в виде книги. Он сложный и объёмный, его бесполезно проходить без практики. Практику придумывать не придётся. После каждой главы есть блок задач, которые авторы просят выполнить. Некоторые из них сугубо математические (просят что-то доказать), либо подразумевают хорошую математическую базу. Их можно и даже нужно пропускать, иначе вы можете очень быстро потерять мотивацию.

Сколько читать

СИКП условно можно разделить на две части. В первую часть входят главы 1, 2 и 3. Во вторую — 4 и 5. Разница в том, что во вторую часть входят главы, копающие очень глубоко, и пройти сквозь них может только по-настоящему увлеченный человек. По этой причине Хекслет рекомендует поставить себе планкой прохождение первых трех глав. Остальное можно с легкостью отложить на потом.

Для примеров и практики в книге используется язык Scheme (Ским), созданный авторами курса. Это один из диалектов семейства Lisp. Как и полагается любому Lisp-языку, Scheme имеет примитивный синтаксис, который можно изучить буквально за несколько часов. Он очень необычен для тех, кто имел дело только с широко распространенными языками, но обладает рядом серьезных достоинств, о которых говорится в книге.

Его выбор, в качестве основного языка для курса обоснован тем, что Scheme позволяет сосредоточиться на сути вещей вместо синтаксиса, увидеть чистые концепции в первозданном виде. Scheme как и любой Лисп, обладает невероятно высокой выразительностью благодаря тому, что в языке всё есть выражение, а инструкции отсутствуют вообще.

Вторая причина — гомоиконность. Свойство языков, в которых данные и код — одно и тоже. Этот тезис сложно понять на словах, его нужно прочувствовать на практике. Есть еще и третья причина — макросы, но они в книге не используются.

Сам язык Scheme, это в первую очередь стандарт языка плюс разные реализации этого стандарта. На данный момент один из самых развитых – и продолжающих развиваться – потомков Scheme, это язык Racket. Хекслет рекомендует проходить СИКП именно на Racket. Специально для этого гайда мы подготовили репозиторий, который можно использовать как основу для кода. В репозиторий стоит заглянуть хотя бы для того, чтобы узнать, как настроить Racket на совместимость именно с тем стандартом Scheme, который используется для примеров кода в книге: немногие существующие реализации Scheme позволяют воссоздать “то самое” окружение, к счастью, Racket может! Не забудьте правильно настроить редактор: Lisp языки относятся к тем языкам, для которых нужна поддержка со стороны редактора для комфортной работы.

Оформление

На Гитхабе можно найти множество репозиториев, в которых лежат решения задач из СИКП на всех возможных языках программирования. Мы настоятельно рекомендуем поступать также: создать репозиторий в своем аккаунте и выкладывать в него все свои решения. Идеально, если каждое решение будет сопровождаться тестами. Такой подход хорош не только тем, что вы дополнительно прокачиваетесь в git и получаете дополнительную мотивацию, но и тем, что у вас появляется код, который можно показать при поиске работы. Более того, велика вероятность, что собеседовать вас будет человек, знающий про СИКП. Это добавит очков в карму и даст возможность продуктивно пообщаться.


Я считаю, что разработка ПО в значительной степени заключается в программировании на псевдокоде. Если ты представил псевдокод, то перевести его на Python, C, что угодно — не проблема. Основная сложность заключается вот в этой концептуальной деятельности, а не в кодировании. Нужно знать, как подходить к тем или иным вопросам. Модульность, абстракция. Гибкость, надёжность, простота. Шаблоны проектирования. Юнит-тестирование. Ю ноу.

Есть на свете курс «Структура и Интерпретация Компьютерных Программ» (далее СИКП), который позиционируется как введение в Computer Science и ранее использовался в MIT для обучения первокурсников. Два года назад я с удовольствием одолел курс лекций по нему и взялся за книгу.

Сначала расскажу о хорошем. Текст повествует о штуках весьма далёких от моей ежедневной работы и позволил мне по-новому взглянуть на программирование. Функциональщина — это целый мир, живущий по своим законам. Язык Лисп очень отличается от привычного мне языка Си бешеной гибкостью за счёт динамической типизации, автоматического управления памятью, возможности переопределения чего угодно во время выполнения. У меня сформировалась более разностороннее представление о том, как в принципе можно решать разные задачи. Говоря шахматным языком, я сильно пополнил свой репертуар домашних заготовок, которые пригождаются в работе (пусть и не каждый день). Упражнения заставляли мой мозг работать (временами очень интенсивно), переосмысливать и систематизировать ранее полученные знания. В общем и целом изучение СИКП сделало меня более хорошим разработчиком, расширило мой кругозор. Уверен, я стал смотреть на разные вещи более системным и зрелым взглядом.

Книга постоянно толкала на размышления, за это ей низкий поклон. Я глубоко осознал вещи, которые вроде бы всем известны, но которые поэтому все ленятся упоминать. Например, что всё ПО сначала делается простым, а потом неизбежно усложняется ради повышения производительности. Пользователю-то плевать, сколько строк исходного кода внутри, а вот скорость имеет значение.

А что там насчёт конкретных эффектов для работы? Я стал лучше видеть недочёты во время code review (в первую очередь, своего же кода). Полюбил маленькие функции, желательно как можно более общего вида. Стал практиковать аккуратное и уместное использование макросов — иногда на Си можно осторожно сделать что-то не по правилам, и от этого все только победят. Опыт, полученный при решении упражнений из книги, помог мне в некоторых задачах по работе.

Но это одна сторона медали. Другая заключается в том, что подход этого курса к обучению можно выразить английским фразеологизмом «sink or swim». Перед тобой стоит перекладина, рядом с ней задание: подтянуться 10 раз. В принципе, этого достаточно для выполнения задачи, но нельзя сказать, что такой подход приятен. Я бы сказал, он весьма выматывает! Тебя бросают в бой полуподготовленного, и часть материала ты познаёшь не на объяснениях, а на своих ошибках. Наверное, это допустимый способ обучения высокомотивированных людей, но меня-лентяя он порядком выжал. Я с трудом терпел его на протяжении 3 глав из 5 (порой я делал паузы на несколько месяцев!), сделал упражнения в них от начала и до конца, но кажется, моё терпение исчерпано.

Например, в книге нет ни слова о том, как организовать свой рабочий процесс. Нет даже приблизительного рассмотрения таких понятий, как «отладка» (она здесь специфическая), «IDE» (они здесь специфические), «юнит-тесты», «разбиение на файлы для повторного использования». Имеются фрагменты, где разрабатывается некая сложная система, которая будет целиком готова лишь к концу главы, а задания появляются после каждого пункта текста. Т.е. строго говоря, прочитав до страницы N, ты в ряде случаев не можешь решить задачу с этой страницы, не утащив код с последующих страниц. Код нужно тащить аккуратно, ибо в примечаниях могут обсуждаться неочевидные тонкости, а порой какой-то код приводится в качестве примера неработающей идеи. Это раздражает! Да, это прям как в реальной жизни — надо самому доопределять задачу, искать что-то в интернетах, но блин… Этожучебник! Я наедаюсь непростыми задачами на работе, и может, авторам стоило более педантично подойти к тексту? Ладно я, профессиональный погромист с быстрым доступом в интернеты, а как было первокурснику MIT в восьмидесятых? Уверен, несладко…

Подчеркну главные плюсы книги: она позволяет получить личный опыт, набить свои шишки, подумать над сложными проблемами в общем виде. С ними непосредственно связаны минусы: она сложная и зачастую даёт тебе мало подсказок для понимания чего-то. Например, если ты имеешь какой-то боевой опыт, то знаешь, что код без юнит-тестов нельзя назвать решением, но книга тебе об этом не скажет. Надо самому до этого дойти! А как ты думал? Ну или вру, книга об этом скажет, но максимально садистским способом. У тебя будет следующее задание, опирающееся на предыдущее (такое там сплошь и рядом). Если у тебя раньше заработал один тестовый кейс и ты решил «Отлично, едем дальше!», то за поворотом тебя ждёт счастливая отладка решений сразу двух заданий. Наверное, когда это произойдёт несколько раз, ты поймёшь, что делаешь что-то не так. Главное, чтобы в такие моменты ты не бросал курс, а разбирался, тогда всё будет хорошо!

Ещё одна раздражающая черта текста: задания (опять же, как и в реальной жизни) порой недостаточно хорошо определены. Я на днях делал упражнение, за полчаса набросал решение, стал перечитывать формулировку задачи. Оказалось, что если рассуждать педантично, то я выполнил его на 95%, затратив примерно 40% усилий. Большинство чуваков, с которыми я сверялся, сделали так же. Один сделал полноценно, но использовал хак из другого интерпретатора Лиспа. Я огорчился и плюнул, потеряв мотивацию продолжать в ближайшее время. Ещё раз проговорю суть проблемы: есть задания, в которых всё решается просто и логично, но только если не быть к себе строгим. Так и в реальной жизни, я понимаю, но у меня были другие ожидания от учебника. Когда делаешь упражнение в свободное время и сам себя проверяешь, то хочется решить проблему на 100%, а не «достаточно хорошо для текущей итерации».

Проблема с юнит-тестами вообще-то того же рода. Иногда нужно неслабо запотеть и подумать, чтобы просто внедрить их в систему. Я-то знаю, что без них никуда, но более простые ребята просто набрасывают решения без проверки и идут дальше! Чем ты строже, внимательнее, опытнее, тем сложнее для тебя становятся задания. Иногда просто в разы! Это демотивирует, потому что тут, в отличие от работы, за это не хвалят и не платят, а итеративный подход плохо применим. Знания и умения, полезные в реальной жизни, больно бьют по рукам при решении студенческих задачек!

Стоит сказать, что в книге много математики. Решая упражнения, я понял красоту и силу этой науки, но порой мне было тяжело именно из-за этих специфических вопросов, лишь косвенно касающихся решаемых задач. Просто авторы решили что-то показать на примере скажем интегрирования, вот ты и вспоминай да ботай!

В общем и целом, я не жалею, что вписался в эту авантюру, она была для меня полезной. Тем не менее, другим людям я рекомендую поискать что-то получше. Например, на основе СИКП с учётом его ошибок (так говорят, я не проверял) недавно был сделан курс «How to Design Programs». Полагаю, стоило и мне на него позариться, но время уже не отмотаешь.

Physics.Math.Code

Physics.Math.Code

Physics.Math.Code запись закреплена

Сейчас книга находится в свободном доступе в Интернете, и любой желающий может скачать и изучать её в своё удовольствие. Помимо книги, в сети также есть цикл видео-лекций от авторов, они расположены на ресурсе MIT OpenCourseware, мне кажется они могут неплохо дополнять друг друга по ходу изучения материала.

Чем же примечательна эта книга? Да хотя бы отзывами на Amazon :) Среди рецензентов есть такие личности как Peter Norvig и Paul Graham. К слову, сейчас у книги рейтинг 3.8 из 5, отчего некоторые известные личности недоумевают.

А если серьёзно, то это фундаментальный классический труд в области программирования (ничем не хуже небезызвестной книги The Art of Programming от Д. Кнута, которую никто не читал). Единственным непонятным моментом для меня является факт преподавания курса программирования для новичков по этой книге.

СИКП — книга об информатике (computer science). Восприятии компьютеров как абстрактных машин, используемых для манипулирования данными. Несмотря на то, что книга впервые опубликована в 1979, она до сих пор не потеряла свою актуальность и не потеряет в будущем. СИКП неизменно находится в топе лучших книг по обучению программированию на протяжении десятков лет.

Его выбор, в качестве основного языка для курса обоснован тем, что Scheme позволяет сосредоточиться на сути вещей вместо синтаксиса, увидеть чистые концепции в первозданном виде. Scheme как и любой Лисп, обладает невероятно высокой выразительностью благодаря тому, что в языке всё есть выражение, а инструкции отсутствуют вообще.

Вторая причина — гомоиконность. Свойство языков, в которых данные и код — одно и тоже. Этот тезис сложно понять на словах, его нужно прочувствовать на практике. Есть еще и третья причина — макросы, но они в книге не используются.



Сейчас из соседней темы подтянутся лисперы, лиспоненавистники и начнётся.


надо читать обе. и ещё PLAI и TaPL (+ ATTaPL)


Хехе :) Я не интересовался именно практической применимостью языка-там не не учебник по Схеме - а навыками и знаниями, которые можно получить и применить на работе и в своих поделиях.



конечно надо, а ссылка что вы дали, это для второкурсников) Сначала sicp читайте. Профита полно. Книжка хорошо восполняет пробелы молодости и восстанавливает мозги калеченые пхп, бесиком и прочей джавой :)


А вот за это спасибо, не знал.

А если я читаю SICP, и как мне кажется, ничего нового не узнаю. Все знал и до нее. Притом что опытным себя назвать не могу, опыта проммышленной разработки около 3 лет. Я не дорос или неизличимо уже? :)

Или вы хорошие книги читали. Или вы от природы умны.
Мне SICP помогла понять как по сути работают многие вещи.
Т.е. не воспринимать lazy, oop, continuations как данность,
а понимать как собственно они реализуются.

У меня этого понимания не было. Если у Вас оно есть - хорошо.



Спасиб. По Вашей аве и без слов понятно.


goga/tapl/, скоро будет в бумажном виде



> По Вашей аве и без слов понятно.

зря ты делаешь какие-то выводы по моей аве. мне просто изображение понравилось =)


спасибо вам, кстати :)

Design Concepts in Programming Languages

да, эта тоже хорошая. но тяжёлая


Спасибо за ссылку на модуль!


tapl на русском! спасибо!


данная книга является введением в программирование. поентому все с вами ОК. основы вы освоили.


данная книга является введением в программирование. поентому все с вами ОК. основы вы освоили.


я думаю задачей книги является не научить решать задачу Х, а научить решать задачу. И в книге СИКП этому учат. можно найти другие книги, являющиеся введением в программирование, в которых решаются задачи не рассмотренные в СИКП-е.


где там макросы? если че, я читал перевод. я конечно их применял для реализации ленивых списков, но в книге они не давались.

Читайте также: