Tìm hiều về Lua và ứng dụng
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 take a look at 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 knowledge khác có dung lượng động.
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 sport ( ví dụ như World of Warcarft addons hay Offended 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 sport. 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 take a look at ( 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 transportable
Lua được phân phối trong các gói nhỏ (small package deal) và được construct độ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à Home windows, trên các nền tảng di động ( Android, iOS, BREW, Symbian, Home windows Telephone), 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 highly effective (however easy)
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 ( options ), 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 lengthen 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ả supply code và documentation, có dung lượng 276k khi nén và 1.1M khi giải nén. Supply 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 constructed 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í.
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 sport. Để 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 sport 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 lengthen Lua đến một ứng dụng/ ngôn ngữ khác, ta sẽ cần phải có một bộ SDK ( Software program Growth Equipment ), 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ộ textual content editor để bắt đầu thực hiện việc viết mã code Lua. Hãy sử dụng bất kì textual content 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 Elegant …
Để obtain 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 take a look at
Ta có thể thấy trong đó có một file helloWorld.lua với nội dung như sau
print(“Whats up World!”)
để chạy thử file này, ta có thể thử
$lua helloWorld
sẽ cho ra output
Whats up 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 lengthen 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 sport. Một ví dụ đơn giản nhất là ta hãy cùng viết một Addons đơn giản cho sport 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 file HelloWorld.toc
File .toc
Về cơ bản thì một file .toc sẽ là nơi shopper 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ư model 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 native , observe … 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 shopper 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: Whats up World ## Writer: Joe Savage ## Model: 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 operate cơ bản của Lua, ta còn có thể sử dụng những operate do WoW cung cấp. Ví dụ, khi muốn in ra màn hình, ta có thể dùng operate print để in một đoạn string ở cửa sổ chat, hoặc dùng message để hiện ra dưới dạng message field.
message(‘Whats up World!’)
Đơn giản như vậy là ta đã có trong tay một Addon. Từ giờ, mỗi khi login vào sport, 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 occasion
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, Occasion API của WoW cung cấp cho ta danh sách những sự kiện (occasion) hết sức phong phú, đủ để bắt hầu hết những tình huống xảy ra trong sport. Bạn có thể xem thêm chi tiết tại Wow Occasion checklist . Để 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 occasion checklist, ta có thể thấy occasion 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 ‘Body’ 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 body 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 Body, có scope là native để tránh các ảnh hưởng ko lương trước có thể có
native Congrats_EventFrame = CreateFrame(“Body”)
Một Body 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 degree 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
native Congrats_EventFrame = CreateFrame(“Body”) Congrats_EventFrame:RegisterEvent(“PLAYER_LEVEL_UP”) Congrats_EventFrame:SetScript(“OnEvent”, operate(self, occasion, …) -Occasion dealing with code goes right here finish)
– To be continued –