ارلنگ

ارلنگ یک زبان برنامه‌نویسی همه‌منظوره، همروند، دارای زباله جمع‌کن و سامانه زمان‌اجرا است. برای همروندی از مدل اکتور پیروی می‌کند. این زبان توسط اریکسون برای پشتیبانی و توسعه برنامه‌های توزیع‌شده، تحمل‌پذیر در برابر خطا، بیدرنگ نرم و بدون وقفه طراحی شده‌است. این زبان از تعویض داغ که در آن بدون توقف سامانه قادر به تغییر کدهای برنامه هستیم پشتیبانی می‌کند.
سیستم زمان اجرا ارلانگ برای طرح‌های خود که به خوبی برای سیستم‌هایی با مشخصات زیر مناسب است شناخته شده‌است:
توزیع شده
بردباری خطا
زمان واقعی ملایم
بسیار در دسترس، بدون توقف برنامه
تعویض داغ که در آن کد می‌تواند بدون توقف سیستم تغییر کند.
زبان برنامه‌نویسی ارلانگ برای خواص زیر شناخته می‌شود:
داده تغییرناپذیر
تطبیق الگو
برنامه‌نویسی تابعی
ارلنگ در واقع یک زبان اختصاصی در شرکت اریسکون بود که توسط Joe Armstrong , Robert Virding و Mike Williams در سال ۱۹۸۶ توسعه پیدا کرده بود، اما در سال ۱۹۹۸ به عنوان یک زیان متن باز منتشر شد. Erlang/OTP توسط واحد محصول OTP در اریکسون پشتیبانی و نگهداری می‌شود.
تاریخچه
نام «ارلنگ» به Bjarne Däcker نسبت داده شده‌است، توسط کسانی که بر روی تعویض تلفن کار می‌کنند تصور می‌شود به یک مرجع که یک ریاضی‌دان دانمارکی است و مهندس ارلنگ Agner Krarup به بعنوان یک مخفف هیجانی «زبان اریکسون» داده شده‌است.
ارلنگ با هدف بهبود و توسعه برنامه‌های کاربردی تلفن طراحی شده‌است. نسخه اولیه ارلنگ در پرولگ اجرا شد و توسط زبان برنامه‌نویسی مورد استفاده در PLEX مبادلات زودتر اریکسون تاثیر پذیرفته بود. در سال ۱۹۸۸ ارلنگ ثابت کرده بود که برای نمونه‌سازی مبادلات تلفنی مناسب است، اما در prolog بسیار آهسته اجرا می‌شد. یک گروه از متخصصان اریکسون تخمین زده بودند که برای استفاده از محصولشان سرعت آن باید ۴۰ بار سریعتر شود. در سال ۱۹۹۲ کار بر روی ماشین مجازی BEAM که ارلنگ را به زبان C با استفاده از ترکیبی از کدهای کامپایل شده محلی و کدهای نخ بندی شده برای اعتصاب یک تعادل بین عملکرد و فضای دیسک شروع شد. با توجه به گفته‌های آرمسترانگ، این زبان از یک محصول آزمایشگاهی به یک محصول واقعی پس از رسیدن به نسل جدید و تبدیل نام AXE به AXE-N در سال ۱۹۹۵ تبدیل شد. در نتیجه، Erlang برای آینده دستگاه خودپرداز تبادل AXD انتخاب شد.
در سال ۱۹۹۸ اریکسون از سوئیچ AXD301 اطلاع داد، که شامل بیش از یک میلیون خط از ارلنگ می‌شد و از در دسترس بودن بالای ۹ گزارش داد. مدت کوتاهی پس از آن، سیستم رادیو ارلنگ استفاده از ارلنگ برای محصول جدید در مصارف خانگی را ممنون کرد، این اتفاق با استناد به اولویت زبان‌های غیررسمی روی داد. این ممنوعیت باعث شد آرمسترانگ و دیگران شرکت اریکسون را ترک کنند. اجرای متن بازکردن این زبان در انتهای همین سال روی داد. سرانجام با برداشتن این ممنوعیت اریکسون دوباره آرمسترانگ را در سال ۲۰۰۴ استخدام کرد.
در سال ۲۰۰۶، پشتیبانی از چند پردازنده‌ای متقارن محلی به سیستم زمان اجرا و ماشین مجازی اضافه شد.
جهان بینی ارلنگ
دیدگاه ارلنگ از جهان، از زبان آرمسترانگ، شرکت سازنده ارلنگ که خلاصه‌ای از آن را در پایان‌نامه دکترای خود به شرح زیر آورده:
همه چیز یک فرایند است.
فرایندها به شدت منزوی هستند.
ایجاد و تخریب فرایند یک عملیات سبک‌وزن است.
عبور پیام تنها راه تعامل فرایند هاست.
فرایندها نام‌های منحصر به فردی دارند.
اگر شما نام یک فرایند را بدانید می‌توانید به آن پیام ارسال کنید.
فرایندها بدون منبع به اشتراک گذاشته می‌شوند.
دست زدن به خطا غیر محلی است.
فرایندها کارهایی که پشتیبانی می‌کنند را انجام می‌دهند که منجر به انجام یا شکست می‌شود.
جو آرمسترانگ در سال ۲۰۱۳ در مصاحبه با Rackspace اشاره می‌کند: «اگر جاوا یک بار نوشته شود و همه جا اجرا شود، پس ارلنگ یک بار نوشته می‌شود و همیشه اجرا می‌شود.»
استفاده
ارلنگ در حال حاضر توسط شرکت‌ها از جمله Nortel و T-Mobile اتخاذ شده‌است. ارلنگ در گره پشتیبانی اریکسون، و 3G , GPRS و شبکه‌های LTE در سرار جهان مورد استفاده قرار می‌گیرد .
نمونه برنامه‌نویسی تابعی
یک تابع ارلنگ که از توابع بازگشتی برای شمارش تا ده استفاده می‌کند:
-module(count_to_ten).
-export( ).
count_to_ten() -> do_count(0).
do_count(10) -> 10;
do_count(N) -> do_count(N + 1).
الگوریتم اجرای فاکتوریل در ارلنگ:
-module(fact). % This is the file fact.erl, the module and the filename must match
-export( ). % This exports the function fac of arity 1 (1 parameter, no type, no name)
fac(0) -> 1; % If 0, then return 1, otherwise (note the semicolon ; meaning else)
fac(N) when N> 0, is_integer(N) -> N * fac(N-1).
% Recursively determine, then return the result
% (note the period . meaning endif or function end)
%% This function will crash if anything other than a nonnegative integer is given.
%% It illustrates the "Let it crash" philosophy of Erlang.
الگوریتم اجرای فیبوناچی در ارلنگ (توجه داشته باشید: این الگوریتم فقط برای نشان دادن نحوه نگارش ارلنگ است و از نظر زمانی بهینه نیست):
-module(fibonacci). % This is the file fibonacci.erl, the module and the filename must match
-export( ). % This exports the function fib of arity 1
fib(0) -> 0; % If 0, then return 0, otherwise (note the semicolon ; meaning else)
fib(1) -> 1; % If 1, then return 1, otherwise
fib(N) when N> 1 -> fib(N - 1) + fib(N - 2).
مرتب‌سازی سریع در ارلانگ، با استفاده از لیست درک مطلب:
%% qsort:qsort(List)
%% Sort a list of items
-module(qsort). % This is the file qsort.erl
-export( ). % A function qsort with 1 parameter is exported (no type, no name)
qsort() -> ; % If the list is empty, return an empty list (nothing to sort)
qsort(Rest) ->
% Compose recursively a list with Front for all elements that should be before Pivot
% then Pivot then Back for all elements that should be after Pivot
qsort() ++
Pivot ++
qsort().
در مثال بالا تابع فراخوانی بازگشتی مرتب‌سازی سریع تا زمانی که چیزی برای مرتب‌سازی باقی نمانده باشد ادامه پیدا می‌کند .
عبارت یک لیست درک است، به این معنی «ساخت یک لیست از عناصر Front به‌طوری‌که Front عضو Rest است، و Front کمتر از Pivot است.» ++ عملگر الحاق لیست است .
یک تابع مقایسه می‌توان برای سازه‌های پیچیده‌تر به خاطر خوانایی استفاده می‌شود.
کد زیر لیست‌ها را بر اساس طول مرتب می‌کند:
% This is file listsort.erl (the compiler is made this way)
-module(listsort).
% Export by_length with 1 parameter (dont care about the type and name)
-export( ).
by_length(Lists) -> % Use qsort/2 and provides an anonymous function as a parameter
qsort(Lists, fun(A,B) -> length(A) ; % If list is empty, return an empty list (ignore the second parameter)
qsort(Rest, Smaller) ->
% Partition list with Smaller elements in front of Pivot and not-Smaller elements
% after Pivot and sort the sublists.
qsort(, Smaller)
++ Pivot ++
qsort(, Smaller).
در اینجا، دوباره یک Pivot از اولین پارامتر داده شده به ()qsort گرفته شده‌است و نام لیست rest را Rest قرار داده‌است. توجه داشته باشید که بیان
تفاوتی با حالت زیر ندارد
(در مثال قبل) به جز برای استفاده از یک تابع مقایسه‌ای در آخرین بخش، صدا زدن"ساخت یک لیست از عناصر X به‌طوری‌که X یک عضو از Rest است، و Smaller درست می‌باشد." با Smaller از پیش تعریف شده مانند
fun(A,B) -> length(A)
توجه داشته باشید تابع بی‌نامی که Smaller ، در لیست پارامتر تعریف دوم qsort هست را می‌توان با نامی که در تابع اشاره شده نامید.
انواع داده
Integers
اعداد صحیح به عنوان دنباله‌ای از اعداد اعشاری نوشته شده‌است، به عنوان مثال، ۱۲، ۱۲۳۷۵ و -۲۳،۴۲۷ اعداد صحیح هستند. علم حساب اعداد صحیح دقیق و تنها محدود به حافظه موجود بر روی دستگاه است.
Atoms
اتم‌ها در یک برنامه برای نشان دادن ارزش‌های متمایز استفاده می‌شود. آن‌ها به صورت رشته‌ای از کاراکترهای الفبایی متوالی نوشته می‌شوند، اولین کاراکتر که حروف کوچک است. اتم‌ها می‌توانند شامل هر کاراکتر باشند اگر آن‌ها در نقل قول‌های محصور و یک کنوانسیون فرار وجود داشته باشد که اجازه می‌دهد هر کاراکتر در یک اتم استفاده شود.
Floats
عداد ممیز شناور از IEEE 754 بیتی۶۴ استفاده می‌کند.