Pull to refresh

Haskell в настоящем проекте

Reading time 5 min
Views 10K
Мне приходилось участвовать в проектах на c++ с количеством строк более 600 000. Поэтому сложно назвать проект на 5000 строк настоящим. И тем не менее, для хаскеля и мотивации just for fun это немалый объём.

Эта небольшая программа[1] пишется в свободное время, поэтому времени ей сильно не хватает.

Хотелось бы описать некоторые впечатления об использовании хаскеля на практике.


Реакция пользователей


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

Установка ни у кого не вызвала серьёзных проблем. Были лишь небольшие проблемы, например, с тем что отключены cookies. Или на 64-битной системе был запущен двоичный файл для 32-битных систем.

Проблемы haskell


Проблемы языка

Говорят, что для программирования на хаскеле нужно иметь докторскую степень. Это неправда. Может быть тем парням, что разрабатывают спецификации языка и изощренные библиотеки это действительно нужно. Но «пользовательский интерфейс» у языка очень простой и интуитивно понятный. Как и для других языков программирования, хватит трёх классов церковно-приходской школы.

За время работы над проектом встретилась только одна проблема, связанная именно с языком. В определённый момент потребовалось добавить в большой стек трансформеров монад ещё одну монаду[2]. Что оказалось нетривиальной задачей. С помощью чтения документации и дружелюбной помощи хаскелистов в irc проблема решилась за вечер. Честно признаться это место можно было сделать проще, но именно такая реализация позволила защититься статической типизацией от целого класса ошибок. Если будут интересны подробности, напишу отдельный пост.

Порог вхождения и кривая обучения

Существует также мнение что порог вхождения в хаскель очень велик. А кривая обучения слишком растянута. По этому поводу могу сказать следующее.

Когда я только начинал изучать хаскель, я решал одну небольшую проблему. В хаскеле нет многострочных строк в исходниках. То есть нельзя в исходник добавить большой текст и получить валидную строковую константу.
-- Так нельзя, ошибка синтаксиса
text1 = "Многострочный
 текст" 
 
-- А так можно
text2 = unlines ["Многострочный",
 "текст"]
 
-- и так можно
text3 = "Многострочный\n\
 \текст"


Я написал программу на 600 строк, которая принимала на вход специальный текстовый файл и генерировала по нему исходник на хаскеле с многострочными строковыми константами. Это позволило при разработке web-приложений встраивать все тексты прямо в бинарник.

Чем дальше я изучал хаскель, тем больше понимал, что этот код очень плох. Там не было монад состояния, для парсинга не использовалась библиотека parsec. Всё было сделано простым кодом с явным указанием всех параметров и использованием только тривиальных конструкций.

Но этот код я с лёгкостью понимал даже через 2 года. И он меня полностью устраивал. Но приближался релиз проекта, для сборки которго нужна эта утилита. Стало стыдно выпускать её в таком виде. Поэтому я сел и за полчаса переписал её на parsec[3].

Возможно, проблемы с плавной кривой обучения нет никакой. Даже начинающие изучать хаскель по разрозненным руководствам пишут вполне рабочий код. А если предположить что начинающий прийдёт в команду опытных хаскелистов, я думаю, он станет писать хороший код очень быстро. Некоторые успешные промышленные языки, например, С++, требуют для этого нескольких лет опыта.

Проблемы взаимодействия с другими системами

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

Для веб-приложений это обычная работа по вёрстке веб-страниц и разработке javascript-кода. Сюда же прилагаются проблемы кроссбраузерной совместимости и прочие прелести веб-разрабоотки.

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

Библиотеки. Помимо родных библиотек, для хаскеля создано большое число обёрток вокруг сишных библиотек. Но далеко не все. В ходе работы пришлось писать собственную обёртку вокруг библиотеки PAM[4], так как готовых реализаций действительно не было. Как оказалось, писать интерфейс к сишному коду на хаскеле достаточно просто.

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

Отдельно стоит отметить проблему создания пакетов для дистрибутивов linux. Это не так просто, вся инфраструктура пакетирования заточена под традиционные компиляторы и языки. Тема создания пакетов для программ на хаскеле заслуживает отдельного поста. Порадовало, что программы на хаскеле собираются даже для таких проверенных временем систем, как Red Hat Enterprise Linux 5. Чтобы запустить там приложение на питоне, вам потребуется добиться работы на python 2.4. Либо попытаться запустить там более новый интерпретатор и получить ещё больше проблем с установкой и поддержкой.

От каких проблем haskell избавляет


Не буду полностью пересказывать параграф «Почему хаскель?» из введения с официального сайта языка[5].

Приведу краткий список преимуществ языка из этого параграфа:
  • Значительно увеличенная производительность программиста.
  • Более лаконичный, понятный код, более дешёвый в сопровождении.
  • Меньше ошибок, более надёжные программы.
  • Меньше «семантическая пропасть» между программистом и языком.
  • Более быстрый выпуск продукта.

Как показала практика, они не врут.

Но от себя я бы добавил ещё один пункт в этот список. Программирование на хаскеле приносит удовольствие. Те же самые эмоции, наверное, были у программистов середины 20 века, когда впервые появился ассемблер. Такое же упрощение работы было при переходе с ассемблера на фортран.

На хаскеле больше нет необходимости управлять поименованными областями памяти(переменными). Разработчику достаются только поименованные неизменяемые значения. О представлении которых в памяти компилятор заботится сам. Это является существенной автоматизацией труда программиста.

Что ж, подождём пока бизнес обратит на хаскель более пристальное внимание. Рискнув использовать хаскель в продакшене, можно всё потерять получить значительное конкурентное преимущество.

[1] http://iptadmin.confmgr.org
[2] Ссылка на исходник, нужный код в функции authorize
[3] http://patch-tag.com/r/etarasov/iptadmin/snapshot/current/content/pretty/util/ptmpl/src/Main.hs
[4] http://hackage.haskell.org/package/pam-0.1
[5] http://haskell.org/haskellwiki/Introduction#Why_use_Haskell.3F
Tags:
Hubs:
+35
Comments 52
Comments Comments 52

Articles