2010-01-26 39 views
50

मैं अभी जावास्क्रिप्ट इंजन के बारे में उलझन में हूं। मुझे पता है कि V8 एक बड़ा सौदा था क्योंकि यह जावास्क्रिप्ट को देशी कोड में संकलित करता था।जावास्क्रिप्ट इंजन लाभ

तो मैं के बारे में Mozilla SpiderMonkey पढ़ना, शुरू कर दिया जो मैं क्या समझ सी में लिखा है और जावास्क्रिप्ट संकलन कर सकते हैं से। तो यह V8 से अलग कैसे है और यदि यह सच है, फ़ायरफ़ॉक्स ऐसा क्यों नहीं करता है?

अंत में, Rhino सचमुच जावा बाइट कोड में जावास्क्रिप्ट संकलित करता है ताकि आपको जावा के सभी गति फायदे मिल सकें? यदि नहीं, तो लोग अपने डेस्कटॉप पर स्क्रिप्ट लिखते समय वी 8 क्यों नहीं चलाते?

+1

राइनो जावा बाइट कोड को संकलित कर सकता है। https://developer.mozilla.org/en/Rhino_JavaScript_Compiler – Thilo

उत्तर

8

वी 8 सबसे तेज़ है, क्योंकि यह सभी जेएस को मशीन कोड में संकलित करता है।

Spidermonkey (एफएफ का उपयोग करता है क्या) तेजी से भी है, लेकिन एक मध्यवर्ती बाइट-कोड, नहीं मशीन कोड को संकलित करता है। वी 8 के साथ यह बड़ा अंतर है। संपादित करें- नई फ़ायरफ़ॉक्स रिलीज स्पाइडमोन्की के एक नए संस्करण के साथ आती है; TraceMonkey। TraceMonkey महत्वपूर्ण भागों, और शायद अन्य स्मार्ट अनुकूलन के जेआईटी संकलन करता है।

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

कारण जगह पर वी 8 के बजाय राइनो का उपयोग क्यों किया जाता है, क्योंकि वी 8 अपेक्षाकृत नया है, इसलिए बहुत सी परियोजनाएं पहले से ही राइनो/स्पाइडरमोनकी का उपयोग अपने जेएस इंजन के रूप में कर रही हैं, उदाहरण के लिए याहू विजेट्स। (मुझे लगता है कि आप "उनके डेस्कटॉप पर स्क्रिप्ट" का जिक्र कर रहे हैं)

संपादित करें- यह लिंक स्पाइडरमोन्की को इतनी व्यापक रूप से अपनाया जाने का कुछ अंतर्दृष्टि भी दे सकता है। Which Javascript engine would you embed in your application?

+2

उम्म ट्रेसमोन्की मशीन कोड के लिए जेआईटी अनुवाद भी करता है ... मुझे यह भी नहीं लगता कि यह कहना सही है कि V8 "संकलित" जावास्क्रिप्ट को मशीन कोड - यह TraceMonkey के रूप में जेआईटी दृष्टिकोण के समान प्रकार के कम या कम है। – Pointy

+0

@Pointy, TraceMonkey और V8 के बीच अंतर AFAIK यह है कि TraceMonkey इंटरमीडिएट कोड के लिए संकलित करता है, जिनमें से कुछ को JIT को मशीन कोड में संकलित किया जाता है क्योंकि यह निष्पादित होता है। वी 8 सीधे मशीन कोड पर सबकुछ संकलित करता है। –

+1

"वी 8 जावास्क्रिप्ट स्रोत कोड को सीधे मशीन कोड में संकलित करता है जब इसे पहले निष्पादित किया जाता है। कोई इंटरमीडिएट बाइट कोड नहीं है, कोई दुभाषिया नहीं है।" स्रोत: http://code.google.com/apis/v8/design.html तो मूल रूप से एक संकलक की तरह संकलन करना होगा। इसके अलावा, वी 8 सभी जेएस संकलित करता है, और ट्रेसमोन्की जेआईटी – adamJLev

3

सवाल, क्यों मूल कोड बाइट कोड बनाम उत्तर देने के लिए ...

मूल कोड तेजी से होता है और गूगल के लिए एक रणनीतिक विकल्प वे जे एस एक उनमें से कम से कम क्रोम ओएस है करने की योजना है, क्योंकि।

इस सवाल के बारे एक अच्छा वीडियो वी 8 के पीछे आदमी पाया जा सकता है here

6

आप देखना चाहते हैं कि विभिन्न जावास्क्रिप्ट इंजन टिके रहते-ब्राउज़र में, सफारी स्थापित चाहते हैं लार्स बक के साथ एक साक्षात्कार के साथ Channel9 पर पोस्ट किया जाता है 4 (हाँ यह अब भी विंडोज पर चलता है!), Chrome में V8, Firefox 3.5 और IE 8 (यदि आप खिड़कियों पर कर रहे हैं) और बेंचमार्क चलाएँ:

http://www2.webkit.org/perf/sunspider-0.9/sunspider.html

मेरा मानना ​​है कि के रूप में नुकीले ऊपर, कहा नया फ़ायरफ़ॉक्स 3.5 TraceMonkey का उपयोग करता है जो कुछ एफ का उपयोग करके फ्लाई पर इंटरमीडिट कोड को संकलित करता है जेआईटी का ओआरएम तो यह कुछ हद तक अनुकूल रूप से वी 8 की तुलना करनी चाहिए। कम से कम यह V8 की तुलना में 10x धीमी नहीं होगी जैसे फ़ायरफ़ॉक्स 3 स्पाइडरमोन्की (जेआईटी के बिना) था।

मेरे लिए ... सफारी 4.0.3 फ़ायरफ़ॉक्स में Tracemonky से 2.5x तेज था Win XP पर 3.5.3। आईई 8 बहुत धीमी थी। मेरे पास इस समय क्रोम स्थापित नहीं है।

जावा बाइटकोड में संकलन राइनो के बारे में नहीं पता। यदि यह अभी भी जावास्क्रिप्ट की गतिशील विशेषताओं की व्याख्या कर रहा है जैसे कि रनटाइम पर ऑब्जेक्ट्स ऑब्जेक्ट्स में ऑब्जेक्ट्स जोड़ने में सक्षम होना (उदाहरण के लिए obj.someNewAttribute = "someValue" जिसे जावास्क्रिप्ट में अनुमति है) ...मुझे इतना यकीन नहीं है कि यह पूरी तरह से बाइटकोड में "संकलित" है, और जब भी आपका जावास्क्रिप्ट चलता है तो आपको जावास्क्रिप्ट स्रोत कोड टेक्स्ट से संकलित करने की आवश्यकता के अलावा आपको कोई बेहतर प्रदर्शन नहीं मिल सकता है। याद रखें कि जावास्क्रिप्ट बहुत गतिशील सिंटैक्स की अनुमति देता है जैसे eval ("x = 10; y = 20; z = x * y"); जिसका अर्थ है कि आप कोड के तारों का निर्माण कर सकते हैं जो रनटाइम पर संकलित हो जाते हैं। यही कारण है कि मुझे लगता है कि यदि आप JVM बाइटकोड को संकलित करते हैं तो भी राइनो मिश्रित-मोड को संकलित/संकलित किया जाएगा।

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

तो आपका माइलेज निश्चित रूप से अलग-अलग होगा और यदि आप अपने इच्छित हार्डवेयर & ओएस पर अपने इच्छित एप्लिकेशन के लिए वास्तविक उत्तर चाहते हैं तो आपको शायद कुछ गंभीर बेंचमार्क करने से लाभ होगा।

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

राइनो का एक लाभ यह है कि यह जेवीएम रनों पर कहीं भी कहीं भी चलता है। मेरे अनुभव में, कमांड लाइन से चलने वाले & को बनाने के लिए स्टैंड-अलोन ट्रेसेमोन्की या स्पाइडरमोन्की प्राप्त करने का प्रयास करना विंडोज़ जैसे सिस्टम पर थोड़ा दर्दनाक हो सकता है। और अपने आवेदन में एम्बेडिंग और भी अधिक समय ले सकता है। लेकिन एक एम्बेड करने योग्य भाषा रखने का भुगतान एक बड़ी परियोजना के लिए इसके लायक होगा, जैसा कि "आप अपना खुद का रोल करें" मिनी स्क्रिप्टिंग समाधान होने की तुलना में यदि आप ऐसा करना चाहते हैं।

राइनो के साथ स्क्रिप्टिंग वास्तव में आसान है यदि आपके पास जावा और राइनो जार है, तो आप बस अपना जावास्क्रिप्ट लिखें और इसे कमांड लाइन से चलाएं। मैं इसे सरल कार्यों के लिए हर समय उपयोग करता हूं।

+0

मैंने अपनी एक्सपी मशीन पर क्रोम 4 स्थापित किया है, और यह फ़ायरफ़ॉक्स की तुलना में 3x तेज के लिए सनस्पीडर बेंचमार्क चलाता है 3.5.3 Tracemonkey। यह भी पता चला कि V8 स्पाइडरमोन्की के साथ अपने पिछले अनुभव की तुलना में डाउनलोड और निर्माण करना सुखद है। बेशक आपको svn + पायथन 2.4 + स्कैन 1.0.0 + विजुअल स्टूडियो 2005/2008 (वीसी ++ 2008 मुफ्त संस्करण माना जाता है) भी है, जिनमें से सभी मेरे डेवलपर पीसी पर पहले से चल रहे थे। निष्पक्ष होने के लिए, शायद मैं वापस जाऊंगा और TraceMonkey को फिर से बनाने का प्रयास करूंगा और देख सकता हूं कि यह आजकल कैसे ढेर हो जाता है। – linguanerd

+3

ध्यान दें कि सनस्पिडर एकमात्र उत्तर नहीं है, यह सिर्फ एक जावास्क्रिप्ट बेंचमार्क है (हालांकि जावास्क्रिप्ट इंजन लेखकों ने भारी अनुकूलित किया है)। –

+0

वीसी ++ 2008 एक्सप्रेस (फ्री) स्कैन के साथ v8 संकलन के लिए काम करता है, इस सप्ताह के शुरू में यह किया था। –

73

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

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

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

+8

ध्यान दें कि हस्तक्षेप करने वाले वर्षों में फ़ायरफ़ॉक्स ने एक पूर्ण-विधि जेआईटी के साथ-साथ "जेगर मॉन्की" का उपयोग करने के लिए स्विच किया है और ट्रेसिंग जेआईटी को छोड़ दिया है। –

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

  • कोई संबंधित समस्या नहीं^_^