Register-Based VM

Pro
v7.12.0+

तेज़ रनटाइम और डिफ़ॉल्ट से अलग VM संरचना के लिए VM को रजिस्टर-आधारित निष्पादन मॉडल पर स्विच करें।

vmRegisterBased विकल्प VM को उसके डिफ़ॉल्ट स्टैक-आधारित बाइटकोड से रजिस्टर-आधारित निष्पादन मॉडल पर स्विच करता है। कुछ मामलों में इससे VM का रनटाइम प्रदर्शन लगभग 10-20% बेहतर हो जाता है, बदले में ऑब्फ़स्केटेड बंडल थोड़ा बड़ा हो जाता है।

इसे चालू करने से Stateful Opcodes (vmStatefulOpcodes) बंद हो जाता है: दोनों असंगत हैं, इसलिए अगर vmStatefulOpcodes चालू था, तो रजिस्टर-आधारित बिल्ड उसे चुपचाप हटा देता है।

स्टैक-आधारित बनाम रजिस्टर-आधारित

स्टैक-आधारित VM ऑपरेंड्स को एक अंतर्निहित स्टैक पर रखता है: हर मान पुश किया जाता है, अगला इंस्ट्रक्शन उसे इस्तेमाल करता है, और नतीजा वापस पुश किया जाता है। इसके बजाय रजिस्टर-आधारित VM अपने ऑपरेंड्स को सीधे संबोधित करता है, इसलिए वही काम कम इंस्ट्रक्शन्स में व्यक्त होता है और उनके बीच कोई push/pop आवाजाही नहीं होती। रनटाइम का फ़ायदा यहीं से आता है - और इसी कारण बाइटकोड थोड़ा बढ़ भी जाता है, क्योंकि अब हर इंस्ट्रक्शन को स्टैक पर अंतर्निहित छोड़ने के बजाय स्पष्ट रूप से बताना पड़ता है कि वह किन रजिस्टर्स को पढ़ता और लिखता है।

कोई भी मॉडल यह नहीं बदलता कि आपका कोड क्या करता है या VM किसकी सुरक्षा करता है। ये एक ही वर्चुअलाइज़्ड लॉजिक के दो एन्कोडिंग हैं; रजिस्टर-आधारित मॉडल बस थोड़ी गति के बदले थोड़ा आकार बढ़ाता है।

इसे कब इस्तेमाल करें

जब VM की रनटाइम लागत मायने रखती हो, तब इसे अपनाएँ। वर्चुअलाइज़्ड कोड अपनी बनावट के कारण सादे JavaScript से धीमा होता है, इसलिए कोड के किसी बार-बार चलने वाले हिस्से पर - एनिमेशन लूप, हर फ़्रेम पर चलने वाला हैंडलर, कसा हुआ पार्सिंग रूटीन - रजिस्टर-आधारित एक्ज़ीक्यूटर जो लगभग 10-20% बचा सकता है, वह बड़े बंडल की कीमत के लायक है। कभी-कभार चलने वाले कोड पर आकार की लागत आमतौर पर उचित नहीं होती। फ़ायदा कोड पर निर्भर करता है, इसलिए इसे अपने कोड के बार-बार चलने वाले हिस्सों पर मापें।

यह VM की संरचना को भी बदलता है। चूँकि यह संरचनात्मक रूप से अलग बाइटकोड और एक्ज़ीक्यूटर बनाता है, इसलिए आउटपुट का फ़िंगरप्रिंट आम स्टैक-आधारित VM से अलग होता है। उस स्टैक-आधारित संरचना के लिए ट्यून किया गया सामान्य, पैटर्न-आधारित विश्लेषण रजिस्टर-आधारित बिल्ड को उतनी आसानी से नहीं पहचानता, इसलिए शिप किए गए VM को डिफ़ॉल्ट से अलग करने का यह एक तरीका है।

अंदर से यह कैसे काम करता है

यह कोई नेटिव रजिस्टर-आधारित कंपाइलर नहीं है। सामान्य स्टैक-आधारित कंपाइलर अब भी बाइटकोड ठीक वैसे ही बनाता है जैसे इस विकल्प के बिना बनाता है; इसके बाद एक अलग ट्रांसफ़ॉर्मेशन चरण उस बाइटकोड को रजिस्टर-आधारित रूप में फिर से लिखता है। चूँकि रजिस्टर-आधारित चरण इन सबके बाद आता है, इसलिए VM ऑब्फ़स्केशन का अधिकांश हिस्सा - टारगेटिंग, Bytecode Encoding, डिस्पैचर विकल्प - अप्रभावित रहता है (Stateful Opcodes को छोड़कर, ऊपर देखें)।

आवश्यकताएँ

  • vmObfuscation आवश्यक है - यह विकल्प केवल उस VM को नया रूप देता है जिसे vmObfuscation बनाता है।
  • ऑब्फ़स्केटर संस्करण 7.12.0 या बाद का।

यह विकल्प प्रायोगिक है। रजिस्टर-आधारित रीराइट डिफ़ॉल्ट स्टैक-आधारित पाथ से नया है और उतना परखा हुआ नहीं है, इसलिए शिप करने से पहले जाँच लें कि vmRegisterBased चालू होने पर आपका कोड सही ढंग से चलता है - यही सलाह हर VM विकल्प पर लागू होती है, लेकिन यहाँ दोगुनी।

उदाहरण

JavaScript

रजिस्टर-आधारित निष्पादन VM ऑब्फ़स्केशन के बाकी हिस्सों के साथ जुड़ जाता है - Bytecode Encoding, Compact Dispatcher, VM Self Defending और VM Domain Lock सभी ठीक वैसे ही काम करते हैं जैसे डिफ़ॉल्ट स्टैक-आधारित VM के साथ। यह बदलता है कि बाइटकोड कैसे निष्पादित होता है, यह नहीं कि उसके चारों ओर कौन-सी सुरक्षाएँ हैं।