لوا زبان نامرئی که هر روز با آن کار می‌کنیم

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

مهندسان معمولاً با زبان لوا اپلیکیشن مستقل نمی‌سازند؛ آن‌ها سیستم‌هایی توسعه می‌دهند که لوا را درون خود پذیرا می‌شود. همین تمایز ظریف، راز ماندگاری این تکنولوژی از سال ۱۹۹۳ تا امروز را تشکیل می‌دهد و نشان می‌دهد چرا یک زبان نسبتاً ساده توانسته لایه‌ی عصبی هزاران نرم‌افزار حیاتی جهان را مدیریت کند.

پیدایش: زبانی که برای جاسازی خلق شد

داستان لوا به سال ۱۹۹۳ و آزمایشگاه تکگراف در دانشگاه پوک-ریو برزیل برمی‌گردد. سه مهندس محسوب‌شده‌ی برزیلی به نام‌های روبِرْتو ایروزالیمیشی، لوئیس هنریک دِ فیگِرِئیدو و والدمار سلِس، زبانی را طراحی کردند که قرار نبود با جاوا یا پایتون برای توسعه‌ی اپلیکیشن‌های سطح کاربر رقابت کند. هدف آن‌ها چیز دیگری بود: خلق یک مغز کم‌حجم که بتواند منطق قابل‌سفارشی‌سازی و هشد را به هسته‌ی برنامه‌های حجیم تزریق کند، بدون آن‌که بار پردازشی سنگینی تحمیل نماید.

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

چرا لوا بر جنگ پلتفرم‌ها پیروز شد؟

مجموعه اجرایی به‌شدت فشرده

شگفت‌انگیزترین ویژگی لوا، ابعاد فیزیکی آن است. مفسر کامل لوا تنها حدود ۲۰۰ کیلوبایت فضا اشغال می‌کند. برای درک مقیاس این تفاوت، نگاهی به رقبای مستقیم بیندازید:

  • مفسر پایتون حدود ۴ مگابایت است که کتابخانه‌ی استاندارد آن ۳۰ مگابایت دیگر به آن می‌افزاید.
  • موتور وی۸ برای جاوااسکریپت حدود ۲۰ مگابایت حجم دارد.
  • ماشین مجازی جاوا بیش از ۲۰۰ مگابایت فضا می‌طلبد.

وقتی هدف اصلی، تزریق زبان اسکریپت‌نویسی به دل یک سیستم از پیش موجود است، این شکاف حجمی تعیین‌کننده است. یک موتور بازی‌سازی می‌تواند لوا را بدون بالا بردن چشمگیر سایز نهایی برنامه، در خود جای دهد. یک روتر شبکه با فلش ۱۶ مگابایتی یا حتی یک میکروکنترلر ضعیف، قادر به اجرای لوا هستند. در محیط‌هایی که هر کیلوبایت بودجه‌بندی شده است، تفاوت میان ران‌تایم ۲۰۰ کیلوبایتی و ۲۰ مگابایتی یک بهینه‌سازی معمولی نیست؛ بلکه خط بطلانی است بین قابلیت عرضه و ناممکن مطلق.

رابط برنامه‌نویسی سی به‌سبکی زبان می‌شود

ارتباط لوا با برنامه‌ی میزبان از طریق یک رابط مبتنی بر پشته (Stack-based) انجام می‌شود که تنها شامل حدود ۸۰ تابع پایه است. تعامل هسته‌ی سی با اسکریپت‌های لوا بسیار شهودی و خطی طراحی شده است:

lua_State *L = luaL_newstate();
lual_openlibs(L);
lual_dofile(L, "config.lua");
lua_getglobal(L, "max_connections");
int max_conn = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_getglobal(L, "on_request");
lua_pushstring(L, "/api/users");
lua_pushinteger(L, 200);
lua_call(L, 2, 1);
const char *result = lua_tostring(L, -1);
lua_pop(L, 1);
lua_close(L);
نمونه کد تعامل زبان سی با زبان لوا

مقایسه‌ی این شیوه با فرآیندهای پیچیده‌ی جاسازی پایتون یا وی۸ گویای همه‌چیز است. پایتون نیازمند مدیریت دستی شمارش مراجع، آزادسازی قفل مفسر سراسری و سربار سیستم ایمپورت ماژول است. وی۸ نیز پیچیدگی‌هایی در مدیریت ایزوله‌ها و کانتکست‌های جاوااسکریپت به همراه می‌آورد. در مقابل، رابط لوا چنان صریح طراحی شده که یک برنامه‌نویس سی می‌تواند آن را در عرض یک بعدازظهر مسلط شود. تیم‌های مهندسی معمولاً در همان روز نخست ادغام، کدهای عملیاتی خود را با هسته‌ی سی هماهنگ می‌کنند. این سرعت یادگیری و استقرار، مزیتی است که پیاده‌سازی معادل آن در محیط‌های جاوااسکریپت یا پایتون همچنان چالشی دشوار باقی می‌ماند.

مدیریت حافظه و اجرای هم‌زمان بدون گره‌خوردگی

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

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