ข้ามไปเนื้อหา

ภาษาลูอา

จากวิกิพีเดีย สารานุกรมเสรี
Lua
กระบวนทัศน์หลายกระบวนทัศน์: สคริปต์, เชิงคำสั่ง (procedural, prototype-based, เชิงวัตถุ), เชิงฟังก์ชัน
ผู้ออกแบบRoberto Ierusalimschy
Waldemar Celes
Luiz Henrique de Figueiredo
เริ่มเมื่อ1993; 31 ปีที่แล้ว (1993)
รุ่นเสถียร
5.4.2 / 3 ธันวาคม 2020; 4 ปีก่อน (2020-12-03)
ระบบชนิดตัวแปรDynamic, strong, duck
ภาษาโปรแกรมANSI C
ระบบปฏิบัติการข้ามแพลตฟอร์ม
สัญญาอนุญาตสัญญาอนุญาต MIT
นามสกุลของไฟล์.lua
เว็บไซต์www.lua.org
ตัวแปลภาษาหลัก
Lua, LuaJIT, LuaVela
ภาษาย่อย
Metalua, Idle, GSL Shell, Luau
ได้รับอิทธิพลจาก
C++, CLU, Modula, Scheme, SNOBOL
ส่งอิทธิพลต่อ
GameMonkey, Io, JavaScript, Julia, MiniD, Red, Ring,[1] Ruby, Squirrel, MoonScript, C--

ลูอา (/ˈlə/ loo; จากโปรตุเกส: lua [ˈlu.(w)ɐ] แปลว่า ดวงจันทร์) เป็นภาษาโปรแกรมระดับสูง น้ำหนักเบา หลายกระบวนทัศน์ ออกแบบมาสำหรับการฝังตัวในแอพพลิเคชัน[2] ลูอาเป็นภาษาแบบข้ามแพลตฟอร์มเนื่องจากตัวแปลรหัสไบต์ที่คอมไพล์ถูกเขียนด้วย ANSI C[3] และลูอามี C API ที่แบบง่ายสำหรับฝังลงในแอปพลิเคชัน[4]

ลูอาได้รับการออกแบบในปี 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 ของตัวเองเสมอ ส่วนปิดคลุมควบคุมด้วยที่เก็บขยะของลูอาคล้ายกับวัตถุอื่น ๆ

ตาราง

[แก้]

การใช้งาน

[แก้]

ในการพัฒนาวิดีโอเกม ลูอาถูกใช้อย่างกว้างขวางในฐานะภาษาสคริปต์โดยโปรแกรมเมอร์ส่วนใหญ่ เนื่องจากความง่ายในการฝัง การดำเนินการที่รวดเร็ว และช่วงการเรียนรู้ที่สั้น[5]

ในปี 2003 การสำรวจความคิดเห็นของ GameDev.net พบว่าลูอาเป็นภาษาสคริปต์ที่ได้รับความนิยมมากที่สุดสำหรับการเขียนโปรแกรมเกม[6] เมื่อวันที่ 12 มกราคม 2012 ลูอาได้รับการประกาศให้เป็นผู้ชนะรางวัล Front Line Award 2011 จากนิตยสาร Game Developer ในหมวด Programming Tools[7]

ยังมีการใช้งานที่ไม่ใช่เกมจำนวนมากที่ใช้ลูอาสำหรับการขยายเช่น LuaTeX ซึ่งมาจากภาษาเรียงพิมพ์ TeX, Redis, ฐานข้อมูลคีย์-ค่า, Neovim, โปรแกรมแก้ไขข้อความ และเว็บเซิร์ฟเวอร์ Nginx

ผ่านส่วนขยาย Scribunto ลูอายังใช้เป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ในซอฟต์แวร์มีเดียวิกิที่ใช้ที่ขับเคลื่อนวิกิพีเดียและวิกิอื่น ๆ[8][9] ตัวอย่างการใช้งานเช่นเป็นตัวช่วยให้สามารถรวมข้อมูลจากวิกิสนเทศลงในบทความได้[10] และทำให้ใช้ระบบตารางจำแนกพันธุ์อัตโนมัติได้

อ้างอิง

[แก้]
  1. Ring Team (5 December 2017). "The Ring programming language and other languages". ring-lang.net. ring-lang. คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2018-12-25. สืบค้นเมื่อ 2021-01-18.
  2. 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.
  3. "About Lua". Lua.org. สืบค้นเมื่อ 2011-08-11.
  4. Yuri Takhteyev (21 April 2013). "From Brazil to Wikipedia". Foreign Affairs. สืบค้นเมื่อ 25 April 2013.
  5. "Why is Lua considered a game language?". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 20 August 2013. สืบค้นเมื่อ 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (ลิงก์)
  6. "Poll Results". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 7 December 2003. สืบค้นเมื่อ 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (ลิงก์)
  7. "Front Line Award Winners Announced". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 15 June 2013. สืบค้นเมื่อ 2017-04-22.{{cite web}}: CS1 maint: bot: original URL status unknown (ลิงก์)
  8. "Extension:Scribunto - MediaWiki". MediaWiki.org. สืบค้นเมื่อ 21 February 2019.
  9. "Wikipedia:Lua". สืบค้นเมื่อ 2018-12-19.
  10. "Wikidata:Infobox Tutorial - Wikidata". www.wikidata.org. สืบค้นเมื่อ 2018-12-21.