ภาษาลูอา

ลูอา ("-ə"; จาก แปลว่า "ดวงจันทร์") เป็นภาษาโปรแกรมระดับสูง น้ำหนักเบา หลายกระบวนทัศน์ ออกแบบมาสำหรับการฝังตัวในแอพพลิเคชัน ลูอาเป็นภาษาแบบข้ามแพลตฟอร์มเนื่องจากตัวแปลรหัสไบต์ที่คอมไพล์ถูกเขียนด้วย ANSI C และลูอามี C API ที่แบบง่ายสำหรับฝังลงในแอปพลิเคชัน
ลูอาได้รับการออกแบบในปี 1993 เพื่อเป็นภาษาสำหรับการเพิ่มเติมลงในแอพพลิเคชั่นซอฟต์แวร์เพื่อตอบสนองความต้องการสำหรับการปรับแต่งที่เพิ่มขึ้นในเวลานั้น มีสิ่งอำนวยความสะดวกพื้นฐานของภาษาโปรแกรมส่วนใหญ่ แต่ไม่รวมคุณสมบัติที่ซับซ้อนหรือเฉพาะโดเมน แต่มีกลไกในการขยายภาษาทำให้โปรแกรมเมอร์สามารถใช้คุณสมบัติดังกล่าวได้ เนื่องจากลูอาตั้งใจให้เป็นภาษาส่วนขยายที่ฝังได้ทั่วไป นักออกแบบของลูอาจึงมุ่งเน้นไปที่การปรับปรุงความเร็ว การพกพา ความสามารถในการขยาย และความสะดวกในการพัฒนา
คุณสมบัติ.
ไวยากรณ์.
โปรแกรมเฮลโลเวิลด์สามารถเขียนได้ดังนี้
print("Hello World!")
หรือ:
print 'Hello World!'
คำอธิบายเริ่มต้นด้วยสองยัติภังค์ (<code>--</code>) และสิ้นสุดบนบรรทัดนั้น สำหรับคำอธิบายหลายบรรทัดสามารถใช้วงเล็บก้ามปูติดกันสองตัว (<code>-- --</code>)
ฟังก์ชันสำหรับแฟกทอเรียลสามารถเขียนได้ดังนี้
function factorial(n)
 local x = 1
 for i = 2, n do
 x = x * i
 end
 return x
end
การควบคุมการไหล.
ลูอามีการทำซ้ำอยู่สี่แบบ: <code>while</code> loop, <code>repeat</code> loop (คล้ายกับ <code> do while</code> loop), <code>for</code> loop แบบตัวเลข และ <code>for</code> loop ทั่วไป
--condition = true
while condition do
 --statements
end
repeat
 --statements
until condition
for i = first, last, delta do --delta may be negative, allowing the for loop to count down or up
 --statements
 --example: print(i)
end
<code>for</code> loop แบบทั่วไป:
for key, value in pairs(_G) do
 print(key, value)
end
จะวนซ้ำบนตาราง <code>_G</code> โดยใช้ฟังก์ชันมาตรฐาน <code>pairs</code> วนซ้ำจนกว่าจะคืนค่า <code>nil</code>
การวนซ้ำยังสามารถใช้ซ้อนทับกันได้
local grid = {
 { 11, 12, 13 },
 { 21, 22, 23 },
for y, row in ipairs(grid) do
 for x, value in ipairs(row) do
 print(x, y, grid[y][x])
 end
end
ฟังก์ชัน.
การที่ลูอาใช้ฟังก์ชันแบบค่า first-class แสดงให้เห็นในตัวอย่าง โดยที่ฟังก์ชัน print ถูกแก้ไข:
do
 local oldprint = print
 -- เก็บฟังก์ชั้น print ปัจจุบันเป็น oldprint
 function print(s)
 -- ตั้งฟังก์ชัน print ใหม่. print เดิมยังสามารถใช้งานได้ผ่าน oldprint 
 อันใหม่มีแค่ argument เดียว
 oldprint(s == "foo" and "bar" or s)
 end
end
การเรียกใช้ <code>print</code> ต่อจากนี้จะย้ายไปยังฟังก์ชันใหม่ และเพราะ lexical scoping ของลูอา ฟังก์ชัน print เก่าจะสามารถเข้าถึงได้เฉพาะฟังก์ชัน print ใหม่ที่ถูกแก้ไขแล้ว
ลูอาสนับสนุนส่วนปิดคลุม ดังตัวอย่างข้างล่าง:
function addto(x)
 -- ให้ฟังก์ชันใหม่ที่เพิ่ม x ลงใน argument คืน
 return function(y)
 --[=[ เมื่อเรียกใช้ตัวแปร x ซึ่งอยู่ข้างนอก scope ปัจจุบันและมีอายุน้อยกว่าฟังก์ชันนี้
 ลูอาจะสร้างส่วนปิดคลุม]=]
 return x + y
 end
end
fourplus = addto(4)
print(fourplus(3)) -- แสดงผล 7
--นอกจากนั้นยังเรียกใช้ตามนี้ได้:
print(addto(4)(3))
-- เพราะว่าเราเรียกฟังก์ชันที่ส่งกลับมาจาก ด้วย argument 4 โดยตรง สิ่งนี้ช่วยลดราคาข้อมูลและประสิทธิภาพจากถูกเรียกซ้ำ ๆ
ส่วนปิดคลุมสำหรับตัวแปร <code>x</code> สร้างขึ้นทุกครั้งที่ <code>addto</code> ถูกเรียก นั่นทำให้ฟังก์ชันใหม่ที่ถูกคินค่าจะเข้าถึง parameter <code>x</code> ของตัวเองเสมอ ส่วนปิดคลุมควบคุมด้วยที่เก็บขยะของลูอาคล้ายกับวัตถุอื่น ๆ
การใช้งาน.
ในการพัฒนาวิดีโอเกม ลูอาถูกใช้อย่างกว้างขวางในฐานะภาษาสคริปต์โดยโปรแกรมเมอร์ส่วนใหญ่ เนื่องจากความง่ายในการฝัง การดำเนินการที่รวดเร็ว และช่วงการเรียนรู้ที่สั้น
ในปี 2003 การสำรวจความคิดเห็นของ GameDev.net พบว่าลูอาเป็นภาษาสคริปต์ที่ได้รับความนิยมมากที่สุดสำหรับการเขียนโปรแกรมเกม เมื่อวันที่ 12 มกราคม 2012 ลูอาได้รับการประกาศให้เป็นผู้ชนะรางวัล Front Line Award 2011 จากนิตยสาร Game Developer ในหมวด Programming Tools
ยังมีการใช้งานที่ไม่ใช่เกมจำนวนมากที่ใช้ลูอาสำหรับการขยายเช่น LuaTeX ซึ่งมาจากภาษาเรียงพิมพ์ TeX, Redis, ฐานข้อมูลคีย์-ค่า, Neovim, โปรแกรมแก้ไขข้อความ และเว็บเซิร์ฟเวอร์ Nginx
ผ่านส่วนขยาย Scribunto ลูอายังใช้เป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ในซอฟต์แวร์มีเดียวิกิที่ใช้ที่ขับเคลื่อนวิกิพีเดียและวิกิอื่น ๆ ตัวอย่างการใช้งานเช่นเป็นตัวช่วยให้สามารถรวมข้อมูลจากวิกิสนเทศลงในบทความได้ และทำให้ใช้ระบบตารางจำแนกพันธุ์อัตโนมัติได้