Elixir язык программирования где используется

Elixir

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

Несколько дней назад Jose Valim опубликовал в своем репозитории проект языка, построенного поверх Erlang. Этот язык обладает простой объектной моделью и Ruby-подобным синтаксисом. Под катом выжимки из документации и видео, демонстрирующее простой пример.

disclaimer: %username%, прежде чем делать выводы насчет того, что умеет, а что не умеет elixir, просьба глазами пройтись хотя бы по readme.

Elixir — язык программирования, работающий поверх Erlang. Как Erlang, это — функциональный язык со строгими вычислениями, однократным присвоением и динамической типизацией, созданный, чтобы поддерживать распределенные, отказоустойчивые, безостановочные приложения с горячей заменой кода. Elixir позволяет Вам вызывать модули Erlang без необходимости преобразовать типы данных, поэтому нет никакой потери в производительности при вызове кода Erlang.

Основное различие между Elixir и Erlang — синтаксис и объектная ориентированность. Elixir обеспечивает очень простую объектную модель и синтаксис, большей частью основанный на Ruby.

В настоящее время главной задачей является разработка стандартной библиотеки. Большая часть существующей стандартной библиотеки написана на самом Elixir, и Вам не нужно знать Erlang, чтобы внести свой вклад в ее развитие. Достаточно будет знакомства с принципами OTP.

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

 $ git clone https://github.com/josevalim/elixir.git $ cd elixir $ make test $ bin/elixir -v Elixir 0.1.0 

Elixir поддерживает целые и дробные числа:

 2 + 15 % => 17 - 13 * 10 % => -130 1986 - 1985 % => 1 5 / 2 % => 2.5 4 / 2 % => 2.0 
 -1.abs % => 1 5.div(2) % => 2 %surprise ! 1.+(2) % => 3 

Атомы в Elixir называются Symbols (как в Ruby). Но синтиксис позаимствован у Lisp (Jose объяснил это в твиттере тем, что хочет «:» использовать в словарях):

 'atom 'Atom 'atom_without_spaces '"Atom with Spaces" 

Списки являются наиболее полезной структурой в Elixir (как и в любом другом функциональном языке), могу содержать все, что угодно и имеют набор методов:

 % Some list with elements ['atom, 1, 2, 3, < 'some, 'tuple >] % An empty list [] [1, 2, 3].length % => 3 ['a, 'b, 'c][1] % => 'b [1, 2, 3] + [4, 5, 6] % => [1,2,3,4,5,6] 

Списки в Erlang и Elixir реализованы как связные списки, поэтому предварительное добавление элементов происходит намного быстрее, чем последующее:

 list = [2,3,4] % Don't do this: [1] + [2,3,4] % => [1,2,3,4] [0,1] + [2,3,4] % => [0,1,2,3,4] % Do this instead: [1|list] % => [1,2,3,4] [0,1|list] % => [0,1,2,3,4] 
 [1, 2, 3].map do (x) x * 2 end % => [2, 4, 6] [1, 2, 3].foldl 0, do (x, acc) acc + x end % => 6 

Строки в Erlang представлены списком символов:

 "hello" == [104, 101, 108, 108, 111] 

Это накладно, поскольку каждый символ занимает 8 байт памяти (не бит!). Elixir реализует строки, в виде utf8 бинарных строк:

 % The famous "hello world" string "hello world" % A string converted to its underlying binary: "hello".to_bin % => <<[104, 101, 108, 108, 111]>> % A string converted to a char list: "hello".to_char_list % => [104, 101, 108, 108, 111] % Strings are UTF-8 "Arrow ⇧ up".length % => 10 
 % Converting a string_from_erlang to Elixir's String String.new string_from_erlang % Where string_from_erlang is either a binary: <<[104, 101, 108, 108, 111]>> % Or a char_list: [104, 101, 108, 108, 111] % Converting a string_from_elixir to Erlang "string_from_elixir".to_bin "string_from_elixir".to_char_list 
 "string # interpolation" % => "string with interpolation" "1 + 1 = #" % => "1 + 1 = 2" 

Функции являются важной частью Elixir, как и любого другого функционального языка. Функции можно создавать с помощью «do» или «->»:

 my_function = do 1 + 2 end my_function() % => 3 another_function = -> 1 * 2 end another_function() % => 2 

Как и Erlang, Elixir поддерживает Pattern matching и единичное присваивание.

 % Let's bound the variable x to 'foo x = 'foo % Now let's match a tuple with other tuple. % Since x is already bound, we are comparing x with 'baz and it will fail: < x, y >= < 'baz, 'bar >% In this case, we compare 'x with 'foo and it matches. % Since y is unbound, we assign 'bar to it: < x, y >= < 'foo, 'bar >x % => 'foo y % => 'bar [h|t] = [1,2,3] h % => 1 t % => [2,3] % Raises an error because h was already assigned to 1 and 1 does not match 2 [h|t1] = [2,3,4] 
 module Math def fibonacci(0) 0 end def fibonacci(1) 1 end def fibonacci(n) fibonacci(n - 1) + fibonacci(n - 2) end end Math.fibonacci(0) % => 0 Math.fibonacci(1) % => 1 Math.fibonacci(3) % => 2 Math.fibonacci(10) % => 55 

Вызов методов Erlang весьма тривиален:

 % Accessing the is_atom BIF from Erlang. % This is the same as `is_atom(foo)` in Erlang. Erlang.is_atom('foo) % => true % Accessing the function delete from module lists. % This is the same as `lists:member(1, [1,2,3])` in Erlang. Erlang.lists.member(1, [1,2,3]) % => true 
  • Динамический выбор реализации — когда вызывается метод, объект сам выбирает, какой код выполнить
  • Mixin’ы — объекты не содержат методов. Все методы запакованы в модули, которые подмешиваются в объекты.
  • Инкапсуляция — методы могут быть public, protected или private.
  • Открытая рекурсия — объекты имеют специальную переменную self, которая позволяет вызвать другие методы объекта не затрагивая цепочку вызовов.
  • Рефлексия — Elixir способен просматривать и модифицировать структуру объекта во времени исполнения.
 object Person def constructor(name, age) < 'name: name, 'age: age >end def name @name end def age @age end def name(value) self.set_ivar('name, value) end end person = Person.name('john, 24) another_person = person.name('john_doe) person.name % => 'john person.age % => 24 another_person.name % => 'johh_doe another_person.age % => 24 

Это описание малой части возможностей Elixir. В репозитории опубликована отличная обзорная документация. Ролик ниже иллюстрирует небольшой пример работы языка:

Источник

Язык программирования Elixir

#

Elixir — язык программирования общего назначения, использующий функциональную парадигму построения кода и динамическую типизацию переменных. По сути, является надстройкой для другого языка — Erlang, и использует его виртуальную машину для компиляции кода. По синтаксису во многом схож с Ruby.

Elixir — не самый распространенный язык. Несмотря на то что он был изобретен еще в 2012 году, такой популярности, как конкуренты, он не приобрел. Тем не менее в веб-среде он нашел свою нишу и успешно решает ряд специфических задач.

Особенности языка

  1. Масштабируемость.
    Код на Эликсире строится из легковесных потоков, называемых процессами. Они изолированы и обрабатываются сборщиком мусора независимо друг от друга. За счет этого ресурсы устройства используются максимально эффективно.
    Процессы также могут работать связно на нескольких устройствах, обмениваясь сообщениями через сеть. Это позволяет разработчикам строить горизонтальные масштабируемые системы из нескольких узлов.
  2. Отказоустойчивость.
    Для поиска и исправления ошибок в Elixir существует специальный супервизор, который описывает найденные в коде проблемы и предлагает их решение.
  3. Функциональное программирование.
    Функциональный стиль в Эликсир позволяет писать короткий, читаемый код. Технология pattern matching делает работу с данными лаконичной и эффективной.
  4. Встроенные инструменты управления.
    Mix — утилита автоматизации, которая помогает управлять разрабатываемым проектом, тестами и подключаемыми задачами.
    Инструмент IEx активирует возможности языка для автосборки, перезагрузки кода и форматирования.
  5. Полная совместимость с Erlang.
    Elixir взаимодействует с Erlang без потери производительности, не требуя преобразования типов данных. Для трансляции программы в машинный код Эликсир использует виртуальную машину Erlang (BEAM).
  6. Быстрое исполнение.
    При сопоставлении с похожими интерпретируемыми языками, такими как Python и Ruby, Elixir показывает в разы более высокую скорость обработки данных и эффективнее работает co множественными веб-сокетами.
  7. Упрощенный синтаксис.
    В сравнении с Erlang в Elixir добавлено больше “синтаксического сахара” — то есть послаблений в построении команд и форматировании программы.

К недостаткам языка относят:

  • непривычность синтаксиса, особенно для разработчиков, привыкших к другим ООП языкам;
  • усложненность арифметики и операторов;
  • малое количество готовых библиотек.

Где используется Elixir

#

Благодаря своему самому крупному фреймворку под названием Phoenix, язык Elixir закрепился в веб-разработке. На “Фениксе” создаются крупные многопользовательские проекты с постоянным обновлением информации в реальном времени: мессенджеры, социальные сети, дашборды.

Работа с базами данных на Эликсир осуществляется через решение Ecto. Это четыре модуля со всеми необходимыми инструментами, включая репозитории и язык запросов.

При этом сам по себе Elixir — язык программирования общего назначения. На нем в теории можно писать программы для любых платформ.

Среди известных компаний, применяющих Elixir в своих IT-продуктах — Discord, PepsiCo и Change.org.

Примеры кода

Классическая программа Hello, world! в синтаксисе Elixir.

Определение и вызов простой функции сложения в рассматриваемом языке выглядит так.

 defmodule Math do def sum_of_values(a, b) do a + b end end IO.puts Math.sum_of_values(5, 8) 

В Elixir используются атомы (константные единицы для определенного типа сущностей) и кортежи — списки из нескольких параметров.

С помощью сочетания атомов и кортежей удобно записывать небольшие общеупотребимые объекты.

Атомы хорошо работают с pattern matching при сравнении объектов. По сути, это их основное предназначение.

Заключение

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

Источник

Редкие языки: Elixir

В комментариях к статье «Редкие языки: Erlang» я обещал рассказать о Elixir. Докладываю.

Что это, Бэрримор?

Elixir построен на виртуальной машине Erlang — BEAM. Это значит, что он может все, что может Erlang, и немного больше. Так, написанные на Erlang библиотеки можно без переделки использовать в коде на Elixir.

Elixir намного младше Erlang — он появился в 2012 году, а создал его Хосе Валим, бывший разработчик Ruby on Rails. Кроме того, Elixir испытал влияние Clojure.

Синтаксис Elixir близок к синтаксису Ruby. Да вы сами посмотрите:

Для новичка синтаксис Elixir может быть понятнее Erlang. Хотя не факт, конечно — угадайте, что делает код:

Кроме того, для Elixir появилось намного больше библиотек — не так много, как для Go, но тоже внушительно: https://github.com/h4cc/awesome-elixir

Знаковые проекты

Ecto
Так сложилось, что для Erlang не было толкового ORM. Проект Chicago Boss развивал свой ORM — boss_db, но он был далек от идеала. Для проектов с интенсивной работой с базами данных приходилось изобретать свои решения.

Ecto появился с Elixir и предоставляет четыре больших модуля для работы с базами данных в Elixir: репозитории, схемы, миграции и язык запросов. Без появления Ecto было бы невозможным появление самого знакового проекта Elixir — Phoenix.

Phoenix
Erlang был недружелюбным языком для большого веба, несмотря на количество библиотек для работы с HTTP. Проекты вроде Chigago Boss не сильно помогали — писать веб на Erlang решались только сильные духом.

Phoenix сделал Elixir одним из решений для написания крупных веб-приложений. Конечно, он не такой изящный, как Ruby on Rails, в силу своих ограничений, но это был шаг вперед.

При этом Phoenix использует всю мощь платформы Erlang — изоляцию памяти потоков, мощную многопоточность, метапрограммирование.

Узнать больше

Есть что добавить? Пишите в комментарии.

Источник

Читайте также:  Спбгу матмех кафедра системного программирования
Оцените статью