Обзор языков программирования: Clojure – реализация Lisp для JVM

14.09.2018      208226

RedMonk опубликовал рейтинг языков программирования за 2018 год. Clojure, современный диалект языка программирования Lisp, оказался на 21 месте. Разбираемся, заслуженно ли для него определили эту позицию, и есть ли у Clojure перспективы к развитию. 

Название этого языка созвучно слову «closure» – «замыкание». Изначально понятие замыкания происходит из абстрактной математики, где оно обозначает множества, замкнутые на самих себя. В функциональных языках «замыкание» обозначает свойство функций ссылаться на контекст функции, ее породившей, даже если родительская функция уже давно отработала. По силе значения это понятие можно сравнить с понятием «инкапсуляция» в объектно-ориентированных языках (ОО). 

История создания

В 2007 году разработчик Рич Хики представил первую публичную версию языка друзьям из сообщества Common Lisp. Дальнейшую популярность язык приобретал через открытые сообщества в интернете, а также с помощью статей выступлений самого Хики.

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

«Имя должно было быть уникальным. Я хотел включить в имя C (C#), L (Lisp) и J (Java). Как только я придумал Clojure, с учетом того, что это каламбур на «closure», что есть доступный домен и огромное пустое google-пространство, то это и было простое решение», – пояснил выбор названия для языка программирования разработчик.

Функциональность Clojure

Требования к увеличению производительности диктуют необходимость использовать параллельные вычисления, чтобы они взаимодействовали друг с другом и работали одновременно. Существующие ОО языки плохо приспособлены к распараллеливанию задач. В них существует большой объем зависимостей объектов и их состояний, которые порождают системы с плохо прогнозируемым поведением при параллельных взаимодействиях. Решения, основанные на блокировках и светофорах, не сильно упрощают реализацию задачи – фундаментальная проблема зависимости состояния системы от последовательностей взаимодействия объектов остается.

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

Язык Clojure не полностью чистый, в нем есть поддержка функций с побочным эффектом. Это функции ввода/вывода, побочный эффект в них – их предназначение. Однако такие функции не имеют своего состояния и служат для взаимодействия с внешним миром. 

Почему Lisp

Прежде всего Lisp – функциональный язык. В нем максимально простой изначальный синтаксис, для которого требуется маленькое ядро языка. Реализация макросов – инструкций, которые сообщают программе, какие действия следует выполнить, чтобы достичь определенной цели – и абстрактный синтаксис делают этот язык невероятно мощным.

Для Lisp разработано два основных диалекта: Scheme и Common Lisp. Первый разрабатывался с целью получения компактного языка вычислений, а второй – стандартизации максимального количества возможностей, реализованных в различных диалектах Lisp, используемых для исследований. Ни тот, ни другой не получили широкого распространения как языки промышленного использования, но их для этого и не создавали.

В отличии от других диалектов Lisp в языке Clojure синтаксис изменен незначительно. Небольшая оптимизация синтаксиса позволила сократить использование группирующих скобок (наличие большого количества скобок своего рода фирменный признак языка Lisp), в некоторых случаях стало возможным заменять пробелы запятыми и обозначать ассоциативные массивы фигурными скобками, векторы – квадратными.

В Clojure исключили возможность изменения макросов чтения, переменные изначально поддерживаются неизменяемыми, расширили возможности работы с последовательностями, включая поддержку «ленивых» и бесконечных последовательностей, реализовали технология Software Transaction Memory (STM) работы c разделяемыми данными в параллельном исполнении.

Почему Java

Язык Java изначально создавался для промышленных приложений широкого применения. Традиционно для языка создается отдельная платформа, но Clojure реализовали  для уже существующей платформы JVM, что гарантировало меньшие вложения сил и средств в развитие библиотек кода. К моменту создания Clojure JVM существовала более 10 лет, и к ней было написано большое количество широко используемых фреймворков, зарекомендовавших себя в многочисленных промышленных решениях.

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

 

Операция

Java

Clojure

Создание экземпляра класса

new ClassName(arg1, arg2, …)

 

(ClassName.arg1 arg2 …)

 

Вызов метода экземпляра объекта

object.methodName(arg1, arg2 …)

(.methodName object arg1 arg2 …)

Запись значения 5 в поле экземпляра объекта

object.fieldName = 5

(set! (.fieldName object) 5)

 

Следующий пример демонстрирует тесную связь типов Clojure и Java:

user=> (class true)
java.lang.Boolean
user=> (class (= 1 1))
java.lang.Boolean

Отличия от других языков

Из всех языков на платформе JVM именно Clojure особенно отличается по синтаксису и может сойти за чужеродный механизм в среде Java. Однако общая система типов, бесшовная возможность вызова кода на Java и наоборот, говорит об общей универсальности платформы. В то же время на той же платформе реализованы концепции языка, которых нет в Java: последовательности («ленивые», бесконечные), оптимизация рекурсии, транзакционная память и гомоиконность. Последние две особо выделяют Clojure от всех остальных языков.

Транзакционная память

Развитие многоядерных процессоров открывает широкие возможности использования параллельного исполнения программ. Однако совместный доступ к данным сильно усложняет разработку таких систем. В императивных языках обычно проблему совместного доступа решают использованием механизма блокировок – это так называемый, пессимистичный подход к управлению данными. Проблема блокировок в том, что их использование требует одинаковой последовательности наложения из параллельных потоков исполнения. Несоблюдение этого условия приводит к взаимоблокировкам. 

Альтернативным решением работы с данными может быть использование транзакционной памяти. В этом подходе блокировки не используются, однако существует механизм отслеживания коллизий. В случае возникновения попытки изменить данные из разных потоков, транзакция отменяется и перезапускается снова. У такого решения есть ограничение: исполнение программ в транзакции должно быть полностью обратимым, у функций исполнения не должно быть побочных эффектов. Чистые функции, позволяют перезапустить процесс без последствий столько раз, сколько потребуется, пока до конца транзакции не произойдет ни одного параллельного изменения. Это так называемый оптимистичный подход, используемый в функциональных языках. 

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

Гомоиконность или код как данные

Другой отличительной особенностью языка является его свойство гомоиконности, когда код языка соответствует результату дерева синтаксического разбора. Это свойство вместе с возможностями использования макросов позволяет эффективно использовать описания синтаксических конструкций, отличных от изначально поддерживаемых. Фактически язык органично поддерживает расширение своего синтаксиса или позволяет строить внутренний DSL (Domain-Specific Language).

Определение собственного DSL можно рассмотреть на примере вычисления выражения:

(x + y) * (a / b)

В соответствии с нотацией Lisp это выражение необходимо преобразовать как

(* (+ x y)
  (/ a b))

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

(expr (x + y) * (a / b))

, тогда макрос будет такой:

(expr (x + y) * (a / b))

В данном макросе просто меняется порядок термов из инфиксного в префиксный (польская запись).

Введя выражение с использованием макроса exprв REPL, мы получим:

(expr 2 + 2)
>>> 4
(expr 2 / 2)
>>> 1

Перспективы развития языка

Если посмотреть статистику за последние несколько лет, то популярность Clojure не меняется. Однако язык не стоит на месте, например, в 2011 году Рич Хик представил новую реализацию языка ClojureScript. Она отличается от предшественника, что  обусловлено значительными различиями между средами выполнения JVM и JavaScript, а также тем, что в последнем случае компилятор не создает байт-код для виртуальной машины, а генерирует непосредственно код на JavaScript. Последнее позволяет писать на языке код, способный выполняться всеми современными веб-браузерами, а также другими средами выполнения, поддерживающие JavaScript.         

На сегодня у Clojure есть уже несколько реализаций: Clojure, ClojureScript, ClojureCLR, Clojureна LLVM, Clojure на Android,Clojure на iOS.      

Языки массового применения условно можно разделить на группы. Языки первой группы – те, на которых с большим отрывом создается наибольшее количество программ. Это так называемые мейнстримные языки: Java, JavaScript, Python, Ruby, PHP, C#, C++ и Objective-C. Несмотря на то, что некоторые из них уже теряют былую популярность, знание одного из них может гарантировать специалисту быстрый поиск работы.                 

Ко второй группе можно отнести такие языки как Scala, Go, Swift, Haskel и Clojure. Эти языки не пробились в мейнстрим, но доказали свою состоятельность. Вокруг них созданы сильные сообщества, однако в мире консервативных ИТ-компаний они не получили сильной популярности. Некоторые из них имеют очень хорошие шансы выйти в мейнстрим в ближайшие несколько лет, и это можно наблюдать по изменению их популярности в сторону увеличения.


Автор:
Обозреватель


Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. s22 19 14.09.18 15:30 Сейчас в теме
Давайте уж OZ или Agda
2. Gureev 14.09.18 16:31 Сейчас в теме
Я знал!!
dimisa; user997184; +2 Ответить
3. dimisa 135 17.09.18 10:25 Сейчас в теме
(2)Ты знал !!! ;))))
Оставьте свое сообщение

См. также

В программу подготовки спортивных программистов вошли бег и скорость печати

Новость ИТ-Новость

Пятничное: в России вступил в силу стандарт подготовки по дисциплине «спортивное программирование». В стандарт вошли требования к физическим показателям спортсменов и скорости набора текста.

16.02.2024    643    VKuser24342747    2       

1

Росстандарт утвердил протокол LoRaWAN для интернета вещей

Новость ИТ-Новость

Федеральное агентство по техническому регулированию и метрологии (Росстандарт) утвердило национальный стандарт протокола LoRaWAN RU, таким образом он получил официальный статус. Технология используется для беспроводной передачи данных между устройствами интернета вещей.

19.01.2024    427    VKuser24342747    0       

2

Новый закон откладывает на год вступление в силу изменений в порядок регистрации на сайтах

Новость Законодательство ИТ-Новость

12 декабря вступил в силу Федеральный закон, меняющий срок, к которому все владельцы сайтов должны внести изменения в порядок авторизации пользователей на сайте. Закон вводит переходный период до 1 января 2025 года.

20.12.2023    607    VKuser24342747    2       

1

Вышло крупное обновление для Android Studio

Новость Мобильные приложения ИТ-Новость

Новая версия Android Studio под номером 2023.1 получила имя Hedgehog. Появились возможности контролировать производительность приложений и управлять подключенными устройствами.

07.12.2023    719    VKuser24342747    2       

3

GitHub опубликовал результаты ежегодного исследования проектов с открытым исходным кодом

Новость GitHub ИТ-Новость

GitHub собрал данные об Open Source проектах в рамках ежегодного исследования Octoverse. Компания изучила географию репозиториев, используемые языки программирования и нейросети, а также активность сообщества.

15.11.2023    487    VKuser24342747    1       

2

Некоммерческие проекты смогут получить бесплатный доступ к GigaChat API

Новость ИТ-компания ИТ-Новость

Компания «Сбер» заявила, что будет бесплатно предоставлять доступ к API нейросети для генерации текста GigaChat для некоммерческих проектов. Однако для них будет ограничено число доступных токенов.

01.11.2023    602    VKuser24342747    2       

3

Состоялся релиз свободной среды разработки Geany 2.0

Новость ИТ-Новость Программист

Вышла новая версия Geany 2.0. Обновление затронуло внешний вид программы, расширило поддержку файлов и сторонних проектов, добавило новые способы работы с кодом.

25.10.2023    691    VKuser24342747    0       

1

Минцифры подготовило критерии по выбору оператора реестра провайдеров хостинга

Новость Минцифры ИТ-Новость Роскомнадзор

Минцифры подготовило проект постановления, которое утверждает требования к организации, претендующей на статус оператора реестра провайдеров хостинга.

25.10.2023    357    VKuser24342747    0       

1

Минцифры составило алгоритм действий для компаний, у которых не работает VPN

Новость Минцифры ИТ-Новость

Минцифры подготовило разъяснения для российских организаций, у которых возникли перебои в работе VPN-сервисов для клиентов и сотрудников из-за блокировки запрещенных ресурсов Роскомнадзором.

24.10.2023    612    VKuser24342747    0       

0

«Сбер» объявила о доступности SberLinux OS Server для российских компаний

Новость Импортозамещение ИТ-Новость

«СберТех», дочерняя компания «Сбера», объявила о предоставлении доступа к собственной серверной операционной системе SberLinux OS Server российским компаниям. ОС включена в реестр отечественного ПО.

20.10.2023    829    VKuser24342747    0       

2

Минцифры внесло изменения в проект правил идентификации клиентов веб-хостингов

Новость Минцифры ИТ-Новость Роскомнадзор

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

18.10.2023    456    VKuser24342747    0       

1

Google выпустила финальную версию Android 14

Новость Android Google ИТ-Новость

Google выпустила новую версию мобильной ОС Android 14. Изменения затронули настройки внешнего вида и безопасности. Были расширены возможности камеры и инструментов для хранения данных.

12.10.2023    672    VKuser24342747    0       

1

Яндекс объявил об открытии исходного кода DataLens

Новость Аналитика ИТ-Новость Яндекс

BI-система Yandex DataLens теперь развивается в опенсорс. Код продукта выложен для всех на GitHub. Любой желающий сможет развернуть DataLens на своем железе и доработать его под свои сценарии применения.

03.10.2023    1370    ЕленаЧерепнева    1       

6

Роскомнадзор создаст реестр хостинг-провайдеров

Новость Минцифры ИТ-Новость Роскомнадзор

Минцифры подготовило несколько проектов постановлений, которые утверждают правила ведения реестра поставщиков хостинг-услуг, а также новые требования к провайдерам.

02.10.2023    561    VKuser24342747    0       

1

«СберТех» представил репозиторий GitVerse с ИИ-помощником для написания кода

Новость Импортозамещение ИТ-Новость Программист

«СберТех» начал прием заявок на тестирование веб-сервиса для публикации ИТ-проектов GitVerse. Платформа подходит для разработки программ с открытым и закрытым кодом.

26.09.2023    767    VKuser24342747    2       

1

ИП и юрлица смогут использовать смартфон для создания и замены электронной подписи

Новость ИТ-Новость ФНС Цифровая подпись

ФНС внесла изменения в правила оформления электронной подписи руководителя организации и ИП. Станет возможным продлевать ее и записывать при помощи мобильного устройства.

18.09.2023    415    VKuser24342747    1       

1

Журнал IEEE Spectrum опубликовал рейтинг популярности языков программирования

Новость ИТ-Новость Языки программирования

Журнал Института инженеров электротехники и электроники IEEE Spectrum подготовил рейтинг самых популярных языков программирования в 2023 году. Статистика разделена на три категории.

01.09.2023    1262    VKuser24342747    4       

2

В бета-версии Microsoft 365 появилась поддержка языка Python для Excel

Новость ИТ-Новость Языки программирования

С помощью библиотек и средств визуализации Python можно будет манипулировать данными Excel, а затем использовать полученные результаты в формулах, диаграммах и сводных таблицах.

28.08.2023    643    VKuser24342747    0       

2

Специалисты Калифорнийского университета установили, что боты справляются с CAPTCHA лучше, чем люди

Новость ИТ-Новость

Международная группа исследователей изучила эффективность тестов CAPTCHA. Ученые пришли к выводу, что технология больше мешает людям, потому что боты научились с ней справляться.

24.08.2023    1141    VKuser24342747    23       

2

Google Chrome начнет поддерживать квантово-устойчивые алгоритмы шифрования

Новость Google Безопасность ИТ-Новость

В версии Google Chrome 116 появится поддержка алгоритмов шифрования, устойчивых к попыткам дешифрации при помощи квантовых вычислений. Технология объединяет преимущества классической и инновационной криптографии.

24.08.2023    466    VKuser24342747    0       

1

В реестр российского ПО включен первый комплекс обработки больших данных

Новость Импортозамещение Минцифры ИТ-Новость Реестр ПО

Минцифры внесло в реестр отечественного ПО программно-аппаратный комплекс «Скала-Р», предназначенный для обработки больших данных. Это первый комплекс с таким функционалом, включенный в перечень.

22.08.2023    452    VKuser24342747    0       

1

Microsoft внедрила новые функции в GitHub Copilot и анонсировала Windows Copilot

Новость GitHub Искусственный интеллект

ИИ-помощник для разработчиков GitHub Copilot теперь не только в реальном времени анализирует код, предлагает варианты для его улучшения и помогает найти решение проблем в разработке, но и  показывает ссылки на репозитории, из которых взят код. 

17.08.2023    1138    VKuser24342747    0       

1

В JetBrains разработали ИИ-помощника для аналитиков данных

Новость Аналитика Искусственный интеллект

JetBrains представила нейросеть Ask AI для онлайн-блокнота Datalore. Виртуальный ассистент способен генерировать код на нескольких языках, предлагать доработки и упрощать процесс аналитики данных. 

16.08.2023    651    VKuser24342747    0       

1

Исследование: ChatGPT дает неправильный ответ на половину вопросов о программировании

Новость Искусственный интеллект ИТ-Новость

Чат-бот OpenAI ошибается в 52% случаев, когда отвечает на вопросы по программированию. Однако делает это так убедительно, что пользователи не замечают ошибки. 

14.08.2023    988    VKuser24342747    5       

3

Минцифры проведет эксперимент по цифровизации «жизненного цикла» госслужащего

Новость Минцифры ИТ-Новость

Минцифры подготовило постановление о проведении эксперимента по внедрению ИТ в управление «жизненным циклом» госслужащего. Ведомство намерено автоматизировать все этапы работы сотрудников госструктур.

04.08.2023    548    VKuser24342747    0       

2