Elixir (язык программирования)
Класс языка: |
мультипарадигмальный: функциональный, параллельный, распределённый, процессо-ориентированный |
---|---|
Появился в: |
2012 |
Выпуск: |
1.3.2 / 15 июля 2016[1] |
Система типов: | |
Испытал влияние: | |
Лицензия: | |
Сайт: |
[elixir-lang.org lang.org] |
Платформа: |
Elixir — функциональный, распределённый, язык программирования общего назначения, который работает на виртуальной машине Erlang (BEAM). Elixir построен поверх Erlang, что обеспечивает распределённость, отказоустойчивость, исполнение в режиме мягкого реального времени, метапрограммирование с макросами и полиморфизмом, реализованным через протоколы[3]. Elixir использует Erlang/OTP для работы с деревьями процессов[4].
Содержание
История
Elixir был создан Хосе Валимом (José Valim), ранее являвшимся одним из основных разработчиков фреймворка Ruby on Rails и сооснователем компании Plataformatec[5][6]. Его целью было включить более высокую расширяемость и производительность в Erlang VM, сохраняя совместимость с инструментами и экосистемой Erlang[7].
Возможности
- Компилируется в байт-код для виртуальной машины Erlang (BEAM)[8]
- Каждый элемент является выражением[8]
- Функции языка Erlang могут быть вызваны без влияния на время исполнения из-за компиляции байт-кода в Erlang и наоборот
- Метапрограммирование дает возможность прямого манипулирования абстрактным синтаксическим деревом (АБС)[8]
- Полиморфизм, реализованный через механизм протоколов. Как и в Clojure, протоколы обеспечивают механизм диспетчеризации (не стоит путать с множественной диспетчеризацией)
- Поддержка документации в стиле строк-документации из языка Python (Markdown)[8]
- Параллельное программирование без разделения ресурсов, через передачу сообщений (модель акторов)[9]
- Акцентирование на рекурсии и функциях высшего порядка вместо зацикливания, основанного на побочных эффектах
- Простой параллелизм с использованием механизмов Erlang с упрощенным синтаксисом (например, Task)[8]
- Ленивые и асинхронные коллекции с потоками
- Сопоставление с образцом[8]
- Поддержка Unicode и UTF-8 строк
Описание языка
Типы данных
На низком уровне Elixir использует примитивные типы, доступные в виртуальной машине Erlang. Так, список — всего лишь упорядоченный набор значений. Кроме того, соответствующие модули и синтаксический сахар позволяют использовать более высокоуровневые абстракции. Например, тип Keyword является модулем Elixir, а его реализация основана на списке кортежей, и, естественно, со значениями типа Keyword можно работать и как со списками[10].
Elixir имеет следующие встроенные типы данных (см. также типы данных Erlang)[11]:
- Целые произвольной разрядности
- Числа с плавающей запятой
- Атомы
- Интервальные типы (англ. ranges)
- Регулярные выражения
- Идентификаторы процессов (PID) и портов
- Ссылки
- Кортежи
- Списки
- Отображения (англ. maps)
- Бинарные данные (англ. binaries)
- Функции
На основе этих примитивных типов в Elixir в частности построены строки и структуры[11].
Сравнение с Erlang
Elixir был задуман как улучшение Erlang, в частности, значительного упрощения синтаксиса. Одним из основных отличий является возможность повторного присваивания значений переменных. В Elixir не требуется завершать каждую команду точкой (по примеру Пролога), так как выражения разделяются переводом строки и точкой с запятой (;). В Elixir не требуется экспортировать функции модуля, тогда как в Erlang по умолчанию все функции недоступны из других модулей, если не упомянуты в директиве -export
. Тем самым, синтаксис Elixir больше похож на синтаксис Ruby[6].
Примеры
Следующие примеры могут быть запущены в оболочке iex или могут быть сохранены в файл и запущены с помощью команды elixir <filename>
.
Пример классической программы Hello world:
IO.puts "Hello World!"
Создание нового списка (List) на основе существующего с помощью свёртки:
for n <- [1,2,3,4,5], rem(n,2) == 1, do: n*n
#=> [1, 9, 25]
Сопоставление с образцом:
[1, a] = [1, 2]
# a = 2
{:ok, [hello: a]} = {:ok, [hello: "world"]}
# a = "world"
Модули:
defmodule Fun do
def fib(0), do: 0
def fib(1), do: 1
def fib(n) do
fib(n-2) + fib(n-1)
end
end
Внутреннее представление кода:
quote do: (k = 1; k + 2) # в результате даёт
{:__block__, [],
[{:=, [], [{:k, [], Elixir}, 1]},
{:+, [context: Elixir, import: Kernel], [{:k, [], Elixir}, 2]}]}
Инструментарий
Для работы с проектами на Elixir: создания новых, управления зависимостями, компиляции, тестирования, запуска на выполнение — имеется утилита автоматизации (англ. build tool) под названием Mix. Например, команда mix new myproject создаёт новый проект по шаблону, в результате чего появляется каталог проекта (версия Mix 1.1.1)[12]:
myproject/
├── config
│ └── config.exs
├── .gitignore
├── lib
│ └── myproject.ex
├── mix.exs
├── README.md
└── test
├── myproject_test.exs
└── test_helper.exs
Где config содержит конфигурацию приложения, lib — исходный код, tests — тесты, mix.exs — конфигурацию проекта.
Напишите отзыв о статье "Elixir (язык программирования)"
Примечания
- ↑ [github.com/elixir-lang/elixir/blob/v1.3/CHANGELOG.md elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir · GitHub]
- ↑ [github.com/elixir-lang/elixir/blob/master/LICENSE elixir/LICENSE at master · elixir-lang/elixir · GitHub]
- ↑ [elixir-lang.org Elixir]. José Valim. Проверено 17 февраля 2013.
- ↑ Thomas, 2014, When Processes Die.
- ↑ [rubyonrails.org/core/ The core team]
- ↑ 1 2 Mihalis Tsoukalos, «Elxir: Take a functional swig», Linux Format, issue 203, 2015
- ↑ [vimeo.com/53221562 Elixir - A modern approach to programming for the Erlang VM]. Проверено 17 февраля 2013.
- ↑ 1 2 3 4 5 6 [elixir-lang.org/ Elixir]. Проверено 7 сентября 2014.
- ↑ [leanpub.com/erlangandelixirforimperativeprogrammers Erlang and Elixir for Imperative Programmers]. — "Chapter 16: Code Structuring Concepts", section title "Actor Model": Leanpub.
- ↑ Thomas, 2014, An Aside—What Are Types?.
- ↑ 1 2 Thomas, 2014, Built-in Types.
- ↑ Thomas, 2014.
Литература
- Dave Thomas. Programming Elixir. — Pragmatic Bookshelf, 2014. — 280 p. — ISBN 978-1-937785-58-1.
- Paulo A. Pereira. Elixir Cookbook. — Packt Publishing, 2015. — 236 p. — ISBN 978-1-78439-751-7.
- Simon St. Laurent, J. David Eisenberg. Introducing Elixir. — O'Reilly Media, Inc., 2014. — 210 p. — ISBN 978-1-4493-6999-6.
- Chris McCord. Metaprogramming Elixir. — Pragmatic Bookshelf, 2015. — 120 p. — ISBN 978-1-68050-041-7.
- Saša Jurić. Elixir in Action. — Manning Publications, 2015. — 376 p. — ISBN 978-1-61729-201-9.
- Bruce A. Tate, Ian Dees, Frederic Daoud, Jack Moffitt. Elixir // Seven More Languages in Seven Weeks. — Pragmatic Bookshelf, 2014. — 350 p. — ISBN 978-1-941222-15-7.
Ссылки
- [elixir-lang.org Официальный сайт]
- [github.com/elixir-lang/elixir/ Исходный код на GitHub]
- [vimeo.com/53221562 Elixir — A modern approach to programming for the Erlang VM video presentation]
- [joearms.github.io/2013/05/31/a-week-with-elixir.html Joe Armstrong: «A Week with Elixir» (blog entry)]
- [elixir-lang.org/crash-course.html Erlang/Elixir Syntax: A Crash Course] (сравнение синтаксисов Elixir и Erlang на примерах)
Отрывок, характеризующий Elixir (язык программирования)
– Бог милостив, голубка. – Няня зажгла перед киотом обвитые золотом свечи и с чулком села у двери. Княжна Марья взяла книгу и стала читать. Только когда слышались шаги или голоса, княжна испуганно, вопросительно, а няня успокоительно смотрели друг на друга. Во всех концах дома было разлито и владело всеми то же чувство, которое испытывала княжна Марья, сидя в своей комнате. По поверью, что чем меньше людей знает о страданиях родильницы, тем меньше она страдает, все старались притвориться незнающими; никто не говорил об этом, но во всех людях, кроме обычной степенности и почтительности хороших манер, царствовавших в доме князя, видна была одна какая то общая забота, смягченность сердца и сознание чего то великого, непостижимого, совершающегося в эту минуту.В большой девичьей не слышно было смеха. В официантской все люди сидели и молчали, на готове чего то. На дворне жгли лучины и свечи и не спали. Старый князь, ступая на пятку, ходил по кабинету и послал Тихона к Марье Богдановне спросить: что? – Только скажи: князь приказал спросить что? и приди скажи, что она скажет.
– Доложи князю, что роды начались, – сказала Марья Богдановна, значительно посмотрев на посланного. Тихон пошел и доложил князю.
– Хорошо, – сказал князь, затворяя за собою дверь, и Тихон не слыхал более ни малейшего звука в кабинете. Немного погодя, Тихон вошел в кабинет, как будто для того, чтобы поправить свечи. Увидав, что князь лежал на диване, Тихон посмотрел на князя, на его расстроенное лицо, покачал головой, молча приблизился к нему и, поцеловав его в плечо, вышел, не поправив свечей и не сказав, зачем он приходил. Таинство торжественнейшее в мире продолжало совершаться. Прошел вечер, наступила ночь. И чувство ожидания и смягчения сердечного перед непостижимым не падало, а возвышалось. Никто не спал.
Была одна из тех мартовских ночей, когда зима как будто хочет взять свое и высыпает с отчаянной злобой свои последние снега и бураны. Навстречу немца доктора из Москвы, которого ждали каждую минуту и за которым была выслана подстава на большую дорогу, к повороту на проселок, были высланы верховые с фонарями, чтобы проводить его по ухабам и зажорам.
Княжна Марья уже давно оставила книгу: она сидела молча, устремив лучистые глаза на сморщенное, до малейших подробностей знакомое, лицо няни: на прядку седых волос, выбившуюся из под платка, на висящий мешочек кожи под подбородком.
Няня Савишна, с чулком в руках, тихим голосом рассказывала, сама не слыша и не понимая своих слов, сотни раз рассказанное о том, как покойница княгиня в Кишиневе рожала княжну Марью, с крестьянской бабой молдаванкой, вместо бабушки.
– Бог помилует, никогда дохтура не нужны, – говорила она. Вдруг порыв ветра налег на одну из выставленных рам комнаты (по воле князя всегда с жаворонками выставлялось по одной раме в каждой комнате) и, отбив плохо задвинутую задвижку, затрепал штофной гардиной, и пахнув холодом, снегом, задул свечу. Княжна Марья вздрогнула; няня, положив чулок, подошла к окну и высунувшись стала ловить откинутую раму. Холодный ветер трепал концами ее платка и седыми, выбившимися прядями волос.
– Княжна, матушка, едут по прешпекту кто то! – сказала она, держа раму и не затворяя ее. – С фонарями, должно, дохтур…
– Ах Боже мой! Слава Богу! – сказала княжна Марья, – надо пойти встретить его: он не знает по русски.
Княжна Марья накинула шаль и побежала навстречу ехавшим. Когда она проходила переднюю, она в окно видела, что какой то экипаж и фонари стояли у подъезда. Она вышла на лестницу. На столбике перил стояла сальная свеча и текла от ветра. Официант Филипп, с испуганным лицом и с другой свечей в руке, стоял ниже, на первой площадке лестницы. Еще пониже, за поворотом, по лестнице, слышны были подвигавшиеся шаги в теплых сапогах. И какой то знакомый, как показалось княжне Марье, голос, говорил что то.
– Слава Богу! – сказал голос. – А батюшка?
– Почивать легли, – отвечал голос дворецкого Демьяна, бывшего уже внизу.
Потом еще что то сказал голос, что то ответил Демьян, и шаги в теплых сапогах стали быстрее приближаться по невидному повороту лестницы. «Это Андрей! – подумала княжна Марья. Нет, это не может быть, это было бы слишком необыкновенно», подумала она, и в ту же минуту, как она думала это, на площадке, на которой стоял официант со свечой, показались лицо и фигура князя Андрея в шубе с воротником, обсыпанным снегом. Да, это был он, но бледный и худой, и с измененным, странно смягченным, но тревожным выражением лица. Он вошел на лестницу и обнял сестру.
– Вы не получили моего письма? – спросил он, и не дожидаясь ответа, которого бы он и не получил, потому что княжна не могла говорить, он вернулся, и с акушером, который вошел вслед за ним (он съехался с ним на последней станции), быстрыми шагами опять вошел на лестницу и опять обнял сестру. – Какая судьба! – проговорил он, – Маша милая – и, скинув шубу и сапоги, пошел на половину княгини.
Маленькая княгиня лежала на подушках, в белом чепчике. (Страдания только что отпустили ее.) Черные волосы прядями вились у ее воспаленных, вспотевших щек; румяный, прелестный ротик с губкой, покрытой черными волосиками, был раскрыт, и она радостно улыбалась. Князь Андрей вошел в комнату и остановился перед ней, у изножья дивана, на котором она лежала. Блестящие глаза, смотревшие детски, испуганно и взволнованно, остановились на нем, не изменяя выражения. «Я вас всех люблю, я никому зла не делала, за что я страдаю? помогите мне», говорило ее выражение. Она видела мужа, но не понимала значения его появления теперь перед нею. Князь Андрей обошел диван и в лоб поцеловал ее.
– Душенька моя, – сказал он: слово, которое никогда не говорил ей. – Бог милостив. – Она вопросительно, детски укоризненно посмотрела на него.
– Я от тебя ждала помощи, и ничего, ничего, и ты тоже! – сказали ее глаза. Она не удивилась, что он приехал; она не поняла того, что он приехал. Его приезд не имел никакого отношения до ее страданий и облегчения их. Муки вновь начались, и Марья Богдановна посоветовала князю Андрею выйти из комнаты.
Акушер вошел в комнату. Князь Андрей вышел и, встретив княжну Марью, опять подошел к ней. Они шопотом заговорили, но всякую минуту разговор замолкал. Они ждали и прислушивались.
– Allez, mon ami, [Иди, мой друг,] – сказала княжна Марья. Князь Андрей опять пошел к жене, и в соседней комнате сел дожидаясь. Какая то женщина вышла из ее комнаты с испуганным лицом и смутилась, увидав князя Андрея. Он закрыл лицо руками и просидел так несколько минут. Жалкие, беспомощно животные стоны слышались из за двери. Князь Андрей встал, подошел к двери и хотел отворить ее. Дверь держал кто то.
– Нельзя, нельзя! – проговорил оттуда испуганный голос. – Он стал ходить по комнате. Крики замолкли, еще прошло несколько секунд. Вдруг страшный крик – не ее крик, она не могла так кричать, – раздался в соседней комнате. Князь Андрей подбежал к двери; крик замолк, послышался крик ребенка.
«Зачем принесли туда ребенка? подумал в первую секунду князь Андрей. Ребенок? Какой?… Зачем там ребенок? Или это родился ребенок?» Когда он вдруг понял всё радостное значение этого крика, слезы задушили его, и он, облокотившись обеими руками на подоконник, всхлипывая, заплакал, как плачут дети. Дверь отворилась. Доктор, с засученными рукавами рубашки, без сюртука, бледный и с трясущейся челюстью, вышел из комнаты. Князь Андрей обратился к нему, но доктор растерянно взглянул на него и, ни слова не сказав, прошел мимо. Женщина выбежала и, увидав князя Андрея, замялась на пороге. Он вошел в комнату жены. Она мертвая лежала в том же положении, в котором он видел ее пять минут тому назад, и то же выражение, несмотря на остановившиеся глаза и на бледность щек, было на этом прелестном, детском личике с губкой, покрытой черными волосиками.