الیکسیر ( Elixir ) زبانی است فانکشنال و داینامیک، که با هدف ساخت سیستم های مقیاس‌پذیر و قابل نگه‌داری طراحی شده است.

الیکسیر بر پایه‌ی ماشین مجازی ارلنگ بنا شده؛ پلتفرمی که به اجرای سیستم‌های توزیع شده، مقاوم در برابر خطا، و کم تاخیر شهرت دارد و علاوه بر آن، در حوضه‌ی توسعه‌ی وب و نرم‌افزارهای توکار بسیار موفق عمل کرده است.

در ادامه به صورت اجمالی برخی از ویژگی‌های زبان را با یکدیگر بررسی می‌کنیم. برای یادگیری الیکسیر،راهنمای شروع را مطالعه فرمایید.

ویژگی‌های پلتفرم

مقیاس‌پذیری

تمام کدهای الیکسیر در غالب جریان‌های اجرایی سبکی که به آن‌ها «پروسه» می‌گوییم دسته‌بندی و اجرا می گردنند و می‌توانند از طریق تبادل «پیام» با یکدیگر در ارتباط باشند.

parent = self()

# Spawns an Elixir process (not an operating system one!)
spawn_link(fn ->
  send parent, {:msg, hello world"}
end)

# Block until the message is received
receive do
  {:msg, contents} -> IO.puts contents
end

دقت کنید که پروسه‌های الیکسیر (یا همان پروسه‌های ارلنگ) با پروسه‌های معمول سیستم عامل فرق دارند و بسیار سبک تر هستند. از همین رو، اینکه بتوانید صدها هزار عدد از آن‌ها را به شکل «همروند» در یک ماشین اجرا کنید، امری بسیار عادی است. هر پروسه کاملا مستقل از بقیه پروسه‌ها عمل می‌کند و این امر باعث شده که هر کدام از آن‌ها بتوانند به طور جدا گانه سیستم مدیریت حافظه (GC) خود را داشته باشند. چنین قابلیتی توقف‌های اجراییِ سیستم (مکث‌های ناشی از اجرای عملیات GC) را کاهش می‌دهد و امکان استفاده‌ی موثرتر از منابع را فراهم می‌کند. (مقیاس‌پذیری عمودی یا vertical scaling)

همچنین پروسه‌ها قادراند با پروسه‌هایی که در دیگر ماشین‌های موجود در شبکه در حال اجرا هستن ارتباط داشته باشند و داده رد و بدل کنند. این ویژگی یک زیرساخت قدرتمند برای سیستم‌های توزیع شده ایجاد می‌کند و توسعه‌دهندگان را قادر می‌سازد تا پردازش سیستم خود را روی ماشین‌های موجود در شبکه تقسیم نمایند (مقیاس‌پذیری افقی یا horizontal scaling)

مقاوم در برابر خطا

حقیقت غیرقابل انکاری که باید قبول کنیم این است که چه بخواهیم و چه نخواهیم، نرم‌افزارها دچار اشکال خواهند شد. ضریب این اشکالات با وارد شدن عوامل خارجی مانند شبکه، سیستم فایل، و سایر منابع جانبی بیشتر هم خواهد شد.

در مواجه با اشکالات احتمالی، الیکسیر مکانیزم «نظارت» را پیشنهاد می‌دهد؛ یک «ناظر» مکانیزم‌ای است که می‌تواند در صورت وقوع خطا، قسمت‌های مشکل‌دار سیستم را ری‌استارت نماید و جریان سیستم را به نقطه‌ای برگرداند که عملکرد سالمی داشته است.

import Supervisor.Spec

children = [
  supervisor(TCP.Pool, []),
  worker(TCP.Acceptor, [4040])
]

Supervisor.start_link(children, strategy: :one_for_one)

ویژگی‌های زبان

برنامه نویسی فانکشنال (تابعی، تابع‌گرا)

برنامه نویسی فانکشنال مروج مدلی از کدنویسی است که توسعه دهندگان را کمک میکند کدهای کوتاه، سریع، و قابل نگه داری بنویسند. برای مثال، مکانیزم «تطبیق الگو» (pattern matching) برنامه نویس را قادر می‌سازد تا به راحتی ساختارهای داده‌ای را بشکافد و مطابق با الگویی که تعیین کرده است به محتوای آن‌ها دسترسی پیدا کند:

%User{name: name, age: age} = User.get("John Doe")
name #=> "John Doe"

قابلیت «تطبیق الگو» وقتی با مکانیزم «گارد - محافظ» (guards) ترکیب می‌شود، ما را قادر می‌سازند تا برای الگوهای خود شرط تعیین کنیم (مشابه کاری که where در اس‌کیوال انجام می‌دهد):

def serve_drinks(%User{age: age}) when age >= 21 do
  # Code that serves drinks!
end

serve_drinks User.get("John Doe")
#=> Fails if the user is under 21

الیکسیر به شدت به چنین قابلیت‌هایی اتکا کرده تا اطمینان حاصل کند که نرم‌افزار شما در شرایط مد نظرتان در حال کار است. و اگر هم اوضاع مطابق میل پیش نرفت، نگران نباشید، ناظرها (توضیح در بالا) به داد شما خواهند رسید!

توسعه‌پذیری و زبان‌های کوچکِ اختصاصی (DSL)

یکی از اهداف ساخت الیکسیر قابل توسعه بودن آن بوده است؛ اینکه توسعه‌دهندگان بتوانند برای بالا بردن بهره‌وری شان در حوضه‌های مختلف، زبان را توسعه دهند و به آن سینتکس های جدیدی اضافه کنند. این سینتکس‌های جدید که مانند زبان‌های کوچکی عمل می کنند و برای منظور خاصی ساخته شده‌اند، «دی‌اس‌ال» نام دارند.

برای مثال، بیایید به کمک فریم‌ورک تست الیکسیر به نام ExUnit ، یک تست کوچک ایجاد کنیم:

defmodule MathTest do
  use ExUnit.Case, async: true

  test "can add two numbers" do
     assert 1 + 1 == 2
  end
end

عبارتasync: trueباعث می‌شود تست‌ها به شکل موازی اجرا شوند و بتوانند از تمام هسته‌های پردازنده استفاده کنند. عبارت assertهم کدهای شما را زیر نظر را می‌گیرد تا در صورت وجود ایراد در تست، آن را به شما گزارش دهد. نکته‌ی جالب این است که هیچ کدام از این قابلیت‌ها جزو سینتکس الیکسیر نیستند و به کمک «ماکرو» ها ایجاد شده‌اند. ماکروها شما را قادر می‌سازند تا سینتکس جدیدی (دی‌اس‌ال) به زبان اضافه کنید و به عبارت دیگر، زبان را در خود زبان توسعه دهید. اتفاقا بیشتر سینتکس الیکسیر به کمک ماکروها ایجاد شده است، یعنی بر خلاف زبان‌های دیگر که از یک سینتکس واحد تبعیت می‌کنند، الیکسیر از ده‌ها دی‌اس‌ال کوچک ساخته شده که در کنار یکدیگر قابل استفاده‌اند.

ماکروهای الیکسیر را با ماکروهای ابتدایی و مشکل‌ساز زبان سی اشباه نگیرید؛ ماکروهای الیکسیر از خانواده لیسپ به این زبان وارد شده‌اند و این یعنی، حداقل از نظر تئوری، با زبانی بدون محدودیت طرف هستید و می‌توانید هر ایده‌ای که در ذهن‌تان دارید را در آن پیاده ‌سازی کنید. (فرضا قابلیت‌هایی که فلان زبان دارد اما در الیکسیر موجود نیست...)

ابزارهای جانبی

اکوسیستمی در حال رشد

الیکسیر با مجموعه‌ای از ابزارهای مفید ارائه شده است تا روند توسعه را بهبود بخشد. برای مثال Mix ابزاریست که برای «ساخت» به کار می‌رود و شما را قادر می‌سازد تا به کمک آن‌ پروژه‌ها را ایجاد کنید، تسک ها را مدیریت کنید، برنامه‌ها را کامپایل و اجرا و تست نمایید و...

$ mix new my_app
$ cd my_app
$ mix test
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

ابزار Mix همچنین قادر است بسته‌های جانبی مورد نیاز پروژه‌ی شما را به کمک ابزار Hex فراهم کند. Hex ابزاری است که وظیفه‌ی مدیریت بسته‌ها در الیکسیر را به عهده دارد (پکیج منیجر). تمام این ابزارها از همان ابتدا و به هنگام نصب الیکسیر در اختیار شما قرارخواهند گرفت.

توسعه‌ی تعاملی

ابزارهایی مانند IEx (پایانه‌ی تعاملی الیکسیر - REPL) شما را قادر می‌سازند تا به شکل موثرتری از پتانسیل‌های این پلتفرم بهره‌مند شوید. قابلیت‌های متنوعی مانند تکمیل اتوماتیک عبارات به هنگام تایپ، خطایابی، بازخوانی کدها، و فراخوانی مستندات مورد نیاز،... شما را در این امر یاری خواهند کرد.

$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> c "my_file.ex"    # Compiles a file
iex> t Enum            # Prints types defined in the module Enum
iex> h IEx.pry         # Prints the documentation for IEx pry functionality

سازگاری با ارلنگ

الیکسیر روی ماشین مجازی ارلنگ اجرا می‌شود و برای برنامه نویسان این امکان را فراهم آورده است تا به اکوسیستم زبان ارلنگ دسترسی داشته باشند.

پلتفرمی که توسط شرکت‌هایی مانندHeroku،Whatsapp،Klarna،Bashoو خیلی ‌های دیگر استفاده شده تا سیستم‌هایی توزیع شده و مقاوم در برابر خطا را ایجاد کنند. برنامه‌نویسان الیکسیر می‌توانند توابع ارلنگ را بدون کوچک‌ترین سربار اضافه صدا بزنند:

iex> :crypto.md5("Using crypto from Erlang OTP")
<<192,223,75,115,...>>

برای آشنایی بیشتر با الیکسیر،راهنمای شروع را مطالعه نمایید.همچنین مستندات کامل زبان ویک راهنمای سریع برای ارلنگ کارهابه صورت آنلاین در دسترس است.