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

14.09.2018     

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

См. также

Google добавит в Chrome режим приоритетной загрузки сайта по HTTPS

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

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

21.07.2021    656    VKuser24342747    0       

JetBrains назвала JavaScript и SQL самыми популярными языками в России

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

Компания JetBrains провела ежегодный опрос об экосистеме разработки в 2021 году. В нем приняли участие 31 743 разработчика из 183 стран, в том числе из Российской Федерации и СНГ.

21.07.2021    1008    VKuser24342747    2       

MongoDB с последней версией Atlas стал бессерверным

Новость СУБД ИТ-новость

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

20.07.2021    1338    SKravchenko    1       

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

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

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

20.07.2021    707    VKuser24342747    1       

Появился способ игнорировать запрет установки Windows 11 на слабые ПК

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

Новая Windows 11 не может быть установлена на компьютеры, которые не соответствуют системным требованиям, определенным разработчиками. Однако продвинутые пользователи нашли способ обойти это ограничение.

19.07.2021    754    VKuser24342747    0       

На свежих процессорах Intel создали микрокомпьютер под Windows 10

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

Энтузиасты и стартаперы полюбили Arduino и Raspberry Pi. Но инженеры Commate Computer (Commell) пошли дальше и представили миниатюрный ПК LE-37O на базе новейших чипов Intel Tiger Lake. И на нем можно запустить Windows 10.

16.07.2021    904    user1015646    3       

Вот это поворот: Microsoft выпустила дистрибутив Linux

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

Пока мир замер в ожидании новой Windows 11, Microsoft решила преподнести пользователям большой сюрприз – и представила собственный дистрибутив Linux, CBL-Mariner 1.0.

15.07.2021    1325    user1015646    2       

Стартовала программа возмещения затрат разработчикам на скидки для малого бизнеса

Новость Законодательство Импортозамещение ИТ-новость Облачные технологии

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

15.07.2021    612    ЕленаЧерепнева    0       

Исследователи установили: ИИ-программы для собеседований не понимают речь соискателя

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

Эксперты из Массачусетского технологического института (MIT) изучили приложения, анализирующие резюме кандидатов. Ученые пришли к выводу, что такой софт плохо справляется с задачами и дает неверные результаты.

14.07.2021    495    VKuser24342747    1       

Юбилейный индекс TIOBE на июль. Рейтинг отмечает 20-летие

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

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

12.07.2021    1028    SKravchenko    0       

Google сделает обязательной двухэтапную аутентификацию для аккаунтов разработчиков

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

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

08.07.2021    1007    VKuser24342747    1       

Google установил новый обязательный формат для Android-приложений

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

Компания Google объявила, что стандарт приложений Android App Bundle (AAB) станет обязательным в Play Store. Он заменит монолитный формат APK.

07.07.2021    1576    user1015646    0       

Токен исходного кода интернета продали с аукциона

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

NFT-токены – уникальные двойники цифровых произведений – становятся все популярнее: их стали предлагать на традиционных аукционах с вековой историей. На этот раз ушел с молотка токен исходного кода интернета – на Sotheby’s его продали за 5,43 млн долларов США.

06.07.2021    2198    user1015646    0       

Российский разработчик научил нейросеть генерировать голос Геральта из The Witcher 3

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

Программист под ником nikich340 создал модификацию A Night to Remember для игры The Witcher 3: Wild Hunt, в которую добавлены новые реплики главного героя, озвученные нейросетью. 

06.07.2021    1509    VKuser24342747    0       

Linux получил крупнейшее обновление с момента выпуска пятой версии

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

Представлен первый стабильный релиз ядра Linux 5.13. По словам Линуса Торвальдса, это один из самых значительных релизов 5.x. ОС получила возможность корректно работать на процессорах Apple M1 и Intel Alder Lake.

05.07.2021    1555    VKuser24342747    4       

Amazon запустил конкурс на поиск уязвимостей AWS BugBust

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

Компания Amazon объявила о новом челлендже по поиску уязвимостей в AWS. И это не традиционная баунти-программа: здесь куда больше геймификации и амбициозная цель – совместно избавиться от 1 миллиона багов.

05.07.2021    1578    user1015646    0       

ИИ-помощник для программистов от Microsoft сможет дописывать код

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

Microsoft и GitHub представили совместный проект Copilot («второй пилот») на базе технологий организации OpenAI. Ассистент способен анализировать код и предлагать варианты завершения строк в зависимости от контекста. 

05.07.2021    1784    VKuser24342747    2       

В России начнет работу единая статистическая платформа

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

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

02.07.2021    1103    VKuser24342747    0       

Обновление GitLab 14: представлены новые DevOps-инструменты в рамках единой платформы

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

Компания GitLab Inc. выпустила свежий релиз – теперь с интегрированной платформой DevOps-специалистов.

01.07.2021    1648    user1015646    0       

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

Новость Автоматизация ИТ-новость

«Базальт СПО», МЦСТ, «Байкал Электроникс», ЭОС и «МойОфис» представили многоместное автоматизированное рабочее место (АРМ). Для тестового запуска системы выбраны госучреждения Орла. 

01.07.2021    1131    VKuser24342747    1       

Новый доклад CompTIA: в Европе вырос спрос на технических специалистов

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

Согласно новому отчету CompTIA, одной из ведущих торговых ассоциаций ИТ-индустрии, спрос работодателей на технических работников в 10 европейских странах увеличился за первый квартал 2021 года. Работодатели разместили 900 тысяч объявлений о вакансиях.

01.07.2021    1524    SKravchenko    0       

Раскрыта неожиданная особенность Windows 11

Новость Windows

При установке Windows 11 на некоторые компьютеры могут возникнуть проблемы. Все дело в инструментах безопасности новой версии операционной системы.

30.06.2021    1297    user1015646    0       

Новый фреймворк Google защитит от встраивания вредоносного кода 

Новость Google

Компания Google представила новый фреймворк SLSA. Он защитит ПО от внедрения вредоносного кода в процессе разработки. 

29.06.2021    700    user1015646    0       

Работу чиновников ускорит отечественная система автоматизации

Новость Автоматизация Минкомсвязь

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

29.06.2021    800    VKuser24342747    0       

Google профинансирует добавление поддержки языка Rust в ядро Linux

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

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

28.06.2021    2942    SKravchenko    0