Разработка веб-приложений на Yesod — Введение
10 июля 2012
Позвольте громогласно объявить о том, что недавно небольшая группа энтузиастов, среди которых есть и я, начала работу над русским переводом книги Developing Web Applications with Haskell and Yesod. В сей заметке я хотел бы представить вашему вниманию черновой вариант перевода первой главы этой книги. Из нее вы узнаете, что это за Yesod такой и чем он может быть полезен. Кстати, мы будем рады всем желающим присоединиться к проекту!
Введение
С тех пор, как появилось программирование для веб, люди старались сделать процесс разработки более приятным. Мы постоянно применяли новые техники для борьбы со сложностью — угрозами безопасности, отсутствием текущего состояния при использовании HTTP, необходимостью использовать множество языков программирования (HTML, CSS, Javascript) при создании мощных веб-приложений и тп.
Yesod пытается упростить процесс веб-разработки, играя на сильных сторонах языка программирования Haskell. Строгие проверки на этапе компиляции в языке Haskell затрагивают не только типы, а чистота языка гарантирует, что мы не имеем ненамеренных побочных эффектов. Сопоставление с образцом алгебраических типов данных позволяет гарантировать, что мы предусмотрели все возможные случаи. Программируя на Haskell, мы избавляемся от целых классов ошибок.
К сожалению, использовать Haskell не достаточно. Всемирная паутина по своей природе не является типобезопасной. У нас даже нет элементарной возможности отличить строку от числа — все данные в вебе передаются в виде простых последовательностей байт, сводя на нет наши усилия относительно безопасности типов. Задача валидации входных данных полностью возложена на разработчика приложения. Я называю это пограничной проблемой — поскольку ваше приложение является безопасным в отношении типов, любая граница с окружающим миром нуждается в «дезинфекции».
Безопасность типов
Здесь в дело вступает Yesod. Используя высокоуровневые декларативные приемы, вы можете точно указать ожидаемые типы входных параметров. Да и сама обработка данных работает не так, как обычно — используя типобезопасные URL, вы можете быть уверены в том, что выходные данные также сформированы правильно.
С пограничной проблемой имеет дело не только клиент, она также существует при сохранении и загрузке данных. И вновь, Yesod спасает нас от пограничных проблем, любезно производя сериализацию данных. Вы можете работать с высокоуровневым определением сущностей, оставаясь в блаженном неведении относительно деталей реализации.
Выразительность
Не секрет, что веб-приложения содержат массу шаблонного кода. Где это возможно, Yesod старается использовать особенности языка Haskell, чтобы уберечь ваши пальцы от лишней работы:
- Библиотека для работы с формами в большинстве случаев уменьшает количество кода путем использования класса типов Applicative.
- Объявления маршрутов очень немногословны, но не в убыток безопасности типов.
- Код для сериализации и десериализации ваших данных генерируется автоматически.
В Yesod есть два вида кодогенерации. Для начала нового проекта предоставляется утилита, предназначенная для создания структуры файлов и каталогов. Тем не менее, большая часть кода генерируется на этапе компиляции благодаря механизму метапрограммирования. Таким образом, сгенерированный код никогда не устареет. Простое обновление библиотеки автоматически обновит весь сгенерированный код.
Но для тех, кто предпочитает сохранять контроль и точно знать, что делает написанный код, предусмотрена возможность оставаться ближе к компилятору и писать весь код самостоятельно.
Производительность
GHC, наиболее популярный компилятор языка Haskell, обладает потрясающими характеристиками производительности, и они постоянно улучшаются. Один только выбор языка программирования дал Yesod огромное преимущество в плане производительности по сравнению с альтернативами. Но одного языка не достаточно — нам нужна архитектура, ориентированная на производительность.
Для примера рассмотрим подход к работе с шаблонами. Разрешив анализ HTML, CSS и JavaScript кода на этапе компиляции, Yesod не только избежал дорогостоящих операций ввода/вывода с диска, но и получил возможность оптимизировать рендеринг этого кода. Однако на этом архитектурные решения не заканчиваются. Благодаря тому, что лежащие в основе Yesod библиотеки используют такие продвинутые приемы, как каналы (conduits) и строители (builders), мы можем быть уверены в том, что наш код потребляет постоянное количество оперативной памяти, не используя при этом файловые дескрипторы и другие дорогостоящие ресурсы. Используя высокоуровевые абстракции, вы можете получить сильно сжатый и должным образом кэшируемый код на CSS и JavaScript.
Warp, флагманский веб-сервер Yesod, является быстрейшим веб-сервером на Haskell. Совместно используя эти две технологии, мы получаем одно из самых высокопроизводительных решений для создания веб-приложений.
Модульность
Yesod породил множество пакетов, большинство из которых могут быть использованы отдельно от самого Yesod. Одна из целей проекта состоит в том, чтобы вернуть сообществу как можно больше. Таким образом, даже если вы не собираетесь использовать Yesod в своем следующем проекте, существенная часть этой книги может оказаться для вас полезной.
Разумеется, эти библиотеки были разработаны с расчетом на возможность легко интегрировать их друг с другом. Использование фреймворка Yesod должно дать вам ощущение сильной согласованности различных API.
Прочная кодовая база
Помню, как-то раз мне попался фреймворк на языке PHP, среди преимуществ которого отмечалась поддержка UTF-8. Я был поражен: то есть, вы хотите сказать, что поддержка UTF-8 не является автоматической? В мире Haskell такие вещи, как поддержка различных кодировок, полностью поддерживаются уже давно. На самом деле, мы обычно сталкиваемся с полностью противоположной проблемой, когда существует более одного пакета, предоставляющего мощное и хорошо спроектированное решение проблемы. Сообщество Haskell-программистов находится в непрерывном поиске более чистого и более эффективного решения для каждой проблемы.
Обратная сторона медали заключается в сложности выбора. Используя Yesod, вы получаете готовый набор инструментов, выбранный за вас, и вы можете быть уверены в том, что эти инструменты будут работать совместно. Разумеется, за вами всегда остается возможность выбрать решение на свой вкус.
Например, Yesod и Hamlet (язык для создания шаблонов, используемый по умолчанию) используют библиотеку blaze-builder для генерации текстового контента. Такой выбор был сделан по той причине, что blaze предоставляет наиболее быстрый интерфейс для генерации данных в кодировке UTF-8. Любой, кто желает использовать одну из других прекрасных библиотек, например text, без труда сможет сделать это.
Введение в Haskell
Haskell является мощным, производительным, типобезопасным функциональным языком программирования. Эта книга написана в предположении, что вы уже знакомы с основами языка Haskell. Существует две прекрасные книги для изечения Haskell, притом обе доступны для чтения онлайн:
Примечание: В качестве русскоязычного аналога можно порекомендовать онлайн-книгу Антона Холомьева «Учебник по Haskell». Обратите также внимание, что недавно вышел перевод «Learn You a Haskell for Great Good!» на русский язык.
Yesod опирается на несколько возможностей языка Haskell, которые не освещены в учебниках для начинающих. Хотя от вас и не часто будет требоваться понимание того, как именно они работают, всегда лучше понимать, что делают используемые вами инструменты. Упомянутые возможности рассматриваются в следующей главе.
Дополнение: Перевод еще одной главы — Интернационализация в Yesod.
Метки: Haskell, Yesod, Перевод, Функциональное программирование.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.