2008-09-07 21 views
38

ऐसा लगता है कि आप बाइटकोड के साथ कुछ भी कर सकते हैं जो आप मूल कोड में आसानी से और बहुत तेज कर सकते हैं। सिद्धांत रूप में, आप बाइटकोड में प्रोग्राम और पुस्तकालयों को वितरित करके मंच और भाषा स्वतंत्रता को तब भी बनाए रख सकते हैं, फिर इसे JITING के बजाए इंस्टॉलेशन पर देशी कोड से संकलित कर सकते हैं।देशी कोड पर बाइटकोड के फायदे क्या हैं?

तो सामान्य रूप से, आप मूल के बजाय बाइटकोड निष्पादित करना कब चाहते हैं?

उत्तर

31

हांक Shiffman कहा (एक लंबे समय पहले, लेकिन यह है सच तक):

जावाके तीन फायदे हैं बजाय प्रणाली के मूल कोड में जाने काका उपयोग कर बाइट कोड:

  1. पोर्टेबिलिटी: कंप्यूटर के प्रत्येक प्रकार अपनी अनूठी अनुदेश सेट है। जबकि कुछ प्रोसेसर में उनके पूर्ववर्तियों के लिए निर्देश शामिल हैं, यह आमतौर पर सच है कि एक प्रोग्राम जो एक प्रकार के कंप्यूटर पर चलता है किसी अन्य पर नहीं चलेंगे। ऑपरेटिंग सिस्टम द्वारा प्रदान की गई सेवाओं में जोड़ें, जो प्रत्येक सिस्टम में अपने स्वयं के अनूठे तरीके से वर्णन करता है, और आपके पास संगतता समस्या है। आम तौर पर, आप के लिए एक प्रोग्राम लिख और संकलित नहीं कर सकते हैं और इसे बिना किसी काम के अन्य पर चला सकते हैं। एप्लिकेशन और वास्तविक वातावरण (कंप्यूटर + ऑपरेटिंग सिस्टम) के बीच इसकी वर्चुअल मशीन डालने से जावा को इस सीमा के आस-पास मिल जाता है। एक आवेदन जावा बाइट कोड को संकलित किया गया है और कहा कि बाइट कोड व्याख्या की है तो हर वातावरण में एक ही तरह से आप एक ही प्रोग्राम है जो जहां जावा समर्थित है सभी विभिन्न प्लेटफार्मों पर काम करेंगे लिख सकते हैं। (यह सिद्धांत, वैसे भी व्यवहार में वहाँ हमेशा छोटे असंगतियां के लिए प्रतीक्षा में झूठ बोल रही प्रोग्रामर रहे हैं।।)

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

  3. आकार: माइक्रोप्रोसेसर दुनिया में RISC आम तौर पर बेहतर CISC खत्म हो गया है। निर्देश सेट सेट करना बेहतर है और एकल निर्देशों के रूप में लागू कई जटिल संचालन के मुकाबले नौकरी करने के लिए कई तेज़ निर्देशों का उपयोग करना बेहतर है। आरआईएससी डिजाइन को चिप पर कम गेट्स की आवश्यकता होती है ताकि पाइपलाइनों के लिए अधिक कमरे और तकनीकों को प्रत्येक निर्देश तेज बनाने के लिए अनुमति दे। एक दुभाषिया में, हालांकि, इनमें से कोई भी मामला नहीं है। आप एक चर लंबाई मामले खंड की संख्या के आधार के साथ स्विच बयान के लिए एक एकल अनुदेश लागू चाहते हैं, वहाँ ऐसा करने के लिए नहीं कोई कारण नहीं है।वास्तव में, एक जटिल अनुदेश सेट एक वेब आधारित भाषा के लिए एक फायदा है: इसका मतलब है कि एक ही कार्यक्रम छोटे (कम अधिक जटिलता के निर्देश), जो कम समय हमारे स्पीड भर हस्तांतरण करने के लिए इसका मतलब है हो जाएगा सीमित नेटवर्क

तो जब बाइट कोड बनाम देशी पर विचार, विचार करें जो व्यापार गत आप पोर्टेबिलिटी, सुरक्षा, आकार, और निष्पादन की गति के बीच बनाना चाहते हैं। यदि गति एकमात्र महत्वपूर्ण कारक है, तो मूल जाओ। यदि कोई अन्य महत्वपूर्ण है, तो बाइटकोड के साथ जाएं।

मैं यह भी जोड़ूंगा कि प्रत्येक रिलीज के लिए एक ही कोड बेस के ओएस और आर्किटेक्चर-लक्षित संकलन को बनाए रखने के लिए बहुत ही कठिन हो सकता है। एकाधिक प्लेटफार्मों पर एक ही जावा बाइटकोड का उपयोग करने के लिए यह एक बड़ी जीत है और इसे "बस काम करें"।

+4

4 साल बाद ... पोर्टेबिलिटी: देशी कोड उत्पन्न करने वाले कंपाइलर्स जीसी (आधिकारिक [गो] (http://golang.org/) कंपाइलर जैसे क्रॉस-कंपाइल कर सकते हैं) जो इसे सरल बनाता है। सुरक्षा: [मूल ग्राहक] (https://developers.google.com/native-client/) एक सैंडबॉक्स में मूल कोड चलाता है जिससे इसकी अनुमति सीमित हो जाती है। आकार: मोबाइल उपकरणों के लिए भी इन दिनों शायद ही कभी कोई समस्या है। –

+2

@Zippoxer चार वर्षों के साथ क्या है? क्रॉस-संकलन एक बहुत पुरानी अवधारणा है। लेकिन आपको अभी भी प्रत्येक प्लेटफ़ॉर्म के लिए कोड को संकलित करना होगा। वर्चुअलाइजेशन भी एक नई अवधारणा नहीं है, लेकिन मूल निष्पादन के लिए लिखित वर्चुअलाइजिंग कोड वर्चुअलाइजिंग कोड जैसा नहीं है जिसे विशेष रूप से एक सैंडबॉक्स में चलाने के लिए डिज़ाइन किया गया है। आकार के लिए, मैं वास्तव में जावा बाइटकोड सीआईएससी को बिल्कुल नहीं बुलाऊंगा। सीआईएल के लिए भी यही है। – Malcolm

2

मुझे लगता है कि आपने अभी अपने प्रश्न का उत्तर दिया है: मंच स्वतंत्रता। प्लेटफार्म-स्वतंत्र बाइटकोड का उत्पादन और अपने लक्षित मंच पर वितरित किया जाता है। निष्पादन शुरू होने से पहले, या साथ ही (Just In Time) निष्पादित होने से पहले इसे मूल कोड में संकलित किया जाता है। जावा जेवीएम और संभवतः .NET रनटाइम इस सिद्धांत पर काम करते हैं।

9

बाइटकोड एक अतिरिक्त स्तर का संकेत बनाता है।

अविवेक की इस अतिरिक्त स्तर के लाभ हैं:

  • मंच स्वतंत्रता
  • प्रोग्रामिंग भाषाओं के किसी भी संख्या (सिंटेक्स) बना सकते हैं और उन्हें एक ही बाईटकोड करने के लिए नीचे संकलन मिल सकता है।
  • आसानी से क्रॉस भाषा कन्वर्टर्स
  • x86, x64, और IA64 को पृथक बाइनरी के रूप में संकलित करने की आवश्यकता नहीं है। केवल उचित वर्चुअल मशीन को स्थापित करने की आवश्यकता है।
  • प्रत्येक ओएस को केवल वर्चुअल मशीन बनाने की आवश्यकता होती है और इसे उसी प्रोग्राम के लिए समर्थन मिलेगा।
  • बस समय संकलन में आप केवल एक ही मुद्रित स्रोत फ़ाइल को प्रतिस्थापित करके प्रोग्राम को अपडेट करने की अनुमति देता है। (बहुत वेब पृष्ठों के लिए फायदेमंद)

नुकसान में से कुछ:

  • प्रदर्शन
  • आसान डिकंपाइल करने
एसजीआई से
1

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

एक माध्यमिक कारक सुरक्षा है। यह सत्यापित करना बहुत आसान है कि एक दुभाषिया देशी कोड के लिए गारंटी देने की तुलना में क्रैश नहीं होगा।

तीसरा प्रदर्शन है। कोड के छोटे टुकड़ों के लिए बाइटकोड की व्याख्या करने के बजाय अक्सर मशीन कोड उत्पन्न करने में अधिक समय लग सकता है जो केवल एक बार चलता है।

15

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

सभी अच्छी चीजें, फिर भी यह लगभग कभी नहीं किया जाता है क्योंकि बाइनरी बनाने के लिए कई कदमों से गुजरना परेशान होता है।

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

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

2

: http://slashdot.org/developers/02/01/31/013247.shtml

जाओ देख Slashdot के शौकीनों इसके बारे में क्या कहना चाहते हैं! थोड़ा दिनांकित, लेकिन बहुत अच्छी टिप्पणियां!

3

सभी अच्छे उत्तरों, लेकिन मेरा हॉट-बटन मारा गया है - प्रदर्शन।

यदि कोड चल रहा है, तो लाइब्रेरी/सिस्टम रूटीन को कॉल करने के लिए अपने सभी समय व्यतीत करता है - फाइल ऑपरेशंस, डेटाबेस ऑपरेशंस, विंडोज मैसेज भेजना, फिर यह ज़िम्मेदार होने पर बहुत मायने रखता है, क्योंकि अधिकांश घड़ी का समय इंतजार कर रहा है उन निचले स्तर के संचालन को पूरा करने के लिए।

हालांकि, अगर कोड बातें हम आमतौर पर "एल्गोरिदम" कहते हैं, तेजी से होना है और अधिक समय खर्च नहीं करना काम करता है, और बुला अगर उन उपयोग किया जाता है अक्सर पर्याप्त एक प्रदर्शन समस्या हो कि होता है, तो जेआईटी बहुत महत्वपूर्ण है।

0

पोर्टेबिलिटी और प्लेटफार्म आजादी शायद देशी कोड पर बाइटकोड के सबसे उल्लेखनीय फायदे हैं।

संबंधित मुद्दे