موضوع مقاله: لوآ | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # لوآ | مقدمه: زبان لوآ با ساختار پردازه‌نویسی (برنامه‌نویسی اسکریپتی) و با هدف داشتن قابلیت‌های گسترش‌پذیر طراحی شده‌است. | ## بخش 1: لوآ | واژه «لوآ» در زبان پرتغالی به معنی «ماه» است فلسفه اولیه ساخت این زبان، استفاده از آن به عنوان یک زبان عمومی و ساده پردازه‌نویسی بود. در پردازه‌نویسی برای انجام توصیفات پیچیده از یک زبان نهفته شده در یک زبان دیگر استفاده می‌شود. به خاطر سبک بودن کتابخانه لوآ، می‌توان لوآ را با تمام قابلیت‌ها به عنوان یک زبان نهفته در سی استفاده نمود. در طراحی لوآ سعی شده‌است از فرا ساز و کارها بیشتر استفاده شود تا در عین کوچکی، انعطاف‌پذیری زبان افزایش یابد. در طراحی لوآ شبیه به آیکون است، شاید به این علت که هر دو از اسنوبال تأثیر پذیرفته‌اند. زبان لوآ در طول زمان تغییر می‌کند، قابلیت‌هایی از آن کاسته و قابلیت‌هایی بر آن افزوده می‌شوند. اکنون این زبان در نسخه ۵٫۴٫۴ قرار دارد (۱۴۰۱) لوآ در صنعت بازی‌های ویدئویی محبوبیت زیادی دارد. تاریخچه لوآ در سال ۱۹۹۳ توسط روبرتو یروسالیمچی، لوییز هنریک دی فیگوئردو و والدمر سلس، اعضای تِکگِراف - گروه تکنولوژی گرافیک کامپیوتر (TecGraph) در PUC-Rio، دانشگاه مسیحی ریو د ژانیرو در برزیل ساخته شد. از سال ۱۹۷۷ تا ۱۹۹۲ در برزیل قوانین سخت تجارت خارجی روی سخت‌افزار و نرم‌افزار وجود داشت. این قوانین از انگیزه ملی توانایی ساخت نرم‌افزار و سخت‌افزار در داخل برزیل نشات گرفته بود. این قوانین موجب شد که تکگراف نه از نظر اقتصادی و نه سیاسی امکان داشته باشد که بتواند نرم‌افزار آماده شده از خارج کشور خریداری کند. به جز این مسئله، جدایی جغرافیای برزیل از بقیه مراکز تحقیقات و توسعه، موجب شد که تکگراف ابزارهایی که نیاز داشت را از هیچ تولید کند. این دو زبان به‌طور مستقل در سال‌هال ۱۳۷۰–۱۳۷۱ در تکگراف توسعه یافتند تا این دو پروژهٔ متفاوت را منعطف‌تر کنند (هر دوی این پروژه‌ها برنامه‌های گرافیکی تعاملی برای کاربردهای مهندسی در شرکت پتروبرس بودند. در SOL و DEL ساختارهای کنترلی وجود نداشت و نیاز به یک زبان برنامه‌سازی کامل‌تر احساس می‌شد. «در ۱۳۷۱ تنها رقیب اصلی لوآ تیکل بود، که به‌طور صریح برای استفاده نهفته در برنامه‌ها طراحی شده بود. اما تیکل نحوی ناآشنا داشت، پشتیبانی کافی از توصیف داده نداشت و فقط روی محیط یونیکس قابل استفاده بود. در جو آزاد و مستقل تکگراف تقریباً عادی بود که ما باید زبان پردازه‌نویسی خودمان را اختراع می‌کردیم… به این علت که خیلی از کاربران محتمل زیان برنامه‌نویسان حرفه‌ای نبودند، زبان باید از نحو و مفاهیم مرموز خودداری می‌کرد. پیاده‌سازی زبان جدید باید قابلیت اجرا روی محیط‌های مختلف را می‌داشت چون کاربران تکگراف انواع متمایزی رایانه در اختیار داشتند. | ## بخش 2: لوآ | در نهایت، از آنچه که ما انتظار داشتیم که محصولات دیگر تکگراف هم نیاز به نهفتن یک زبان پردازه‌نویسی داشتند، زبان جدید باید مثال SOL را ادامه می‌داد و به عنوان کتاب‌خانه‌ای همراه API سی ارائه می‌شد.» در نتیجه لوآ به دنیا آمد. سازنده‌های اشیا لوآی ۱٫۰ که آن زمان کمی متفاوت از حالت سبُک و انعطاف‌پذیر امروزی متفاوت بودند، نحو توصیف دادهٔ SOL را به کار گرفته بودند (ریشه نام لوآ از همین‌جا می‌آید، sol در زبان پرتغالی یه معنای خورشید است و لوآ به معنای ماه). لوآ همچنین از ++C (تعریف محدودتر حوزه متغیرها)، آوک و سنوبال (آرایه‌های انجمنی) هم تأثیر گرفته‌است. در یک مقاله منتشر شده در مجله «Dr Dobb's Journal»، سازندگان لوآ همچنین اذعان می‌کنند که زبان لیسپ و شما هم با داده ساختار تکین خود (لیست) تأثیر مهمی روی تصمیم سازندگان بر استفاده از جدول به عنوان داده ساختار اولیه داشتند. مفاهیم فعلی لوآ بیشتر از شما گرفته شده‌اند: «از نظر مفهوم لوآ شباهت‌های زیادی به شما دارد، گرچه این شباهت‌ها مستقیماً دیده نمی‌شوند، چون این دو زبان تفاوت‌های نحوی زیادی دارند. تأثیر شما روی لوآ به تدریج در زمان تکامل لوآ افزایش یافته‌است: در ابتدا شما فقط زبانی در پس‌زمینه بود اما بعداً به تدریج به عنوان منبعی برای ایده گرفتن مهم شد، به خصوص به خاطر معرفی توابع ناشناس و حوزه‌بندی کامل» کاربردها لوآ در صنعت بازی‌های ویدئویی محبوبیت زیادی دارد. در لوآ همچون زبان‌های پردازه‌نویسی دیگر تابع اصلی (main) وجود ندارد (می‌توان اینطور تصور کرد که کل برنامه یک تابع اصلی است). هر بلوک کد لوآ یا مربوط به مقداردهی متغیر است یا اینکه اجرای یک تابع خاص می‌باشد. در لوآ مستقیماً قابلیت‌های زیادی وجود ندارد، بلکه هر برنامه‌نویس با فرا ساز و کارهای تعبیه شده می‌تواند قابلیت لازم خود را اضافه کند. عوض کردن تابع print تعریف شده در لوآ به گونه‌ای که رفتار آن فقط به ازای حالت خاص ورودی "foo" تفاوت کند. سیستم تایپ لوآ دارای نوع پویا (Dynamic Type) است، یعنی نوع متغیرها در لوآ در زمان کامپایل مشخص نمی‌شود، بلکه هر متغیر در زمان اجرا نوعش تعیین می‌شود. زمانی که برنامه‌نویس به آن متغیر مقداردهی کند، نوع متغیر بسته به چیزی که در آن ذخیره می‌گردد تعیین می‌شود. جدول: جدول ساختمان داده‌ای شبیه آرایه است، اما می‌توان از هر تایپی (عدد، رشته، ...) برای اندیس‌گذاری در آن استفاده کرد. داده کاربر: برای پیوند میان لوآ و C باید اشاره‌گرها را بتوان در لوآ استفاده کرد. جدول ساختمان داده‌ای شبیه آرایه است، اما می‌توان از هر تایپی (عدد، رشته، ...) برای اندیس‌گذاری در آن استفاده کرد. قبل از اینکه بتوان از عملگر استفاده کرد باید متغیر مربوط را مقدار دهی اولیه به مقداری جدولی کرد. داده‌ساختار جدول (از دید برنامه‌نویس) شبیه جدولی است که دو ستون دارد: در ستون اول تعدادی صفت مشخص شده‌است (مثلاً رنگ، اندازه، ...). برنامه‌نویس می‌تواند یک سطر به جدول اضافه کند، یک سطر را حذف کند یا مقدار ستون دوم یک سطر را تغییر دهد. | ## بخش 3: لوآ | همهٔ این اعمال با این نحو انجام می‌شود: t[x] = a که در آن t یک جدول است و x نام ستون است. اگر x مقداری بوده که قبلاً هم در جدول بوده (در ستون اول)، آنگاه مقدار روبروی آن x می‌شود. اگر x قبلاً در جدول نبوده آنگاه یک سطر جدید اضافه می‌شود که در ستون اول آن x و در ستون دوم a آمده‌است. به این ترتیب یک جدول که اندیس‌هایش اعداد صحیح ۱ تا n هستند می‌تواند بیانگر مفهوم یک آرایه یاشد. اگر این امکان نباشد خطای زمان اجرا پیش می‌آید (البته می‌توان با فراجدول‌ها بعضی از این خطاها را مهار کرد) پس در صورتی که نمونه‌ای خصوصیات کافی داشته باشد، از نظر مفهومی به عنوان یک نمونه از یک کلاس خاص محسوب می‌شود. سازوکار تولید مثل برای ساده‌سازی فرایند نمونه‌سازی لوآ از سازوکار تولید مثل استفاده می‌کند. در این سازکار، یک نمونه ساخته می‌شود و سپس از تابعی کمکی استفاده می‌شود تا مانند آن نمونه به تعداد کافی ساخته شود. این تابع یک متغیر می‌گیرد و اولین عضو بعد از آن در جدول را برمی‌گرداند (توجه کنید که اعضا در جدول با ترتیبی تعریف نشده نگهداری می‌شوند). این قابلیت به لوآ امکانات زیادی می‌دهد از جمله تولید مثل اشیا یا ذخیره‌سازی و بازیابی تمام متغیرهای عمومی. متغیرهای عمومی در همه جا قابل دسترسی هستند اما متغیرهای محلی فقط در بدنه همان تابع یا توابع تعریف شده در درون آن تابع قابل دسترسی هستند. برای اینکه احاطه برنامه‌نویس بر روند اجرا بیشتر شود، قابلیت فراجدول به زبان اضافه شد. این قابلیت اجازه می‌دهد که به جای رخ دادن خطاهای زمان اجرا تابعی از پیش تعیین شده توسط کاربر اجرا شود. این تابع وضعیت خطا را بررسی می‌کند و می‌تواند هم فعالیتی را در این زمان انجام دهد (مثلاً ضبط این موضوع که خطا رخ داده در یک فایل) یا اینکه یک مفهوم جدید برای عمل تعریف نشده تعریف کند. در مثال بالا جمع دو جدول را این‌گونه تعریف کرد که مقادیر متناظر نام‌های یکسان را جمع می‌کنیم (اگر مقداری در جدول اول بود که متناظری در جدول دوم نداشت حاصل nil می‌شود). عقب‌گردان‌ها به علت مشکلاتی که در خوانایی و قابلیت نگهداری و استفاده دوباره کد ایجاد می‌کردند از نسخه ۳٫۰ به بعد از زبان حذف شدند. این زبان باید با زبان پردازه‌نویسی داخلی از طریق یک لایه ارتباط برقرار کند، که آن رابط ربن (برنامه‌نویسی نرم‌افزار) است. لایه ربن در لوآ نسبتاً ساده است، چون برخلاف پایتون مدیریت ارجاع در آن نیاز نیست. | ## جمع‌بندی | ربن لوآ همچون خود زبان کمینه است: عملکرد پیشرفته‌تر توسط کتاب‌خانهٔ کمکی پشتیبانی می‌شود، که شامل ماکروهای تعریف شده زیادی است که عملیات پیچیده جدولی را آسان می‌کند.