ارلنگ یک زبان برنامهنویسی تابعی است که برای ساخت سیستمهای مقیاسپذیر و مقاوم در برابر خطا طراحی شده است، بهویژه در حوزه برنامههای توزیعشده و همزمان. این زبان در اواخر دهه 1980 توسط اریکسون برای ایجاد سیستمهای مخابراتی قوی توسعه یافت. ویژگیهای منحصر به فرد ارلنگ شامل پشتیبانی از فرآیندهای سبک، همزمانی مبتنی بر ارسال پیام، تعویض کد داغ و تأکید قوی بر قابلیت اطمینان است. امروزه، این زبان بهطور گستردهای در صنایعی که به دسترسی بالا و سیستمهای توزیعشده نیاز دارند، مانند مخابرات، برنامههای پیامرسان و سیستمهای پایگاه داده استفاده میشود.
ارلنگ در اواخر دهه 1980 توسط جو آرمسترانگ، رابرت ویرینگ و مایک ویلیامز در اریکسون ایجاد شد، عمدتاً برای پاسخگویی به نیازهای صنعت مخابرات. این زبان برای تسهیل ساخت سیستمهای بزرگ مقیاس و مقاوم در برابر خطا که میتوانند چندین تماس و اتصال را بهطور همزمان مدیریت کنند، توسعه یافت.
در اوایل دهه 1990، اریکسون پتانسیل ارلنگ را فراتر از مخابرات شناسایی کرد. تا سال 1998، ارلنگ بهعنوان منبع باز منتشر شد که به جامعه وسیعتری از توسعهدهندگان اجازه داد تا به رشد آن کمک کنند. جنبش منبع باز منجر به توسعه ماشین مجازی BEAM شد که کد ارلنگ را اجرا میکند و از آن زمان بهطور مداوم برای پشتیبانی از زبانهای دیگر تکامل یافته است.
ارلنگ در حال حاضر توسط تیم ارلنگ/OTP نگهداری میشود و دارای یک جامعه dedicated است. چرخه انتشار ارلنگ بهطور مداومتر شده است و بهروزرسانیها و بهبودهای منظم بر روی عملکرد، ویژگیهای جدید و مستندات بهبود یافته متمرکز است. این زبان همچنین الهامبخش توسعه الیکسیر، یک زبان برنامهنویسی مدرن است که بر روی ماشین مجازی ارلنگ اجرا میشود و بسیاری از اصول آن را در حالی که ویژگیهای اضافی را ارائه میدهد، در بر میگیرد.
ارلنگ عمدتاً یک زبان تابعی است، به این معنی که توابع شهروندان درجه یک هستند و میتوانند مانند متغیرها منتقل شوند.
double(X) -> X * 2.
فرآیندهای سبک ارلنگ امکان ایجاد هزاران فرآیند همزمان را بدون بار اضافی قابل توجه فراهم میکنند.
spawn(fun() -> io:format("Hello from a process!~n") end).
فرآیندها در ارلنگ با استفاده از ارسال پیام ارتباط برقرار میکنند که امکان ارتباط ایمن بدون حالت مشترک را فراهم میکند.
Pid = spawn(fun() -> receive
{msg, Content} -> io:format("Received: ~s~n", [Content])
end end),
Pid ! {msg, "Hello!"}.
ارلنگ از تطبیق الگو استفاده میکند، ویژگیای قدرتمند که امکان نوشتن کد واضح و مختصر را فراهم میکند.
match(X) when X > 0 -> io:format("Positive number: ~B~n", [X]);
match(X) -> io:format("Non-positive number: ~B~n", [X]).
ارلنگ از طریق فلسفه "بگذارید خراب شود" از تحمل خطا پشتیبانی میکند و به فرآیندها اجازه میدهد که خراب شوند و بدون تأثیر بر سیستم دوباره راهاندازی شوند.
start_process() ->
spawn(fun() -> crash() end).
ارلنگ به توسعهدهندگان اجازه میدهد که کد را در سیستمهای در حال اجرا بدون متوقف کردن آنها تغییر دهند.
%% نسخه قدیمی
-module(example).
-export([hello/0]).
hello() -> io:format("Old Version~n").
%% نسخه جدید
-module(example).
-export([hello/0]).
hello() -> io:format("New Version~n").
دادهها در ارلنگ غیرقابل تغییر هستند که منجر به کاهش باگها و آسانتر شدن استدلال در مورد کد میشود.
List = [1, 2, 3],
NewList = [4 | List].
ارلنگ ویژگیهایی دارد که امکان توزیع آسان فرآیندها در میان گرههای مختلف را فراهم میکند.
net_adm:start() ->
net_adm:ping('other_node@hostname').
ارلنگ از انواع رکورد برای ایجاد انواع داده ساختاری پشتیبانی میکند.
-record(person, {name, age}).
Person = #person{name="Alice", age=30}.
ارلنگ اجازه میدهد تا درک لیستها برای تولید و دستکاری لیستها بهطور مختصر انجام شود.
Squares = [X*X || X <- [1,2,3]].
ارلنگ بر روی ماشین مجازی BEAM اجرا میشود که برای اجرای برنامههای همزمان و مقاوم در برابر خطا طراحی شده است. BEAM عملکرد را بهینه میکند و ویژگیهایی مانند تعویض کد داغ را امکانپذیر میسازد.
چندین محیط توسعه برای ارلنگ وجود دارد که از میان آنها Emacs و IntelliJ IDEA (با پلاگین ارلنگ) از محبوبترینها هستند. سایر ابزارهای قابل توجه شامل ویرایشگرهای خاص ارلنگ مانند Erlide است.
برای ایجاد یک پروژه ارلنگ، بهطور سنتی از ابزار rebar3
استفاده میشود که وابستگیها و ساختها را مدیریت میکند. بهعنوان مثال، برای ایجاد یک پروژه جدید، باید دستور زیر را اجرا کنید:
rebar3 new app myapp
سپس میتوانید پروژه را با:
rebar3 compile
بسازید.
ارلنگ بهطور گستردهای در مخابرات، سیستمهای پیامرسان و برنامههای زمان واقعی استفاده میشود. برنامههای قابل توجه شامل:
نقاط قوت اصلی ارلنگ در مدل همزمانی و تحمل خطا نهفته است که آن را از زبانهایی مانند:
ترجمه کد به و از ارلنگ میتواند به دلیل پارادایمهای منحصر به فرد آن پیچیده باشد. ابزارهایی مانند erl2cpp
برای برخی از ترجمهها وجود دارد، اما هیچ ابزار خودکار گستردهای برای تمام زبانها وجود ندارد. ترجمه دستی ممکن است شامل: