لوآ یک زبان اسکریپتنویسی سبک و سطح بالا است که عمدتاً برای سیستمها و برنامههای جاسازیشده طراحی شده است. این زبان که در ابتدا در برزیل توسعه یافته، به خاطر سادگی، کارایی و قابلیت حملپذیریاش شناخته شده است. لوآ به طور گستردهای در توسعه بازی، برنامههای وب و به عنوان یک زبان اسکریپتنویسی در پلتفرمهای نرمافزاری مختلف مورد استفاده قرار میگیرد. این زبان دارای یک نحو ساده و ویژگیهای قدرتمندی است که شامل توابع درجه یک، بستهها و مدیریت خودکار حافظه میشود.
لوآ در اوایل دهه 1990 در دانشگاه کاتولیکا پاپی ریو دو ژانیرو در برزیل ایجاد شد. هدف اولیه این زبان ارائه یک راهحل اسکریپتنویسی انعطافپذیر و قابل گسترش برای برنامههای پردازش داده بود. خالقان اصلی—رابرتو ایروسالیمنسکی، لوئیز هنریکه د فیگیردو و والدیمار سِلِس—در تلاش بودند زبانی توسعه دهند که به راحتی در نرمافزارهای موجود ادغام شود.
در طول سالها، لوآ به طور قابل توجهی تکامل یافته در حالی که اصول اصلی سادگی و کارایی خود را حفظ کرده است. اولین نسخه رسمی، لوآ 1.0، در سال 1993 منتشر شد و نسخههای بعدی بهبودها و ویژگیهای جدیدی را معرفی کردند. تا سال 2006، لوآ 5.1 منتشر شد که یک نقطه عطف مهم با معرفی سیستم ماژول و بهبود در کوروتینها بود. امروزه، لوآ در نسخه 5.4 (تا سال 2020) قرار دارد که قابلیتهای آن را به ویژه در زمینههای عملکرد و جمعآوری زباله بیشتر میکند.
فلسفه طراحی لوآ از چندین زبان مانند C، جاوااسکریپت و اسکیما الهام گرفته است، اما در طراحی سبک و توابع درجه یک خود متمایز باقی مانده است. لوآ همچنین به خاطر قابلیت تعامل با سایر زبانهای برنامهنویسی شناخته شده است که ادغام آسانی را در برنامههای C، C++ و جاوا فراهم میکند.
لوآ عمدتاً به عنوان یک زبان اسکریپتنویسی جاسازیشده در برنامهها استفاده میشود و نقش برجستهای در توسعه بازی از طریق موتورهایی مانند یونیتی و کرونا SDK دارد. طبیعت سبک آن آن را برای برنامههای ابری، سرورهای وب و دستگاههای IoT ایدهآل میسازد.
لوآ یک زبان با نوعگذاری پویا است، به این معنی که نیازی به اعلام نوع داده یک متغیر به طور صریح نیست. به عنوان مثال:
x = 10 -- x یک عدد است
x = "Hello" -- حالا x یک رشته است
در لوآ، توابع به عنوان مقادیر درجه یک شناخته میشوند، به این معنی که میتوانند به متغیرها اختصاص داده شوند، به عنوان آرگومانها منتقل شوند و از توابع دیگر بازگردانده شوند.
function add(a, b)
return a + b
end
sum = add
print(sum(5, 10)) -- خروجی: 15
جداول ساختار داده اصلی در لوآ هستند که به عنوان آرایهها، دیکشنریها و اشیاء عمل میکنند.
myTable = {key1 = "value1", key2 = "value2"}
print(myTable.key1) -- خروجی: value1
لوآ از بستهها پشتیبانی میکند که به توابع اجازه میدهد متغیرهای محیط اطراف خود را ضبط کنند.
function counter()
local count = 0
return function()
count = count + 1
return count
end
end
myCounter = counter()
print(myCounter()) -- خروجی: 1
print(myCounter()) -- خروجی: 2
لوآ از کوروتینها پشتیبانی میکند که تسهیلکننده چندوظیفگی تعاونی هستند.
co = coroutine.create(function ()
for i = 1, 5 do
coroutine.yield(i)
end
end)
print(coroutine.resume(co)) -- خروجی: true 1
print(coroutine.resume(co)) -- خروجی: true 2
لوآ از متا جداول برای تغییر رفتار جداول استفاده میکند و امکان بارگذاری مجدد عملگرها را فراهم میآورد.
mt = {}
mt.__add = function(t1, t2)
return t1[1] + t2[1]
end
setmetatable(t1, mt)
setmetatable(t2, mt)
print(t1 + t2) -- خروجی: نتیجه بر اساس پیادهسازی
مدیریت رشته در لوآ ساده است و دارای توابع داخلی برای عملیاتهایی مانند الحاق و تطابق الگو است.
str = "Hello, "
str = str .. "World!" -- الحاق
print(str) -- خروجی: Hello, World!
لوآ یک مکانیزم ساده برای مدیریت خطا از طریق تابع pcall
فراهم میکند.
function riskyFunction()
error("یک خطا رخ داده است!")
end
status, err = pcall(riskyFunction)
print(status) -- خروجی: false
print(err) -- خروجی: یک خطا رخ داده است!
لوآ مدیریت حافظه خودکار را از طریق یک جمعآور زباله شامل میشود که به طور خودکار حافظههای استفاده نشده را بازیابی میکند.
-- لوآ به طور خودکار حافظه را مدیریت میکند؛ نیازی به مدیریت صریح نیست
لوآ از ماژولها پشتیبانی میکند تا به جداسازی و سازماندهی کد کمک کند و شیوههای برنامهنویسی مدولار را تقویت کند.
-- mymodule.lua
local mymodule = {}
function mymodule.sayHello()
print("سلام از mymodule!")
end
return mymodule
-- main.lua
local mymodule = require("mymodule")
mymodule.sayHello() -- خروجی: سلام از mymodule!
لوآ میتواند به راحتی در برنامهها جاسازی شود و از API C خود استفاده کند، به این معنی که هر برنامهای معمولاً میتواند اسکریپتهای لوآ را اجرا کند. مفسر لوآ سبک است و میتواند اسکریپتها را در هر محیطی که از C پشتیبانی میکند، اجرا کند.
لوآ میتواند به طور مؤثری با استفاده از IDEهای مختلف توسعه یابد، از جمله:
برای ساخت یک پروژه در لوآ، معمولاً اسکریپتهای لوآ خود را مینویسید و اگر یک برنامه از کتابخانه لوآ استفاده میکند، برنامه میزبان را که کد لوآ را فراخوانی میکند، کامپایل میکنید. اسکریپتهای لوآ معمولاً با پسوند .lua
ذخیره میشوند و از طریق خط فرمان با استفاده از lua script.lua
اجرا میشوند.
لوآ به طور گستردهای در موارد زیر استفاده میشود:
لوآ اغلب در مقایسه با چندین زبان قرار میگیرد:
لوآ به ویژه در موقعیتهایی که اندازه و سرعت حیاتی هستند، ارزشمند است و آن را به یک انتخاب محبوب برای توسعهدهندگان بازی و سیستمهای جاسازیشده تبدیل میکند. بر خلاف C++، جاوا یا C# که ممکن است بار اضافی قابل توجهی داشته باشند، طبیعت سبک لوآ اجازه میدهد تا تکرارهای سریعتر و مصرف منابع کمتری داشته باشد.
هنگام ترجمه کد لوآ به زبان دیگر، مهم است که به نکات زیر توجه کنید:
در حال حاضر، هیچ ابزار ترجمه منبع به منبع محبوبی به طور خاص برای لوآ وجود ندارد، اما برخی ابزارهای عمومی مانند SWIG (Simplified Wrapper and Interface Generator) میتوانند برای ارتباط لوآ با کدهای C/C++ استفاده شوند و اجازه میدهند تا سطحی از ادغام یا ترجمه بین دو زبان وجود داشته باشد.