Lua

Lua
Mẫu hìnhlập trình thủ tục,
lập trình hàm
Thiết kế bởiRoberto Ierusalimschy,
Waldermar Celes,
L.H. Figueiredo
Xuất hiện lần đầu1993
Kiểm tra kiểuđộng
Hệ điều hànhđa nền tảng
Giấy phépgiấy phép MIT
Trang mạnglua.org
Các bản triển khai lớn
Lua, murgaLua,
Ảnh hưởng từ
Scheme, ALGOL

Lua là một ngôn ngữ lập trình thông dịch với đặc điểm nhỏ gọn, đa nền tảng. Lua được phát triển từ C và hệ thống các API theo hướng đơn giản hóa.

Lịch sử

[sửa | sửa mã nguồn]

Lua được nhóm chuyên viên khoa học máy tính gồm Roberto Ierusalimschy, Waldermar Celes, L.H. Figueiredo, tại đại học PUC-RIO, Brasil phát triển vào năm 1993. Phát sinh từ nhu cầu có một ngôn ngữ thích hợp để viết những tập tin cấu hình cho các phần mềm chuyên dụng trong ngành dầu khí, các tác giả đã xem xét ngôn ngữ hiện dùng lúc bấy giờ là SOL (Simple Object Language - ngôn ngữ đối tượng đơn giản), để tạo ra một ngôn ngữ có tính năng diễn đạt tốt hơn. Ngôn ngữ này được đặt tên là Lua, có nghĩa là Mặt Trăng theo tiếng Bồ Đào Nha (SOL có nghĩa là Mặt trời).

Tính năng

[sửa | sửa mã nguồn]

Lua có một số ưu điểm nổi bật sau[1]:

  • Dễ đọc, dễ học.
  • Nhỏ gọn: Toàn bộ phần mềm thông dịch Lua cùng mã nguồn, tài liệu hướng dẫn và các ví dụ chỉ gói gọn trong dung lượng 860 KB (phiên bản 5.1.4, không nén).
  • Nhanh: Tốc độ của Lua thuộc vào loại nhanh nhất trong số các ngôn ngữ thông dịch[2].
  • Kết hợp tốt với các ngôn ngữ khác, chẳng hạn C.
  • Đa nền tảng: Chạy trên Windows, Unix, Linux, Mac OS X cùng nhiều hệ điều hành khác.
  • Thư viện chương trình có một số tính năng tốt: xử lý chuỗi, coroutine.
  • Là một trong những ngôn ngữ đang phát triển mạnh

Đặc điểm kĩ thuật

[sửa | sửa mã nguồn]

Lua là ngôn ngữ kiểu động. Các biến được sử dụng mà không cần khai báo trước. Biến trong Lua được mặc định là biến toàn cục (global).

Lua là ngôn ngữ theo thiên hướng lập trình thủ tục. Tuy nhiên trong Lua hàm được coi là kiểu biến cơ bản (first-class variable), giống như lập trình hàm. Ngoài ra Lua còn có một cách khéo léo mô phỏng lập trình hướng đối tượng.

Lua có cấu trúc dữ liệu rất gọn. Chỉ một kiểu số duy nhất (không phân biệt số nguyên, số thực). Kiểu dữ liệu phức hợp gồm một dạng là table, tức là hash-table, associative array hoặc dictionary theo các cách gọi khác nhau.

Từ một kiểu dữ liệu table có thể sử dụng linh hoạt để biểu diễn các kiểu dữ liệu khác. Thật vậy, nếu như kiểu table có dạng tổng quát là {khóa1: giá_trị1, khóa2: giá_trị2,... } thì khi đặt khóa1, khóa2 bằng các số tự nhiên thì ta có kiểu mảng một chiều (kiểu dãy). Ngoài ra, với việc sử dụng metatable ta có thể hình thành các phương thức bằng việc đưa tên hàm vào đóng vai trò của các khóa.

Các bó lệnh (chunk)

[sửa | sửa mã nguồn]

Mặc dù các câu lệnh nên được viết riêng rẽ trên từng dòng, nhưng thực ra Lua có khái niệm bó câu lệnh theo đó có thể viết nhiều câu lệnh trên cùng một dòng, và không nhất thiết có dấu phân cách (; hoặc ,).

-- đây là dòng chú thích
a = 1
b = 2; c = 3 -- phân cách bằng;
d = 4, e = 5 -- phân cách bằng,
f = 6 g = 7 -- cũng hợp lệ!

Cấu trúc

[sửa | sửa mã nguồn]

Các cấu trúc như rẽ nhánh, lặp đều được kết thúc bằng từ khóa dùng chung là end.

for i = 1,10 do
 s = s + i -- không cần khởi tạo s, mặc định s bằng 0 
end

repeat
 s = s - 1
until s < -10

function gttd(x)
 if x > 0 then
 return(x)
 else
 return(-x)
 end
end

Các hàm trong Lua được gọi với cặp ngoặc () truyền thống.

print(2+3)
print("Hello World")

Ngoài ra còn có cú pháp đặc biệt cho phép bỏ cặp ngoặc đơn trong trường hợp tham số có dạng chuỗi hoặc table:

print "Hello World"

Hàm là kiểu dữ liệu cơ bản và có thể gán vào các biến:

gttd = math.abs
print(gttd(-5.7))

Phương thức

[sửa | sửa mã nguồn]

Khi gọi một phương thức có thể sử dụng theo cách truyền thống với dấu chấm hoặc dùng dấu hai chấm. Trong trường hợp thứ hai thì ta lược bỏ đối tượng gọi phương thức trong danh sách tham số:

aFile = io.open("tenfile", "r") -- đọc file sử dụng phương thức open
-- với read là một phương thức của đối tượng aFile trong lớp io 
a = io.read(aFile, "*n") -- đọc số a từ file aFile
a = aFile:read("*n") -- cách 2

Kiểu table

[sửa | sửa mã nguồn]
tuoi = {Britney=27, Andy=26} -- một kiểu datatable
print(tuoi["Britney"], tuoi["Andy"])
print(tuoi.Britney, tuoi.Andy) -- syntactic sugar

-- dãy số chính phương
day = {[1] = 1, [2] = 4} -- tương đương với dòng lệnh dưới...
day = {1, 4} -- tự động gán các khóa là số nguyên
day[3] = 9
for i = 4,10 do
 day[i] = i * i
end

print(day) -- mã hiệu của table day
print(unpack(day)) -- các phần tử trong table day
  • Tạo các key trong table rất đơn giản
  • Thay đổi cấu trúc và chỉ mục của table đã được tạo trước.
  • Có thể sử dụng table như 1 mảng
  • Sử dụng vòng lặp trong table
  • Viết chương trình hướng đối tượng với table.
  • Xây dựng những cấu trúc dữ liệu từ table.
  • Những phương thức được định nghĩa sẵn trên table:

o Table.insert: thêm một phần tử vào table Ví dụ:

			
	T = {}
 table.insert(T, "a")
 table.insert(T, "b")
 table.insert(T, "c")
 print(CommaSeparate(T))	
		
a, b, c

o Table.sort: sắp xếp các phần tử trong 1 table Ví dụ sử dụng chức năng sort:

			
	Names = {"Scarlatti", "Telemann", "Corelli", "Purcell",
 "Vivaldi", "Handel", "Bach"}
 table.sort(Names)
 for I, Name in ipairs(Names) do
 print(I, Name)
 end	
		
	Trích: 			
1 Bach
2 Corelli
3 Handel
4 Purcell
5 Scarlatti
6 Telemann
7 Vivaldi

o Table.concat: nối các phần tử trong table thành một chuỗi. Ví dụ:

 			
	print(table.concat({"a", "bc", "d"}))	
		
Abcd

o Table.remove: Loại bỏ một phần tử trong table. Ví dụ:

			
 T = {}
 table.insert(T, "a")
 table.insert(T, "b")
 table.insert(T, "c")
 print(CommaSeparate(T))
 a, b, c
 print(table.remove(T))
 c
 print(CommaSeparate(T))
 a, b
 print(table.remove(T))
 b
 print(CommaSeparate(T))
 a
 print(table.remove(T))
 a	
		
-- T giờ sẽ rỗng:
print(#T)

o Table.maxn: tìm trên mỗi cặp key – value trong một table và trả về key tương ứng với value lớn nhất hoặc trả về 0 nếu value không phải là số dương. Ví dụ:

 			
 print(table.maxn({"a", nil, nil, "c"}))
 4
 print(table.maxn({[1.5] = true}))
 1.5
 print(table.maxn({[ì1.5î] = true}))
 0

Phát triển

[sửa | sửa mã nguồn]

Lua hiện có một hướng phát triển trên cơ sở mở rộng tính năng của các hệ thống sẵn có:

  • Plua: Lua dành cho các máy Palm.
  • LuaTeX: cấu hình hệ thống LaTeX bằng ngôn ngữ Lua.

Các ứng dụng

[sửa | sửa mã nguồn]

Lua được dùng rộng rãi trong công nghệ game. Một số trò chơi có thể kể đến: World of Warcraft III, Heroes of Might and Magic V, Warhammer Online, Angry Birds, Roblox. Lua thường giữ vai trò cấu hình các file thông số, hoặc lập trình trí tuệ nhân tạo trong các game.

Ngoài lĩnh vực trò chơi, một số các phần mềm khác cũng sử dụng Lua, như Adobe Lightroom. Hệ điều hành Damn Small Linux cũng tận dụng ưu điểm nhỏ gọn của Lua.

Indigorose sử dụng ngôn ngữ lập trình Lua là ngôn ngữ chính cho Autoplay Media Studio dùng để viết phần mềm trên hệ điều hành Windows.

Liên kết ngoài

[sửa | sửa mã nguồn]
  1. Trang chủ của Lua
  2. Cuốn sách Programming in Lua của tác giả R. Ierusalimschy
  3. MurgaLua, một bộ hiện thực của Lua Lưu trữ 2009-02-28 tại Wayback Machine
  4. Trang chủ một IDE sử dụng ngôn ngữ lua để viết phần mềm trên Windows
  5. Zerobrane, IDE lua phổ biến để viết trên Linux, Mac, Windows

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ Lua: about
  2. ^ “The Computer Language Benchmarks Game”. Bản gốc lưu trữ ngày 29 tháng 5 năm 2018. Truy cập ngày 28 tháng 1 năm 2009.
Chúng tôi bán
Bài viết liên quan
Một tip nhỏ về Q của Bennett và snapshot
Một tip nhỏ về Q của Bennett và snapshot
Nhắc lại nếu có một vài bạn chưa biết, khái niệm "snapshot" dùng để chỉ một tính chất đặc biệt của kĩ năng trong game
Nhân vật Ichika Amasawa - Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e
Nhân vật Ichika Amasawa - Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e
Ichika Amasawa (天あま沢さわ 一いち夏か, Amasawa Ichika) là một trong những học sinh năm nhất của Trường Cao Trung Nâng cao.
Nghệ thuật của việc mất cân bằng trong phát triển
Nghệ thuật của việc mất cân bằng trong phát triển
Mất cân bằng trong phát triển là điều rất dễ xảy ra, vậy mất cân bằng như thế nào để vẫn lành mạnh? Mình muốn bàn về điều đó thông qua bài viết này.
Bitcoin: Hệ thống tiền điện tử ngang hàng
Bitcoin: Hệ thống tiền điện tử ngang hàng
Hệ thống tiền điện tử ngang hàng là hệ thống cho phép các bên thực hiện các giao dịch thanh toán trực tuyến trực tiếp mà không thông qua một tổ chức tài chính trung gian nào