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

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

14.09.2018      196500

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. Эти языки не пробились в мейнстрим, но доказали свою состоятельность. Вокруг них созданы сильные сообщества, однако в мире консервативных ИТ-компаний они не получили сильной популярности. Некоторые из них имеют очень хорошие шансы выйти в мейнстрим в ближайшие несколько лет, и это можно наблюдать по изменению их популярности в сторону увеличения.



Источник: https://infostart.ru/journal/news/tekhnologii/obzor-yazykov-programmirovaniya-clojure-realizatsiya-lisp-dlya-jvm_904140/
Автор:
Обозреватель


Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. s22 19 14.09.18 15:30 Сейчас в теме
2. Gureev 14.09.18 16:31 Сейчас в теме
3. dimisa 133 17.09.18 10:25 Сейчас в теме
Оставьте свое сообщение

См. также

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

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

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

01.12.2022    1087    VKuser24342747    11       

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

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

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

28.11.2022    1128    VKuser24342747    0       

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

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

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

24.11.2022    1393    VKuser24342747    1       

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

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

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

23.11.2022    1147    VKuser24342747    1       

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

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

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

02.11.2022    1147    VKuser24342747    1       

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

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

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

21.10.2022    1628    VKuser24342747    4       

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

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

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

19.10.2022    2368    VKuser24342747    14       

OpenAI опубликовала код системы распознавания речи Whisper

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

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

28.09.2022    2571    VKuser24342747    0       

Вторая версия среды разработки для плат Arduino вышла из бета-теста

Новость ИТ-новость Микроэлектроника

Arduino IDE 2.0 получила стабильную версию, в которой появилась поддержка автодополнения кода и темная тема. Разработка заняла несколько лет. Программа распространяется бесплатно.

23.09.2022    2638    VKuser24342747    0       

Основатель движения свободного ПО выпустил руководство по языку C

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

Ричард Мэттью Столлман, основатель Фонда свободного программного обеспечения, представил руководство по языку C и расширениям GNU. Пособие доступно всем желающим и предназначено как для опытных, так и начинающих программистов.

19.09.2022    2194    VKuser24342747    0       

«Ростелеком» предложил создать национальную экосистему на базе «Авроры»

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

Провайдер считает, что государственная мобильная экосистема поможет обеспечить технологическую независимость и экономический подъем страны. А ОС «Аврора» наиболее перспективная разработка для достижения этих целей.

15.09.2022    2151    VKuser24342747    5       

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

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

Фреймворк DivKit от Яндекса стал доступен как open source решение. Инструмент позволяет менять интерфейс приложений без скачивания обновлений и значительно ускоряет мобильную разработку.

02.09.2022    1817    VKuser24342747    0       

Группа компаний «Астра» представила собственную мобильную ОС

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

Доработанная ОС Astra Linux Special Edition может быть запущена на большом числе мобильных устройств, в том числе на планшетах и смартфонах с процессорами на архитектурах ARM, «Эльбрус» и x86-64.

25.08.2022    1496    VKuser24342747    1       

В России разработаны меры для решения проблемы нехватки ИТ-специалистов

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

Вице-премьер Дмитрий Чернышенко сообщил, что сейчас экономике страны не хватает 1 млн ИТ-специалистов. Способы преодоления дефицита закреплены в программе нацпроекта «Цифровая экономика»

05.08.2022    1652    VKuser24342747    11       

Яндекс открыл доступ к фреймворку для создания приложений с микросервисной архитектурой

Новость GitHub ИТ-новость Яндекс

Инструмент Userver опубликован как бесплатное open source решение. Яндекс уже несколько лет эффективно его использует в своих приложениях Go, «Еда», «Лавка», «Доставка» и другие. Фреймворк находится в стадии бета – переезда на открытую разработку.

02.08.2022    2500    VKuser24342747    19       

Бизнес сможет использовать повышающий коэффициент для расходов на покупку ПО

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

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

26.07.2022    2266    VKuser24342747    0       

Минэкономразвития тестирует миграцию с Windows 10 на Astra Linux

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

Министерство проводит эксперимент, в ходе которого сотрудники используют российскую ОС Astra Linux вместо Windows 10. По словам главы департамента, эксперимент проходит успешно.

11.07.2022    1825    VKuser24342747    0       

Вышла версия открытого текстового редактора Vim 9.0

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

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

07.07.2022    1995    VKuser24342747    0       

 «Яндекс» открыл доступ к SmartCaptcha и нейросети по генерации текстов 

Новость ИТ-новость Яндекс

Компания открыла доступ к алгоритму SmartCaptcha, который защищает сайт от спама и DDoS-атак, а также к проекту YaLM 100B, способному писать тексты на английском и русском языках. 

29.06.2022    2242    VKuser24342747    0       

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

Новость Кадровые агентства, подбор персонала ИТ-новость Яндекс

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

27.06.2022    2106    VKuser24342747    1       

GitHub открыл доступ всем разработчикам к ИИ-помощнику Copilot по подписке

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

Github Copilot стал общедоступным, но для его использования пользователю репозитория нужно приобрести подписку. Хотя некоторые разработчики могут пользоваться инструментом бесплатно.

24.06.2022    3798    VKuser24342747    1       

В России планируют учредить Федерацию спортивного программирования

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

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

21.06.2022    2755    VKuser24342747    6       

Microsoft окончательно прекратила поддержку Internet Explorer

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

Microsoft прекратила выпуск обновлений для своего браузера Internet Explorer, а с августа начнет удалять приложение из актуальных версий Windows. Эксперты полагают, что из-за этого пострадает много бизнес-пользователей.

17.06.2022    3250    VKuser24342747    4       

В России начал работу отечественный сервис мониторинга сбоев

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

Российская компания BrandAnalytics запустила платформу «Детектор сбоев», предназначенную для отслеживания работоспособности сайтов и сервисов, в том числе русскоязычных.

16.06.2022    2103    VKuser24342747    0       

Минцифры запустило систему отслеживания поддельных сайтов

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

Информационная система под названием «Антифишинг» способна обнаруживать мошеннические веб-ресурсы, которые выглядят как официальные сайты госорганов, компаний и соцсетей.

14.06.2022    2949    VKuser24342747    0