Что такое 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 статически типизирован и ленив по умолчанию |
| Scala | JVM, функции | Scala объединяет ООП и ФП, синтаксис не Lisp |
| Elixir | неизменяемость, акцент на данные | Elixir на BEAM, не на JVM |
| Java | общая JVM и библиотеки | Java императивна, объекты изменяемы |
Частые ошибки
- «Это просто старый Lisp». Нет: Clojure — современный язык с богатой стандартной библиотекой и доступом ко всей экосистеме JVM.
- «Скобки — это ужас». На практике редактор сам их балансирует, а единообразие синтаксиса упрощает чтение кода.
- Путать Clojure с Common Lisp. Это разные языки: у Clojure свои структуры данных, неизменяемость по умолчанию и иной набор функций.
Итоги
- Clojure — современный Lisp на JVM, созданный Ричем Хикки в 2007 году.
- Три столпа: функциональность, неизменяемость, простота.
- Гомоиконность даёт макросы; JVM даёт экосистему и производительность.
- Применяется в бэкенде, обработке данных и (через ClojureScript) на фронтенде.