10 điểm bởi GN⁺ 2024-12-28 | 7 bình luận | Chia sẻ qua WhatsApp
  • Càng tìm hiểu về thiết kế và cách triển khai của Lua càng thấy ấn tượng. Hiếm có phần mềm nào làm được nhiều việc với ít mã như vậy
  • Tuy nhiên, Lua không nhận được mức độ tiếp thị và chú ý như nhiều ngôn ngữ khác. Vì vậy, không nhiều nhà phát triển biết đến các tính năng và ưu điểm của Lua
  • Nó chủ yếu được xem là một ngôn ngữ ngách dùng trong game và hệ thống nhúng

[Các đặc điểm và ưu điểm của Lua]

Ngôn ngữ dễ hiểu

  • Lua là một ngôn ngữ kịch bản miễn phí, phản chiếu và mệnh lệnh. Nó được tạo ra vào năm 1993 và được thiết kế để có thể nhúng vào các ứng dụng khác nhằm mở rộng chúng.
  • Thiết kế gọn gàng và mã chạy nhanh. C API dễ sử dụng và cho hiệu năng tốt.
  • Cú pháp ngắn gọn, theo chủ nghĩa tối giản nên người mới bắt đầu cũng dễ tiếp cận.

Khả năng nhúng vượt trội

  • Lua được thiết kế để dễ dàng nhúng vào các ứng dụng viết bằng ngôn ngữ khác, đặc biệt là C và C++.
  • Đây là lựa chọn tuyệt vời cho việc viết script và mở rộng game cũng như các ứng dụng nhúng.
  • Ví dụ: nhúng Lua vào chương trình C
    #include <lua.h>  
    #include <lauxlib.h>  
    #include <lualib.h>  
    
    int main() {  
        lua_State *L = luaL_newstate();  
        luaL_openlibs(L);  
        luaL_dofile(L, "./myscript.lua");  
        lua_close(L);  
        return 0;  
    }  
    

Hỗ trợ nhiều mô hình lập trình

  • Lua hỗ trợ lập trình mệnh lệnh, hàm và hướng đối tượng khi dùng độc lập hoặc kết hợp với các thư viện phù hợp.
  • Mang lại sự linh hoạt để chọn phong cách lập trình phù hợp với nhu cầu của người dùng

[Những nhược điểm tiềm tàng của Lua]

Quy ước đánh chỉ mục

  • Trong Lua, việc đánh chỉ mục thường bắt đầu từ 1, nhưng đó chỉ là quy ước. Mảng có thể được đánh chỉ mục bằng 0, số âm hoặc giá trị khác.
  • Lua thực ra không có mảng đúng nghĩa mà chỉ có bảng luôn là hash khóa-giá trị, nên có thể đánh chỉ mục bằng nhiều giá trị khác nhau như 0 hoặc số âm
  • Thư viện chuẩn và các hàm tích hợp sẵn giả định các bảng giống mảng có chỉ mục bắt đầu từ 1.

Xử lý lỗi

  • Cách xử lý lỗi của Lua có thể không trực quan với các nhà phát triển đến từ ngôn ngữ khác.
  • Trong Lua, lỗi có thể được xử lý như một giá trị. Có thể bắt lỗi bằng pcall.
    function risky_function()  
        error("Something went wrong!")  
    end  
    
    local status, err = pcall(risky_function)  
    if not status then  
        print("Error: " .. err)  
    end  
    

Mảng kết thúc bằng Nil

  • Mảng trong Lua (các bảng được dùng như mảng) sẽ kết thúc khi gặp giá trị nil, điều này có thể gây ra hành vi ngoài dự kiến
    local arr = {10, 20, 30, nil, 50}  
    for i, v in ipairs(arr) do  
        print(v) -- output: 10, 20, 30 (stops at nil)  
    end  
    
  • Hàm ipairs sẽ dừng lặp khi gặp giá trị nil
  • Nếu mảng có khoảng trống, nên dùng pairs thay vì ipairs. Có thể duyệt tất cả phần tử, bao gồm cả các mục có giá trị nil

[Tóm tắt]

  • Lua là một ngôn ngữ lập trình mạnh mẽ, hiệu quả và đa dụng, xứng đáng được công nhận nhiều hơn.
  • Nhờ tính đơn giản, khả năng nhúng và hiệu năng, nó phù hợp với nhiều ứng dụng khác nhau như game và hệ thống nhúng.
  • Dù bị đánh giá thấp, nó vẫn rất đáng để thử nhờ sự đơn giản và hiệu năng của mình
  • Nó được dùng trong hệ thống plugin của nvim và rất hiệu quả.

7 bình luận

 
jhj0517 2025-01-03

> Lua thực ra không có mảng; chỉ luôn tồn tại bảng là hash key-value, nên có thể lập chỉ mục bằng nhiều giá trị khác nhau như 0 hoặc số âm

Tôi từng dùng Lua một thời gian ngắn vì addon của WoW, và nhớ rằng đây là điểm khiến tôi ấn tượng nhất. Hầu như mọi cấu trúc dữ liệu đều luôn dùng bảng.

 
asdwqr 2024-12-31

Trước giờ tôi chỉ biết đến cái tên Lua, nhưng đọc bài này xong thì lại thấy nó chẳng có gì đặc biệt lắm haha..

 
bbulbum 2024-12-30

Tôi không rõ lắm, nhưng tôi đã nghe nói rằng khả năng tương thích ngược giữa các phiên bản rất tệ..

 
ffdd270 2024-12-30

Cá nhân tôi thấy, so với Ruby... thì với câu hỏi kiểu “trước hết, code cũ có chạy lên được không??” Lua vẫn khá hơn một chút, nhưng đặc biệt từ 5.3, cách xử lý number đã thay đổi so với các phiên bản trước, nên khi nâng từ 5.1 lên 5.3 sẽ phát sinh hàng loạt bug rất khó lần ra ở bên trong...

Ngoài ra cũng có nhiều nơi dùng LuaJIT, mà cái này lại có interface hơi khác một chút, nên tôi nghĩ các vấn đề phát sinh từ những khác biệt tinh vi đó là nghiêm trọng nhất. Có khá nhiều phần mà hành vi nội bộ đã thay đổi nên cũng khó mà làm gì được.. =meo=.

 
secret3056 2024-12-30

Tôi từng có kinh nghiệm viết edge driver cho SmartThings bằng Lua.
Nó cũng tạm dùng được, nhưng không phải là ngôn ngữ hợp gu của tôi.

Tôi cho rằng môi trường phát triển hay DE cũng là một phần của ngôn ngữ,
trước hết thì có vẻ cộng đồng đang hơi bị chia rẽ

Cũng có nhiều language server khác nhau, nhưng mỗi cái lại thiếu một vài tính năng, hoặc việc đánh chỉ mục mã chậm, và khi có sửa đổi thì lại làm lại từ đầu.

Tôi cũng không thích kiểu indexing bắt đầu từ 1 hay việc viết type hint bằng comment,
mà type hint dường như cũng không có chuẩn thống nhất, mỗi language server lại khác nhau.

Coroutine cũng khiến tôi nhớ đến thứ đó của Python thời cũ...

Còn embedding hay FFI thì đúng là có vẻ khá tiện.

 
ffdd270 2024-12-30

Dạo này language server cho Lua do sumneko làm rất đỉnh đó... (hình như làm vào năm 22 hay 23) Phần indexing của nó khá có gu đấy.

Mình nghĩ ưu điểm (đồng thời cũng là nhược điểm) của Lua xuất hiện khi làm mấy trò kỳ quặc: nó dễ đến mức vô lý trong việc overwrite method của object khác. Vì thế, đây là một ngôn ngữ rất hợp để dùng thật bừa, nghĩ gì viết nấy.

Còn type hinting thì... đúng như bạn nói, giải pháp được đưa ra thì rất nhiều nhưng hầu như chẳng có giải pháp nào thực sự ổn định, nên mình đang đặt kỳ vọng vào luau do team Roblox làm.

 
GN⁺ 2024-12-28
Ý kiến Hacker News
  • Lua rất phù hợp để nhúng, nhưng việc Redis chọn nó làm ngôn ngữ scripting là điều gây nhiều hối tiếc. Bản thân tôi không thích ngôn ngữ này. Nó tạo cảm giác có quá nhiều ma sát so với những gì tôi mong đợi ở mức độ trừu tượng đó. Nhiều quyết định thiết kế nhỏ cộng dồn lại khiến ngôn ngữ trở nên hơi thù địch. Tuy vậy, nó vẫn đáng chọn nhờ tốc độ, dễ tích hợp, dùng ít bộ nhớ và độ tin cậy. Ngay cả ở mức C-API cũng vẫn có cảm giác khó chịu do cách tiếp cận dựa trên stack. Tôi từng tiếp xúc với các ngôn ngữ stack như FORTH, nhưng khi viết binding vẫn phải vận động trí óc khá nhiều.

  • Nếu thích Lua thì nên xem Terra. Terra là một ngôn ngữ lập trình hệ thống cấp thấp được nhúng vào Lua và được meta-program bằng Lua. Nó là ngôn ngữ biên dịch, kiểu tĩnh như C/C++, và cho phép quản lý bộ nhớ thủ công. Nhưng khác với C/C++, nó được thiết kế ngay từ đầu để meta-program bằng Lua. Chương trình Terra dùng cùng backend LLVM với trình biên dịch C của Apple. Điều này có nghĩa là mã Terra cho hiệu năng tương đương với mã C tương ứng.

  • Gần đây tôi đã tích hợp Lua vào một game engine tùy chỉnh và đồng cảm với việc nó tích hợp với ngôn ngữ khác gọn gàng đến mức nào. Giao diện sạch sẽ nên rất dễ tự động sinh binding. Tôi đã dùng Roslyn Incremental Source Generators để tự động tạo binding giữa C# và Lua, và nhờ thiết kế giao diện nên hoàn toàn không khó. Lua stack, dynamic typing và "table" giúp việc tạo marshaller cho các lớp dữ liệu tùy ý giữa C# và Lua trở nên dễ dàng. Tuy nhiên, cũng có nhiều phê bình xác đáng về bản thân ngôn ngữ. Đặc biệt tôi không thích indexing bắt đầu từ 1. Tôi đang cân nhắc thiết kế một ngôn ngữ scripting nhúng có giao diện tương tự nhưng khắc phục các vấn đề này.

  • Tôi không thấy yêu Lua hơn chút nào. Ngược lại, những bất mãn còn mạnh hơn. Đã lâu rồi tôi mới viết Lua, nhưng tôi vẫn thấy nó không trực quan. Tôi không hiểu vì sao mảng lại là table, vì sao kết thúc bằng nil và vì sao bắt đầu từ 1. Tôi không nghĩ Lua bị đánh giá thấp. Nó rất phổ biến để viết script trong các game engine (cũ).

  • Tôi từng làm chatbot bằng các lệnh plugin Lua, nhưng có trải nghiệm kinh khủng khi tích hợp nó vào một chương trình C++. Tôi không hiểu vì sao mọi người nói nhúng nó dễ. Bạn phải thao tác stack rất nhiều. Bản thân ngôn ngữ này rườm rà và hoàn toàn không giúp gì khi bạn mắc lỗi. Tôi sẽ không bao giờ dùng Lua nữa và sẽ tránh các dự án sử dụng Lua.

  • Lua khiến việc viết lượng mã đáng kể trở nên khó khăn vì kiểu yếu, thiếu type hint và thiếu xử lý lỗi. Nó không hề bị đánh giá thấp. Theo thời gian, tôi ngày càng thích các ngôn ngữ kiểu tĩnh và type hint hơn (Python, TypeScript). Việc viết Python hoặc JS không có hint cho cộng đồng là có hại. Gần đây tôi đã viết lại 1.5k cloc JS sang TypeScript. Luôn có hàng chục trường hợp null bị bỏ sót, truy cập thuộc tính của null, hoặc các giá trị null đáng ngờ về mặt ngữ nghĩa.

  • Tôi nghĩ hầu hết các ứng dụng cần scripting nên nhúng JavaScript. Hệ sinh thái sẵn có mang lại lợi thế lớn. Không phải ai cũng luôn thích nó, nhưng hàng triệu người đã biết sẵn. Không cần học lại những điểm kỳ quặc như indexing mảng và kết thúc bằng nil, cùng hàng chục điều khác mà Lua chỉ bộc lộ ra lúc runtime. Có đủ loại JS engine ở mọi quy mô, và hầu hết hệ điều hành đều cung cấp engine chất lượng cao cùng framework nhúng có thể truy cập mà không cần cài thêm. Thay vì bắt người dùng học một ngôn ngữ mới, tốt hơn là dùng một ngôn ngữ tiêu chuẩn. Điều đó có thể tiết kiệm thời gian cho cả bạn lẫn người dùng.

  • Tôi thích làm việc với Lua và nghĩ rằng đó là một ngôn ngữ rất tốt. Đặc biệt, giao diện để nhúng vào C/C++ rất sạch và linh hoạt. Có vấn đề về hiệu năng, nhưng xét việc Lua được dùng rộng rãi cho game logic trong các trò chơi hiệu năng cao, các vấn đề đó có thể giải quyết được. Tuy nhiên vẫn có những vấn đề khác gây rối và khiến ngôn ngữ khó hơn. Vì học giao diện Lua-C gần như cũng nhiều như học Lua, nên việc chuyển đổi giữa các lần triển khai gây bối rối hơn các ngôn ngữ khác. Dù vậy, tôi vẫn nghĩ ngôn ngữ này bị đánh giá thấp.

  • Việc nhúng Lua khá thú vị, nhưng cũng giống wasm, hiếm khi tôi thực sự cần chạy mã mới mà không biên dịch lại toàn bộ binary. Điều thú vị nhất là làm một game engine bằng C++ và dùng Lua cho toàn bộ game logic. Chu kỳ debug nhanh cực kỳ hữu ích. Điều thú vị thứ hai là làm một IRC bot có thể reload lại logic Lua. Điều thú vị thứ ba là dùng Lua như một ngôn ngữ cấu hình Turing-complete. Khi cần mảng thì tôi tự tạo mảng bằng Lua. Điều ít thú vị nhất là một plugin Blender xuất mô hình 3D sang Lua được sinh tự động.

  • Tôi nghĩ Lua bị đánh giá quá cao. Đó là vì nó được dùng rộng rãi trong ngành game. Ưu điểm duy nhất của Lua là dễ nhúng vào C++. Ngoài điều đó ra thì đúng là ác mộng.