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

14.09.2018      168950

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 Сейчас в теме
2. Gureev 14.09.18 16:31 Сейчас в теме
3. dimisa 129 17.09.18 10:25 Сейчас в теме
Оставьте свое сообщение

См. также

Samsung разработала модуль биометрической аутентификации для смарт-карт

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

Samsung представила чип биометрической защиты, который может быть установлен в банковские карты. Разработка объединяет в себе различные элементы безопасности, ранее наносимые на саму карту.

вчера в 09:52    3237    VKuser24342747    0       

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

Новость Безопасность ИТ-новость Мобильные приложения Новости компаний

Apple в очередной раз перенесла сроки вступления в силу новых правил App Store. В них прописано новое требование для всех разработчиков: добавить в приложение возможность удалять аккаунт.

27.01.2022    3298    VKuser24342747    0       

Google назвала пять трендов машинного обучения в 2021 году

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

Google провела исследование, в котором озвучила ключевые направления развития индустрии машинного обучения (МО) в 2021 году. Компания ожидает в ближайшие годы научных прорывов в отрасли.

27.01.2022    3903    VKuser24342747    0       

Исходный код модели Facebook XLS-R выложили в интернет

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

Одна из самых мощных многоязычных моделей распознавания речи XLS-R теперь доступна всем разработчикам. Facebook опубликовала исходный код решения на GitHub и Hugging Face.

27.01.2022    3191    user1015646    0       

Компания OPPO подготовила концепцию устройств без аккумуляторов

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

Китайский производитель смартфонов OPPO опубликовал доклад, в котором представил идею зарядки IoT-устройств от сигналов мобильных телефонов, Bluetooth и сетей Wi-Fi.

26.01.2022    2540    VKuser24342747    2       

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

Новость ИТ-новость Минкомсвязь Цифровая экономика

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

24.01.2022    2308    VKuser24342747    0       

Visa разработала способ превратить почти любое устройство в POS-терминал

Новость ИТ-новость Новости компаний Онлайн-торговля

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

21.01.2022    1642    VKuser24342747    0       

Число патентов на нейросетевые технологии показало взрывной рост

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

Агрегатор патентных данных IFI Claims провел исследование рынка, что узнать: какие страны и компании наиболее активно регистрируют права на изобретения в области компьютерных систем, основанных на биологических моделях.

20.01.2022    1398    VKuser24342747    0       

Nvidia обновила программу для генерации пейзажей при помощи ИИ

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

Новая версия графического редактора Nvidia Canvas, создающего изображения по примитивному наброску, поддерживает высокое разрешение картинок и предлагает больше материалов.

19.01.2022    2323    VKuser24342747    0       

Производитель «Эльбрусов» раскритиковал отсрочку внедрения российских процессоров

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

Компания «МЦСТ», выпускающая российские процессоры «Эльбрус», опасается угрозы нацбезопасности после ввода балльной системы оценки для отечественной радиоэлектроники.

18.01.2022    2087    VKuser24342747    0       

Сводит олдскулы: культовую игру Prince of Persia перенесли в браузер

Новость

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

18.01.2022    1445    user1015646    1       

Минцифры намерено предустановить российские ОС на ноутбуки HP, Acer и Lenovo

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

Министерство цифрового развития начало переговоры с представителями компаний HP, Acer и Lenovo о возможности предустановки отечественных операционных систем на устройства производителей.

10.01.2022    6286    VKuser24342747    2       

OpenAI обучила нейросеть редактировать изображение по текстовому описанию

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

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

29.12.2021    8311    VKuser24342747    0       

Google посоветовала разработчикам адаптировать Android-приложения под Chrome OS

Новость ОС Android Google ИТ-новость

Google сообщила, что работает над крупным обновлением для Chrome OS, которое позволит более эффективно работать с Android-приложениями, поэтому разработчикам стоит задуматься над адаптацией своих программ.

28.12.2021    9863    VKuser24342747    0       

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

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

Microsoft представила новый инструмент на базе искусственного интеллекта. BugLab использует технологии глубокого обучения, чтобы находить баги в коде и давать советы по их исправлению.

24.12.2021    10486    user1015646    0       

Яндекс научил «Балабобу» генерировать новогодние открытки

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

Яндекс представил обновление для своего нейросетевого сервиса для создания текстов «Балабоба». Веб-приложение научилось генерировать именные поздравления с Новым годом и изображения к ним.

21.12.2021    12488    VKuser24342747    0       

В Windows можно будет запускать Android-игры

Новость Windows Google ИТ-новость Мобильные приложения Новости компаний

На выставке The Game Awards компания Google заявила, что Android-игры придут в Windows на десктопе уже в 2022 году.

20.12.2021    10377    user1015646    0       

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

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

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

17.12.2021    18359    VKuser24342747    0       

Лауреатов «Премии Рунета 2021» впервые определил искусственный интеллект

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

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

16.12.2021    26531    VKuser24342747    1       

МИД разработает систему на базе ИИ для анализа внешней политики

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

МИД России намерен в следующем году представить концептуальный проект системы на базе машинного обучения для анализа big data в отношении внешнеполитической деятельности.

16.12.2021    10513    VKuser24342747    0       

Компания Mozilla представила стабильную версию браузера Firefox 95

Новость Интернет ИТ-новость

В обновленном веб-обозревателе появилась продвинутая песочница для надежной защиты браузера. Кроме того, добавлена версия для Microsoft Store в Windows 11, улучшена производительность и скорость загрузки страниц.

15.12.2021    7616    VKuser24342747    0       

Россия догонит международный рынок квантовых технологий в 2030 году

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

Минцифры сообщило о планах сократить отставание страны от глобального рынка квантовых вычислений к 2025 году. Еще через пять лет Россия достигнет уровня других государств в этой отрасли.

14.12.2021    10955    VKuser24342747    4       

В России запустили аналог GitHub

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

Российские разработчики представили платформу для работы с Git-репозиториями – GitFlic. Это облачный сервис для совместного редактирования кода и контроля версий программных продуктов.

14.12.2021    22567    user1015646    4       

Разработчики ИИ получат 10 млрд рублей для создания ПО для бизнеса

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

Минэкономики представило проект, который позволяет компаниям, создающим программы на базе ИИ, интернета вещей и 5G, получить до 250 млн рублей на адаптацию софта под нужны крупного бизнеса.

10.12.2021    12205    VKuser24342747    3       

Российский ИИ проведет психоанализ по постам в социальных сетях

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

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

10.12.2021    10973    user1015646    2