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

Знакомимся с Clojure: что это за язык, откуда он взялся и какие задачи решает.

Clojure — современный диалект Lisp, работающий на виртуальной машине Java (JVM), с упором на функциональное программирование, неизменяемые данные и простоту.

Откуда взялся Clojure

Язык создал Рич Хикки (Rich Hickey) и выпустил его в 2007 году. Хикки много лет писал коммерческий софт на Java и C++ и устал бороться с одной и той же проблемой: изменяемое состояние, которое разные части программы меняют непредсказуемо. Особенно больно это в многопоточных приложениях, где два потока правят один объект и получают гонки данных.

Clojure — его ответ на эту боль. Язык построен вокруг трёх идей: функциональность (функции — главный строительный блок), неизменяемость (структуры данных по умолчанию нельзя менять) и простота (простое — это то, что не переплетено с другим).

Почему именно Lisp и JVM

Clojure принадлежит к семейству Lisp — старейшему после Fortran семейству языков. У Lisp особый синтаксис: код записывается теми же скобочными структурами, что и данные. Это свойство называется гомоиконностью и даёт суперсилу — макросы, о которых мы поговорим в конце курса.

При этом Clojure не изобретает свою экосистему с нуля: он компилируется в байт-код JVM. Значит, вам доступны все библиотеки Java, зрелый сборщик мусора, JIT-компиляция и серверная инфраструктура, на которой держится половина корпоративного мира.

; Так выглядит код на Clojure: префиксная запись, всё в скобках
(println "Привет, Clojure!")

; Сложение 2 и 3 — оператор + стоит ПЕРЕД аргументами
(+ 2 3)

Вывод:

Привет, Clojure!
5

Где применяют Clojure

Clojure любят за надёжность и продуктивность. Типичные области:

  • Бэкенд и веб-сервисы — обработка запросов, API, микросервисы;
  • Обработка данных — ETL-конвейеры, аналитика, потоковая обработка;
  • Стартапы — маленькая команда может быстро строить и переделывать продукт;
  • ClojureScript — тот же язык компилируется в JavaScript для фронтенда.

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

Когда вы запускаете программу на Clojure, исходный код читается reader-ом и превращается в структуры данных (списки, символы, числа). Затем компилятор переводит эти структуры в байт-код JVM. То есть Clojure — компилируемый язык, но компиляция происходит на лету, что и даёт ощущение динамичности и живого REPL.

Сравнение с другими языками

ЯзыкЧто роднит с ClojureЧем отличается
Haskellчистота, неизменяемостьHaskell статически типизирован и ленив по умолчанию
ScalaJVM, функцииScala объединяет ООП и ФП, синтаксис не Lisp
Elixirнеизменяемость, акцент на данныеElixir на BEAM, не на JVM
Javaобщая JVM и библиотекиJava императивна, объекты изменяемы

Частые ошибки

  • «Это просто старый Lisp». Нет: Clojure — современный язык с богатой стандартной библиотекой и доступом ко всей экосистеме JVM.
  • «Скобки — это ужас». На практике редактор сам их балансирует, а единообразие синтаксиса упрощает чтение кода.
  • Путать Clojure с Common Lisp. Это разные языки: у Clojure свои структуры данных, неизменяемость по умолчанию и иной набор функций.

Итоги

  • Clojure — современный Lisp на JVM, созданный Ричем Хикки в 2007 году.
  • Три столпа: функциональность, неизменяемость, простота.
  • Гомоиконность даёт макросы; JVM даёт экосистему и производительность.
  • Применяется в бэкенде, обработке данных и (через ClojureScript) на фронтенде.
Проверьте себя
1. На какой платформе исполняется Clojure?
AНа собственной виртуальной машине Clojure
BНа JVM (виртуальной машине Java)
CНа BEAM (как Elixir)
DКомпилируется только в нативный код
2. Что означает «гомоиконность» Clojure?
AВсе функции возвращают одинаковый тип
BКод записывается теми же структурами данных, что и данные
CПрограмма состоит из одного файла
DЯзык не различает большие и маленькие буквы
3. Какие три идеи лежат в основе Clojure по замыслу Рича Хикки?
AСкорость, безопасность, типизация
BОбъекты, наследование, инкапсуляция
CФункциональность, неизменяемость, простота
DПараллелизм, GPU, многопоточность