NGHIÊN CỨU NGÔN NGỮ LẬP TRÌNH LUA

Bên dưới là những kết quả nghiên cứu ngôn ngữ lập trình LUA. Gồm những nội dung chính sau:
- Đặc trưng của ngôn ngữ lập trình LUA.
- So sánh khả năng biểu diễn với các ngôn ngữ lập trình khác cùng họ scripting.
- So sánh hiệu năng với các ngôn ngữ lập trình khác cùng họ scripting.
Nội dung trên được trích ra từ các chương 2,3,4 của khoá luận tốt nghiệp CNTT của 2 tác giả : Võ Mai Linh và Nguyễn Thị Sáng.
-------------------------
Xin mời các bạn cùng tham khảo.
-------------------------


Chương 2: ĐẶC TRƯNG CỦA NGÔN NGỮ LUA

Trong chương này chúng tôi sẽ giới thiệu các đặc tính cơ bản của ngôn ngữ Lua bao gồm các đặc trưng:

2.1.Tính mở rộng:

-Người ta không chỉ quan tâm đến LUA như một ngôn ngữ, mà còn như là một công cụ dùng để xây dựng một ngôn ngữ.
-Những chương trình viết bằng LUA được thiết kế từ đầu, sau này có thể được mở rộng không chỉ bằng chính ngôn ngữ LUA mà còn cả ngôn ngữ C.
-LUA dễ dàng giao tiếp với ngôn ngữ C/C++ và những ngôn ngữ khác như: Fortran, Java, Smalltalk, Ada, và thậm chí với những ngôn ngữ scripting khác.

2.2.Tính đơn giản:

-LUA là một ngôn ngữ đơn giản và nhỏ. Nó có rất ít các khái niệm, kiểu dữ liệu … nhưng lại rất mạnh.
-Tính đơn giản làm cho LUA rất dễ học và dễ tích hợp vào những chương trình lớn khác.
-Một chương trình đầy đủ của LUA bao gồm: mã nguồn, hướng dẫn, cộng với một vài thư viện nhị phân tương ứng cho platforms, có thể sắp xếp gọn trong một đĩa mềm.

2.3.Tính hiệu quả:

-Chương trình được viết bằng LUA thực thi khá nhanh.
-LUA được đánh giá như một trong những ngôn ngữ nhanh nhất trong lĩnh vực của những ngôn ngữ scripting.

2.4.Tính khả chuyển:

-LUA không chỉ chạy tốt trên Windows và Unix. LUA còn chạy tốt trên mọi platforms mà chúng ta biết đến như : NextStep, OS/2, PlayStation II (Sony), Mac OS-9 and OS X, BeOS, MS-DOS, IBM mainframes, EPOC, PalmOS, MCF5206eLITE Evaluation Board, RISC OS.
-Với cùng một mã nguồn có thể chạy trên nhiều môi trường khác nhau. Bởi vì LUA được cài đặt theo chuẩn ANSI C nên nếu có một ANSI compiler thì có thể compile LUA.

2.5.Tính “đa dạng thức”:

-LUA có cấu trúc đơn giản nhưng giải quyết được nhiều vấn đề phức tạp khác nhau, trong khi những ngôn ngữ khác có cấu trúc phức tạp nhưng chỉ giải quyết một vấn đề chuyên biệt.
-LUA không có tính kế thừa nhưng cho phép tạo ra mối quan hệ đó với metatable (*).
-Cho phép người lập trình tạo namespaces, class và những đặc tính liên quan khác sử dụng sự thi hành của table.

2.6.Thư viện dễ thay đổi:

-Có thể mở rộng các kiểu dữ liệu và các hàm của thư viện.
-Có bộ nhớ tự động nên không cần quan tâm ai là người cấp phát và giải phóng bộ nhớ hay là tràn bộ nhớ.
-Những hàm đặc biệt cho phép sự thể hiện của các tham số ở mức độ cao nên có thể tạo các hàm có nhiều chức năng hơn.
-Khi ghi chương trình LUA vào vi xử lý, do phần cứng bị hạn hẹp ta có thể vào trong thư viện của LUA để loại bỏ những hàm không cần thiết. 


2.7.Tính tích hợp:

-Sử dụng LUA để tích hợp vào trong chương trình ứng dụng của mình.
-Sử dụng trong CGILUA để xây dựng một trang web động.
-Sử dụng LuaOrb, cho việc truy cập những đối tượng CORBA.
-Sử dụng LUA-C API để tạo ra những hàm mới, kiểu dữ liệu mới, thay đổi cách hoạt động của một vài hệ thống ngôn ngữ, cấu hình LUA cho những phân vùng đặc biệt của chúng.

2.8.Table là kiểu dữ liệu “mạnh”:

-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: 
oTable.insert: thêm một phần tử vào table
-Ví dụ:
Code:
T = {}
  table.insert(T, “a”)
  table.insert(T, “b”)
  table.insert(T, “c”)
  print(CommaSeparate(T))
a, b, c


oTable.sort : sắp xếp các phần tử trong 1 table
-Ví dụ sử dụng chức năng sort :
Code:
Names =  {“Scarlatti”, “Telemann”, “Corelli”, “Purcell”,
              “Vivaldi”,  “Handel”, “Bach”}
  table.sort(Names)
  for I, Name in ipairs(Names) do
              print(I,  Name)
  end
1 Bach
2 Corelli
3 Handel
4 Purcell
5 Scarlatti
6 Telemann
7 Vivaldi
oTable.concat: nối các phần tử trong table thành một chuổi.
-Ví dụ :
Code:
print(table.concat({“a”, “bc”, “d”}))
Abcd

oTable.remove: Remove một phần tử trong table.
-Ví dụ:
Code:
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 is now empty again:
print(#T)

oTable.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ụ:
Code:
print(table.maxn({“a”, nil, nil, “c”}))
  4
  print(table.maxn({[1.5] = true}))
  1.5
  print(table.maxn({[ì1.5î] = true}))
  0
2.9.Mở rộng các xử lý trên table bằng Metatable 
-Mỗi table có thể là một metatable.
-Mỗi table có 1 cặp key-value. Mỗi metatable có 1 cặp event-metamethod. Một event ứng với 1 key trong table và metamethod ứng với 1 value trong table. Mỗi metatable có thể có 1 hoặc nhiều table và ta có thể tính toán được trên metatable dựa vào metamethod.
-Metamethod giống như 1 hàm tính toán trong metatable.
-Ví dụ, sử dụng metatable chúng ta có thể định nghĩa trong ứng dụng Lua việc tính toán biểu thức a+b như thế nào, trong đó a và b là các table. 
-Mỗi một table có thể là một metatable của bất kỳ một table khác. Một nhóm các table có liên quan với nhau có thể chia sẻ một metatable (cái mà diễn tả xử lý chung của chúng).

2.10.Mở rộng với Function:

-Khai báo hai biến cùng tên trong cùng một khối lệnh. Ví dụ:
Code:
function ScopeTest3(Lcl)
      for I = 1, 5 do
          Lcl = Lcl .. "a"
          print(Lcl)
          local Lcl =  ""
          Lcl = Lcl ..  "z"
          print(Lcl)
      end
      print("Kết  quả sau vòng lặp.")
      print(Lcl)
  end
  ScopeTest3("")
Kết quả: 
a
z
aa
z
aaa
z
aaaa
z
aaaaa
z
Kết quả sau vòng lặp.
aaaaa

-Định nghĩa function như gán giá trị
Code:
DoNothing1, DoNothing2 = function() end, function() end
  print(DoNothing1, DoNothing2)
  print(DoNothing1 == DoNothing2)
-- Kết quả: 
function: 011540E0 function: 01154080
false

-Định nghĩa và gọi 1 hàm nặc danh (anonymous function)

(function(A, B)
print(A + B)
end)(2, 3)
--Kết quả: 5

-Định nghĩa và gọi hàm cục bộ
Code:
          do
      local LclAverage = function(Num1, Num2)
      return (Num1 + Num2) / 2
  end
  print(LclAverage(10, 20))
  end

2 nhận xét :

  1. AD có ebook học LUA bản tiếng việt ko ạ , e thấy trên mạng tài liệu toàn tiếng anh thôi ạ , e mới tìm hiểu mong AD giúp đỡ . Thank AD nhìu

    Trả lờiXóa
  2. AD có ebook học LUA bản tiếng việt ko ạ , e thấy trên mạng tài liệu toàn tiếng anh thôi ạ , e mới tìm hiểu mong AD giúp đỡ . Thank AD nhìu

    Trả lờiXóa