ลูอา (ภาษาโปรแกรม)
ลูอา (/ˈluːə/ loo-ə; จากโปรตุเกส: lua [ˈlu.(w)ɐ] แปลว่า ดวงจันทร์) เป็นภาษาโปรแกรมระดับสูง น้ำหนักเบา หลายกระบวนทัศน์ ออกแบบมาสำหรับการฝังตัวในแอพพลิเคชัน ลูอาเป็นภาษาแบบข้ามแพลตฟอร์มเนื่องจากตัวแปลรหัสไบต์ที่คอมไพล์ถูกเขียนด้วย ANSI C และลูอามี C API ที่แบบง่ายสำหรับฝังลงในแอปพลิเคชัน
นามสกุลของไฟล์ | .lua |
---|---|
กระบวนทัศน์ | หลายกระบวนทัศน์: สคริปต์, เชิงคำสั่ง (procedural, prototype-based, เชิงวัตถุ), เชิงฟังก์ชัน |
เริ่มเมื่อ | 1993 |
ออกแบบโดย | Roberto Ierusalimschy Waldemar Celes Luiz Henrique de Figueiredo |
รุ่นเสถียร | 5.4.2 (3 ธันวาคม 2020 | )
ระบบชนิดตัวแปร | Dynamic, strong, duck |
ตัวแปลภาษาหลัก | Lua, LuaJIT, LuaVela |
ภาษาย่อย | Metalua, Idle, GSL Shell, Luau |
ได้รับอิทธิพลจาก | C++, CLU, Modula, Scheme, SNOBOL |
ส่งอิทธิพลต่อ | GameMonkey, Io, JavaScript, Julia, MiniD, Red, Ring, Ruby, Squirrel, MoonScript, C-- |
ภาษาโปรแกรม | ANSI C |
ระบบปฏิบัติการ | ข้ามแพลตฟอร์ม |
สัญญาอนุญาต | สัญญาอนุญาต MIT |
เว็บไซต์ | www |
ลูอาได้รับการออกแบบในปี 1993 เพื่อเป็นภาษาสำหรับการเพิ่มเติมลงในแอพพลิเคชั่นซอฟต์แวร์เพื่อตอบสนองความต้องการสำหรับการปรับแต่งที่เพิ่มขึ้นในเวลานั้น มีสิ่งอำนวยความสะดวกพื้นฐานของภาษาโปรแกรมส่วนใหญ่ แต่ไม่รวมคุณสมบัติที่ซับซ้อนหรือเฉพาะโดเมน แต่มีกลไกในการขยายภาษาทำให้โปรแกรมเมอร์สามารถใช้คุณสมบัติดังกล่าวได้ เนื่องจากลูอาตั้งใจให้เป็นภาษาส่วนขยายที่ฝังได้ทั่วไป นักออกแบบของลูอาจึงมุ่งเน้นไปที่การปรับปรุงความเร็ว การพกพา ความสามารถในการขยาย และความสะดวกในการพัฒนา
คุณสมบัติ
ไวยากรณ์
โปรแกรมเฮลโลเวิลด์สามารถเขียนได้ดังนี้
print("Hello World!")
หรือ:
print 'Hello World!'
คำอธิบายเริ่มต้นด้วยสองยัติภังค์ (--
) และสิ้นสุดบนบรรทัดนั้น สำหรับคำอธิบายหลายบรรทัดสามารถใช้วงเล็บก้ามปูติดกันสองตัว (--[[ ]]--
)
ฟังก์ชันสำหรับแฟกทอเรียลสามารถเขียนได้ดังนี้
function factorial(n) local x = 1 for i = 2, n do x = x * i end return x end
การควบคุมการไหล
ลูอามีการทำซ้ำอยู่สี่แบบ: while
loop, repeat
loop (คล้ายกับ do while
loop), for
loop แบบตัวเลข และ for
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
for
loop แบบทั่วไป:
for key, value in pairs(_G) do print(key, value) end
จะวนซ้ำบนตาราง _G
โดยใช้ฟังก์ชันมาตรฐาน pairs
วนซ้ำจนกว่าจะคืนค่า nil
การวนซ้ำยังสามารถใช้ซ้อนทับกันได้
local grid = { { 11, 12, 13 }, { 21, 22, 23 }, { 31, 32, 33 } } 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
การเรียกใช้ print
ต่อจากนี้จะย้ายไปยังฟังก์ชันใหม่ และเพราะ 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 โดยตรง สิ่งนี้ช่วยลดราคาข้อมูลและประสิทธิภาพจากถูกเรียกซ้ำ ๆ ]]
ส่วนปิดคลุมสำหรับตัวแปร x
สร้างขึ้นทุกครั้งที่ addto
ถูกเรียก นั่นทำให้ฟังก์ชันใหม่ที่ถูกคินค่าจะเข้าถึง parameter x
ของตัวเองเสมอ ส่วนปิดคลุมควบคุมด้วยที่เก็บขยะของลูอาคล้ายกับวัตถุอื่น ๆ
ตาราง
การใช้งาน
ในการพัฒนาวิดีโอเกม ลูอาถูกใช้อย่างกว้างขวางในฐานะภาษาสคริปต์โดยโปรแกรมเมอร์ส่วนใหญ่ เนื่องจากความง่ายในการฝัง การดำเนินการที่รวดเร็ว และช่วงการเรียนรู้ที่สั้น
ในปี 2003 การสำรวจความคิดเห็นของ GameDev.net พบว่าลูอาเป็นภาษาสคริปต์ที่ได้รับความนิยมมากที่สุดสำหรับการเขียนโปรแกรมเกม เมื่อวันที่ 12 มกราคม 2012 ลูอาได้รับการประกาศให้เป็นผู้ชนะรางวัล Front Line Award 2011 จากนิตยสาร Game Developer ในหมวด Programming Tools
ยังมีการใช้งานที่ไม่ใช่เกมจำนวนมากที่ใช้ลูอาสำหรับการขยายเช่น LuaTeX ซึ่งมาจากภาษาเรียงพิมพ์ TeX, Redis, ฐานข้อมูลคีย์-ค่า, Neovim, โปรแกรมแก้ไขข้อความ และเว็บเซิร์ฟเวอร์ Nginx
ผ่านส่วนขยาย Scribunto ลูอายังใช้เป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ในซอฟต์แวร์มีเดียวิกิที่ใช้ที่ขับเคลื่อนวิกิพีเดียและวิกิอื่น ๆ ตัวอย่างการใช้งานเช่นเป็นตัวช่วยให้สามารถรวมข้อมูลจากวิกิสนเทศลงในบทความได้ และทำให้ใช้ระบบตารางจำแนกพันธุ์อัตโนมัติได้
อ้างอิง
- Ring Team (5 December 2017). "The Ring programming language and other languages". ring-lang.net. ring-lang.
- Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Filho, Waldemar Celes (June 1996). "Lua—An Extensible Extension Language". Software: Practice and Experience. 26 (6): 635–652. doi:10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P. สืบค้นเมื่อ 24 October 2015.
- "About Lua". Lua.org. สืบค้นเมื่อ 2011-08-11.
- Yuri Takhteyev (21 April 2013). "From Brazil to Wikipedia". Foreign Affairs. สืบค้นเมื่อ 25 April 2013.
- . Archived from the original on 20 August 2013. สืบค้นเมื่อ 2017-04-22.CS1 maint: BOT: original-url status unknown (link)
- . Archived from the original on 7 December 2003. สืบค้นเมื่อ 2017-04-22.CS1 maint: BOT: original-url status unknown (link)
- . Archived from the original on 15 June 2013. สืบค้นเมื่อ 2017-04-22.CS1 maint: BOT: original-url status unknown (link)
- "Extension:Scribunto - MediaWiki". MediaWiki.org. สืบค้นเมื่อ 21 February 2019.
- "Wikipedia:Lua". สืบค้นเมื่อ 2018-12-19.
- "Wikidata:Infobox Tutorial - Wikidata". www.wikidata.org. สืบค้นเมื่อ 2018-12-21.