जावास्क्रिप्ट डिजाइन द्वारा व्याख्या की है?


73

मैं यह सवाल पूछने से सावधान हूं क्योंकि यह बहुत तेजी से प्रकट हो सकता है। मैंने अभी जावास्क्रिप्ट को खोला है: द डेफिनिटिव गाइड, और यह अध्याय 1 के पहले पृष्ठ की स्थिति बताता है

"जावास्क्रिप्ट एक उच्च-स्तरीय, गतिशील, बिना किसी व्याख्या वाली प्रोग्रामिंग भाषा है"

तो क्या मैं इसे ले सकता हूं कि व्याख्या की गई भाग भाषा विनिर्देश में एक आवश्यकता है, या यह कहना भ्रामक है कि भाषा एक व्याख्या की गई भाषा है जब भाषा और उसके कई कार्यान्वयन के बीच अंतर का सम्मान किया जाता है?

स्पष्ट रूप से जावास्क्रिप्ट के लिए कोई स्थिर संकलक नहीं हैं - https://stackoverflow.com/questions/1118138/is-there-a-native-machine-code-compiler-for-javascript इसलिए शायद यह सिर्फ इसी का प्रतिबिंब है।


थोड़ी देर के लिए jscript.net था जो AS3 / "लॉस्ट" ES4 के समान था। यह CIL को बाय-कोड-संकलित किया गया था।
हे

13
V8 स्पष्ट रूप से एक दुभाषिया नहीं बल्कि एक संकलक होने का दावा करता है
पीमवेदब

@GGG JScript.Net अभी भी जीवित है और बीमार है। लेकिन फिर भी जिंदा है। msdn.microsoft.com/en-us/library/72bd815a.aspx
जेटी

1
एफडब्ल्यूआईडब्ल्यू, "अनकैप्ड" बिट या तो सख्ती से सच नहीं है
रोब अगार

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

जवाबों:


50

तो क्या मैं इसे ले सकता हूं कि व्याख्या की गई भाग भाषा विनिर्देश में एक आवश्यकता है, या यह कहना भ्रामक है कि भाषा एक व्याख्या की गई भाषा है जब भाषा और उसके कई कार्यान्वयन के बीच अंतर का सम्मान किया जाता है?

EcmaScript भाषा geeks अक्सर EcmaScript के कार्यान्वयन को संदर्भित करने के लिए "ES दुभाषिया" शब्द का उपयोग करते हैं, लेकिन कल्पना उस शब्द का उपयोग नहीं करती है। भाषा सिंहावलोकन विशेष रूप से दुभाषिया-अज्ञेयवाद संदर्भ में भाषा का वर्णन करता है:

ECMAScript ऑब्जेक्ट-आधारित है: मूल भाषा और होस्ट सुविधाएं ऑब्जेक्ट द्वारा प्रदान की जाती हैं, और एक ECMAScript प्रोग्राम संचार वस्तुओं का एक समूह है।

इसलिए EcmaScript एक "मेजबान वातावरण" मानता है, जिसे ऑब्जेक्ट परिभाषाओं के प्रदाता के रूप में परिभाषित किया जाता है, जिसमें उन सभी को शामिल किया गया है जो I / O या बाहरी दुनिया के किसी अन्य लिंक की अनुमति देते हैं, लेकिन उन्हें दुभाषिया की आवश्यकता नहीं है।

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

8.9 पूर्णता निर्दिष्ट प्रकार

समापन प्रकार बयान के व्यवहार की व्याख्या करने के लिए प्रयोग किया जाता है ( break, continue, returnऔर throw) है कि नियंत्रण से nonlocal स्थानान्तरण प्रदर्शन करते हैं। समापन प्रकार के मान प्रपत्र (की ट्रिपल कर रहे हैं प्रकार , मूल्य , लक्ष्य ), जहां प्रकार से एक है सामान्य , तोड़ने , जारी रखने के लिए , वापसी , या फेंक , मूल्य किसी भी मूल्य या ECMAScript भाषा है खाली , और लक्ष्य किसी भी ECMAScript पहचानकर्ता है या खाली

शब्द "अचानक पूरा होने" से तात्पर्य सामान्य के अलावा किसी अन्य प्रकार से पूर्ण होने से है

नियंत्रण के गैर-स्थानीय हस्तांतरण को देशी या बाइट-कोड संकलन की अनुमति देने वाले जंप के साथ निर्देशों के सरणियों में परिवर्तित किया जा सकता है।

"एक्मास्क्रिप्ट इंजन" समान विचार व्यक्त करने का एक बेहतर तरीका हो सकता है।


स्पष्ट रूप से जावास्क्रिप्ट के लिए कोई स्थिर संकलक नहीं हैं

यह सच नहीं है। V8 "दुभाषिया" मूल कोड के आंतरिक रूप से संकलित करता है, राइनो आंतरिक रूप से जावा बाइटकोड को आंतरिक रूप से संकलित करता है, और विभिन्न मोज़िला दुभाषियों ({ट्रेस, स्पाइडर, जगर} बंदर) एक जेआईटी संकलक का उपयोग करते हैं।

V8 :

V8 जावास्क्रिप्ट को देशी मशीन कोड पर संकलित करने से पहले प्रदर्शन को बढ़ाता है, या फिर बायटेकोड को निष्पादित करता है या इसकी व्याख्या करता है।

राइनो :

public final void setOptimizationLevel(int optimizationLevel)

वर्तमान अनुकूलन स्तर सेट करें। अनुकूलन स्तर -1 और 9 के बीच पूर्णांक होने की उम्मीद है। उपयोग किया गया। 9 के माध्यम से स्तर 0 से संकेत मिलता है कि वर्ग फाइलें उत्पन्न हो सकती हैं। उच्च अनुकूलन स्तर रनटाइम प्रदर्शन के लिए संकलन समय प्रदर्शन को बंद कर देते हैं। ऑप्टिमाइज़र स्तर -1 से अधिक सेट नहीं किया जा सकता है यदि ऑप्टिमाइज़र पैकेज रन टाइम पर मौजूद नहीं है।

TraceMonkey :

TraceMonkey में मोज़िला के जावास्क्रिप्ट® इंजन के लिए मूल on कोड संकलन जुड़ता है (जिसे “स्पाइडरमोनी” के रूप में जाना जाता है)। यह यूसी इरविन में विकसित एक तकनीक पर आधारित है जिसे "ट्रेस ट्री" कहा जाता है, और टैमरीन ट्रेसिंग प्रोजेक्ट के साथ साझा किए गए कोड और विचारों पर निर्माण होता है। शुद्ध परिणाम ब्राउज़र क्रोम और वेब। पृष्ठ सामग्री दोनों में एक बड़े पैमाने पर गति वृद्धि है।


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

@ me232, 2008 से पहले का बयान काफी हद तक सही था। राइनो ने प्री-डेट्स की थी, लेकिन यह एक बड़ा दुभाषिया नहीं था और इसलिए इसे नजरअंदाज करने के लिए कुछ ने "निश्चित गाइड" को गलत ठहराया होगा। मैंने पुस्तक नहीं पढ़ी है, इसलिए मैं इस बात पर टिप्पणी नहीं कर सकता कि वह प्रतिनिधि अपनी समग्र गुणवत्ता का कैसे है।
माइक सैमुअल

"स्थिर संकलक" की परिभाषा क्या है। मुझे लगता है कि परिभाषा का मतलब संकलन केवल एक बार होता है और आपको बिट्स की एक स्थिर (यानी अपरिवर्तित) बाल्टी मिलती है जिसे आप निष्पादित करते हैं। AFAIK यह नहीं है कि कोई भी जावास्क्रिप्ट इंजन कैसे काम करता है। इसलिए उनके de-optimizationकदम हैं। दूसरे शब्दों में, जावास्क्रिप्ट को इन इंजनों द्वारा संकलित किया गया है लेकिन यह सांख्यिकीय रूप से संकलित नहीं है।
gman

@gman, राइनो का बायटेकोड जनरेटर इस तरह से काम करता है।
माइक सैमुअल

AFAIK ऐसा नहीं है। राइनो में अन्य जावास्क्रिप्ट फाइलें शामिल हो सकती हैं जिन्हें रनटाइम पर संकलित किया जाना है। वह स्थैतिक जटिलता नहीं है।
gman

20

Chrome में उपयोग किए गए V8 JavaScript VM में एक दुभाषिया शामिल नहीं है। इसके बजाय इसमें दो संकलक होते हैं और मक्खी पर कोड संकलित करते हैं। संकलकों में से एक जल्दी से चलता है, लेकिन अक्षम कोड उत्पन्न करता है, दूसरा एक अनुकूली संकलक है।

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


19

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

संकलन और व्याख्या के बीच कई शेड हैं।

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

लेकिन क्या जावास्क्रिप्ट को व्याख्या के लिए डिज़ाइन किया गया है? एक तरह से, हाँ: इसमें एक evalफ़ंक्शन के साथ-साथ Functionकंस्ट्रक्टर भी है कि आप प्रोग्राम कोड को एक स्ट्रिंग के रूप में दे सकते हैं जिसे निष्पादित किया जाएगा। रन टाइम में प्रोग्राम कोड को गतिशील रूप से बनाने की क्षमता के लिए आवश्यक है कि इंजन सोर्स कोड की व्याख्या करने में सक्षम हो। लेकिन इसका मतलब यह नहीं है कि आप आगे की हर चीज नहीं कर सकते। यहां तक ​​कि C ++ और C # जैसी संकलित भाषा में भी आप सोर्स कोड ले सकते हैं, इसे नए मशीन कोड को मेमोरी में संकलित कर सकते हैं और फिर उस पर अमल कर सकते हैं। उसके लिए भी लाइब्रेरी हैं: C ++ में LLVM + Clang और C # में Roslyn प्रोजेक्ट।

इसके अलावा, जावास्क्रिप्ट के लिए वितरण तंत्र स्रोत कोड है; इसका कोई मान्यताप्राप्त बाइट कोड फॉर्म नहीं है। C # और Java का अपना आधिकारिक बाइट कोड है, और सभी को उम्मीद है कि C ++ को मशीन कोड के रूप में वितरित किया जाएगा। लेकिन यह अभी भी एक अंतर्निहित पहलू नहीं है अगर भाषा, सिर्फ एक प्रमुख उपयोग परिदृश्य। वास्तव में, फ्लैश में जावास्क्रिप्ट के करीबी रिश्तेदार एक्शनस्क्रिप्ट वास्तव में बाइट कोड (फ्लैश कंपाइलर सभी लिपियों को precompiles) के रूप में दिया जाता है।


4

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

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


हम्म, मुझे जावा और सी को एक ही श्रेणी में रखना पसंद नहीं है। शायद एक बेहतर अंतर भाषाएं हैं जो सबसे अधिक (ए) स्रोत कोड, (बी) मध्यवर्ती कोड, या (सी) मशीन कोड के रूप में वितरित की जाती हैं। उदाहरण के लिए ए = जावास्क्रिप्ट, बी = जावा, सी = सी।
जॉन हेंकेल

किसी भाषा की व्याख्या या संकलन करना सही नहीं है। उदाहरण के लिए उस नियम के तहत, आप इस बात से सहमत होंगे कि C ++ संकलित भाषा सही है? फिर क्लिंग के बारे में क्या है, जो इसे संकलित किए बिना c ++ कोड निष्पादित करता है। "और इसी तरह व्याख्या की जाती है (भले ही वे मध्यवर्ती चरणों जैसे बायटेकोड या यहां तक ​​कि देशी कोड का उपयोग करते हैं)" इस के लिए, जावा की व्याख्या भी की गई है, इसकी वीएम द्वारा व्याख्या की गई है।
अभिनव गौनियाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.