2012-07-03 21 views
30

कैसे मैं एक एकल निष्पादन योग्य फ़ाइल में मेरी Lua लिपियों संकलन कर सकते हैं, जबकि यह भी LuaJIT के सुपर तेजी से प्रदर्शन लाभ प्राप्त? (उदाहरण के लिए की मेजबानी के लिए http://example.com)लुआ स्क्रिप्ट को एक निष्पादन योग्य में कैसे संकलित करें, जबकि अभी भी तेज लुआजिट कंपाइलर प्राप्त कर रहे हैं?

  • मेरे लुआ स्क्रिप्ट एक वेब अनुप्रयोग मैं बनाया के लिए कर रहे हैं
  • मेरे मौजूदा प्रौद्योगिकी ढेर nginx (वेब ​​सर्वर), लुआ/LuaJIT (भाषा गतिशील पुनः प्राप्त करने जाता है:

    पृष्ठभूमि सामग्री)

  • मैं चारों ओर 50 + .lua फ़ाइलों कि मेरी वेब अनुप्रयोग (मॉडल/दृश्य/नियंत्रकों से बना)
  • FreeBSD 9 ऑपरेटिंग सिस्टम
01 है

तैनाती में सादगी के लिए, मैं अपनी सभी .lua स्क्रिप्ट को संकलित करना चाहता हूं जो मेरे वेब एप्लिकेशन को एक निष्पादन योग्य तक चलाते हैं।

  1. क्या यह संभव है और कैसे?

    ऐसा प्रतीत होता है लुआ अधिकारी एक पुस्तकालय SRLua

  2. क्या एक भी निष्पादन करने के लिए अपने .lua नीचे संकलन करने के लिए नकारात्मक हैं कहा जाता है के साथ आता है कि (जैसे प्रदर्शन, बदतर होगी आदि)?
+0

यह एक वेब ऐप है, है ना? इसका मतलब यह नहीं है कि आप इसे अपने वेब ब्राउज़र से चलाते हैं? तो यह आपके द्वारा डाउनलोड निष्पादन योग्य नहीं है, है ना? –

+0

हां, एक वेब अनुप्रयोग। कोई डाउनलोड नहीं यह सभी सर्वर की तरफ है। – nickb

+0

यह मेरे कोड के पैचिंग आदि के लिए सर्वर पक्ष पर मेरी तैनाती को सरल बनाना है। आज मेरे वेब एप्लिकेशन को चलाने के लिए 50+ से अधिक फाइलें लेती हैं। जिसका अर्थ है कि मुझे अपने सर्वर पर 50+ .lua फ़ाइलों को होस्ट करना है और सुनिश्चित करें कि मेरे पास सभी सही फ़ाइलें हैं। यदि मैं इसके बजाय (1) एक संकलित फ़ाइल को समेकित कर सकता हूं, तो यह मेरे सर्वर रखरखाव और संस्करण को बहुत आसान बनाता है, और (2) यदि प्रदर्शन लाभ (?) हैं तो यह भी अच्छा होगा। – nickb

उत्तर

69

फाइलों वस्तु और उन्हें एक स्थिर पुस्तकालय में डालने के लिए लुआ स्रोत कोड फ़ाइलों के सभी अनुवाद:

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

फिर अपने मुख्य -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E का उपयोग कर कार्यक्रम में libmyluafiles.a पुस्तकालय लिंक।

यह पंक्ति लिंकर को संग्रह से सभी ऑब्जेक्ट फ़ाइलों को शामिल करने और सभी प्रतीकों को निर्यात करने के लिए मजबूर करती है।

उदाहरण के लिए, foo.lua नाम की एक फ़ाइल अब आपके आवेदन के भीतर local foo = require("foo") से लोड की जा सकती है।

-b विकल्प के बारे में विवरण Running LuaJIT पर पाया जा सकता है।

+15

वाहू! लुआजिट से माइक पल ने इस सवाल का जवाब दिया :) – nickb

+10

लुआजिट पर आपके सभी कामों के लिए बहुत धन्यवाद! यह वास्तव में अविश्वसनीय है कि आपने क्या किया है। – nickb

+0

वह बेसनाम कमांड उबंटू 13.04 पर काम नहीं करता है। यह मूल lua फ़ाइल को बाइटकोडेड संस्करण – Matt

2

एक वेब ऐप के लिए जो आप वर्तमान में संबंधित .lua फ़ाइलों के घोंसले के रूप में तैनात कर रहे हैं, तो आपका सबसे आसान उत्तर उन्हें एक फ़ाइल में घुलाना होगा। यह अक्सर luac के साथ सरल मामलों के लिए किया जा सकता है। हालांकि, मॉड्यूल के मिश्रण के साथ जटिल अनुप्रयोगों के लिए आप कुछ बेहतर चाहते हैं।

मैं व्यक्तिगत रूप से कुछ ऐसा करने के लिए मैथ्यू वाइल्ड की उपयोगिता squish का उपयोग करता हूं।

स्क्विश चलाने के बाद, आपके पास एक ही .lua फ़ाइल होगी जिसमें सभी लुआ स्रोत कोड आसानी से बंडल किए जाएंगे। आप बस उस एकल फाइल को तैनात कर सकते हैं।

यदि आपको किसी भी बाइनरी मॉड्यूल, या लुआ या लुआजिट दुभाषिया को भी बंडल करने की आवश्यकता है, तो आप आसानी से लूआ दुभाषिया के साथ इसे बंडल करने के लिए, या लुआजिट के साथ बंडल करने के लिए इसी तरह की तकनीकों का उपयोग कर सकते हैं।

+0

तो, यह वास्तव में मेरे मूल प्रश्न के रूप में एक निष्पादन योग्य के लिए संकलित नहीं है बल्कि इसके बजाय - मेरी सभी .lua फ़ाइलों को एक .lua फ़ाइल में विलय कर रहा है? – nickb

+0

यद्यपि आप निष्पादन योग्य के लिए सभी तरह से जा सकते हैं, और उस निष्पादन योग्य में लिंक करने के लिए निर्भरताओं के संग्रह को सरल बनाने के लिए स्क्विश का भी उपयोग कर सकते हैं, आप केवल एकल '.lua' फ़ाइल से भी रोक सकते हैं। [माइक पल] (http://stackoverflow.com/a/11318414/68204) ने 'लुआज' फाइलों के साथ लुआजिट को बंडल करने के लिए एक अच्छी नुस्खा प्रदान की है। – RBerteig