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

14.09.2018      197834

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 133 17.09.18 10:25 Сейчас в теме
Оставьте свое сообщение

См. также

«Сбер» начнет использовать российские TLS-сертификаты для платежного шлюза

Новость Безопасность ИТ-новость Минцифры

Банк запланировал переход на сертификаты, выпущенные Национальным удостоверяющим центром (НУЦ) Минцифры, на 30 января 2023 года. Клиентам необходимо добавить на свои серверы корневой сертификат ведомства.

вчера в 09:45    1239    VKuser24342747    0       

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

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

Гражданин имеет право отказаться от сбора и распространения своих биометрических данных. Отказ можно оформить в МФЦ только при личном присутствии.

24.01.2023    987    VKuser24342747    0       

Банки смогут получить право на передоверие полномочий по электронной подписи

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

Комитет Госдумы рекомендует принять соответствующий законопроект. Документ позволит компаниям финансового сектора использовать электронную подпись наравне с другими организациями.

20.01.2023    872    VKuser24342747    0       

«ВКонтакте» начал поддерживать получение уведомлений от Госуслуг

Новость Госуслуги ИТ-новость Мессенджеры Налоги

Оповещения с Единого портала госуслуг будут отображаться в Вконтакте и приложении «VK Мессенджер». Кроме того, стала доступна оплата штрафов ГИБДД прямо в VK.

19.01.2023    986    VKuser24342747    0       

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

Новость Законодательство ИТ-новость Минцифры

Проект постановления содержит требования к Цетробанку и госорганам, а также к сторонним организациям, которые будут привлекаться ведомствами в качестве операторов. Требования согласованы с ФСБ.

19.01.2023    905    VKuser24342747    0       

Утвержден профстандарт специалиста по информационной безопасности

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

Новый профстандарт вступит в силу 1 сентября 2023 года. А пока у работодателей в кредитно-финансовой сфере есть время проанализировать трудовой функционал специалистов по ИБ и при необходимости уточнить его.

17.01.2023    1564    user1816563    0       

Национальная система пространственных данных начала работу в России

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

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

12.01.2023    1753    VKuser24342747    0       

Госдума рассмотрит законопроект о цифровом рубле

Новость Законодательство ИТ-новость Цифровая экономика

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

11.01.2023    3570    VKuser24342747    2       

Оператором Единой биометрической системы стал «Центр Биометрических Технологий»

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

Ранее за работу платформы отвечал «Ростелеком». На «Центр Биометрических Технологий» возложены задачи по развитию в России цифровых технологий идентификации и аутентификации, в том числе на основе биометрических персональных данных.

22.12.2022    2417    VKuser24342747    2       

GitHub бесплатно проверит репозитории на наличие секретных токенов

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

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

22.12.2022    1781    VKuser24342747    1       

GitHub к концу 2023 года введет обязательную двухфакторную аутентификацию

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

Веб-хостинг потребует от всех пользователей, загружающих код, включить двухфакторную аутентификацию (2FA) для дополнительной защиты своих аккаунтов.

21.12.2022    2063    VKuser24342747    0       

Госдума рассмотрит законопроект о провайдере для госсайтов

Новость Государственные, бюджетные структуры Законодательство ИТ-новость

Документ предусматривает запрет на размещение государственных информационных ресурсов на хостингах, не включенных в специальный реестр. Сейчас около 20% ресурсов госорганов размещены на иностранных площадках.

20.12.2022    1675    VKuser24342747    1       

«Яндекс» открыл доступ к фреймворку Yatagan для сборки Android-приложений

Новость ИТ-новость Яндекс Разработка

Инструмент свободно распространяется через GitHub. Перед публикацией в открытом доступе фреймворк долгое время применялся во внутренних проектах компании. Решение основано на API Dagger.

16.12.2022    2504    VKuser24342747    1       

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

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

Программный комплекс будет создан на базе существующего отечественного решения Axiocat. Сейчас это приложение не внесено в Единый реестр российского ПО, хотя применяется некоторыми компаниями.

15.12.2022    1718    VKuser24342747    0       

Google рассказала о проблемах и преимуществах поддержки разработки на Rust в Android 13

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

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

14.12.2022    1806    VKuser24342747    0       

Банки обяжут принимать оплату по картам «Мир» с QR-кодом в смартфоне

Новость Банки ИТ-новость

Оператор платежной системы «Мир» разослал российским банкам документ с требованием обеспечить прием платежей по новой технологии. Первый этап внедрения завершится в апреле 2023 года.

14.12.2022    2006    VKuser24342747    1       

Госдума рассмотрит законопроект о создании Национального удостоверяющего центра

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

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

09.12.2022    1843    VKuser24342747    0       

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

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

Госдума в первом чтении одобрила законопроект, который продлевает переходный период для машиночитаемых доверенностей. Еще полгода организации смогут не применять МЧД при использовании электронных подписей.

08.12.2022    1940    VKuser24342747    0       

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

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

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

01.12.2022    2329    VKuser24342747    11       

Инспекторы смогут проводить дистанционные проверки через смартфон

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

Минэкономразвития представило мобильное приложение, которое позволит осуществлять надзорные мероприятия бизнеса без посещения офиса. Программа работает через Госуслуги.

28.11.2022    2279    VKuser24342747    0       

«Яндекс» представил бесплатный сервис для быстрого поиска в облаке

Новость ИТ-новость Облачные технологии

Сервис Managed Service for OpenSearch от платформы Yandex Cloud предназначен для оптимизации поисковых систем и проверки стабильности и безопасности работы приложений. Услуга доступа в режиме Public Preview.

24.11.2022    3058    VKuser24342747    1       

В декабре начнут действовать новые правила регистрации доменов .RU и .РФ

Новость ИТ-новость Роскомнадзор

С 12 декабря Роскомнадзор получит право прекращать делегирование домена, если он оформлен нелегально, или на сайте содержится запрещенная в России информация.

23.11.2022    2219    VKuser24342747    1       

Stack Overflow запустил проект для оффлайн-доступа к форуму

Новость ИТ-новость Разработка

Проект под названием Overflow Offline позволяет скачать актуальную версию архива вопросов и ответов по разработке ПО. По объему данных база форума уступает только «Википедии».

02.11.2022    2098    VKuser24342747    1       

Минцифры запустило магазин российского ПО из реестра ИТ-решений

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

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

21.10.2022    2474    VKuser24342747    4       

В ноябре начнется создание российского государственного аналога GitHub

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

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

19.10.2022    3390    VKuser24342747    14