среда, ноября 08, 2006

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

Сбылась мечта идиота ;) Наконец-то приобрел эту потрясающую книгу.

Для тех кто не в курсе: „Структура и интерпретация компьютерных программ“ вышла в июле этого года на русском языке. К сожалению, тиражом всего в 1000 экземпляров и во всех магазинах она уже давно раскуплена. Однако не стоит отчаиваться, можно попробовать сделать где-нибудь заказ и подождать следующего завоза. По крайней мере у меня получилось.

Для тех, кто совсем не в курсе: SICP — одна из лучших книг по программированию из когда либо изданных. Прочесть ее от корки до корки — абсолютный MUST для любого уважающего себя программера.

Потрясает то, что эта книга — изначально всего лишь вводный курс по информатике в MIT. Метода для первокурсника, так сказать. Однако материал, который она охватывает, далеко не всегда вообще преподается в ВУЗе. Книга начинается с описания абстракции процедур и данных (рассматриваются функции высших порядков и даже символьная алгебра), плавно переходит к рассмотрению модульности, объектов и состояния (в частности: параллелизм, имитация цифровых схем, распространение ограничений). Затем начинается описание металингвистических абстракций (например, строится интерпретатор пролога, имитация ленивых вычислений, недетерминистское вычисление). А заканчивается книга вообще чудесно — строится эмулятор регистровой машины и пишется компилятор под нее.

Вот так надо учить программированию!

Безумно жалко, что 12 лет назад, когда я только начинал изучать программирование, я тратил время на всякую ерунду и на горьком опыте или путем долгих ковыряний в инете находил то, что в этой книге описывается „на пальцах“.

Не менее жалко, что во многих учебных заведениях также зачастую учат ерунде. На сколько бы увеличилось качество выпускников ВУЗов, если бы их на первом курсе учили по этой книге...

PS: также доступны видеозаписи лекций.

PPS: после того как прочту книгу для первокурсников, закажу себе книгу для второкурсников :)

UPD: можно попробовать купить SICP в издательстве.

10 комментариев:

dulanov комментирует...

Эта книга - классика жанра, еле выцепил её в Библио-Глобусе в прошлые выходные. Жаль что с переплетом облажались ;( Хоть и читал её уже, но частично, и на ближайшую неделю у меня есть чем занятся. Хорошем дополнением к книги, лично для меня, служит DrScheme (http://www.plt-scheme.org/software/drscheme/).

Тех кто программировал только на алгоподобных языках, типа Pascal, C/C++, Java/C# книга строго обязательна к прочтению, а то так и умрете с полной уверенностью что алгоритм возможен тока в соответствии с машиной Тьюринга!

Vladimir Shabanov комментирует...

DrScheme конечно симпатяшка, но у нее почему-то нет консольной версии (равно как и у MIT Scheme), по крайней мере у виндового варианта. Так что юзаю Chez Scheme. Отлично работает с emacs.

dulanov комментирует...

было дело, я без особых проблем настроил DrScheme с emacs - все отлично работало. Только через некоторое время не смог себя перебороть и вернулся к GUI оболочке ;(

А ты используешь Scheme для расширения кругозора или нашел реальное применение на практике?

Vladimir Shabanov комментирует...

Не, я старый фанат емакса. Зачем каждый раз изучать новый гуй, если есть емакс - один для всех языков, интерпретаторов и консольных тулзов. Да еще и один для всех платформ.

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

А scheme я особо и не использую, т.к. когда-то изучал common lisp. И пока в схеме ничего нового не обнаружил (разве что call/cc и, если не путаю, какие-то более правильные макросы). Просто дистиллированный и упрощенный common lisp.

Насчет практического применения - я фанат статической типизации и все языки без оной меня пугают. Как можно писать большие приложения на языках с динамической типизацией я пока не понимаю, видимо склад ума не тот (а м.б. все из-за того что начинал с паскаля, а не схемы).

Vladimir Shabanov комментирует...

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

dulanov комментирует...

Насчет практического применения - я фанат статической типизации и все языки без оной меня пугают.

Отличная статья в тему: Strong Typing vs. Strong Testing

Я не вижу принципиальной разницы между статической и динамической типизацией. Первая хоть и может на этапе компиляции выявить синтаксические ошибки, но основные семантические баги она не обнаружит все равно, а гибкости меньше.

Давно подсел на TDD (Test Driven Development) и считаю, что если какой-то функционал не протестирован - то наверняка работает неправильно ;)

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

Vladimir Shabanov комментирует...

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

В случае плюсов это действительно так. А в случае хаскела или кемла - нет. Статическая типизация - она разная бывает. В большинстве случаев ее даже не замечаешь.

В кемле можно сделать список из любых объектов, лишь бы они обладали общими методами. И все это будет статически проверено. Т.е. при нормальной статической типизации легко можно сделать пример, рассматриваемый в статье.

Кстати, у кемла вообще очень хорошая объектная система. Правда ей в кемле редко кто пользуется, т.к. многие вещи можно сделать и без объектов.

А про питон... Недавно писал небольшой скрипт на нем. После 2-х лет писания прог на кемле, питон - огромный шаг назад. Большинство ошибок, которые у меня были, могла выявить статическая проверка типов. Зачем руками тестировать то, что можно переложить на компилятор.

Viktor комментирует...

Есть еще в электронном виде на русском
http://newstar.rinet.ru/~goga/sicp/sicp.ps.gz

sergicus комментирует...

Victor спасибо за ссылку

iba-progon комментирует...

http://lib.rus.ec/b.usr/Avtor_neizvesten_Struktura_i_interpretatsiya_kompyuternyih_programm.pdf Во еще ссылочка