Thursday, October 25, 2007

Пятиминутка ненависти к C++

..на этот раз не моя, однако почитать другим пострадавшим будет довольно забавно. Автор — yousefk, видимо, годами записывал в книжечку все подлянки, которые ему устраивал C++, и в результате у него получился вот такой весьма объемный документ.

Называется это C++ Frequently Questioned Answers, и проезжается он практически по всем сколько-нибудь заметным фичам C++.

За основу взят широко известный C++ FAQ Lite, дополненный "альтернативными" ответами в среднеиздевательском тоне — то есть автор, к счастью, не совсем сваливается в непрерывное брюзжание (как я иногда), что сделало бы такой огромный труд невыносимо скучным.

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


Monday, October 08, 2007

Эзотерические языки - самый полный список

..найден на вики-сайте канала #esolangs в irc-сети freenode.

За ссылку спасибо жж сообществу ru_brainfucker.

Языков там какое-то дикое количество, а особенно выдающимся создателем странных языков оказался некто Дэвид Морган-Мар, очевидно, тру программист. В числе его творений:

  • язык Petrovich (назван в честь И.П. Павлова), основанный на концепции наград и наказаний и выработки у программы нужных "условных рефлексов" :

Petrovich> do something
11:15:23 11 June 2005
Petrovich> reward
Petrovich>

  • язык Haifu, где программы выглядят как хокку
  • язык Piet, исходники выглядят как абстракционистские произведения живописи:

Это собственно программа на Piet, печатающая первые сто чисел Фибоначчи.

Про эзотерические языки, кстати, была отличная статья на рсдн (если кто не видел), многие интересные языки из списка там тоже упоминаются.


Monday, September 24, 2007

Ссылки: Erlang for .NET, Python 3000 и все все все

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

  • Некий товарищ тут вот собирается писать erlang для .NET, при этом подробно комментируя процесс в блоге. Не знаю надолго ли его хватит (блогу всего неделя), но начало интригующее. Например пост про внутренности виртуальной машины эрланга — BEAM. У эрланга вообще всплеск популярности, вон даже у O'Reilly в ONLamp появилось небольшое введение в Erlang. И еще вот неплохое интервью про практическое применение Erlang некими австралийцами.

  • Гвидо ван Россум и Брюс Эккель в своих блогах интересно спорят о Python 3.0, многопоточности в питоне и возможности/невозможности убрать из питона Global Interpreter Lock, вот ссылки на последние посты про питон 3.0 и про GIL (на первые посты ссылки давать бессмысленно, поскольку они там в форме "мой ответ на этот ответ Гвидо на мой пост...")

  • Двигаясь в сторону теоретических основ — отличный пост про связь между замыканиями (в смысле closures) и ООП, с иллюстрациями на Scheme.

  • Плюс, на youtube добрые люди начали делать видеолекции по всяким интересным темам из области теории категорий. В частности, серия лекций про монады и про сопряженные функторы.

  • Ну и в заключение опять немножко суровых практических вещей: интересная библиотека для генерации парсеров бинарных протоколов, "binpac: A yacc for Writing Application Protocol Parsers": Юзер гайд, whitepaper[PDF].


Saturday, September 08, 2007

Seaside: веб-фреймворк на основе continuations

[Довольно длинное введение]

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

Написание сложных (и не очень) веб-приложений обычно наталкивается на кучу проблем, и основная — это то, что протокол HTTP не подразумевает никакого состояния — и поэтому это состояние приходится за собой таскать в виде cookies, скрытых полей в формах и букета параметров методов GET/POST. Плюс к этому, линейные переходы между страницами — по сути, аналог оператора goto — приводят к тому что дизайн многих веб приложений представляет из себя мешанину из процедурного и как-бы-объектно-ориентированного кода, сумбурных обращений к базе данных, разбавленных HTML разметкой.

Проблемы эти стараются решить современные фреймворки для веб-разработки, прежде всего Django, CakePHP и Ruby on Rails, в которых авторы постарались максимально отделить представление от логики, упростить работу с базой данных засчет всяких ORM подсистем и вообще структурировать приложение (в той или иной степени) заставляя его следовать классическому, но подзабытому в 90-е паттерну Model-View-Controller. В Ruby on Rails, скажем, под моделью понимаются данные, хранящиеся в БД, view — это система шаблонов, на основе которых генерируются страницы и контроллер — это собственно бизнес-логика.

Однако же проблема таскать за собой "состояние" сессии остается, хотя и для ее решения фреймворки предлагают много всяких вспомогательных средств.

[Па-пам]

Старики помнят, что термин "объектно-ориентированный" был изобретен для того чтобы назвать так язык Smalltalk. В дискуссиях о том, насколько тот или иной язык ОО обычно гуру ссылаются именно на него, как на эталон тру ОО языка.

Более того, паттерн MVC у тех же стариков ассоциируется прежде всего с GUI библиотеками Smalltalk, именно там этот паттерн родился и получил широкое применение (потом эта вся идеология перекочевала в ОС NextStep, а из нее в Mac OS(X), если кто не в курсе).

Возвращаясь к веб-разработке, многие наверное читали эссе Пола Грэма Beating the Averages, как Пол с товарищами написали на лиспе систему для создания веб-магазинов и потом продали ее за много миллионов баксов Yahoo!. Там они, кроме всего прочего, использовали continuations как механизм передачи управления между страницами. Continuation'ы хранились на сервере в словаре, а ссылки на страницах содержали как параметр id того continuation, который надо выполнить для генерации страницы.

Если сложить вместе концепцию continuations, MVC в качестве основного паттерна для архитектуры всего приложения и smalltalk в качестве языка разработки — получим Seaside, фреймворк для разработки сложных веб-приложений, не думая о большинстве вышеописанных проблем.

[Немножко подробнее про continuations в вебе]

С логикой и control flow в вебе проблем несколько — во первых, вышеупомянутое состояние сессии: таскать его между страницами через параметры POST/GET довольно неудобно да и иногда просто нереально, а наличие у юзера кнопок "назад" и "открыть в новом окне" создает проблемы, если мы храним состояние в куках или сразу сохраняем в базе данных введенные в формы данные.

Но отличное решение этой проблемы уже давно существует и реализовано во многих динамических языках, начиная с лиспа. Называется continuation — тут я описывал подробнее, что это, но если в двух словах — мы можем поставить выполнение программы в каком-то месте "на паузу", и потом с объектом "поставленная на паузу программа" обращаться как с любым другим — продолжить выполнение с того места (сколько угодно раз, заново), сохранить, передать, удалить за ненадобностью.

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

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

/show_form.php 
-> validate_form.php?userName=John&phone=02
-> show_warning.php?userName=John&phone=02
-> show_form.php?userName=John&phone=02

В фреймворках, основанных на continuations метод showForm() просто вызывает validateForm(), которая вызывает showWarning(), и на время, когда юзеру надо показать отрендеренную страницу все состояние сохраняется в continuation. Потом, когда юзер жмет OK — все возобновляется с того места где приложение остановилось.

По сравнению с традиционным подходом тут целых несколько преимуществ: во-первых, мы не заботимся о том, как таскать состояние через страницы; во-вторых, структура программы становится понятнее, это своего рода переход от GOTO к процедурам; в-третьих, поскольку состояние теперь не наша забота, куски кода становятся более модульными, функции showWarning() уже не надо знать ничего ни о каких формах.

Последнее особенно хорошо иллюстрируется примером из дистрибутива Seaside: пять компонентов (счетчиков) на одной странице, состояние обо всех некоторым образом передается между страницами, но каждый счетчик ничего не знает о других — вся логика и представление сосредоточено внутри класса, отвечающего за компонент, а не размазана по скрипту сгенерить_страницу_с_пятью_счетчиками.php. Это именно благодаря тому, что состояние сохраняется и передается автоматически между вызовами. И кнопка back в браузере отлично работает без всяких усилий со стороны разработчика.

[Seaside]

Собственно, про сам Seaside добавить можно теперь немного — используется в точности подход, описанный выше.

Немаловажный момент — Seaside принципиально не использует никакой системы шаблонов, подобно Ruby on Rails и Django — XHTML код генерится с помощью набора специальных классов, благодаря чему генерацию XHTML можно разносить по методам, применять к ним инструменты для рефакторинга Smalltalk-овского кода (а среда тут предоставляет их очень богатый набор). Конечно, дизайнерам править XHTML будет немного сложнее, но, по-хорошему, им и не надо: XHTML призван отвечать за "семантику" страницы, а для представления ее существует CSS.

Вообще среда разработки в Smalltalk (точнее Squeak, основная но не единственная реализация Smalltalk, в которой работает Seaside)  заслуживает отдельного большого поста — настолько это инопланетное создание. Чего стоит только тот факт что там нету понятия исходных файлов — есть только один большой рантайм, все классы и методы правятся "на лету", не останавливая работы приложения. Система контроля версий тоже своя, и diff работающий не на уровне текста, а на уровне классов и методов. Поначалу больше всего расстраивает то, что в Squeak нельзя воспользоваться своим любимым редактором, но мало какой редактор предоставляет столько инструментов для рефакторинга и автоматической генерации кода, как System Browser в Squeak.

Кроме всего этого, к Squeak/Seaside прилагаются очень неплохие инструменты для отладки, тестирования и настройки производительности. В отладочном режиме вообще много приятностей — когда в приложении происходит какой-то эксепшен, можно нажать кнопку Debug и начать отлаживать с этого места в Squeak. Для десктопных средств разработки в этом ничего выдающегося нету, но для веб — это большой шаг вперед.

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

Лучше, конечно один раз увидеть: скринкаст здесь — рефакторинг приложения (не веб-) в squeak, не останавливая его работы; и тут — создание блога за 15 минут в Seaside. Заметьте, как товарищ ловко фиксит там баг на лету, опять же без остановки приложения.

[Кто-то же должен за это платить?]

Естественно, все это оборачивается несколько более высокими аппаратными требованиями. Seaside изначально ставит стоимость времени программиста много выше стоимости железок. Squeak кушает изрядно памяти и процессорного времени (хотя по скорости выполнения, говорят, как минимум не медленнее питона и руби). По стабильности рантайма проблем нету, если кого-то беспокоит что это все может быть несколько "сыровато" — виртуальная машина squeak разрабатывается уже лет 10 как, причем довольно серьезными и профессиональными дядьками, начиная с того же Алана Кея.

[Ну и..]

В общем, крайне рекомендую поиграться, особенно тем кто занимается веб-разработкой профессионально. Получите, как минимум, массу удовольствия.

[Ссылки. Много ссылок]

  • Блог "On Smalltalk" много про squeak, smalltalk и seaside
  • Блог "HREF Considered Harmful" про про seaside и внутренности squeak
  • Подробно о continuations в вебе Статья "Seaside - a Multiple Control Flow Web Application Framework" [PDF]
  • Сравнение Rails Vs Seaside (+ в комментах интересная битва между любителями Rails и автором)
  • Другое интересное сравнение Rails и Seaside от опытного программиста на java Дэвида Поллака. Судя по всему, Дэвида все-таки не устроило ни то, ни другое, поэтому сейчас он активно разрабатывает фреймворк на базе Scala, это отдельная интересная тема :)
  • Сайт Seaside
  • Сайт Squeak
  • Бесплатный хостинг для некоммерческих Seaside приложений
  • Туториалы к Seaside: вот и вот, и еще несколько в гугле можно найти. К сожалению, кое-какие из них местами устарели.


Friday, August 31, 2007

Блог: монстры геймдева

Группа широко известных в узких кругах отечественных разработчиков компьютерных игрушек (и не только) с недавних пор ведет коллективный блог по адресу http://blog.gamedeff.com

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

Всячески рекомендую, в общем.


Wednesday, August 29, 2007

Самый популярный функциональный язык

... чей рантайм установлен практически на каждом компьютере — это XSLT, язык для трансформации XML документов.

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

Все это в изобилии можно наблюдать в замечательной XSLT-библиотеке FXSL, разработанной Димитром Новачевым. Реализации большинства функциональных идиом, таких как композиция функций, операций со списками по мотивам хаскелевской стандартной библиотеки — map/filter/foldl/zipWith и т.п. Более того, в cvs-версии библиотеки можно найти даже реализацию небольшого LR-парсера на чистом XSLT 2.0

Конечно, выглядит не очень прозрачно, вот например использование foldl для вычисления произведения элементов списка:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foldl-func="foldl-func"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f foldl-func"
>

   <xsl:import href="../f/func-foldl.xsl"/>

<!--
    This transformation must be applied to:  
        ../data/numList.xml                  
                                             
        Expected result: 3628800 or 3.6288E6 
-->
   <foldl-func:foldl-func/>
   <xsl:variable name="vFoldlFun" select="document('')/*/foldl-func:*[1]"/>
    <xsl:output  encoding="UTF-8" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <xsl:value-of select="f:foldl($vFoldlFun, 1, 1 to 10 )"/>
    </xsl:template>
    
    <xsl:template match="*[namespace-uri() = 'foldl-func']"
     mode="f:FXSL">
         <xsl:param name="arg1" select="0"/>
         <xsl:param name="arg2" select="0"/>
         
         <xsl:value-of select="$arg1 * $arg2"/>
    </xsl:template>

</xsl:stylesheet>

Created with colorer-take5 library. Type 'xslt2'

В качестве примеров более серьезных программ на XSLT — решалка головоломки Sudoku и CSV2XML конвертер,написанные товарищем по имени Andrew Welch, у которого есть еще очень интересный блог по XSLT.

Если захочется поиграться, берите saxon в качестве XSLT процессора — поддержка XSLT 2.0 в MSXML только планируется (а в Orcas ее точно еще не будет)

Ссылки: