2012-07-03 27 views
30

Tôi làm cách nào để biên dịch các tập lệnh Lua của mình thành một tệp thực thi duy nhất, đồng thời đạt được các lợi ích hiệu suất siêu nhanh của LuaJIT?Làm thế nào để biên dịch tập lệnh Lua thành một tệp thực thi duy nhất, trong khi vẫn đạt được trình biên dịch LuaJIT nhanh?

Bối cảnh:

  • My Lua script là dành cho một ứng dụng web tôi đã tạo (ví dụ như để lưu trữ http://example.com)
  • công nghệ chồng hiện tại của tôi là Nginx (web server), Lua/LuaJIT (ngôn ngữ để lấy năng động nội dung)
  • tôi có khoảng 50 .lua file nào tạo nên ứng dụng web của tôi (từ mô hình/Views/Controller)
  • FreeBSD 9 hệ điều hành

Để đơn giản vì mục đích triển khai, tôi muốn biên dịch tất cả các tập lệnh .lua chạy ứng dụng web của tôi xuống một tệp thực thi duy nhất.

  1. Điều này có thể thực hiện được không?

    Dường như Lua chính thức đi kèm với một thư viện gọi SRLua

  2. tâm lý tiêu cực để biên dịch xuống .lua của tôi đến một thực thi duy nhất là gì (ví dụ sẽ hoạt động thể tồi tệ hơn, vv)?
+0

Đó là một ứng dụng web, phải không? Điều đó không có nghĩa là bạn chạy nó ... từ trình duyệt web của bạn? Vì vậy, nó không phải là một tập tin thực thi bạn tải về, phải không? –

+0

Có, một ứng dụng web. Không tải xuống. Đây là tất cả các phía máy chủ. – nickb

+0

Nó đơn giản hóa việc triển khai của tôi ở phía máy chủ để vá, vv mã của tôi. Phải mất hơn 50 tệp .lua để chạy ứng dụng web của tôi ngay hôm nay. Có nghĩa là tôi phải lưu trữ hơn 50 tệp .lua trên máy chủ của mình và đảm bảo rằng tôi có tất cả các tệp chính xác. Nếu tôi có thể thay thế (1) hợp nhất thành một tệp được biên dịch duy nhất, nó làm cho việc bảo trì và phiên bản máy chủ của tôi trở nên dễ dàng hơn, và (2) nếu có lợi ích hiệu suất (?) Cũng sẽ tuyệt vời. – nickb

Trả lời

69

Dịch tất cả các tập tin mã nguồn Lua cho đối tượng tập tin và đặt chúng trong một thư viện tĩnh:

for f in *.lua; do 
    luajit -b $f `basename $f .lua`.o 
done 
ar rcus libmyluafiles.a *.o 

Sau đó liên kết các thư viện libmyluafiles.a vào chương trình chính của bạn sử dụng -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E.

Dòng này buộc trình liên kết bao gồm tất cả các tệp đối tượng từ tệp lưu trữ và xuất tất cả các ký hiệu.

Ví dụ: tệp có tên foo.lua hiện có thể được tải bằng local foo = require("foo") từ trong ứng dụng của bạn.

Chi tiết về tùy chọn -b có thể được tìm thấy trên Running LuaJIT.

+15

Wahoo! Mike Pall từ LuaJit đã trả lời câu hỏi này :) – nickb

+10

cảm ơn rất nhiều vì tất cả công việc của bạn trên LuaJIT! Nó thực sự đáng kinh ngạc những gì bạn đã làm. – nickb

+0

Lệnh basename đó không hoạt động trên Ubuntu 13.04. Nó kết thúc lên ghi đè các tập tin lua ban đầu với phiên bản bytecoded – Matt

2

Đối với một ứng dụng web mà bạn hiện đang triển khai làm tổ có liên quan .lua tệp, câu trả lời dễ nhất của bạn sẽ là chia nhỏ chúng thành một tệp. Điều này thường có thể được thực hiện cho các trường hợp đơn giản với luac. Tuy nhiên, đối với các ứng dụng phức tạp với sự kết hợp của các mô-đun, bạn muốn một cái gì đó thông minh hơn.

Cá nhân tôi sử dụng tiện ích Mathew Wild squish để làm điều tương tự.

Sau khi chạy squish, bạn sẽ có một tệp .lua chứa tất cả mã nguồn Lua được gói gọn một cách thuận tiện. Bạn chỉ có thể triển khai tập tin đó.

Nếu bạn cũng cần gói bất kỳ mô-đun nhị phân hoặc trình thông dịch Lua hoặc LuaJIT, thì bạn có thể dễ dàng sử dụng SRLua để gói nó với trình thông dịch Lua hoặc các kỹ thuật tương tự để gộp nó với LuaJIT.

+0

Vì vậy, điều này không thực sự biên dịch xuống một tệp thực thi đơn lẻ như trong câu hỏi ban đầu của tôi mà thay vào đó - hợp nhất tất cả các tệp .lua của tôi thành một tệp .lua đơn lẻ? – nickb

+0

Mặc dù bạn có thể thực hiện tất cả các cách để thực thi, và cũng có thể sử dụng squish để đơn giản hóa việc thu thập các phụ thuộc để liên kết với tệp thực thi đó, bạn cũng có thể dừng chỉ với tệp '.lua' duy nhất. [Mike Pall] (http://stackoverflow.com/a/11318414/68204) đã cung cấp một công thức tốt để gộp LuaJIT với các tệp '.lua'. – RBerteig

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