Сегодня в почтовой рассылке Simon Marlow объявил о том, что он уходит из MIcrosoft Research.
«Я планирую взять небольшой перерыв и завершить мою книгу о многопоточном и параллельном программировании на Haskell для издательства O'Relly, а затем начать работу в британском офисе Facebook в марте 2013 года» — пишет он.
Simon Marlow — один из создателей языка Haskell и один из ведущих разработчиков единственного наиболее популярного компилятора, GHC.
Последние несколько лет я провел в изучении и экспериментах со многими языками программирования. В частности, я начал использовать Scala как основной язык, стараюсь использовать функциональный стиль везде где это возможно. Меня также весьма заинтересовал Haskell (чистый функциональный язык) и Clojure (современный диалект Лиспа).
Таким образом, я постепенно отказываюсь от объектно-ориентированной парадигмы, несмотря на то, что использовал в основном её последние 17 лет моей профессиональной деятельности. У меня появляется чувство, что объекты это то, что мешает нам писать лапидарный, структурированный и повторно используемый код.
У программ на хаскеле есть одно свойство. После компиляции мы получаем самодостаточный бинарник, один файл с исполняемым машинным кодом. Языков с компиляторами, удобных для веб разработки, не так уж и много. Это свойство не имеет особого значения. Однако, оно позволяет добиться непревзойдённого удобства установки программ. И не только установки, но и всего того, что скрывается за английским словом deployment.
Веб-приложения используют дополнительные данные — изображения, стили css, скрипты javascript. Как правило они хранятся отдельно от исполняемого кода приложения в файловой системе веб-сервера. Но если этих дополнительных ресурсов меньше мегабайта — почему бы не встроить их прямо в бинарник? Сделаем deployment веб-приложений проще!
Мне приходилось участвовать в проектах на c++ с количеством строк более 600 000. Поэтому сложно назвать проект на 5000 строк настоящим. И тем не менее, для хаскеля и мотивации just for fun это немалый объём.
Эта небольшая программа[1] пишется в свободное время, поэтому времени ей сильно не хватает.
Хотелось бы описать некоторые впечатления об использовании хаскеля на практике.
# iptables -t nat -N test
# iptables -t nat -A test -p tcp -j REDIRECT --to-port 80
# iptables -t nat -A test -p tcp -j MASQUERADE
# iptables -t nat -A POSTROUTING -j test
iptables: Invalid argument. Run `dmesg' for more information.
# dmesg | tail -n 1
ip_tables: REDIRECT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT
# iptables -t nat -A PREROUTING -j test
iptables: Invalid argument. Run `dmesg' for more information.
# dmesg | tail -n 1
ip_tables: MASQUERADE target: used from hooks PREROUTING, but only usable from POSTROUTING
Это пост о программе Iptables и о веб-интерфейсе для неё.
Любой программист, изучающий haskell, рано или поздно встречается с таким непостижимым понятием как монада. Для многих знакомство с языком заканчивается монадами. Существует множество руководств по монадам, и постоянно появляются новые (1). Те немногие, кто понимает монады, тщательно скрывают свои знания, объясняя монады в терминах эндофункторов и естественных преобразований (2). Ни один опытный программист не может найти монадам место в своей устоявшейся картине мира.
В результате java-программисты только посмеиваются над хаскелем, не отрываясь от своего миллионострочного энтерпрайзного проекта. Разработчики на С++ патчат свои сверх-быстрые приложения и придумывают ещё более умные указатели. Веб-разработчики листают примеры и огромные спецификации по css, xml и javascript. А те из них, кто в свободное время изучает haskell, сталкивается с труднопреодолимым препятствием, имя которому монады.
Итак, узнаем как программировать на хаскеле без монад.