زبان برنامه نویسی ارلنگ - مقدمه

ارلنگ چیست؟

اولش این رو بگم که ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است.

اگه تا حالا با زبان‌های دستوری کار کرده باشین عباراتی مثل ++i ممکنه براتون عادی باشه اما در برنامه نویسی تابع‌گرا مجاز نیست. در واقع تغییر دادن مقدار یک متغیر شدیدا ممنوعه!‍‍‍ ممکنه عجیب و غریب به نظر بیاد ولی اگه کلاس ریاضی رو یادتون باشه چیزی که یادگرفتین این بود:‍‍‍‍‍‍

y = 2
x = y + 3
x = 2 + 3
x = 5

اگه اینو اضافه کنیم:

x = 5 + 1
x = x
∴ 5 = 6‍‍

گیج شدین؟! برنامه‌نویس‍‍ی تابع‌گرا این را به رسمیت میشناسه. اگه ما بگیم که x برابر است با 5؛ منطقا نمتونیم مدعی باشیم برابر 6 هم هست! و همچنین اینکه یک تابع با پارامتر یکسان همیشه یه چیز برمیگردونه:

x = add_two_to(3) = 5
∴ x = 5

خروجی توابع با پارمترهای یکسان همیشه یکی است و تغییر نمی‌کنه که به این اصل referential transparency میگیم. این اصل چیزیه که اجازه میده add_two_to(3) رو با 5 جاگزین کنیم؛ در نتیجه 3+2 همیشه برابر با 5 است. این به این معنی است که میتونیم چندین تابع رو به هم بچسبونیم تا یک مسئله پیچیده تر رو حل کنیم بدون اینکه مشکلی پیش بیاد. منطقی و تروتمیز. اینجوری نیست؟ مشکلی هست این وسط:

x = today() = 2018/10/22
-- یک روز صبر کنین --
x = today() = 2018/10/23
x = x
∴ 2018/10/22 = 2018/10/23

وای نه! معادله زیبای من! ناگهان همه چیز اشتباه میشه! چجوریه میشه وقتی که خروجی تابع من هر روز فرق می‌کنه؟

مشخصا مواردی وجود داره که خوبه referential transparency نقض بشه. ارلنگ رویکرد عملگرایی با برنامه نویسی تابع‌گرا داره: پیروی کنید از اصلی ترین ویژگی ها (پرهیز کردن از تغییر دادن داده، referential transparency و غیره) اما وقتی به مسائل دنیای واقعی برخوردید این اصول رو نقض کنید .

الان ارلنگ رو تعریف میکنیم: ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است، اما با تاکید بسیار زیاد روی همزمانی(concurrency) و قابلیت اطمینان بالا (high reliability). ارلنگ برای اینکه بتواند ده‌ها کار رو همزمان انجام بدهد از مدل بازیگر (actor model) بهره می‌برد و هر بازیگر یک فرایند (process) ماشین مجازی است. اگه شما یه بازیگر در جهان ارلنگ بودید، یک شخص تنهایی هستید که در یک اتاق تاریک بدون پنچره نشسته‌اید و منتظرین تا یک نامه‌ای رو از صندوق‌ پستی بگیرین. وقتی که نامه رو گرفتین، یک کار مشخصی میکنین: صورتحساب رو پرداخت میکنین وقتی که یک صورتحساب گرفتین؛ وقتی یه کارت تبربک گرفتین، یه نامه «تشکر» مینویسین و بی‌خیال نامه هایی میشین که درکی ازش ندارین.


مدل بازیگر رو میشه اینجوری تصور کرد: جهانی که هر کس تنها توی اتاق خودش نشسته و میتونه چند تا کار مشخصی رو انجام بده. همه افراد فقط با نامه باهم ارتباط برقرار میکنن. همزمانی که ممکنه یه زندگی حصوله سر بر باشه به معنی این هم هست که شما از افراد دیگه درخواست میکنین که کارای خیلی خاصی رو براتون انجام بدن و هیچکدومشون کارشون رو اشتباه انجام نمیدن یا کاری نمیکن که پیامدی توی کار دیگران داشته باشه؛ ممکنه اونها حتی از وجود افرادی غیر از شما اطلاعی نداشته باشن.

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

وقتی ما ارلنگ رو تعریف میکردیم در سطح زبان بودیم ولی در یک معنای وسیعتر این همه اون چیزی نیست که وجود داره؛ ارلنگ یک محیط توسعه هم هست. کد به بایت‌کد ترجمه میشود و داخل ماشین مجازی اجرا می‌شود. بنابراین ارلنگ شبیه جاوا و بچه‌هاش همه جا میتونن اجرا بشن. توزیع استاندارد ارلنگ شامل ابزار‌های توسعه ( کامپایلر، دیباگر، پروفایلر و فریمورک تست)، فریمورک OTP، یک وب سرور،پایگاه داده mnesia؛ یک سیستم ذخیره سازی کلید-مقدار که میتونه خودشو روی چندین سرور توزیع کنه؛از تراکنش های چند سطحی پشتیبانی میکنه و اجازه میده بهتون هر نوع داده‌ی ارلنگ رو ذخیره کنین.

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

جلوتر میبینم که چجوری از این ابزارها استفاده میشه ولی برای الان بزارید یک قانون کلی در ارلنگ رو بگم: «بزار سقوط کنه!» نه شبیه یک هواپیما با ده‌ها مسافر که دارن میمیرن بلکه بیشتر شبیه کسی که در ارتفاع روی یک توری مطمئن داره راه میره. درحالی که شما سعی میکنین اشتباه نکنین، نیازی هم نیست که هر نوع خطا یا شرایط خطا رو در اغلب موارد چک کنین.

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

خیلی نوشابه نخورین!

ارلنگ در بعضی زمینه ها خیلی خوبه و عشاق ارلنگ ممکنه چیزایی بیشتر از اون چیزی که واقعا هست بگن.

اولین مورد مربوط به قابلیت مقیاس پذیری بالای ارلنگ هست که ناشی از فرایندهای سبکش هست: درسته که فرایند‌های ارلنگ خیلی سبکه و شما میتونین صدها و هزارها فرایند همزمان داشته باشین،اما به این معنی نیست که فرایندها رو ایجاد کنین فقط به خاطر اینکه میتونین داشته باشین. مثلا در یک بازی تفنگی، اینکه هرچیزی حتی گلوله ها بازیگر خودشون رو داشته باشن دیوانگیه. برای ارسال پیام از یک بازیگر به بازیگر دیگه هنوز هزینه اندکی وجود داره و اگه خیلی کارها رو بشکنین فقط کارها رو کندتر کردین!

بعدا با عمق بیشتری این مباحث رو پوشش میدیم اما در ذهنتون داشته باشین که برای حل یک مسئله کافی نیست به صورت تصادفی همزمانی رو ایجاد کنیم و کارها سریعتر انجام بشه. غمگین نشین؛ موقعیت‌هایی وجود داره که استفاده از صدها فرایند، هم ممکنه و هم مفیده؛ فقط همیشه این اتفاق نمی‌افته.

همچنین گفته میشه که ارلنگ میتونه به تناسب تعداد هسته cpu به صورت خطی مقیاس پذیر باشه، اما این حرف معمولا درست نیست: این کار امکان پذیره ولی اغلب مسائل جوری نیستند که شما بتونین فقط همه چیز رو در یک زمان اجرا کنین و مشکل حل بشه.

یه چیز دیگه هم هست که تو ذهنتون داشته باشین: در حالی که ارلنگ بعضی کارها رو خوب انجام میده، میشه همون نتیجه رو با یک زبان دیگه هم گرفت، برعکسش هم درسته؛ نیاز هست که هر مسئله‌ای درست ارزیابی بشه و متناسب با اون ابزارش هم انتخاب بشه. ارلنگ در بعضی زمینه‌ها آش دهن سوزی نیست، مخصوصا برای کارهایی مثل پردازش تصویر، درایور سیستم عامل و غیره و در برخی زمینه ها هم عالیه مثل نرم‌افزاهای بزرگ سروری (مثل صف، نگاشت-کاهش)، پیاده سازی پروتکل های سطح بالاتر، پیام‌رسان و غیره. موضوعات این وسط بستگی به شما داره. الزاما خودتون رو در ارلنگ به نرم‌افزار های سروری محدود نکنین. مواردی وجود داره که افراد کارهای غیرمنتظره و شگفت‌انگیزی هم انجام دادن، مثلا ربات IANO که توسط تیم UNICT درست شده و برای هوش مصنوعی این ربات از ارلنگ استفاده شده و در مسابقات یوروبات ۲۰۰۹ مدال نقره رو هم برنده شده. مثال دیگه‌ش Wings 3D هست، یک مدل کننده سه بعدی (نه رندرکننده) که متن بازه و با ارلنگ نوشته شده و بنابراین چند سکویی هم هست.

برای شروع چه چیزی نیاز دارین؟

یک ادیتور نیاز دارین و یک محیط ارلنگ. کدمنبع و نصاب ویندوزش رو میتونین از سایت رسمی ارلنگ دریافت کنین. در ویندوز کافیه دریافت کنین و اجراش کنین؛ فقط یادتون باشه مسیر نصب رو داخل PATH سیستم عامل قرار بدین تا همه جا در دسترس باشه.

روی لینوکس هم به راحتی و با دستور زیر نصب کنین

apt-get install erlang # debain based linux
yum install erlang # redhat based linux

روز خوش یا هم شب بخیر!