egorius: (Default)

Ян Чихольд, «Новая типографика»

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

Януш Корчак, «Король Матиуш» и «Матиуш на необитаемом острове»

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

В книге нет сил добра и сил зла, нет вообще ничего белого или чёрного — над всем приходится думать самому. И такие неразрешимые вопросы ставит автор, что с самого начала понятно — хэппи-энда не будет.

Орсон Скотт Кард, «Игра Эндера» (КПК)

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

Антураж, кстати, позаимствован из Звёздного десанта Хайнлайна с заменой жуков на жукеров.

Никлаус Вирт, «Построение компиляторов»

Практически курс конструляторов Серебрякова, только с полным примером компилятора для подмножества Оберона. Не то, чтобы я её прочитал, скорее проглядел. Из попробовать пока написал лексический анализатор на Хаскеле (красивенький такой получился), на этом свободное время закончилось.

Книга вышла в издательстве ДМК Пресс, они же выпустили Кауфмана. За книги спасибо, но руки всё-таки оторвать нужно: в книгах по программированию программист должен вычитывать приведённый код, потому что наборщики в нём ни черта не понимают. Знакомого программиста у издательства не нашлось.

egorius: (Default)

Макс Фрай, «Обжора-хохотун»

Уже шестая книга из Хроник Ехо. Продолжаю радоваться каждой новой встрече.

Виталий Кауфман, «Языки программирования. Концепции и принципы»

Удивительно, но приятно: переиздали книгу, по которой мы на ВМК учили ЯПы. Очень глубокий текст, языки программирования разбираются с разных позиций буквально по кирпичикам, выявляются принципы и концепции, лежащие в их основе и обычно неведомые программистам.

Не мог не поддержать благое дело покупкой, заодно и перечитал. Тщусь надеждой, что понял больше, чем прежде, но — надо признать — опять не всё. С большой пользой для себя:

  • вспомнил Аду (интересна тем, что является прародителем PL/SQL);
  • осознал связь между реляционным программированием (Пролог) и реляционными базами данных (надо осмыслить);
  • почитал про функциональное программирование (стали понятны кое-какие странности Хаскеля);
  • нашёл прекрасную главу про причины сложности и методы борьбы с ней (прямиком в курс по качеству в программировании);
  • проникся всеобъемлющей универсальностью аппарата абстракции-конкретизации.

Адриан Форте, «Объекты желания»

Книга про дизайн. Основная мысль (богато проиллюстрированная на историческом материале) состоит в том, что дизайн, в отличие от искусства, определяется не столько творческой работой дизайнера, сколько требованиями бизнеса: социальным контекстом, ожиданиями потребителей, доступными средствами производства. Звучит убедительно.

egorius: (Default)

Ещё один пример ленивых вычислений и рекурсии, менее тривиальный. Есть такое решето Эратосфена — простой, но эффективный алгоритм нахождения простых чисел. Выписываем дцать первых целых чисел, начиная с двойки; дальше мы их будем вычёркивать. Двойку, как невычеркнутую, объявляем простым числом, и вычёркиваем все числа, кратные её (4, 6, 8 и так далее). Берём следующее ещё невычеркнутое число (это будет три), объявляем его простым и вычёркиваем кратные ему. И так повторяем до конца (достаточно дойти до корня из дцати — все оставшиеся невычеркнутые заведомо будут простыми).

Написать такой алгоритм на традиционном языке — дело нескольких минут, но опять-таки первый вопрос: какого размера заводить массив? А нельзя ли подойти к этой задаче функционально, в терминах множеств, а не алгоритмически? Попробуем.

Итак, множество простых чисел — это множество всех чисел, начиная с двойки, за вычетом множества составных чисел.
Множество составных чисел — это множество чисел, кратных простым числам.

И это не какая-нибудь тавтология, это — рекурсия. Достаточно явно назвать двойку простым числом, чтобы это определение завертелось, вычисляя всё новые и новые простые числа.

Дальше не для слабонервных )

Lazy crazy

Aug. 14th, 2010 01:33 am
egorius: (Default)

Поговорим о Хаскеле... Первая вещь, которая отличает_от и поражает воображение, это до невозможности ленивые вычисления. Хаскел никогда ничего не вычисляет, пока оно не понадобится.

Например, можно сказать [1..], и Хаскел бросится печатать бесконечный список чисел. Но если попросить take 5 [1..], то ответом будет [1,2,3,4,5], то есть будут вычислены только те элементы, которые нужны. Не впечатляет? Идём дальше.

Классическая задача — числа Фибоначчи. Классическая же рекурсивная реализация, понятная без каких-либо тайных знаний_о:

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

Говорим fib 10, получаем 55, всё честно.

А если хочется список чисел? Первая мысль императивного программиста: какой длины объявлять массив? Вот в этом месте требуется смена парадигмы. В Хаскеле нет проблем (почти) работать с бесконечными списками.

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Говорим take 11 fibs, получаем [0,1,1,2,3,5,8,13,21,34,55]. Говорим fibs!!10, получаем 55.

Тут уже требуется пара пояснений. Функция tail возвращает весь список, кроме головы: tail [1,2,3] даёт [2,3]. Функция zipWith «сшивает» два списка с помощью функции-параметра, например zipWith (+) [10,20,30] [1,2,3] даст [11,22,33], а zipWith (-) [10,20,30] [1,2,3] даст [9,18,27].

То есть вот что происходит. Сначала в fibs нам известны первые два элемента. А затем происходит рекурсивное (потенциально бесконечное!) сложение списка самого с собой, сдвинутым на одну позицию влево, как-то так:

[0,1,…
+
[1,…
=
[1,…

[0,1,1,…
+
[1,1,…
=
[1,2,…

[0,1,1,2,…
+
[1,1,2,…
=
[1,2,3,…

Ну и так далее, алгоритм O(n) — понятно, не самый быстрый, но для упражнения сойдёт. Суть же в том, что благодаря ленивости вычислений нам не надо заботиться о максимальном размере списка: сколько понадобится, столько и будет, но не больше! По-моему, красиво.

egorius: (Default)

Сделал первый подход к Хаскелю. Скачал GHC, открыл консольку, понажимал клавиши. Надо же, комментарии ставятся двумя минусами. Не знак ли это?

Долго думал «как отсюда выйти». Нажал :q — помогло! Точно знак. Придётся учить.

egorius: (Default)

Ник Горькавый, «Астровитянка» и «Теория катастрофы» (КПК)

Эту книгу упомянул [livejournal.com profile] dottedmag, да так, что захотелось прочитать. Занятная книга: то ли Поттер попал в мир науки вместо мира магии (но мы же помним, что достаточно развитая технология неотличима_от), то ли возвращение Алисы Селезнёвой, то ли Пятый Элемент-2... Сам автор позиционирует трилогию как НФ для умных подростков, однако же её с удовольствием читают и взрослые дядьки. Эх, чому ж я не физик-теоретик?..

Со второй книгой у меня сложились более натянутые отношения: эпизод с синими таблетками не даёт покоя. Всё-таки кажется мне, что с неокрепшими детскими душами надо как-то поаккуратнее. Однако же последнюю часть жду с нетерпением.

Майкл Физерс, «Эффективная работа с унаследованным кодом»

Книжка про то, как бороться с творчеством братьев по разуму, да и со своим тоже. Автор пытается подвести какую-то теоретическую базу и приводит всякие примеры рефакторинга, но главная полезная мысль такова: прежде, чем что-то делать с кодом, надо написать для него блочные тесты. Следствие: тесты нужны не столько для проверки работоспособности готовой программы, сколько в качестве страховки при внесении изменений (идеал автора — test driven development). Наблюдение: простоту написания блочных тестов можно рассматривать как один из критериев «хорошести» кода.

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

Нил Форд, «Продуктивный программист»

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

Лично для меня стало откровением, что уже научились компилировать разные языки в джавовский байт-код, в том числе и Хаскел. Пора, может, его уже изучить?

Марина и Сергей Дяченко, «Ведьмин век» (КПК)

Снова взялся за Дяченок, заботливо отобранных [livejournal.com profile] sergg_rw. Увлекательно пишут! Эта вещь очень лихо закручена, каждая деталька работает, напрягаешься, предвкушаешь концовку — и на тебе... в духе «и тут я проснулся». Так я и не понял, что хотели сказать авторы. Но ведь хотели же!

Profile

egorius: (Default)
egorius

July 2025

M T W T F S S
  12 3 4 5 6
7891011 12 13
1415 1617181920
21222324252627
28293031   

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 7th, 2025 08:12 am
Powered by Dreamwidth Studios