الیکسیر یک زبان برنامهنویسی تابعی و همزمان است که بر روی ماشین مجازی ارلنگ (BEAM) ساخته شده و از قابلیتهای قوی و مقاوم در برابر خطا برخوردار است. این زبان برای ایجاد برنامههای مقیاسپذیر و قابل نگهداری طراحی شده و ویژگیهای مدرنی مانند متاپروگرامینگ، چندریختی و نحو قابل گسترش را ارائه میدهد. الیکسیر بهویژه برای سیستمهای توزیعشده و همزمان مناسب است و آن را برای برنامههای وب و خدمات بلادرنگ ایدهآل میسازد. با نحو بیانگر و تأکید قوی بر بهرهوری توسعهدهنده، الیکسیر در جامعه توسعه وب محبوبیت زیادی پیدا کرده است.
الیکسیر در سال ۲۰۱۱ توسط خوزه ولیم ایجاد شد، که زبانی را تصور میکرد که بهترین ویژگیهای برنامهنویسی تابعی و اکوسیستم ارلنگ را ترکیب کند. ولیم، یکی از مشارکتکنندگان برجسته در فریمورک روبی آن ریلز، به دنبال بهبود نقاط ضعف موجود در زبانهای فعلی در زمینه ساخت سیستمهای همزمان و مقاوم در برابر خطا بود. او با الهام از زبانهایی مانند روبی، جنبههای متاپروگرامینگ را ادغام کرد و تجربه توسعهدهنده را با ویژگیهایی که به اشتراکگذاری کد را ترویج میکنند، بهبود بخشید.
الیکسیر بر روی ماشین مجازی ارلنگ ساخته شده است که مدل همزمانی قوی و مقاومت در برابر خطا را فراهم میکند. این ارتباط به الیکسیر اجازه میدهد تا مزایای قابل توجهی از ویژگیهای دیرینه ارلنگ برای ساخت سیستمهای توزیعشده به ارث ببرد. همچنین به زبانهایی مانند روبی به خاطر نحو و قابلیتهای متاپروگرامینگش مرتبط است، در حالی که میتوان آن را با زبانهای تابعی مانند هسکل و اسکالا مقایسه کرد به دلیل تأکیدش بر پارادایمهای برنامهنویسی تابعی.
از زمان ایجاد، الیکسیر به طور قابل توجهی در محبوبیت رشد کرده است، بهویژه در میان توسعهدهندگانی که بر روی برنامههای وب کار میکنند؛ فریمورک فینیکس، یک فریمورک وب الیکسیر، راه را برای توسعه برنامههای وب بلادرنگ هموار کرده است. این زبان همچنین حمایت قابل توجهی از جامعه را تجربه کرده و ایجاد کتابخانهها و ابزارهای متعدد را به همراه داشته است. با تمرکز بر مقیاسپذیری و مقاومت در برابر خطا، الیکسیر در زمینههای مختلفی از جمله مخابرات، بازیسازی، خدمات مالی و هر حوزهای که نیاز به پردازش همزمان دارد، استفاده میشود.
الیکسیر بر اساس پارادایم برنامهنویسی تابعی طراحی شده است و به توابع اجازه میدهد که به عنوان شهروندان درجه یک عمل کنند. این بدان معناست که توابع میتوانند به عنوان آرگومانها منتقل شوند، از توابع دیگر بازگردانده شوند و به متغیرها بهراحتی اختصاص داده شوند.
sum = fn a, b -> a + b end
sum.(5, 3) # برمیگرداند ۸
تطابق الگو در الیکسیر اجازه میدهد تا ساختارهای داده بهطور زیبا تجزیه شوند. این ویژگی به طور گستردهای در تعریف توابع، عبارات case و بیشتر استفاده میشود.
{a, b} = {1, 2}
a # برمیگرداند ۱
در الیکسیر، ساختارهای داده غیرقابل تغییر هستند، به این معنی که پس از ایجاد، نمیتوانند تغییر کنند. این امر به برنامهنویسی همزمان ایمنتری منجر میشود.
list = [1, 2, 3]
new_list = [0 | list] # [0, 1, 2, 3]
الیکسیر از فرآیندهای سبک برای مدیریت همزمانی استفاده میکند. هر فرآیند ایزوله است و از طریق ارسال پیام با یکدیگر ارتباط برقرار میکنند.
spawn(fn -> IO.puts "سلام از یک فرآیند!" end)
الیکسیر از توابع مرتبه بالاتر پشتیبانی میکند و به توسعهدهندگان اجازه میدهد توابعی ایجاد کنند که میتوانند توابع دیگر را به عنوان پارامتر بپذیرند یا آنها را بازگردانند.
defmodule Math do
def apply_func(func, value) do
func.(value)
end
end
square = fn x -> x * x end
Math.apply_func(square, 4) # برمیگرداند ۱۶
الیکسیر قابلیتهای متاپروگرامینگ را ارائه میدهد و به توسعهدهندگان اجازه میدهد ماکروهایی ایجاد کنند که میتوانند کد را در زمان کامپایل تغییر دهند و تولید کنند.
defmodule MyMacros do
defmacro say_hello do
quote do
IO.puts("سلام!")
end
end
end
پروتکلها در الیکسیر اجازه میدهند تا چندریختی وجود داشته باشد و انواع دادههای مختلف بتوانند همان رفتار را بدون نیاز به یک کلاس پایه مشترک پیادهسازی کنند.
defprotocol Stringable do
def to_string(data)
end
defimpl Stringable, for: Integer do
def to_string(data), do: Integer.to_string(data)
end
الیکسیر مکانیزمهای کنترل جریان قدرتمندی مانند if
، unless
و case
را ارائه میدهد که اجازه میدهد شرایط بهطور بیانگرانه مدیریت شوند.
case {1, 2} do
{a, b} when a < b -> "a کمتر از b است"
_ -> "مورد دیگر"
end
وارد کردن ماژولها و نامگذاری مستعار آنها خوانایی را افزایش میدهد و به جلوگیری از تداخل نامها کمک میکند.
import Enum
alias MyApp.Helpers, as: Helpers
الیکسیر ویژگیهایی برای مدیریت خطا بهطور صریح از طریق تطابق الگو بر روی خطاها یا استفاده از ساختارهای try/catch
ارائه میدهد.
try do
raise "یک خطا!"
rescue
e -> IO.puts("خطا: #{e.message}")
end
الیکسیر بر روی ماشین مجازی ارلنگ (BEAM) اجرا میشود که محیطی بسیار همزمان و مقاوم برای اجرای برنامههای الیکسیر فراهم میکند. این زمان اجرا برای مدیریت تعداد زیادی از اتصالات همزمان طراحی شده است و الیکسیر را برای برنامههای وب ایدهآل میسازد.
توسعهدهندگان الیکسیر معمولاً از IDEها و ویرایشگرهایی استفاده میکنند که از نحو و ویژگیهای الیکسیر پشتیبانی میکنند. انتخابهای محبوب شامل:
برای ایجاد یک پروژه جدید الیکسیر، توسعهدهندگان از ابزار داخلی Mix استفاده میکنند که ابزاری برای ساخت و مدیریت پروژه است. دستور پایه برای ایجاد یک پروژه جدید به صورت زیر است:
mix new my_project
این دستور ساختار پروژه را تنظیم میکند، از جمله فایلهای پیکربندی. از آنجا، توسعهدهندگان میتوانند پروژههای خود را با استفاده از:
mix compile # کامپایل پروژه
mix run # اجرای پروژه
الیکسیر بهخاطر سرعت، مقیاسپذیری و ویژگیهای مقاوم در برابر خطا در برنامههای مختلف بهطور گستردهای استفاده میشود. کاربردهای قابل توجه شامل:
الیکسیر شباهتهای مفهومی با زبانهای برنامهنویسی مختلف دارد، اما ویژگیهای منحصر به فردی را نشان میدهد که آن را متمایز میکند.
رابطه اصلی الیکسیر با ارلنگ است که به عنوان پایه آن عمل میکند. الیکسیر نحو و ویژگیهای مدرنتری را به ارمغان میآورد که آن را کاربرپسندتر میکند در حالی که همزمانی و مقاومت در برابر خطای ارلنگ را حفظ میکند.
الیکسیر از نحو روبی الهام گرفته است و آن را برای توسعهدهندگان روبی آشنا میسازد. با این حال، در حالی که روبی شیءگرا است، الیکسیر یک مدل برنامهنویسی تابعی را در آغوش میگیرد که بر غیرقابل تغییر بودن و توابع مرتبه بالاتر تأکید دارد.
اگرچه جاوااسکریپت عمدتاً یک زبان چندپارادایمی است، اما ماهیت تابعی الیکسیر و پشتیبانی قوی از همزمانی آن را به انتخابی قوی برای خدمات پشتیبان تبدیل میکند، در مقایسه با حلقه رویداد جاوااسکریپت برای مدیریت وظایف ورودی/خروجی.
سادگی و خوانایی پایتون با تأکید الیکسیر بر همزمانی و مقاومت در برابر خطا در تضاد است. در حالی که پایتون برای حوزههای مختلف چندمنظوره است، الیکسیر به خاطر معماری BEAM خود در برنامههای بلادرنگ برتری دارد.
هر دو الیکسیر و گو برای سیستمهای همزمان طراحی شدهاند، اما الیکسیر از ساختارهای برنامهنویسی تابعی بهره میبرد در حالی که گو سبک دستوری با goroutines را اتخاذ میکند.
هسکل یک زبان کاملاً تابعی است که بر سیستمهای نوع قوی تمرکز دارد. الیکسیر اجازه انتخابهای عملیتری را میدهد و به خاطر ویژگیهای زمان اجرای خود برای برنامههای وب مناسبتر است.
برای الیکسیر، توسعهدهندگان میتوانند از ابزارهای ترجمه منبع به منبع مانند Transpiler و ExMachina استفاده کنند. این ابزارها انتقال بین زبانها را تسهیل میکنند و به یک کد الیکسیر اجازه میدهند تا به جاوااسکریپت یا زبان دیگری تبدیل شود و منطق را حفظ کنند در حالی که ساختار نحو تغییر میکند.
برخی از ابزارهای موجود ترجمه منبع به منبع عبارتند از:
ts2elixir
این ابزارها ادغام سیستمهای قدیمی یا موجود را به برنامههای جدید الیکسیر بدون از دست دادن عملکرد ساده میکنند.