تاریخچهای کوتاه از Erlang
با وجود اینکه Erlang در سال ۱۹۸۶ معرفی شد (تنها دو سال پس از تولد نویسنده متن اصلی)، آشنایی با آن تا حدود سال ۲۰۱۷ اتفاق نیفتاد. در نقش یک توسعهدهنده وب، نخستین برخورد با Erlang در سناریویی رخ داد که برای بسیاری آشناست: RabbitMQ. در آن زمان، RabbitMQ در پروژهای استفاده میشد که دارای یک فرایند ETL بسیار پیچیده و زمانبر بود. نیاز اصلی پروژه سرعت، همزمانی بالا و قفلگذاری امن رکوردها بود. بعدها مشخص شد که دلیل توانمندی RabbitMQ در پاسخگویی به این نیازها، این است که بهطور خاص با Erlang و دقیقاً برای چنین الزامات سختگیرانهای نوشته شده است.
با توجه به اینکه Erlang در سال ۲۰۲۵ بهعنوان دومین زبان با بالاترین میانگین حقوق معرفی شده است، این سؤال مطرح میشود که Erlang دقیقاً چیست و چه کاربردهای مشخصی دارد؟
چشمانداز شکلگیری
نقطه شروع هر روایت فنی، شناسایی شکاف موجود است. PHP بهعنوان یک ابزار اسکریپتی برای تولید پویای صفحات HTML متولد شد و JavaScript ابتدا با نام LiveScript برای اجرای کد در مرورگرها شکل گرفت. از سال ۱۹۹۵ تاکنون، هر دو زبان بهدلیل نیازهای روزافزون، آنچنان تکامل یافتهاند که تقریباً غیرقابل شناسایی شدهاند.
Erlang نیز بهشکلی مشابه، اما با هدفی کاملاً مشخص متولد شد: ارتباطات. در آن دوران، صنعت مخابرات به زبانی نیاز داشت که بتواند مقیاسپذیری عظیم، همزمانی بسیار بالا و اجرای بلادرنگ را پشتیبانی کند. تولد Erlang به توسعه سوئیچ ATM به نام AXD301 بازمیگردد که توسط Ericsson ساخته شد؛ سیستمی که نیازمند سطحی از دسترسپذیری موسوم به «نهتا نه» (nine-nines) بود. به زبان ساده، این یعنی نرمافزار باید نرخ دسترسپذیری ۹۹.۹۹۹۹۹۹۹٪ داشته باشد. در آن زمان، هیچ زبان برنامهنویسیای برای پاسخ به چنین نیازی وجود نداشت.
تکامل
Erlang از دسامبر ۱۹۹۸ و با تصمیم Ericsson برای متنباز کردن زبان، بهطور جدی مورد توجه قرار گرفت. با انتشار عمومی زبان، پروژههای بیرونی نیز شکل گرفتند و بهتدریج منابع و مستنداتی پدید آمدند که نحوه استفاده از Erlang و قویترین موارد کاربرد آن را مشخص میکردند.
«بگذار خراب شود» (Let It Crash)
یکی از مفاهیم متفاوت در Erlang این است که توسعهدهندگان عملاً تشویق میشوند اجازه دهند فرایندها شکست بخورند. در بسیاری از سبکهای برنامهنویسی سنتی، برنامهنویسی تدافعی یک اصل اساسی است. اما Erlang بهعنوان یک زبان بکاند کلاسیک مبتنی بر سرور طراحی نشده است.
دلیل قابلقبول بودن خرابیها در Erlang این است که کدها به قطعات کوچک و ایزوله تقسیم میشوند که هرکدام بهصورت مستقل اجرا میگردند. اجرای اپلیکیشن بر عهده سیستمهای ناظر (Supervisor) است که فرایندهای از کار افتاده را شناسایی کرده و مجدداً راهاندازی میکنند. این فلسفه منجر به دسترسپذیری بالا میشود: مهم نیست یک پردازش در همان لحظه کامل شود، بلکه مهم این است که داده موردنظر در نهایت منتقل شود.
همین ویژگی باعث شده Erlang بهطور گسترده در بازارهای ارتباطی استفاده شود. تابآوری ذاتی این زبان دلیل اصلی انتخاب آن برای توسعه RabbitMQ است. همچنین توضیح میدهد چرا پیامرسانهایی مانند WhatsApp با Erlang و Discord با Elixir (زبانی مبتنی بر Erlang که روی ماشین مجازی BEAM اجرا میشود) ساخته شدهاند. این موضوع همچنین روشن میکند چرا Erlang در بسترهای ارتباطی بهطور گسترده حضور دارد.
همزمانی (Concurrency)
توانایی Erlang در مدیریت چنین سطحی از همزمانی از کجا میآید؟ توسعهدهندگان وب معمولاً با مفاهیمی مانند Async/Promise یا مدل تکریسمانی Node.js آشنا هستند. اما Erlang مسیر متفاوتی را انتخاب کرده است.
بهجای تکیه بر ریسههای سیستمعامل، Erlang دارای ماشین مجازی اختصاصی خود به نام BEAM است که فرایندهای بسیار سبکوزن را مدیریت میکند. BEAM میتواند با سرعت بسیار بالا بین این فرایندها جابهجا شود و همین ویژگی امکان اجرای همزمان میلیونها فرایند را فراهم میسازد.
مشاهده شکستها
تحمل خطا در Erlang از طریق ساختاری به نام درختهای نظارتی (Supervision Trees) پیادهسازی میشود. این الگوی طراحی داخلی بخشی از هسته Open Telecom Platform (OTP) است که میتوان آن را معادل کتابخانه استاندارد در سایر زبانها دانست.
در این ساختار، شبکهای از ناظران بر فرایندها نظارت میکنند و توسعهدهندگان را بهجای استفاده از الگوهای سنتی try-catch، به بازراهاندازی فرایندها تشویق مینمایند.
مقاوم در برابر همهچیز: تعویض کد در زمان اجرا (Hot Swapping)
برخی قابلیتها در زبانهای برنامهنویسی میتوانند واقعاً شگفتانگیز باشند. یکی از این قابلیتها در Erlang، امکان تعویض کد در حال اجرا بدون توقف ماشین مجازی است.
از آنجا که تحمل خطا در هسته طراحی Erlang قرار دارد، میتوان کد زنده را جایگزین کرد بدون اینکه سرویس متوقف شود. اگر این سؤال وجود داشته باشد که پیامرسانهایی مانند WhatsApp چگونه حجم عظیمی از بهروزرسانیها را تقریباً بدون downtime مدیریت میکنند، پاسخ در همین ویژگی نهفته است.
جمعبندی
در این مطلب، فلسفه اصلیای که Erlang را به آنچه امروز هست تبدیل کرده بررسی شد. این پیشزمینه نشان میدهد چرا Erlang انتخابی ایدهآل نهتنها برای پیامرسانی و ارتباطات، بلکه برای هر سیستمی است که به سطح بالایی از دسترسپذیری و تحمل خطا نیاز دارد.
همچنین کاربرد Erlang در حوزه پایگاه داده قابل توجه است؛ موضوعی که توضیح میدهد چرا CouchDB و Riak نیز با Erlang توسعه داده شدهاند. از این رو، برای توسعهدهندگانی که به ساخت بکاندهای IoT یا یکپارچهسازی APIهای شبکه علاقهمند هستند، Erlang میتواند گزینهای جدی و قابل تأمل باشد.
