2010-02-17 14 views
34

मैं संक्षेप में Maxine पढ़ रहा था जो जावा में लिखा गया एक ओपन सोर्स जेवीएम कार्यान्वयन है। यह मेरे लिए परिपत्र लगता है। यदि जावा को वर्चुअल मशीन चलाने की आवश्यकता होती है, तो वर्चुअल मशीन को जावा में कैसे लिखा जा सकता है (क्या वीएम कोड को वीएम की आवश्यकता नहीं होगी, और इसी तरह?)।जावा में एक जेवीएम कैसे लिखा जा सकता है

संपादित करें: ठीक है, तो मुझे लगता है कि मैंने इस तथ्य को अनदेखा किया कि जावा को वीएम में चलाने की आवश्यकता नहीं है। फिर एलआईएसपी में एलआईएसपी कंपाइलर कैसे लिखा जा सकता है? या यह एक नया सवाल पूरी तरह से होना चाहिए?

+1

सी ++ में लिखे गए बजेर्न स्ट्राउस्ट्रुप द्वारा पहला सी ++ कंपाइलर नहीं था (जब इसे अभी भी "कक्षाओं के साथ सी" कहा जाता था)? जिसे मैं और अधिक प्रभावशाली मानता हूं, क्योंकि सी ++ एक व्याख्या की गई भाषा नहीं है लेकिन एक कंपाइलर की आवश्यकता है! – Matthias

+1

जो मुझे समझ में नहीं आता है :) – kji

+5

द न्यू ड्रैगन बुक, फर्स्ट एडिशन (त्रुटि-दूसरे संस्करण से दूर रहें) संकलक बूटस्ट्रैपिंग बताते हैं। –

उत्तर

14

आपकी धारणा है कि जावा को वर्चुअल मशीन is incorrect to begin with की आवश्यकता है।

+1

जावा * भाषा * को वीएम की आवश्यकता नहीं हो सकती है, लेकिन "जावा" शब्द केवल भाषा से अधिक है, इसमें वीएम भी शामिल है। – skaffman

+0

और मैक्सिन को कम से कम चलाने के लिए जेडीके 1.6 जेवीएम की आवश्यकता होती है। – Thilo

+0

@ केजी: मुझे लगता है कि मैं गलत था। ऐसा लगता है कि मैक्सिन एक मूल निष्पादन योग्य के लिए संकलित करता है, इसलिए मैक्सिन को आंतरिक रूप से बनाने के बाद जेडीके जेवीएम की आवश्यकता नहीं है (इसे अभी भी कक्षा पुस्तकालय की आवश्यकता है, मुझे विश्वास है)। – Thilo

1

जावा कोड सीधे मशीन कोड पर संकलित किया जा सकता है ताकि वर्चुअल मशीन की आवश्यकता न हो।

0

आप बूटस्ट्रैपिंग कंपाइलर्स की अच्छी तरह से स्थापित विधि पर एक नज़र डाल सकते हैं। मुझे लगता है कि यह 70 के दशक में शुरू हुआ ...

6

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

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

+0

अच्छी व्याख्या, धन्यवाद – kji

+0

नहीं। मैक्सिन में सी कोड डेटा परिभाषा भाषा की तरह अधिक उपयोग किया जाता है, यह वास्तव में कुछ भी दिलचस्प नहीं लगाता है। ऑपरेटिंग सिस्टम कुछ संरचनाओं को स्मृति में एक निश्चित विशिष्ट तरीके से निर्धारित करने की अपेक्षा करता है, और सी कंपाइलर जानता है कि यह कैसे करें, इसलिए मैक्सिन इन संरचनाओं को सही ढंग से निर्धारित करने के लिए सी का उपयोग करता है। लेकिन वहां केवल कुछ स्थान हैं जो सी का उपयोग करते हैं: एक न्यूनतम लॉन्चर, जो वीएम छवि को स्मृति में लोड करता है, लोड पता को छवि के अंदर एक विशिष्ट स्थान में लिखता है और फिर किसी अन्य विशिष्ट स्थान पर जाता है। डीबगर, क्योंकि मैक्सिन ओएस की सी डीबग सुविधाओं का उपयोग करता है। –

+0

जेएनआई का निम्न स्तर का हिस्सा, क्योंकि, जेएनआई का पूरा बिंदु सी के साथ एकीकृत करना है और थ्रेडिंग के निम्न स्तर का हिस्सा है, क्योंकि मैक्सिन मूल धागे का उपयोग करता है जो सिस्टम से सिस्टम में जंगली रूप से भिन्न होते हैं। –

0

यह थोड़े 'whooaoaa आदमी, कैसे है कि काम कर सकते हैं ???' है - लेकिन मुझे लगता है कि आप 'स्वयं-होस्टिंग' के रूप में जाने वाली घटना का वर्णन कर रहे हैं:

भाषाएं (या टूलचेन्स/प्लेटफार्म) स्वयं-होस्टिंग के रूप में शुरू नहीं होती हैं - वे मौजूदा प्लेटफ़ॉर्म पर बनाए गए जीवन को शुरू करते हैं: एक निश्चित बिंदु पर वे कार्यक्रमों को लिखे जाने की अनुमति देने के लिए पर्याप्त कार्यात्मक हो जाते हैं जो सिंटैक्स को समझते हैं जो स्वयं ही लिखा जाता है।

क्लासिक एडब्ल्यूके पुस्तक में एक शानदार उदाहरण है, जो एक एडब्ल्यूके प्रोग्राम पेश करता है जो पार्स कर सकता है (जैसा कि होता है एक कट-डाउन संस्करण) अन्य एडब्ल्यूके प्रोग्राम: नीचे लिंक देखें।

"सुंदर कोड" पुस्तक में एक और उदाहरण है जिसमें जावास्क्रिप्ट प्रोग्राम है जो जावास्क्रिप्ट को पार्स कर सकता है।

मुझे लगता है कि इस पर याद रखने की बात है - अगर आपके पास जावा में लिखा गया एक जेवीएम है (इसलिए) जावा बाइट कोड चला सकता है: जावा जेवीएम चलाने वाले जेवीएम को मूल रूप से होस्ट किया जाना चाहिए (शायद यह जेवीएम था 'सी' में लिखा गया है और फिर मशीन कोड में संकलित किया गया है): अंत में एक स्वयं-होस्टिंग प्रोग्राम के किसी भी मामले में यह सच है - रेखा के साथ कहीं भी।

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

यह अंग्रेजी भाषा का उपयोग करके अंग्रेजी (आदि) भाषा का वर्णन करने में सक्षम होने के बराबर है .... शायद ...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

2

मैं मैक्सिन पिछले सप्ताह पर एक नज़र था और मैक्सिन documentation से ही :)

सोच रहा था:

1 बिल्डिंग बूट छवि

अब चलिए एक [बूट छवि] बनाएं। इस चरण में, मैक्सिन प्रोटोटाइप को कॉन्फ़िगर करने के लिए एक होस्ट JVM पर चलता है, तो पर अपना कोड और डेटा संकलित करता है लक्ष्य प्लेटफ़ॉर्म के लिए निष्पादन योग्य प्रोग्राम बनाएं।

2 मैक्सिन

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

0

मुझे पता है कि यह पोस्ट पुराना है, लेकिन मैंने सोचा कि मैं चर्चा में थोड़ा सा जोड़ सकता हूं क्योंकि वे चूक गए हैं। तो भविष्य के पाठकों को यह सहायक मिल सकता है।

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

कई साल पहले मैंने बेसिक ए और जीडब्ल्यूबीसिक कार्यक्रमों को लिखा था जो असेंबली कोड 6800 और जेड 80 माइक्रोसॉफ्ट का उत्पादन करते थे। मेरा मुद्दा यह है कि आउटपुट इनपुट या लक्ष्य के समान ही नहीं होना चाहिए। अर्थात। सिर्फ इसलिए कि आप जावा में एक जेवीएम लिख रहे हैं इसका मतलब यह नहीं है कि अंतिम परिणाम जावा जेवीएम के तहत खेला जाना चाहिए।

0

यहां एक स्वयं-होस्टेड वीएम बूटस्ट्रैपिंग पर एक अच्छा पेपर है। यह जावा नहीं है, लेकिन जावास्क्रिप्ट है, लेकिन सिद्धांत समान हैं।

Bootstrapping a self-hosted research virtual machine for JavaScript: an experience report

नोट जबकि एक आत्म मेजबान संकलक bootstraping और एक स्वयं की मेजबानी वीएम bootstraping कुछ इसी तरह कर रहे हैं, मुझे विश्वास है कि वे ठीक उसी चुनौतियों उठाना नहीं है।

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

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