टाइपस्क्रिप्ट जेएस में ट्रांसपायर करता है। फिर पेड़ हिल रहा है, "कम" (वैकल्पिक) और एक तैनाती करने की प्रक्रिया में और क्या है। लेकिन इस तरह (afaik) का "संकलन" से कोई लेना देना नहीं है। सब कुछ बंडल हो जाता है और भारी रूप से अनुकूलित होता है, लेकिन यह वास्तव में संकलित नहीं है, है ना?
संकलन एक भाषा में लिखा एक कार्यक्रम बदलने का मतलब है एक एक शब्दार्थ बराबर भाषा में लिखे गए इस कार्यक्रम में बी ऐसी है कि भाषा के नियमों के अनुसार संकलित कार्यक्रम के मूल्यांकन के बी (उदाहरण के लिए के लिए एक अनुवादक के साथ उसकी व्याख्या बी ) एक ही परिणाम पैदावार और है मूल भाषा के नियमों के अनुसार कार्यक्रम के मूल्यांकन के रूप में एक ही साइड इफेक्ट एक (के लिए एक अनुवादक के साथ उसकी व्याख्या उदाहरण के लिए एक )।
संकलन का सीधा मतलब है कि भाषा A से भाषा B तक के कार्यक्रम का अनुवाद करना । यह सब इसका मतलब है। (यह भी ध्यान दें कि ए और बी एक ही भाषा होना पूरी तरह से संभव है ।)
कुछ मामलों में, हमारे पास कुछ विशेष प्रकार के संकलक के लिए अधिक विशिष्ट नाम हैं, जो इस बात पर निर्भर करता है कि A और B क्या हैं, और संकलक क्या करता है:
- यदि A को विधानसभा भाषा माना जाता है और B को मशीन भाषा माना जाता है, तो हम इसे एक असेंबलर कहते हैं ,
- यदि A को मशीन भाषा माना जाता है और B को असेंबली भाषा माना जाता है, तो हम इसे एक डिस्सेम्बलर कहते हैं ,
- यदि A को B की तुलना में निम्न-स्तर का माना जाता है , तो हम इसे एक अपघटनकर्ता कहते हैं ,
- यदि A और B एक ही भाषा हैं, और परिणामी कार्यक्रम किसी तरह से तेज या हल्का है, तो हम इसे एक अनुकूलक कहते हैं ,
- यदि A और B एक ही भाषा हैं, और परिणामी कार्यक्रम छोटा है, तो हम इसे मिनिफ़ायर कहते हैं ,
- यदि A और B एक ही भाषा हैं, और परिणामी कार्यक्रम कम पठनीय है, तो हम इसे एक ऑब्सफ्यूज़र कहते हैं ,
- यदि ए और बी को लगभग एक ही स्तर पर अमूर्त माना जाता है, तो हम इसे ट्रांसपिलर कहते हैं , और
- यदि ए और बी को लगभग एक समान स्तर पर माना जाता है और इसके परिणामस्वरूप प्रोग्राम स्वरूपण, टिप्पणियों और प्रोग्रामर के इरादे को बरकरार रखता है, तो यह संभव है कि परिणामी कार्यक्रम को मूल कार्यक्रम के समान ही बनाए रखना संभव हो, तो हम कॉल करते हैं यह एक फिर से इंजीनियरिंग उपकरण है ।
यह भी ध्यान दें कि पुराने स्रोत "संकलन" और "संकलक" के बजाय "अनुवाद" और "अनुवादक" शब्दों का उपयोग कर सकते हैं। उदाहरण के लिए, C "अनुवाद इकाइयों" के बारे में बात करता है।
आप "भाषा प्रोसेसर" शब्द के दौरान भी ठोकर खा सकते हैं। इसका अर्थ परिभाषा के आधार पर एक संकलक, एक दुभाषिया, या संकलक और व्याख्याकार दोनों हो सकता है।
जावास्क्रिप्ट ही अभी भी व्याख्या की है, है ना?
जावास्क्रिप्ट एक भाषा है। भाषाएँ तार्किक नियमों और प्रतिबंधों का एक समूह हैं। भाषाओं की व्याख्या या संकलन नहीं किया जाता है। भाषाएं बस हैं ।
संकलन और व्याख्या एक संकलक या दुभाषिया (डुह!) के लक्षण हैं। हर भाषा को एक संकलक के साथ लागू किया जा सकता है और हर भाषा को दुभाषिए के साथ लागू किया जा सकता है। कई भाषाओं में संकलक और व्याख्याकार दोनों होते हैं। कई आधुनिक उच्च-निष्पादन निष्पादन इंजनों में कम से कम एक संकलक और कम से कम एक दुभाषिया होता है।
ये दो शब्द अमूर्तता की विभिन्न परतों पर हैं। यदि अंग्रेजी टाइप की गई भाषा होती, तो "व्याख्या-भाषा" एक प्रकार की त्रुटि होती।
यह भी ध्यान दें कि कुछ भाषाओं में न तो कोई दुभाषिया होता है और न ही संकलक। ऐसी भाषाएं हैं जिनका कोई कार्यान्वयन नहीं है। फिर भी, वे भाषाएं हैं, और आप उनमें कार्यक्रम लिख सकते हैं। आप उन्हें नहीं चला सकते।
यह भी ध्यान दें कि सब कुछ किसी बिंदु पर व्याख्या किया गया है : यदि आप किसी चीज को निष्पादित करना चाहते हैं, तो आपको इसकी व्याख्या करनी चाहिए । संकलन सिर्फ एक भाषा से दूसरी भाषा में कोड का अनुवाद करता है। यह इसे नहीं चलाता है। व्याख्या इसे चलाता है। (कभी-कभी, जब एक दुभाषिया हार्डवेयर में लागू होता है, तो हम इसे "सीपीयू" कहते हैं, लेकिन यह अभी भी एक दुभाषिया है।)
बिंदु में मामला: वर्तमान में हर एक मौजूदा मुख्यधारा जावास्क्रिप्ट कार्यान्वयन एक संकलक है।
V8 को एक शुद्ध संकलक के रूप में शुरू किया गया: इसने जावास्क्रिप्ट को सीधे अनुकूलित देशी मशीन कोड के लिए संकलित किया। बाद में, एक दूसरा संकलक जोड़ा गया था। अब, दो संकलक हैं: एक हल्का संकलक जो मध्यम रूप से अनुकूलित कोड का उत्पादन करता है लेकिन संकलक स्वयं बहुत तेज़ है और कम रैम का उपयोग करता है। यह संकलक प्रोफाइलिंग कोड को संकलित कोड में भी इंजेक्ट करता है। दूसरा संकलक एक अधिक भारी, धीमा, अधिक महंगा संकलक है, जो, हालांकि, अधिक तंग, बहुत तेज कोड का उत्पादन करता है। यह डायनामिक अनुकूलन निर्णय लेने के लिए पहले संकलक द्वारा इंजेक्ट किए गए प्रोफाइलिंग कोड के परिणामों का भी उपयोग करता है। साथ ही, दूसरे संकलक का उपयोग करके पुन: संकलन करने के लिए कौन सा कोड तय किया गया है, यह उस रूपरेखा जानकारी के आधार पर किया जाता है। ध्यान दें कि किसी भी समय एक दुभाषिया शामिल नहीं है। V8 कभी व्याख्या नहीं करता है, यह हमेशा संकलन करता है। यह नहीं है' टी में एक दुभाषिया भी होता है। (वास्तव में, मेरा मानना है कि आजकल यह होता है, मैं पहले दो पुनरावृत्तियों का वर्णन कर रहा हूं।)
स्पाइडरमोंकी ने जावास्क्रिप्ट को स्पाइडरमोंकी बाईटेकोड के लिए संकलित किया है, जो तब इसकी व्याख्या करता है। दुभाषिया कोड को प्रोफाइल भी करता है, और फिर जो कोड सबसे अधिक बार निष्पादित होता है वह एक कंपाइलर द्वारा देशी मशीन कोड में संकलित किया जाता है। तो, स्पाइडरमोंकी में दो कंपाइलर होते हैं: एक जावास्क्रिप्ट से स्पाइडरमोंकी बाईटेकोड तक, और दूसरा स्पाइडरमोंकी बाईटेकोड से देशी मशीन कोड तक।
लगभग सभी जावास्क्रिप्ट निष्पादन इंजन (V8 के अपवाद के साथ) एओटी कंपाइलर के इस मॉडल का पालन करते हैं जो जावास्क्रिप्ट को बायटेकोड के लिए संकलित करता है, और एक मिश्रित-मोड इंजन जो उस बायटेकोड की व्याख्या और संकलन के बीच स्विच करता है।
आपने एक टिप्पणी में लिखा है:
मैं वास्तव में सोच रहा था कि मशीन कोड कहीं न कहीं शामिल है।
"मशीन कोड" का क्या अर्थ है?
एक आदमी की मशीन की भाषा दूसरी आदमी की मध्यवर्ती भाषा है और इसके विपरीत? उदाहरण के लिए, सीपीयू जो मूल रूप JVM बाईटकोड निष्पादित कर सकते हैं इस तरह के एक CPU पर, कर रहे हैं, JVM बाईटकोड है देशी मशीन कोड। और x86 मशीन कोड के लिए दुभाषिये होते हैं, जब आप उन x86 मशीन कोड को चलाते हैं तो बायटेकोड की व्याख्या की जाती है।
जावा में लिखा हुआ एक जे 86 इंटरप्रिटर है जिसे जेपीसी लिखा जाता है। अगर मैं एक देशी JVM CPU पर चलने वाले JPC पर x86 मशीन कोड चलाऊं ... जो कि बाईटकोड है और जो देशी कोड है? यदि मैं x86 मशीन कोड को जावास्क्रिप्ट में संकलित करता हूं (हां, ऐसे उपकरण हैं जो ऐसा कर सकते हैं) और इसे अपने फोन पर एक ब्राउज़र में चलाएं (जिसमें एआरएम सीपीयू है), जो कि बाईटकोड है और जो मूल मशीन कोड है? क्या होगा यदि मैं जो कार्यक्रम संकलित कर रहा हूं वह एक स्पार्क एमुलेटर है, और मैं इसका उपयोग स्पार्क कोड चलाने के लिए करता हूं?
ध्यान दें कि हर भाषा एक अमूर्त मशीन को प्रेरित करती है, और उस मशीन के लिए मशीन भाषा है। तो, हर भाषा (बहुत उच्च-स्तरीय भाषाओं सहित) देशी मशीन कोड है। इसके अलावा, आप हर भाषा के लिए एक दुभाषिया लिख सकते हैं। तो, हर भाषा (x86 मशीन कोड सहित) मूल नहीं है।