2012-02-20 24 views
7

Tôi đã nghe thấy tiếng lẩm bẩm xung quanh các internet về việc có thể mã hot-swap trong Lua tương tự như cách nó được thực hiện trong Java, Erlang, Lisp, vv Tuy nhiên, 30 phút googling cho nó đã biến không có gì. Có ai đọc bất cứ điều gì đáng kể về điều này? Bất cứ ai có kinh nghiệm làm việc đó? Nó hoạt động trong LuaJIT hay chỉ trong VM tham chiếu?mã hoán đổi nóng tại lua

Tôi quan tâm nhiều hơn đến kỹ thuật này làm lối tắt trong quá trình phát triển/gỡ lỗi hơn đường dẫn nâng cấp trong môi trường trực tiếp.

+0

Bạn có ý nghĩa gì với "mã hoán đổi nóng"? –

+1

http://en.wikipedia.org/wiki/Hot_swapping#Software – DynamiteReed

+0

Tôi đã tạo mẫu thử nghiệm này https://github.com/meric/l2l/tree/master/samples/sample09 debugger.lua cho phép bạn hotswap mã và duy trì trạng thái. Đó là một nguyên mẫu và có thể sẽ có lỗi hoặc trường hợp khi nó không hoạt động, nhưng nó thể hiện khái niệm. Nó sẽ giải quyết một số vấn đề được minh họa bởi câu trả lời của Nicol. – Eric

Trả lời

18

Lua và hầu hết các ngôn ngữ kịch bản cho vấn đề đó, không hỗ trợ hình thức tổng quát nhất của "trao đổi nóng" khi bạn xác định nó. Tức là, bạn không thể bảo đảm thay đổi tệp trên đĩa và có bất kỳ thay đổi nào trong đó tự lan truyền vào chương trình thực thi.

Tuy nhiên, Lua và hầu hết các ngôn ngữ kịch bản cho vấn đề đó, hoàn toàn có khả năng được kiểm soát các hình thức hoán đổi nóng. Các chức năng toàn cục là các chức năng toàn cầu. Mô-đun chỉ đơn giản là tải các chức năng toàn cầu (nếu bạn sử dụng chúng theo cách đó). Vì vậy, nếu một mô-đun tải các chức năng toàn cầu, bạn có thể tải lại mô-đun một lần nữa nếu nó được thay đổi, và các tham chiếu hàm toàn cục này sẽ thay đổi thành các hàm mới được nạp.

Tuy nhiên, Ngôn ngữ và hầu hết các ngôn ngữ kịch bản cho vấn đề đó, không đảm bảo về điều này. Tất cả những gì đang xảy ra là sự thay đổi của dữ liệu trạng thái toàn cầu. Nếu ai đó đã sao chép một hàm cũ vào một biến cục bộ, thì họ vẫn có thể truy cập nó. Nếu mô-đun của bạn sử dụng dữ liệu trạng thái cục bộ, phiên bản mới của mô-đun không thể truy cập trạng thái của mô-đun cũ. Nếu một mô-đun tạo ra một loại đối tượng nào đó có các hàm thành viên, trừ khi các thành viên đó được lấy từ các hình cầu, các đối tượng này sẽ luôn luôn tham chiếu đến các hàm cũ, chứ không phải các hàm mới. Và kể từ đó trở đi.

Ngoài ra, Lua không phải là chủ đề an toàn; bạn không thể chỉ làm gián đoạn một số lua_State tại một số điểm và thử tải lại mô-đun. Vì vậy, bạn sẽ phải thiết lập một số điểm cụ thể trong thời gian cho nó để kiểm tra các công cụ và tải lại các tập tin thay đổi.

Vì vậy, bạn có thể làm điều đó, nhưng nó không được "hỗ trợ" theo nghĩa là nó chỉ có thể xảy ra. Bạn phải làm việc cho nó, và bạn phải cẩn thận về cách bạn viết những thứ và những gì bạn đưa vào các chức năng cục bộ so với toàn cầu.

-1

Hoàn toàn đồng ý với Nicol. Tôi đang làm việc với ngọn đuốc (một khuôn khổ học máy) - được xây dựng dựa trên lua. Tôi đã phải khởi chạy nhiều thử nghiệm bằng cách sử dụng cùng một main.lua. Khi trao đổi nóng không được hỗ trợ một cách rõ ràng, tất cả những gì tôi phải làm là thay đổi một số tham số trong main.lua và khởi chạy các thử nghiệm bằng cách sử dụng cùng một lệnh. Điều này đảm bảo rằng tôi không phải tạo nhiều bản sao mã của tôi và các thử nghiệm trước đó không bị ảnh hưởng bởi thay đổi này.

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