Что такое OCaml и зачем он нужен

Знакомимся с языком, который сочетает математическую строгость функционального стиля с практичностью промышленного инструмента.

OCaml — статически типизированный функциональный язык из семейства ML, который компилируется в быстрый нативный код и при этом разрешает императивный и объектно-ориентированный стиль, когда это удобно.

Слово «функциональный» часто звучит так, будто речь идёт об академической экзотике. OCaml ломает этот стереотип. Это язык, на котором финансовая компания Jane Street пишет торговые системы, обрабатывающие миллиарды долларов в день; язык, на котором был написан первый компилятор Rust; язык, на котором построена система доказательства теорем Coq. OCaml одновременно строг как математика и быстр как C.

Семья ML: откуда растут корни

OCaml принадлежит к семейству языков ML (Meta Language), которое зародилось в 1970-х в Эдинбурге как язык для тактик в системе доказательства теорем. От ML унаследованы три кита, которые мы будем изучать весь курс: мощный вывод типов, сопоставление с образцом (pattern matching) и алгебраические типы данных. Держите в голове генеалогию: Haskell — двоюродный брат OCaml (тоже из мира ML-идей, но ленивый и чисто функциональный), а F# — прямой потомок OCaml, перенесённый на платформу .NET. Scala взяла из ML идею алгебраических типов и сопоставления с образцом, но привила её к объектному миру JVM.

Чем OCaml отличается от Haskell

Главное отличие от Haskell — прагматизм. Haskell бескомпромиссен: вычисления ленивые, побочные эффекты загнаны в систему типов, мутация — почти табу. OCaml же энергичный (strict): выражения вычисляются сразу, в привычном порядке. И если вам нужно изменить переменную, завести цикл for или ссылку на изменяемую ячейку — OCaml разрешит это без церемоний. Это делает язык легче для перехода с императивных языков и часто проще для рассуждений о производительности.

(* Первая программа на OCaml *)
let () = print_string "Привет, OCaml!\n"

Вывод:

Привет, OCaml!

Здесь let () = ... — это вычисление выражения ради побочного эффекта (печати). Скобки (* ... *) — комментарий. Уже в этой строчке видна философия языка: всё построено из let и выражений.

Где применяется OCaml

  • Финансы. Jane Street — крупнейший индустриальный пользователь, весь их стек на OCaml.
  • Компиляторы и языки. Сильная система типов и pattern matching: первый компилятор Rust, Flow, Hack, ReScript.
  • Верификация. Coq, а также инструменты вроде Frama-C.
  • Инфраструктура. MirageOS (unikernel-ОС), Tezos (блокчейн).

Как работает под капотом

OCaml компилируется двумя путями. Байткод (ocamlc) — переносимый, для быстрой разработки. Нативный код (ocamlopt) — машинный код под конкретный процессор, по скорости сопоставимый с C. У OCaml есть автоматический сборщик мусора с поколениями, поэтому вы не управляете памятью вручную, но аллокации дёшевы, а пауза GC обычно крошечная. Именно эта связка — выразительность функционального языка плюс скорость нативного кода — и делает OCaml выбором там, где важны одновременно надёжность и производительность.

Частые ошибки в восприятии

  • «Функциональный значит медленный». Нет: нативный OCaml часто быстрее динамических языков в десятки раз.
  • «Придётся писать кучу аннотаций типов». Наоборот: вывод типов почти всегда выводит типы сам.
  • «Это чистый функциональный язык как Haskell». Нет: OCaml мультипарадигменный, допускает мутацию и циклы.

Итоги

  • OCaml — функциональный язык семейства ML с выводом типов, pattern matching и алгебраическими типами.
  • Он прагматичен: энергичные вычисления, разрешённая мутация, компиляция в быстрый нативный код.
  • Применяется в финансах, компиляторах, верификации; родственник Haskell, прародитель F#.
Проверьте себя
1. К какому семейству языков относится OCaml?
ALisp
BML
CSmalltalk
DForth
2. Чем OCaml принципиально отличается от Haskell?
AOCaml динамически типизирован
BOCaml энергичный (strict) и разрешает мутацию
COCaml не компилируется
DOCaml не имеет вывода типов
3. Какой известный язык изначально имел компилятор, написанный на OCaml?
APython
BGo
CRust
DJava