Парадигма | мультипарадигма :
|
---|---|
Семья | Лисп |
Разработано | Рич Хикки |
Впервые появился | 2007 ( 2007 ) |
Стабильный релиз | 1.11.2 [8] / 8 марта 2024 г. ( 2024-03-08 ) |
Дисциплина набора текста | |
Управление памятью | Сборка мусора через хост ( JVM , CLR , среда выполнения JavaScript, такая как V8 в случае ClojureScript или BEAM (см. ниже) |
Платформа | |
Лицензия | Затмение Публичное |
Расширения имени файла |
|
Веб-сайт | clojure.org |
Диалекты | |
ClojureScript, ClojureDart | |
Под влиянием | |
Под влиянием | |
Clojure ( / ˈ k l oʊ ʒ ər / , как и замыкание ) [17] [18] — это динамический и функциональный диалект языка программирования Lisp на платформе Java . [19] [20]
Как и большинство других Lisp, синтаксис Clojure построен на S-выражениях , которые сначала разбираются на структуры данных считывателем Lisp перед компиляцией . [21] [17] Считыватель Clojure поддерживает литеральный синтаксис для карт , множеств и векторов , а также списков, и они компилируются в упомянутые структуры напрямую. [21] Clojure рассматривает код как данные и имеет систему макросов Lisp . [22] Clojure является Lisp-1 и не предназначен для совместимости с другими диалектами Lisp, поскольку он использует свой собственный набор структур данных, несовместимых с другими Lisp. [22]
Clojure выступает за неизменяемость и неизменяемые структуры данных и призывает программистов быть явными в управлении идентичностью и ее состояниями. [23] Этот акцент на программировании с неизменяемыми значениями и явными конструкциями прогрессии времени призван облегчить разработку более надежных, особенно параллельных , программ, которые являются простыми и быстрыми. [24] [25] [17] Хотя его система типов полностью динамическая , недавние попытки также были направлены на реализацию зависимой системы типов . [26]
Язык был создан Ричем Хики в середине 2000-х годов, изначально для платформы Java; с тех пор язык был портирован на другие платформы, такие как Common Language Runtime (.NET). Хики продолжает руководить разработкой языка как его благосклонный диктатор на всю жизнь .
Рич Хики — создатель языка Clojure. [19] До Clojure он разработал dotLisp
аналогичный проект на основе платформы .NET , [27] и три более ранних попытки обеспечить взаимодействие между Lisp и Java : интерфейс иностранного языка Java для Common Lisp ( jfli
), [28] Интерфейс внешних объектов для Lisp (FOIL), [29] и дружественный Lisp интерфейс для сервлетов Java (Lisplets). [30]
Хики провел около двух с половиной лет, работая над Clojure, прежде чем выпустить его публично в октябре 2007 года, [31] большую часть этого времени работая исключительно над Clojure без внешнего финансирования. В конце этого времени Хики отправил электронное письмо с анонсом языка нескольким друзьям в сообществе Common Lisp.
По словам Хики, название Clojure представляет собой игру слов , основанную на концепции программирования « замыкание », включающую буквы C, L и J, обозначающие C# , Lisp и Java соответственно — три языка, которые оказали большое влияние на дизайн Clojure. [18]
Рич Хики разработал Clojure, потому что он хотел современный Lisp для функционального программирования , симбиотический с устоявшейся платформой Java и разработанный для параллелизма . [24] [25] [32] [17] Он также подчеркивал важность простоты в проектировании языков программирования и архитектуре программного обеспечения, выступая за слабую связанность , полиморфизм через протоколы и классы типов вместо наследования , функции без состояния , которые находятся в пространстве имен вместо методов или замену синтаксиса данными . [33] [34] [35]
Подход Clojure к состоянию характеризуется концепцией идентичностей, [23] которые представлены как ряд неизменяемых состояний с течением времени. Поскольку состояния являются неизменяемыми значениями, любое количество рабочих процессов может работать с ними параллельно, и параллелизм становится вопросом управления изменениями из одного состояния в другое. Для этой цели Clojure предоставляет несколько изменяемых ссылочных типов , каждый из которых имеет четко определенную семантику для перехода между состояниями. [23]
Clojure работает на платформе Java и, как следствие, интегрируется с Java и полностью поддерживает вызов кода Java из Clojure, [36] [17] и код Clojure также может быть вызван из Java. [37] Сообщество использует такие инструменты, как интерфейс командной строки Clojure (CLI) [38] или Leiningen для автоматизации проектов, обеспечивая поддержку интеграции Maven . Эти инструменты управляют управлением пакетами проекта и зависимостями и настраиваются с использованием синтаксиса Clojure.
Как диалект Lisp, Clojure поддерживает функции как объекты первого класса , цикл read–eval–print (REPL) и систему макросов. [6] Система макросов Lisp Clojure очень похожа на систему Common Lisp , за исключением того, что версия обратной кавычки Clojure (называемая «синтаксической кавычкой») квалифицирует символы с их пространством имен . Это помогает предотвратить непреднамеренный захват имени, поскольку привязка к именам, квалифицированным пространством имен, запрещена. Можно принудительно расширить макрос захвата, но это должно быть сделано явно. Clojure не допускает определяемых пользователем макросов чтения, но читатель поддерживает более ограниченную форму синтаксического расширения. [39] Clojure поддерживает мультиметоды [40] и для абстракций, подобных интерфейсу , имеет основанный на протоколе [41] полиморфизм и систему типов данных с использованием записей [42] , обеспечивая высокопроизводительный и динамический полиморфизм, разработанный для избежания проблемы выражения .
Clojure поддерживает ленивые последовательности и поощряет принцип неизменяемости и постоянные структуры данных . Как функциональный язык , акцент делается на рекурсии и функциях высшего порядка вместо циклов на основе побочных эффектов. Автоматическая оптимизация хвостовых вызовов не поддерживается, поскольку JVM не поддерживает ее изначально; [43] [44] [45] это можно сделать явно, используя recur
ключевое слово . [46] Для параллельного и одновременного программирования Clojure предоставляет программную транзакционную память , [47] систему реактивных агентов , [1] и параллельное программирование на основе каналов . [48]
Clojure 1.7 представил условные операторы чтения, разрешив встраивание кода Clojure, ClojureScript и ClojureCLR в одно и то же пространство имен. [49] [21] Трансдьюсеры были добавлены как метод для составления преобразований. Трансдьюсеры позволяют функциям более высокого порядка, таким как map и fold , обобщать любые источники входных данных. В то время как традиционно эти функции работают с последовательностями , трансдьюсеры позволяют им работать с каналами и позволяют пользователю определять свои собственные модели для преобразования. [50] [51] [52]
Extensible Data Notation , или edn , [53] — это подмножество языка Clojure, предназначенное как формат передачи данных. Его можно использовать для сериализации и десериализации структур данных Clojure, а сам Clojure использует надмножество edn для представления программ.
edn используется аналогично JSON или XML , но имеет относительно большой список встроенных элементов, показанных здесь с примерами:
true
,false
"foo bar"
\c
,\tab
name
:key
123
3.14
(a b 42)
[a b 42]
{:a 1, "foo" :bar, [1 2 3] four}
#{a b [1 2 3]}
nil
( значение , подобное нулю )В дополнение к этим элементам он поддерживает расширяемость за счет использования тегов , которые состоят из символа #
, за которым следует символ. При обнаружении тега считыватель передает значение следующего элемента соответствующему обработчику, который возвращает значение данных. Например, это может быть помеченный элемент: #myapp/Person {:first "Fred" :last "Mertz"}
, интерпретация которого будет зависеть от соответствующего обработчика считывателя.
Такое определение элементов расширения с точки зрения других позволяет избежать необходимости полагаться на соглашения или контекст для передачи элементов, не включенных в базовый набор.
Основная платформа Clojure — Java , [20] [36], но существуют и другие целевые реализации. Наиболее заметными из них являются ClojureScript, [54] , который компилируется в ECMAScript 3, [55] и ClojureCLR, [56] полный порт на платформе .NET , совместимый с ее экосистемой.
Другие реализации Clojure на разных платформах включают:
Инструментарий для разработки Clojure значительно улучшился за эти годы. Ниже приведен список некоторых популярных IDE и текстовых редакторов с плагинами, которые добавляют поддержку программирования на Clojure: [69]
В дополнение к инструментам, предоставляемым сообществом, официальные инструменты интерфейса командной строки (CLI) Clojure [38] также стали доступны на Linux , macOS и Windows, начиная с Clojure 1.9. [83]
Процесс разработки ограничен основной командой Clojure, хотя проблемы видны публично на странице проекта Clojure JIRA . [84] Любой может задавать вопросы или отправлять проблемы и идеи на ask.clojure.org. [85] Если будет установлено, что новая проблема требует тикета JIRA, член основной команды рассмотрит ее и добавит. Проблемы JIRA обрабатываются командой скринеров и окончательно утверждаются Ричем Хики. [86] [87]
С постоянным интересом к функциональному программированию, принятие Clojure разработчиками программного обеспечения, использующими платформу Java, продолжало расти. Язык также был рекомендован разработчиками программного обеспечения, такими как Брайан Гетц, [88] [89] [90] Эрик Эванс, [91] [92] Джеймс Гослинг , [93] Пол Грэм , [94] и Роберт К. Мартин . [95] [96] [97] [98] ThoughtWorks , оценивая языки функционального программирования для своего Technology Radar, [99] описала Clojure как «простую, элегантную реализацию Lisp на JVM» в 2010 году и повысила его статус до «ADOPT» в 2012 году. [100]
В «JVM Ecosystem Report 2018» (который был заявлен как «крупнейший опрос разработчиков Java»), подготовленный совместно Snyk и Java Magazine, Clojure был назван вторым наиболее используемым языком программирования на JVM для «основных приложений». [101] Clojure используется в промышленности такими фирмами , как Apple , [103] [104] Atlassian , [105] Funding Circle , [106] Netflix , [107] Nubank , [108] Puppet , [109] и Walmart , [110] а также государственными учреждениями, такими как NASA . [111] Он также использовался для творческих вычислений, включая визуальное искусство, музыку, игры и поэзию. [112]
В выпуске Stack Overflow Developer Survey 2023 года Clojure был четвертым по популярности в категории языков программирования и сценариев, причем 68,51% респондентов, которые работали с ним в прошлом году, заявили, что хотели бы продолжать его использовать. Однако в желаемой категории его отметили как таковой только 2,2% опрошенных, тогда как JavaScript с наивысшей оценкой был желаем 40,15% разработчиков, участвовавших в опросе. [113]
Версия | Дата выпуска | Основные особенности, улучшения |
---|---|---|
17 октября 2007 г. [31] ( 2007-10-17 ) | Первоначальный публичный релиз | |
1.0 | 4 мая 2009 г. [114] ( 2009-05-04 ) | Первый стабильный релиз |
1.1 | 31 декабря 2009 г. [115] ( 2009-12-31 ) | Фьючерсы |
1.2 | 19 августа 2010 г. [116] ( 2010-08-19 ) | Протоколы |
1.3 | 23 сентября 2011 г. [117] ( 2011-09-23 ) | Расширенная поддержка примитивов |
1.4 | 15 апреля 2012 г. [118] ( 2012-04-15 ) | Читательские литералы |
1.5 | 1 марта 2013 г. [119] ( 2013-03-01 ) | Редукторы |
1.5.1 | 10 марта 2013 г. [120] ( 2013-03-10 ) | Устранение утечки памяти |
1.6 | 25 марта 2014 г. [121] ( 2014-03-25 ) | Java API, улучшенные алгоритмы хеширования |
1.7 | 30 июня 2015 г. [49] ( 2015-06-30 ) | Преобразователи, считыватели условных обозначений |
1.8 | 19 января 2016 г. [122] ( 2016-01-19 ) | Дополнительные строковые функции, прямое связывание, сокет-сервер |
1.9 | 8 декабря 2017 г. [123] ( 2017-12-08 ) | Интеграция со спецификацией, инструменты командной строки |
1.10 | 17 декабря 2018 г. [124] ( 2018-12-17 ) | Улучшенные отчеты об ошибках, совместимость с Java |
1.10.1 | 6 июня 2019 г. [125] ( 2019-06-06 ) | Обход снижения производительности Java и улучшение отчетов об ошибкахclojure.main |
1.10.2 | 26 января 2021 г. [126] ( 2021-01-26 ) | Улучшения взаимодействия/совместимости Java и другие важные исправления языка |
1.10.3 | 4 марта 2021 г. [127] ( 2021-03-04 ) | поддержка prepl для условных операторов чтения |
1.11.0 | 22 марта 2022 г. [128] ( 2022-03-22 ) | Новый синтаксис для вызова аргумента ключевого слова, новое clojure.math пространство имен, псевдоним пространства имен без загрузки и новые вспомогательные функции, добавленные вclojure.core |
1.11.1 | 5 апреля 2022 г. [129] ( 2022-04-05 ) | Откат непреднамеренных изменений в двоичной сериализации объектов типов clojure.lang.Keyword и clojure.lang.ArraySeq . |
Текущая стабильная версия: 1.11.2 | 8 марта 2024 г. [8] ( 2024-03-08 ) | Исправление уязвимости CVE-2024-22871 «Отказ в обслуживании» |
Легенда: Старая версия Старая версия, все еще поддерживается Последняя версия Последняя предварительная версия Будущий релиз |
1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LISP 1, 1.5, LISP 2 (заброшен) | |||||||||||||||
Маклисп | |||||||||||||||
Интерлисп | |||||||||||||||
молдавский лей | |||||||||||||||
Лисп-машина Лисп | |||||||||||||||
Схема | Р5РС | Р6РС | R7RS маленький | ||||||||||||
НОЛЬ | |||||||||||||||
ZIL (язык реализации Zork) | |||||||||||||||
Франц Лисп | |||||||||||||||
Общий Лисп | стандарт ANSI | ||||||||||||||
Ле Лисп | |||||||||||||||
Схема Массачусетского технологического института | |||||||||||||||
XLISP | |||||||||||||||
Т | |||||||||||||||
Chez Схема | |||||||||||||||
Emacs Лисп | |||||||||||||||
АвтоЛИСП | |||||||||||||||
ПикоЛисп | |||||||||||||||
Гамбит | |||||||||||||||
EuLisp | |||||||||||||||
ИСЛИСП | |||||||||||||||
OpenLisp | |||||||||||||||
Схема PLT | Ракетка | ||||||||||||||
новыйLISP | |||||||||||||||
GNU-хитрость | |||||||||||||||
Визуальный ЛИСП | |||||||||||||||
Кложур | |||||||||||||||
Дуга | |||||||||||||||
ЛФЭ | |||||||||||||||
Хай | |||||||||||||||
Хиалисп |