Elixir | |
---|---|
![]() | |
Класс языка | мультипарадигмальный: функциональный, параллельный, распределённый, процессо-ориентированный |
Появился в | 2012 |
Разработчик | Жозе Валим[d] |
Расширение файлов |
.ex или .exs |
Выпуск | 1.6.0 / 17 января 2018[1] |
Система типов | динамическая, строгая |
Испытал влияние | Erlang, Ruby, Clojure |
Лицензия | Apache License 2.0[2] |
Платформа | Erlang |
Сайт | elixir-lang.org |
Elixir — функциональный, распределённый язык программирования общего назначения, который работает на виртуальной машине Erlang (BEAM). Построен поверх Erlang, что обеспечивает распределённость, отказоустойчивость, исполнение в режиме мягкого реального времени, метапрограммирование с макросами и полиморфизмом, реализованным через протоколы[3]. Использует Erlang/OTP для работы с деревьями процессов[4].
Создан Жозе Валимом (José Valim), ранее являвшимся одним из основных разработчиков фреймворка Ruby on Rails и сооснователем компании Plataformatec[5][6]. Его целью было включить более высокую расширяемость и производительность в Erlang VM, сохраняя совместимость с инструментами и экосистемой Erlang[7].
Программы компилируются в байт-код для виртуальной машины Erlang (BEAM)[8]. Каждый элемент программы является выражением[8], функции языка Erlang могут быть вызваны без влияния на время исполнения из-за компиляции байт-кода в Erlang и наоборот.
Метапрограммирование дает возможность прямого манипулирования абстрактным синтаксическим деревом (АСД)[8]. Полиморфизм, реализованный через механизм протоколов. Как и в Clojure, протоколы обеспечивают механизм диспетчеризации (не стоит путать с множественной диспетчеризацией). Параллельное программирование — без разделения ресурсов, через передачу сообщений (модель акторов)[9]. В практике применения делают акцент на рекурсии и функциях высшего порядка вместо зацикливания, основанного на побочных эффектах. Для реализации простого параллелизма использованы механизмы Erlang с упрощённым синтаксисом (например, Task)[8].
Реализованы ленивые вычисления и асинхронные коллекции с потоками, сопоставление с образцом[8].
Язык поддерживает Unicode и UTF-8-строки. Реализована поддержка документирования кода в стиле строк-документации из языка Python (Markdown)[8].
На низком уровне Elixir использует примитивные типы, доступные в виртуальной машине Erlang. Так, список — всего лишь упорядоченный набор значений. Кроме того, соответствующие модули и синтаксический сахар позволяют использовать более высокоуровневые абстракции. Например, тип Keyword является модулем Elixir, а его реализация основана на списке кортежей, и, естественно, со значениями типа Keyword можно работать и как со списками[10].
Elixir имеет следующие встроенные типы данных (см. также типы данных Erlang)[11]:
На основе этих примитивных типов в Elixir в частности построены строки и структуры[11].
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
Асинхронное выполнение:
task = Task.async fn -> perform_complex_action() end
other_action()
Task.await task
Внутреннее представление кода:
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 — конфигурацию проекта.
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .