ارلنگ

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

ارلنگ (به انگلیسی: Erlang) یک زبان برنامه‌نویسی همه‌منظوره، همروند، دارای زباله جمع‌کن و سامانهٔ زمان‌اجرا (به انگلیسی: Runtime) است. برای همروندی از مدل اکتور (به انگلیسی: Actor Model) پیروی می‌کند. این زبان توسط اریکسون برای پشتیبانی و توسعه برنامه‌های توزیع‌شده، تحمل‌پذیر در برابر خطا، بیدرنگ نرم (به انگلیسی: soft-real-time) و بدون وقفه طراحی شده‌است. این زبان از تعویض داغ[نیازمند منبع] (به انگلیسی: Hot swapping) که در آن بدون توقف سامانه قادر به تغییر کدهای برنامه هستیم پشتیبانی می‌کند.

سیستم زمان اجرا ارلانگ برای طرح های خود که به خوبی برای سیستم هایی با مشخصات زیر مناسب است شناخته شده است :

  • توضیع شده(به انگلیسی: Distributed)
  • بردباری خطا(به انگلیسی: Fault-tolerant)
  • زمان واقعی ملایم(به انگلیسی: Soft real-time)
  • بسیار در دسترس،بدون توقف (به انگلیسی: Highly available, non-stop applications) برنامه
  • تعویض داغ(به انگلیسی: Hot swapping) که در آن کد میتواند بدون توقف سیستم تغییر کند .

زبان برنامه نویسی ارلانگ برای خواص زیر شناخته می شود:

  • داده تغییر ناپذیر(به انگلیسی: Immutable data)
  • تطبیق الگو(به انگلیسی: Pattern matching)
  • برنامه نویسی تابعی(به انگلیسی: Functional programming)

ارلنگ در واقع یک زبان اختصاصی در شرکت اریسکون بود که توسط Joe Armstrong ، Robert Virding و Mike Williams در سال 1986 توسعه پیدا کرده بود،اما در سال 1998 به عنوان یک زیان متن باز منتشر شد . Erlang/OTP توسط واحد محصول OTP در اریکسون پشتیبانی و نگهداری میشود .

تاریخچه[ویرایش]

نام "ارلنگ" به Bjarne Däcker نسبت داده شده است ،توسط کسانی که بر روی تعویض تلفن کار میکنند تصور میشود به یک مرجع که یک ریاضی دان دانمارکی است و مهندس ارلنگ Agner Krarup به بعوان یک مخفف هیجانی "زبان اریکسون" داده شده است .

ارلانگ با هدف بهبود و توسعه برنامه های کاربردی تلفن طراحی شده است.نسخه اولیه ارلانگ در پرولگ (به انگلیسی: Prolog) اجرا شد و توسط زبان برنامه نویسی مورد استفاده در PLEX مبادلات زودتر اریکسون تأثیر پذیرفته بود.در سال 1988 ارلانگ ثابت کرده بود که برای نمونه سازی مبادلات تلفنی مناسب است، اما در prolog بسیار آهسته اجرا میشد.یک گروه از متخصصان اریکسون تخمین زده بودند که برای استفاده از محصولشان سرعت آن باید 40 بار سریعتر شود.در سال 1992 کار بر روی ماشین مجازی BEAM که ارلنگ را به زبان C با استفاده از ترکیبی از کد های کامپایل شده محلی و کد های نخ بندی شده برای اعتصاب یک تعادل بین عملکرد و فضای دیسک شروع شد.با توجه به گفته های آرمسترانگ،این زبان از یک محصول آزمایشگاهی به یک محصول واقعی پس از رسیدن به نسل جدید و تبدیل نام AXE به AXE-N در سال 1995 تبدیل شد .در نتیجه، Erlang برای آینده دستگاه خودپرداز تبادل AXD انتخاب شد.

در سال 1998 اریکسون از سوئیچ AXD301 اطلاع داد ،که شامل بیش از یک میلیون خط از ارلنگ می شد و از در دسترس بودن بالای 9 گزارش داد . مدت کوتاهی پس از آن ، سیستم رادیو ارلنگ استفاده از ارلنگ برای محصول جدید در مصارف خانگی را ممنون کرد ، این اتفاق با استناد به اولویت زبان های غیر رسمی روی داد. این ممنوعیت باعث شد آرمسترانگ و دیگران شرکت اریکسون را ترک کنند . اجرای متن باز کردن این زبان در انتهای همین سال روی داد . سرانجام با برداشتن این ممنوعیت اریسون دوباره آرمسترانگ را در سال 2004 استخدام کرد .

در سال 2006، پشتیبانی از چند پردازنده ای متقارن محلی به سیستم زمان اجرا و ماشین مجازی اضافه شد.

جهان بینی ارلنگ

دیدگاه ارلنگ از جهان ، از زبان آرمسترانگ ، شرکت سازنده ارلنگ که خلاصه ای از آن را در پایان نامه دکترای خود به شرح زیر آورده :

  • همه چیز یک فرایند است.
  • فرایند ها به شدت منزوی هستند.
  • ایجاد و نخریب فرایند یک عملیات سبک وزن است.
  • عبور پیام تنها راه تعامل فرایند هاست.
  • فرایند ها نام های منحصر به فردی دارند.
  • اگر شما نام یک فرایند را بدانید میتوانید به آن پیام ارسال کنید.
  • فرایند ها بدون منبع به اشتراک گذاشته می شوند.
  • دست زدن به خطا (به انگلیسی: Error handling) غیر محلی است.
  • فرایند ها کار هایی که پشتیبانی میکنند را انجام میدهند که منجر به انجام یا شکست می شود.

جو آرمسترانگ در سال 2013 در مصاحبه با Rackspace اشاره میکند: "اگر جاوا یک بار نوشته شود و همه جا اجرا شود ، پس ارلنگ یک بار نوشته میشود و همیشه اجرا میشود."

استفاده

ارلنگ در حال حاضر توسط شرکت ها از جمله Nortel و T-Mobile اتخاذ شده است.ارلنگ در گره پشتیبانی اریکسون ، و 3G ، GPRS و شبکه های LTE در سرار جهان مورد استفاده قرار می گیرد .
[۱] [۲]

نمونه برنامه نویسی تابعی[ویرایش]

یک تابع ارلنگ که از توابع بازگشتی برای شمارش تا ده استفاده میکند:

1 -module(count_to_ten).
2 -export([count_to_ten/0]).
3  
4 count_to_ten() -> do_count(0).
5  
6 do_count(10) -> 10;
7 do_count(N) -> do_count(N + 1).

الگوریتم اجرای فاکتوریل در ارلنگ :

-module(fact).    % This is the file 'fact.erl', the module and the filename must match
-export([fac/1]). % 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([fib/1]). % 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([qsort/1]). % 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([Pivot|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([Front || Front <- Rest, Front < Pivot]) ++ 
    [Pivot] ++
    qsort([Back || Back <- Rest, Back >= Pivot]).

در مثال بالا تابع فراخوانی بازگشتی مرتب سازی سریع تا زمانی که چیزی برای مرتب سازی باقی نمانده باشد ادامه پیدا میکند .
عبارت [Front || Front <- Rest, Front < Pivot] یک لیست درک است ، به این معنی "ساخت یک لیست از عناصر Front به طوری که Front عضو Rest است ، و Front کمتر از Pivot است." ++ عملگر الحاق لیست است .
یک تابع مقایسه می توان برای سازه های پیچیده تر به خاطر خوانایی استفاده می شود.
کد زیر لیست ها را بر اساس طول مرتب میکند :

% This is file 'listsort.erl' (the compiler is made this way)
-module(listsort).
% Export 'by_length' with 1 parameter (don't care about the type and name)
-export([by_length/1]).

by_length(Lists) -> % Use 'qsort/2' and provides an anonymous function as a parameter
   qsort(Lists, fun(A,B) -> length(A) < length(B) end).

qsort([], _)-> []; % If list is empty, return an empty list (ignore the second parameter)
qsort([Pivot|Rest], Smaller) ->
    % Partition list with 'Smaller' elements in front of 'Pivot' and not-'Smaller' elements
    % after 'Pivot' and sort the sublists.
    qsort([X || X <- Rest, Smaller(X,Pivot)], Smaller)
    ++ [Pivot] ++
    qsort([Y || Y <- Rest, not(Smaller(Y, Pivot))], Smaller).

در اینجا، دوباره یک Pivot از اولین پارامتر داده شده به ()qsort گرفته شده است و نام لیست rest را Rest قرار داده است . توجه داشته باشید که بیان

[X || X <- Rest, Smaller(X,Pivot)]

تفاوتی با حالت زیر ندارد

[Front || Front <- Rest, Front < Pivot]

(در مثال قبل)به جز برای استفاده از یک تابع مقایسه ای در آخرین بخش ، صدا زدن"ساخت یک لیست از عناصر X به طوری که X یک عضو از Rest است ، و Smaller درست می باشد." با Smaller از پیش تعریف شده مانند

fun(A,B) -> length(A) < length(B) end

توجه داشته باشید تابع بی نامی که Smaller ، در لیست پارامتر تعریف دوم qsort هست را میتوان با نامی که در تابع اشاره شده نامید .

انواع داده[ویرایش]

Integers

اعداد صحیح به عنوان دنباله ای از اعداد اعشاری نوشته شده است، به عنوان مثال، 12، 12375 و -23،427 اعداد صحیح هستند.علم حساب اعداد صحیح دقیق و تنها محدود به حافظه موجود بر روی دستگاه است.

Atoms

اتم ها در یک برنامه برای نشان دادن ارزش های متمایز استفاده می شود. آنها به صورت رشته ای از کاراکترهای الفبایی متوالی نوشته می شوند، اولین کاراکتر که حروف کوچک است. اتم ها می توانند شامل هر کاراکتر باشند اگر آنها در نقل قول های محصور و یک کنوانسیون فرار وجود داشته باشد که اجازه می دهد هر کاراکتر در یک اتم استفاده شود.

Floats

عداد ممیز شناور از IEEE 754 بیتی64 استفاده میکند.

References

مراجع نماد های منحصر به فرد جهانی هستند که تنها ویژگی آنها این است که می توان آنها را برای برابری مقایسه کرد.

Binaries

دودویی دنباله ای از بایت است. باینری راه صرفه جویی در فضای ذخیره سازی داده های دودویی را ارائه می دهد.

Pids

pid برای شناسایی فرایند کوتاه است.pid توسط ارقام ابتدایی ارلانگ ایجاد می شود.

Ports

Ports برای برقراری ارتباط با دنیای خارج استفاده می شود. پورت ها با function-built-in open_port ایجاد می شوند. پیام ها را می توان به پورت ها ارسال و دریافت کرد، اما این پیام ها باید به اصطلاح "پروتکل پورت" مطابقت داشته باشند.

Funs

Funs تابع بسته است. Funs توسط عبارات فرم ایجاد می شود: Fun(...) -> ... end

Tuples

Tupels ظروف برای تعداد ثابت از انواع داده ارلانگ هستند. نحو {D1 , D2, ...,Dn} یک تابع را نشان می دهد که استدلال آن D1, D2, ...,Dn است. استدلال می تواند نوع داده های اولیه یا انواع داده های ترکیب باشد. هر عنصر یک دوره زمانی می تواند در زمان ثابت مشاهده شود.

Lists

لیست ها ظروف برای تعداد متغیری از انواع داده Erlang هستند. نحو [Dh | Dt] یک لیست را نشان می دهد که اولین عنصر آن Dh است و عناصر باقی مانده آن Dt است. نحو [] یک لیست خالی را نشان می دهد. نحو [D1، D2، ..، Dn] کوتاه است برای [D1 | [D2 | .. | [Dn | []]]]. اولین عنصر از یک لیست در زمان ثابت قابل دسترسی است. اولین عنصر از لیست، سر لیست است. باقی مانده از یک لیست زمانی که سر آن حذف شده است دم لیست است.

Maps

نقشه ها دارای تعداد متغیری از ارتباطات کلیدی ارزش هستند. نحو به این صورت # {Key1 => Value1، ...، KeyN => ValueN} است.

Strings

رشته ها مابین نقل قول دوتایی نوشته می شوند. این یک نحو جالب برای نمایش دنباله ای از کدهای اسکی و یا لیستی از کارکتر ها می باشد . بنابراین، به عنوان مثال، رشته "CAT" به صورت [99،97،116] کوتاه می شود. این پشتیبانی جزئی برای رشته Unicode است.

Records

سوابق یک راه مناسب برای ارتباط یک برچسب با هر یک از عناصر در یک تاپل فراهم می کند. این موضوع اجازه می دهد تا به یک عنصر از یک تاپل با نام و نه با موقعیت اشاره کرد. یک پیش کامپایلر طول می کشد رکوردتعریف و جایگزین آن با مرجع تاپل مناسب شود.


بارگذاری کد و ماژولهای جدید[ویرایش]

ارلنگ از بروزرسانی برنامه هایی با سطح زبان پویا پشتیبانی میکند. برای اجرای این ، کد به عنوان یک واحد "ماژول" بارگذاری و مدیریت میشود; ماژول یک واحد تلفیقی است. سیستم می تواند همزمان دو نسخه از یک ماژول را در حافظه نگه دارد و فرایندها می توانند همزمان هر یک از کد ها را اجرا کنند. به نسخه ها با نسخه های جدید و قدیمی مراجعه میشود . فرایندها تا زمانی که یک تماس خارجی به ماژول آن ایجاد نشود به نسخه جدید تبدیل نمیشوند.

یک مثال از مکانیزم بارگیری کد :

  %% A process whose only job is to keep a counter.
  %% First version
  -module(counter).
  -export([start/0, codeswitch/1]).

  start() -> loop(0).

  loop(Sum) ->
    receive
       {increment, Count} ->
          loop(Sum+Count);
       {counter, Pid} ->
          Pid ! {counter, Sum},
          loop(Sum);
       code_switch ->
          ?MODULE:codeswitch(Sum)
          % Force the use of 'codeswitch/1' from the latest MODULE version
    end.

  codeswitch(Sum) -> loop(Sum).

برای نسخه دوم، ما امکان اضافه کردن شمارش به صفر را اضافه می کنیم.

  %% Second version
  -module(counter).
  -export([start/0, codeswitch/1]).

  start() -> loop(0).

  loop(Sum) ->
    receive
       {increment, Count} ->
          loop(Sum+Count);
       reset ->
          loop(0);
       {counter, Pid} ->
          Pid ! {counter, Sum},
          loop(Sum);
       code_switch ->
          ?MODULE:codeswitch(Sum)
    end.

  codeswitch(Sum) -> loop(Sum).

منابع[ویرایش]

  1. Wikipedia contributors, "Erlang (programming language)," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Erlang_(programming_language)&oldid=417616995 (accessed March 10, 2011).
  2. Wikipedia contributors, "Erlang (programming language)," Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/wiki/Erlang_(programming_language)