Tìm hiều về Lua và ứng dụng
Bài đăng này đã không được cập nhật trong 3 năm
1. Tổng quan về Lua
Lua là một ngôn ngữ lập trình được viết dựa trên C. Được phát mình vào năm 1993 bởi Roberto Ierusalimschy, Luiz Henrique de Figueiredo và Waldemar Cele, ngay từ ban đầu, đích nhắm tới của Lua là trở thành một thứ ngôn ngữ lập trình đơn giản, gọn nhẹ, và có thể dễ dàng được tích hợp vào các chương trình đc viết bằng các loại ngôn ngữ phổ biến khác như C hay Java. Điều này mang lại cho Lua nhiều lợi thế : Không phụ thuộc vào nền tảng phần cứng, cấu trúc linh động, ít dư thừa, có thể dễ dàng test hay debug. Lua thực hiện được điều này nhờ có môi trường an toàn, khả năng tự động quản lí bộ nhớ, và nhiều công cụ để xử lí string cũng như những loại data khác có dung lượng động.
2 Tại sao lựa chọn Lua ?
Lua là một ngôn ngữ được sử dụng nhiều, và đã được kiểm chứng
Lua đã được dùng trong rất nhiều các ứng dụng công nghiệp ( ví dụ như Adobe's Photoshop Lightroom ), trong các hệ thống nhúng ( ví dụ như Ginga middleware dùng trong các hệ thống TV số ở Brazil ) , hay làm game ( ví dụ như World of Warcarft addons hay Angry Birds ). HIện tại Lua được đánh giá là ngôn ngữ kịch bản ( scripting language ) hàng đầu sử dụng trong game. Lua được đông đảo cộng đồng ghi nhận, và có hệ thống documentation khá đầy đủ và chi tiết.
Lua rất nhanh
Lua rất nổi tiếng về tốc độ xử lí, là chuẩn mực để các loại ngôn ngũ kịch bản khác hướng tới. Khả năng thực thi của Lua đã được kiểm chứng qua rất nhiều bài test ( benchmark ), cũng như trong môi trường thực tế . Một phần đáng kể của các ứng dụng lớn hiện nay đều đc viết bằng Lua
Lua is portable
Lua được phân phối trong các gói nhỏ (small package) và được build độc lập trong tất cả những nền tảng có bộ biên dịch C chuẩn. Lua có thể chạy trên tất cả các nền tảng Unix và Windows, trên các nền tảng di động ( Android, iOS, BREW, Symbian, Windows Phone), trên các vi xử lí nhứng ( như ARM và Rabbit, cho các ứng dụng như Lego MindStorms)
Lua is embeddable
Lua là một loại ngôn ngữ rất nhanh và nhỏ gọn, có thể dễ dàng được nhúng vào trong các ứng dụng khác nhau. Với hệ thống API đơn giản và được documented tốt, ta có thể dễ dàng tích hợp Lua vào trong các hệ thống viết bằng các loại ngôn ngữ khác. Có thể dễ dàng sử dụng các thư viện của các ngôn ngữ khác trong Lua, cũng như dễ dàng dùng các thư viện Lua trong các ứng dụng viết bằng ngôn ngữ khác, không chỉ C , C++, Java, ... mà kể cả các loại ngôn ngữ kịch bản khác như Perl hay Ruby.
Lua is powerful (but simple)
Một khái niệm cơ bản trong Lua, đó là cung cấp những phương thức tổng quát ( meta-mechanisms ) để thực hiện những tính năng ( features ), thay vì cung cấp trực tiếp những tính đó. Ví dụ, mặc dù Lua không phải là ngôn ngữ hướng đối tượng thuần túy, thay vào đó , Lua cung cấp khái niệm metatable, và dựa vào đây, ta có thể implement class và kế thừa trong Lua. Đặc điểm cơ bản này của Lua, giúp cho ngôn ngữ này nhỏ gọn về mặt cấu trúc, trong khi vẫn có thể dễ dàng được extend sang những hệ thống khác.
Lua rất nhỏ gọn
Thêm Lua vào một ứng dụng không làm phình to ứng dụng đó. File tarball của Lua 5.3.1, trong đó có chứa cả source code và documentation, có dung lượng 276k khi nén và 1.1M khi giải nén. Source code của Lua chúa khoảng 23000 dòng code C. Trong một hệ thống Linux 64-bit, bộ biên dịch Lua built với tất cả các thư viện Lua chuẩn chiếm khoảng 242kb , và thư viện Lua thì chiếm khoảng 414Kb.
Lua is free
Lua là phần mềm mã nguồn mở, được phân phối dưới license MIT. Lua có thể được dùng cho tất cả các mục đích, kể cả mục đích thương mại và vẫn hoàn toàn miễn phí.
3 Making your first Lua program
Trong phần này, ta sẽ cùng nhau tìm hiểu về một ứng dụng thực tiễn đang khá phổ biến của Lua, đó là dùng trong làm game. Để làm quen, ta hãy cùng xây dựng một ứng dụng thuộc loại cơ bản nhất, cùng viết một Addons đơn giản trong game World of Warcraft.
Cài đặt Lua
Về cơ bản thì việc cài đặt Lua là rất đơn giản. Để có thể bắt đầu bắt tay vào lập trình Lua, bạn chỉ cần có :
- Thứ nhất : Bộ thông dịch Lua ( Lua interpreter ) : Một chương trình nhỏ, nơi bạn có thể gõ trực tiếp các lệnh của Lua và thực thi chúng ngay lập tức. Lua interpreter sẽ dừng thực thi mọt file Lua ngay khi nó bắt gặp lỗi trong file đó .
- Thứ hai : Bộ biên dịch Lua (Lua complier) : Khi ta muốn extend Lua đến một ứng dụng/ ngôn ngữ khác, ta sẽ cần phải có một bộ SDK ( Software Development Kit ), trong đó có bộ biên dịch (complier) tương thích với Lua.
- Thứ ba : Cuối cùng, ta sẽ cần phải có một bộ text editor để bắt đầu thực hiện việc viết mã code Lua. Hãy sử dụng bất kì text editor nào mà bạn cảm thấy quen thuộc, tất cả đều có thể viết Lua, từ Notepad hay Vim hay Sublime ...
Để download Lua trên Linux, chạy đoạn lệnh sau trên cửa sổ command
$ wget http://www.lua.org/ftp/lua-5.2.3.tar.gz
$ tar zxf lua-5.2.3.tar.gz
$ cd lua-5.2.3
$ make linux test
Ta có thể thấy trong đó có một file helloWorld.lua với nội dung như sau
print("Hello World!")
để chạy thử file này, ta có thể thử
$lua helloWorld
sẽ cho ra output
Hello World!
Để xem thêm về cú pháp cụ thể của Lua, ta có thể tham khảo thêm Lua Documentation
World of Warcraft Addons
Như đã nói ở trên, một trong những đặc điểm chính của Lua là tính gọn nhẹ và có thể dễ dàng được nhúng hay extend tới các ứng dụng / ngôn ngữ khác. Và một trong những ứng dụng phổ biến của Lua là trong lập trình game. Một ví dụ đơn giản nhất là ta hãy cùng viết một Addons đơn giản cho game World of Warcraft, sử dụng Lua.
Trước tiên, ta nên biết rằng Lua có thể tương tác với các ứng dụng khác nhau, nhưng mỗi ứng dụng có quy tắc riêng của nó trong việc tương tác với Lua, nên trước khi bắt đầu, ta cần phải nắm được quy tắc đó. Trong trường hợp cụ thể này, WoW yêu cầu :
- Mỗi Addons có một folder riêng, nằm trong /Interface/Addons .Ví dụ ta sẽ tạo thư mục /Interface/Addons/HelloWorld
- Trong folder đó có một file đuôi
.toc
, cùng tên với tên thư mục, trong đó có chứa nội dung của Addon. Trong trường hợp này, ta sẽ tạo fileHelloWorld.toc
File .toc
Về cơ bản thì một file .toc
sẽ là nơi client nhìn tới đầu tiên khi chạm tới Addon của ta. Format của một file .toc
thường có dạng ,ban đầu là khai báo thông tin directives , bao gồm những thông tin như version Interface ( bắt buộc ) , tên addons, thông tin về tác giả, khai báo các biến lưu trữ trên local , note ... Các directives này được khai báo bằng tiền tố ##
ở đầu dòng. Kế đến , những dòng ko có tiền tố này, sẽ được client hiểu là những file cần được load hay thực thi khi chạy Addons. Giả sử ta viết một file HelloWorld.lua
cho Addons này, file HelloWorld.toc
của ta sẽ có dạng:
## Interface: 50001
## Title: Hello World
## Author: Joe Savage
## Version: 0.1
HelloWorld.lua
File .lua
Nếu coi file .toc
là khung xương của Addons, thì file .lua
sẽ là phần thịt, script do ta viết sẽ hoàn toàn nằm trong những file này. Nên lưu ý là trong trường hợp này, ta đang viết một Addon cho WoW, nên ngoài những function cơ bản của Lua, ta còn có thể sử dụng những function do WoW cung cấp. Ví dụ, khi muốn in ra màn hình, ta có thể dùng function print
để in một đoạn string ở cửa sổ chat, hoặc dùng message
để hiện ra dưới dạng message box.
message('Hello World!')
Đơn giản như vậy là ta đã có trong tay một Addon. Từ giờ, mỗi khi login vào game, ta đã có thể thấy một cửa sổ thông báo hiện ra
Nhưng nếu chỉ thế này thì quá đơn giản, hãy thử tương tác một chút với hệ thống cho ra dáng một Addon.
Listening to event
Khi viết một chương trình Lua tương tác với một ứng dụng khác, ta nên tìm hiểu xem, ứng dụng đích cung cấp cho ta những gì. Trong ví dụ này, Event API của WoW cung cấp cho ta danh sách những sự kiện (event) hết sức phong phú, đủ để bắt hầu hết những tình huống xảy ra trong game. Bạn có thể xem thêm chi tiết tại Wow Event list . Để làm một ví dụ đơn giản, giả sử ta muốn viết một Addon hiển thị message chúc mừng mỗi khi người chơi thăng cấp. Tra trong event list, ta có thể thấy event PLAYER_LEVEL_UP
. Hãy bắt đầu viết lại Addon của ta.
Đầu tiên ta phải biết về khái niệm 'Frame' trong WoW Addon. Đây là một cấu trúc cơ bản, tương tự như customtable của Lua. Trong một frame của WoW, ta có thể bắt được các sự kiện, tạo các cửa sổ ... hay những hành động tùy biến khác. Trước tiên, trong file HelloWorld.lua , ta hãy khai báo một Frame, có scope là local để tránh các ảnh hưởng ko lương trước có thể có
local Congrats_EventFrame = CreateFrame("Frame")
Một Frame sẽ gắn với sự kiện nào , qua khai báo RegisterEvent
, và thực hiện hành động như thế nào, qua khai báo SetScript
. Trong trường hợp này, ta đang muốn bắt sự kiện level up, và khi sự kiện đó xảy ra , thì hiện ra thông báo chúc mừng. Ta có thể dùng
local Congrats_EventFrame = CreateFrame("Frame")
Congrats_EventFrame:RegisterEvent("PLAYER_LEVEL_UP")
Congrats_EventFrame:SetScript("OnEvent",
function(self, event, ...)
--Event handling code goes here
end)
---- To be continued ----
All rights reserved