ภาษาลูอา

**ลูอา** (; ) เป็นภาษาโปรแกรมระดับสูง ประเภทน้ำหนักเบา (lightweight) และเป็นหลายกระบวนทัศน์ ที่ออกแบบมาเพื่อใช้เป็นภาษาสคริปต์สำหรับฝังตัว (embedded use) ในแอปพลิเคชันเป็นหลัก ลูอาเป็นซอฟต์แวร์ที่ทำงานได้ข้ามแพลตฟอร์ม เนื่องจากตัวอินเทอร์พรีเตอร์ของไบต์โค้ดที่ผ่านการคอมไพล์แล้วนั้นเขียนขึ้นด้วยANSI C และมีส่วนต่อประสานโปรแกรมประยุกต์ (API) ในภาษาซีที่ค่อนข้างเรียบง่ายสำหรับการนำไปฝังไว้ในตัวแอปพลิเคชันต่าง ๆ

ลูอาถือกำเนิดขึ้นในปี ค.ศ. 1993 ในฐานะภาษาสำหรับขยายขีดความสามารถของซอฟต์แวร์ประยุกต์ เพื่อตอบสนองความต้องการในการปรับแต่งซอฟต์แวร์ที่เพิ่มมากขึ้นในขณะนั้น ตัวภาษาเตรียมสิ่งอำนวยความสะดวกพื้นฐานของการเขียนโปรแกรมเชิงขั้นตอนส่วนใหญ่เอาไว้ แต่จะไม่รวมคุณสมบัติที่ซับซ้อนหรือคุณสมบัติที่เป็นภาษาเฉพาะโดเมน (domain-specific) เข้ามาโดยตรง ทว่าลูอาจะใช้กลไกในการขยายตัวภาษาเพื่อให้โปรแกรมเมอร์สามารถนำคุณสมบัติเหล่านั้นไปพัฒนาต่อยอดเองได้ เนื่องด้วยลูอาถูกออกแบบมาให้เป็นภาษาขยายซอฟต์แวร์ที่ฝังตัวได้ทั่วไป ผู้ออกแบบจึงมุ่งเน้นไปที่การปรับปรุงประสิทธิภาพในด้านความเร็ว, ความสามารถในการพอร์ต, ความสามารถในการขยายตัว และความง่ายในการใช้งานเพื่อการพัฒนา

## คุณสมบัติ
### ไวยากรณ์
โปรแกรมเฮลโลเวิลด์สามารถเขียนได้ดังนี้

```lua
print("Hello World!")
```

หรือ:

```lua
print 'Hello World!'
```


คำอธิบายเริ่มต้นด้วยสองยัติภังค์ (`--`) และสิ้นสุดบนบรรทัดนั้น สำหรับคำอธิบายหลายบรรทัดสามารถใช้วงเล็บก้ามปูติดกันสองตัว (`--[[ ]]--`)

ฟังก์ชันสำหรับแฟกทอเรียลสามารถเขียนได้ดังนี้


```lua
function factorial(n)
  local x = 1
  for i = 2, n do
    x = x * i
  end
  return x
end
```


### การควบคุมการไหล
ลูอามีการทำซ้ำอยู่สี่แบบ: <code>while</code> loop, `repeat` loop (คล้ายกับ <code> do while</code> loop), <code>for</code> loop แบบตัวเลข และ `for` loop ทั่วไป

```lua
--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 แบบทั่วไป:

```lua
for key, value in pairs(_G) do
  print(key, value)
end
```

จะวนซ้ำบนตาราง `_G` โดยใช้ฟังก์ชันมาตรฐาน `pairs` วนซ้ำจนกว่าจะคืนค่า `nil`

การวนซ้ำยังสามารถใช้ซ้อนทับกันได้

```lua
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 ถูกแก้ไข:

```lua
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 ใหม่ที่ถูกแก้ไขแล้ว

ลูอาสนับสนุนส่วนปิดคลุม ดังตัวอย่างข้างล่าง:

```lua
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 ลูอายังใช้เป็นภาษาสคริปต์ฝั่งเซิร์ฟเวอร์ในซอฟต์แวร์มีเดียวิกิที่ใช้ที่ขับเคลื่อนวิกิพีเดียและวิกิอื่น ๆ ตัวอย่างการใช้งานเช่นเป็นตัวช่วยให้สามารถรวมข้อมูลจากวิกิสนเทศลงในบทความได้ และทำให้ใช้ระบบตารางจำแนกพันธุ์อัตโนมัติได้

## อ้างอิง

หมวดหมู่:ภาษาลูอา
หมวดหมู่:ภาษาสคริปต์
หมวดหมู่:ซอฟต์แวร์ในปี พ.ศ. 2536