SDCast #61: в гостях Павел Аргентов, практикующий fp-программист

Встречайте 61-й выпуск SDCast’а, целиком и полностью посвящённый языку OCaml. У меня в гостях Павел Аргентов, практикующий fp-программист. В этом выпуске мы попытались осветить все аспекты языка OCaml, сферы его применения, вопросы разработки, экосистему и сообщество вокруг.

В начале Паша сделал довольно подробный экскурс в историю появления самого языка, начиная с появления диалекта Lisp’а в семидесятых, добавление алгебраических типов данных и категориальной абстрактной машины в восьмидесятых, появление реализации Caml Light в девяностых и заканчивая уже современной инкарнацией c поддержкой объектной модели.

Подробно обсудили основые парадигмы языка и ключевые концепции, такие как: функциональное программирование, strict-механика и вытекающие из этого последствия, связывание переменных и лексические скоупы для связывания, система типов Хиндли-Милнера и опциональные аннотации типов, ООП-слой, язык модулей и функторы, инструментарий для синтаксического расширения (собственные DSL) и многое другое.

Пообщались о сферах применения языка, для каких задач OCaml подходит лучше всего, какие преимущества у него по сравнению с другими языками в контексте этих задач. Паша рассказал про различные известные (и не очень) проекты, написанные на OCaml, среди которых, например, MirageOS, фреймворк для построения Unikernel систем. Рассказал про различные проекты, написанные под сильным влиянием OCaml. В основном это различные языки программирования, которые основаны на идеях OCaml, например FSharp, Haxe или ReasonML.

Не забыли мы обсудить и экосистему вокруг языка, какие есть инструменты для работы с языком: моды к различным IDE, браузер типов, пакетные менеджеры и прочие сопутствующие инструменты, коммьюнити вокруг языка, списки рассылки, места скопления OCaml-программистов, чаты и форумы.

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

Ссылки на ресурсы по темам выпуска:

Понравился выпуск? — Поддержи подкаст на patreon.com/KSDaemon а так же ретвитом, постом и просто рассказом друзьям!

Скачать (mp3, 71 MB) Скачать (ogg, 53 MB)
  • ajooluz

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

  • Арнольд Кавке

    https://uploads.disquscdn.com/images/0e16c79cd108f9bb24302f33446cc27f6077504ecc5c851c802fb78034c790c1.png

    печаль, а в россии запрещено просматривать онлайн курсы, слайды и видео по ocaml

  • Slava Semushin

    Спасибо! Интересно послушать программистов “старой школы” :) Кстати, тему про юникернел хорошо бы развить.

  • g.orlov

    Выпуск отличный. Гость звучал хорошо, говорил связно и со знанием дела. Спасибо за выпуск!

  • prepor

    Отлично! Но по тексту сразу много замечаний возникает. Я их записал :) До конца не дослушал пока, пойду домой

    – Окамл не шибко функциональный, за то его многие и любят. Мутабельный стейт, эксепшены, массивы, все это вовсю используется
    – Окамлу ниразу не 40 лет, а 20, он моложе явы. Окамл такой же МЛ, как ява8 паскаль.
    – Раст компилируется в ллвм-ir, а не в машинный код. Собственно и збс.
    – Насчет “зависти” хаскелистами к модулям. В хаскелле уже зарелизили https://plv.mpi-sws.org/backpack/. А вот имплиситы (https://arxiv.org/pdf/1512.01895.pdf) в окамле так и не зарелизили
    – Отличие объектов в окамле от явы все же ни в какой ни “скорости”, а 1. В четком разделении классов (со всеми этими конструкторами и наследованием) и объектов. 2. Типизирование реализовано не через подтипы, а row polymorphism
    – Ocsigen не использует “лексеры”, “парсеры” и т.д., которые тоже есть в окамл-экосистеме. Раньше он расширялся через
    – В окамле нет стейтментов? А ; что делает? (который ниразу не монада, к слову, а просто комбинатор) ;) Кроме того в окамле есть понятие top-level деклараций. let … in в топ левеле это не то же самое, что let … in вложеный.
    – Strict язык и ленивый язык это разные вещи. strict это про систему типов, ленивость это про стратегию выполнения
    – Функиональное программирование и статическая (а не строгая, как автор говорит) полностью ортогональны.
    – Выстреливать в ногу проще простого. Рантайм ошибок в окамле более чем достаточно (в отличии от ELM, например)
    – опам и bundle совсем разные вещи, опам все еще не умеет нормально фиксировать версии, даже в 2.0. В целом, пэкейджинг в окамле все еще крайне убогий
    – oasic это дич. Все остальные билд-системы тоже. Но есть topkg, есть jbuilder все же. Ничего по удобству сравнимого с cargo, например, нет.
    – reasonml это и не суперсет, и не диалект окамла. Это альтернативный синтаксис окамла, при том не первый, давным давно существует Revised syntax, например, который парсится ровно в те же структуры, что и “обычный” окамл. Дальше идет тот же (физически) фронтенд и бекенд окамла.
    – В докере окамл, справедливости ради, все же появился после покупки докером Unikernel Systems (которые MirageOS) вместе с разработчиками

    • Спасибо за дельные замечания ) Вместе с тем пара вопросов — уточнить:

      > Окамл такой же МЛ, как ява8 паскаль

      Поясни плиз, а то это немного расходится со справочниками )

      > в окамле есть понятие top-level деклараций

      Дай ссылку на ман плиз.

      • prepor

        1. Ну ты же и дальше там по истории идешь. Окамл появился в 1996. У него другой синтаксис, другая система типов, другая имплементация, чем у всех предыдущих ML языков. Конечно, есть преемственность, идеологическая, синтаксическая, системы типов, но называть окамл 40 летним языком примерно то же, что кложу — 60 летним.

        2. Ну тут, по-определению :) Окамл состоит из двух языков — модулей, и собственно ml, где все — экспрешен. топ-левел является особой формой модуля. Есть специальные формы, которые есть только в модулях. У них свой синтаксис (let x = expr VS let x), нет типа, есть сайд эффект (добавления себя в модуль). Там где возможны мудуль формы невозможны экспрешены (1 + 2 невалидная окамл-программа), там где возможны экспрешены невозможны формы модулей (let f x = type Foo = Bar Foo низя). Не думаю, что это шибко важно, но различия есть. В лиспах (кложа, например), этого различия нет, там вообще все — экспрешен, у всего есть значение и тип. Или как другой пример erlang2 (в противовес собственно эрлангу)