Часть 2: тулзы и варезы

В предыдущей части я налил немного воды на пустыню, которой является представление современного вебдева о юникернелах. Итак, юникернел — это фреймворк для сборки компактного инстанса очень узкоспециального приложения и запуска получившегося изделия на некоторой VM (xen, kvm, vbox и т.п. — кто-то даже шутит об ARMv7-машинках). На выхлопе юникернел-фреймворка ожидается полностью самодостаточный имидж со всеми своими изолированными зависимостями и сам-себе-операционка. Это чем-то напоминает докер-образ, за тем исключением, что всё ещё компактнее и реализовано средствами какого-то одного языка.

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

  1. Инсталляция OCaml
  2. Редактор с OCaml-модой
  3. Минимальные знания о работе в shell

Третий пункт, думаю, есть у всех (иначе идём в свою геймконсоль и не морочим взрослым дядям и тётям голову). В качестве второго я буду использовать Emacs с ocaml-mode + merlin. Merlin — это такой мощный препроцессор, реализованный на самом же окамле в виде CLI-бинарника. Он интегрируется в редактор (Emacs или Vim) и снабжает автора благами цивилизации в виде навигации по типам и исходникам. Лирическое отступление: в FP-языках ML-семейства (Haskell, OCaml) всё локальное рассуждение о коде строится по принципу «что делает что из чего» — то есть, всегда держишь перед глазами тип текущей функции вида (a -> b), где a — тип аргумента, b — тип результата, а стрелка между ними — твоя драгоценная функция. Merlin и OCaml-mode редактора позволяют быстро подглядеть тип любого выражения в коде, и автор не сходит с ума. Это была рекламная пауза.

Первый пункт пока самый интересный, потому что сейчас мы откроем консольку и начнём хачить крутые шелл-команды. Я буду показывать пример на MacOS/homebrew. На линуксе всё идентично за исключением команд пакет-манагера. Если что, [спойлер] в следующих частях опуса мы повторим всё в линуксной виртуалке НаШкафу(тм) и освежим пройденные грабли. Итак, приступаем.

Раз. Картинки нет, потому что в этом месте мы делаем:

$ brew update && brew upgrade

Два.

Пакет-менеджером OC инсталлируем OCaml (рантайм и компайлер языка) и OPAM (собственный пакет-менеджер, аналог gem в Ruby). Наблюдаем предупреждение об opam init — тулза создаст ~/.opam, где будут жить все последующие пакеты/бинарники/библиотеки и вставит настройки шелла куда-следует (PATH и всё такое):

Кстати, видели — опам ещё пару-тройку системных библиотек подставил, вот умничка! Перезапускаем шелл и идём дальше.

Три. Оп-па, в этом месте, если у вас фиш (fish), вы рискуете попасть на кучу неприятных сообщений и общий экзистенциальный ужас при запуске консоли. Если так, то идём в ~/.configure/fish/config.fish и заменяем там секцию «OPAM configuration» на такое:

Четыре. Запускаем таки шелл. Проверяем версии того, что уже поставилось:

Пять. Ставим ещё несколько нужных вещей:

$ opam switch 4.04.0+flambda
$ opam install -y ocamlfind utop core merlin

Opam всё компилирует из исходников, так что придётся немного подождать. Красивого разноцветного вывода в консоли тоже очень много, поэтому пока без картинок. Лирическое отступление: бывает так, что при установке некоторых зависимостей opam предупреждает о необходимости перекомпиляции каких-то уже установленных пакетов. Это — ничего страшного, соглашаемся. Когда нибудь камлеры прокачают управление зависимостями до уровня песочниц вроде рубишного bundle или хаскелевого stack. А пока — так. Да, ещё во время установки обратите на массу ppx* пакетов — Это синтаксические расширения. Кое-что из них нам пригодится чуть позже.

Тем временем, всё проинсталлилось, и мы увидели красочную доку Мерлина. Придётся ещё подшаманить:

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

Шесть. Ставим mirage (из-за чего всё, собственно, и затевалось). Пока он ставится, ещё одно лирическое отступление. Как фреймворк, продукт и образец кода мираж так хорош, что я всем рекомендую его как отправную точку для изучения OCaml и всех его передовых технологий, в т.ч. кооперативной многозадачности, туториал по которой от миража считаю лучшим (так как сам въехал в проблему именно по нему). О, оно поставилось:

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

To be continued