2012-01-20 29 views
32

Tôi đang cố biên dịch tập lệnh lua gọi một số hàm đã xuất, lưu kết quả bytecode vào một tệp và sau đó tải bytecode này và thực thi nó, nhưng tôi chưa tìm thấy bất kỳ ví dụ về cách làm điều này. Có ví dụ nào về cách thực hiện điều này không? Tôi có thể làm cái này như thế nào?Biên dịch mã lua, lưu mã bytecode rồi tải và thực hiện nó

Chỉnh sửa: Tôi đang sử dụng Lua + Luabind (C++)

Trả lời

51

Điều này rất đơn giản.

Trước tiên, bạn tải tập lệnh Lua mà không cần thi hành nó. Nó không quan trọng nếu bạn đã kết nối trạng thái Lua với các hàm đã xuất của bạn; tất cả những gì bạn đang làm là biên dịch tập lệnh.

Bạn có thể sử dụng luaL_loadfile, sử dụng chức năng thư viện chuẩn C để đọc tệp từ đĩa và tải tệp đó vào lua_State. Ngoài ra, bạn có thể tự tải tệp vào chuỗi và sử dụng luaL_loadstring để tải tệp đó vào lua_State.

Cả hai chức năng này sẽ phát ra các giá trị trả lại và lỗi trình biên dịch theo the documentation for lua_load.

Nếu quá trình biên dịch thành công, lua_State hiện đã biên dịch Lua thành một hàm Lua ở đầu ngăn xếp. Để có được tệp nhị phân đã biên dịch, bạn phải sử dụng hàm lua_dump. Nó khá phức tạp vì nó sử dụng một giao diện gọi lại để truyền dữ liệu cho bạn. Xem the documentation for details.

Sau quá trình đó, bạn có mã byte Lua được biên dịch. Đưa nó vào một tập tin bạn chọn. Chỉ cần nhớ: viết nó là nhị phân, không phải với bản dịch văn bản.

Khi đến lúc tải mã byte, tất cả những gì bạn cần làm là ... chính xác những gì bạn đã làm trước. Vâng, gần như. Lua có heuristics để phát hiện rằng một "chuỗi" nó được đưa ra là một chuỗi nguồn Lua hoặc mã byte. Vì vậy, có, bạn có thể tải mã byte với luaL_loadfile giống như trước đây.

Sự khác biệt là bạn không thể sử dụng luaL_loadstring với mã byte. Hàm đó dự kiến ​​một chuỗi NULL bị chấm dứt, điều đó là xấu. Mã byte có thể có các ký tự NULL được nhúng vào trong đó, điều này sẽ làm mọi thứ trở nên khó khăn. Vì vậy, nếu bạn muốn tự mình làm tệp IO (vì bạn đang sử dụng một hệ thống tệp đặc biệt hoặc một cái gì đó), bạn phải sử dụng trực tiếp lua_load. Mà cũng sử dụng một giao diện gọi lại như lua_dump. Vì vậy, read up on how to use it.

+1

Chúc các câu trả lời thú vị khác! – vines

+0

Câu trả lời hay, đó là chính xác những gì tôi nghĩ rằng nó sẽ được, nhưng tôi chỉ không biết những gì để sử dụng. Tôi se thử no. Bây giờ cho tôi biết, làm thế nào cứng là để đặt một cái gì đó như thế này (rõ ràng và khách quan) trong một câu hỏi thường gặp hoặc thậm chí trong tài liệu hướng dẫn? Cảm ơn bạn! – WoLfulus

+5

@WoLfulus: Nếu bạn đã google "Lua load bytecode", [liên kết đầu tiên] (http://csl.sublevel3.org/lua/) sẽ cho bạn biết mọi thứ bạn cần biết. Vì vậy, tôi không thấy cần có câu hỏi thường gặp về vấn đề này. Và ứng dụng 'luac' đã có thể biên dịch trước các kịch bản lệnh Lua thành bytecode, vì vậy bạn thậm chí không cần một chương trình để làm điều đó. Vì vậy, thực sự, không cần một câu hỏi thường gặp; chỉ sử dụng đúng cách Google. –

Các vấn đề liên quan