एक JVM प्रोग्रामिंग भाषा बनाएँ


91

मैंने सी में एक कंपाइलर (lex & bison का उपयोग करके) एक डायनामिक टाइप की गई प्रोग्रामिंग लैंग्वेज के लिए बनाया है, जो लूप्स, फंक्शंस डिक्लेरेशन इन फंक्शन्स, रिकर्सिव कॉल्स आदि का समर्थन करता है। मैंने एक वर्चुअल मशीन भी बनाई है जो कंपाइलर द्वारा बनाया गया इंटरमीडिएट कोड चलाता है।

मैं अब अपने स्वयं के मध्यवर्ती कोड को संकलित करने के बजाय, इसे जावा बाइट कोड पर संकलित करने के बारे में सोच रहा था।

मैंने देखा कि JVM भाषा बनाने के बारे में सवाल पहले ही पूछा जा चुका है, लेकिन मुझे इसका उत्तर बहुत जानकारीपूर्ण नहीं लगा।

तो यहाँ मेरे सवाल हैं:

  1. मुझे लगता है कि JVM के लिए एक भाषा बनाने के लिए एक JVM विनिर्देश पुस्तक पढ़ना आवश्यक है , आप अन्य पुस्तकों के बारे में क्या सुझाव दे सकते हैं (ड्रैगन बुक ऑफ़ कोर्स को छोड़कर)? मैं ज्यादातर पुस्तकों या ट्यूटोरियल के बारे में चिंतित हूं कि एक जेवीएम भाषा कैसे बनाई जाए, सामान्य रूप से संकलक नहीं।
  2. वहाँ कई जावा पढ़ने के लिए पुस्तकालयों, लिखने और जैसे परिवर्तन .class फ़ाइलें हैं jclasslib , BCEL , जीएनयू बाईटकोड एक आप सुझाव है कि कौन सा, आदि? इसके अलावा, क्या आप सी पुस्तकालयों के बारे में जानते हैं जो समान कार्य करते हैं?
  3. मैं शायद एक और भाषा पर एक नज़र डालने के बारे में सोच रहा था जो क्लीवेज, जेथॉन या जेरी जैसे जेवीएम को लक्षित करती है। लेकिन ये सभी भाषाएं बहुत उच्च स्तर की और जटिल हैं (उनके लिए एक कंपाइलर बनाने के लिए)। मैं एक सरल (अगर मुझे पता नहीं है कि यह अज्ञात या अप्रयुक्त है) प्रोग्रामिंग भाषा जो जेवीएम को लक्षित करती है और यह संकलित है तो खुला स्रोत है। कोई विचार?

जवाबों:


61

मैं ASM की भी सिफारिश करूंगा, लेकिन जैस्मीन पर एक नज़र डालिए , मैंने एक विश्वविद्यालय-परियोजना के लिए इसका इस्तेमाल किया (या: इसका इस्तेमाल करना पड़ा), और यह काफी अच्छी तरह से काम करता है, मैंने एक लेक्सर / पार्स / विश्लेषक / अनुकूलक / जनरेटर संयोजन के लिए लिखा जावा और जैस्मिन का उपयोग करते हुए एक प्रोग्रामिंग-भाषा, इसलिए जेवीएम कोड उत्पन्न करना। मैंने यहां कोड अपलोड किया है , दिलचस्प हिस्सा स्रोत-कोड ही होना चाहिए । फ़ोल्डर "bytecode / InsanelyFastByteCodeCreator.java" में आपको कोड का एक टुकड़ा मिलता है जो एएसटी ट्री को जैस्मिन असेंबलर के इनपुट फॉर्मेट में बदल देता है। काफी सीधा है।

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

यदि आप अजीब श्रेणी के नाम के बारे में आश्चर्य करते हैं: विश्वविद्यालय परियोजना का कार्य एएसटी को एएए एसएसए ग्राफ (इसलिए इनपुट कोड का प्रतिनिधित्व करने वाला एक ग्राफ) में बदलना था , तो ग्राफ को अनुकूलित करें और फिर ग्राफ को जावा बाइट कोड में बदल दें। यह परियोजना के काम का लगभग 3/4 हिस्सा था और InsanlyFastByteCodeCreator सब कुछ परीक्षण करने के लिए सिर्फ एक शॉर्ट-कट था।

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


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

पुस्तक हालांकि बहुत सस्ती दूसरी हाथ है। मुझे कुछ डॉलर के लिए एक प्रति मिली।
Namin

ऊपर मेरे संपादन पर एक नज़र डालें, यदि आपके कोई प्रश्न हैं, तो मुझे मदद करने में खुशी होगी।
ओमेगा

"स्रोत-कोड ही" का लिंक टूट गया है। हालांकि मुझे लगता है कि 8 साल बाद उम्मीद की जानी है।
लेलेव वालिस

@ LlewVallis, यदि मैं सभी सूचनाओं की सही व्याख्या करता हूं, तो कोड यहां लगता है: github.com/replimoc.compiler
U880D

14

अंतिम सेमेस्टर मैंने एक "कंपाइलर कंस्ट्रक्शन" पाठ्यक्रम में भाग लिया है। हमारी परियोजना ठीक वही थी जो आप करना चाहते हैं।

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

जावा bytecode उत्पादन करने के लिए मैं स्काला CAFEBABE पुस्तकालय का उपयोग किया है । अच्छी तरह से प्रलेखित और आपको क्या करना है यह समझने के लिए जावा कक्षाओं के अंदर गहराई तक जाने की जरूरत नहीं है।

पुस्तक के अलावा, मुझे लगता है कि कोर्स के दौरान हमारे द्वारा की गई प्रयोगशालाओं को गर्त में ले जाकर आप बहुत सारे इन्फोस पा सकते हैं ।


यह एक महान पाठ्यक्रम की तरह लग रहा है। क्या आप अपने नोट्स या कोड साझा करना चाहेंगे?
पेड्रो

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

1
नीट, मैं एक हैंड-ऑन संकलक पाठ्यक्रम की तलाश कर रहा हूं जो स्व-अध्ययन के लिए ऑनलाइन सभी सामग्री के साथ जेवीएम को लक्षित करता है।
namin

5

एएसएम बायोटेक्स उत्पन्न करने के लिए एक समाधान हो सकता है। शुरू करने के लिए, मैनुअल से तत्वों को बनाने पर विषयों की जांच करें ।


4

मैं शायद एक और भाषा पर एक नज़र डालने की सोच रहा था जो क्लीवेज, जेथॉन या जेरी जैसी जेवीएम को लक्षित करती है। लेकिन ये सभी भाषाएं बहुत उच्च स्तर की और जटिल हैं (उनके लिए एक कंपाइलर बनाने के लिए)।

सुझाव: आप लुआ प्रोग्रामिंग भाषा पर एक नज़र डाल सकते हैं , लुवाज जैसे जेवीएम कार्यान्वयन हैं ।

लाइटवेट , तेज, जावा-केंद्रित Lua दुभाषिया J2ME और J2SE के लिए लिखा गया है, जिसमें बेसिक, स्ट्रिंग, टेबल, पैकेज, गणित, io, डिबग और कॉरटीन पैकेज के लिए लाइब्रेरी , एक कंपाइलर , लाजवाव बाइंडिंग, और JSR-233 प्लगगेबल स्क्रिप्टिंग इंजन के साथ लिखा गया है। बाइंडिंग।

(JNI दृष्टिकोण के साथ देशी कामों का उपयोग करने वाले लुजवा के साथ भ्रमित होने की नहीं।)


धन्यवाद। मैं एक नज़र

3

पिछले सप्ताह के अंत में, मैं खुद से यही सवाल पूछ रहा था कि मैं अपनी खिलौना भाषा को जेवीएम में पोर्ट करवाऊं।

मैं केवल कुछ घंटे खोज जानकारी खर्च करता हूं, इसलिए नमक के एक दाने के साथ इस संदर्भ को लें।

  • भाषा कार्यान्वयन पैटर्न । मुझे antlr से नफरत है लेकिन यह किताब बहुत अच्छी लगती है। यदि आपको एंटीलर पसंद नहीं है और न ही, "पार्सिंग तकनीक। एक प्रैक्टिकल गाइड" को पार्स करने के बारे में बहुत अच्छा है।

    कॉन्फ़िगरेशन फ़ाइल रीडर, डेटा रीडर, मॉडल-चालित कोड जनरेटर, स्रोत-से-स्रोत अनुवादक, स्रोत विश्लेषक और व्याख्याकार बनाना सीखें। आपको कंप्यूटर विज्ञान में पृष्ठभूमि की आवश्यकता नहीं है - ANTLR निर्माता टेरेंस Parr इसे सबसे सामान्य डिजाइन पैटर्न में तोड़कर भाषा कार्यान्वयन को नष्ट कर देता है। पैटर्न के अनुसार, आप अपनी कंप्यूटर भाषाओं को लागू करने के लिए प्रमुख कौशल सीखेंगे।

    इस विषय के 30 पृष्ठों (आईएमओ को तेज करने) में अध्याय 10 कवर। लेकिन अन्य अध्याय हैं जो शायद आप रुचि लेंगे।

    • 10 बिल्डिंग बायोटेक इंटरप्रिटेटर
      • 10.1 प्रोग्रामिंग बायोटेक इंटरप्रिटेटर। ।
      • 10.2 असेम्बली लैंग्वेज सिंटैक्स को परिभाषित करना
      • 10.3 बाइटकोड मशीन आर्किटेक्चर। । । । ।
      • 10.4 यहां से कहां जाएं। । । । । । । । । ।
      • पृष्ठ 26। बाइटकोड असेंबलर। । । । । । । । । । ।
      • P.27। स्टैक-आधारित बायटेकोड दुभाषिया। । ।
      • P.28। रजिस्टर-आधारित बायोटेक इंटरप्रेटर
      http://pragprog.com/titles/tpdsl/language-implementation-patterns
    • Lua 5.0 का कार्यान्वयन यह रजिस्टर-आधारित बायटेकोड मशीनों के बारे में एक बेहतरीन पेपर है। इसे पढ़ने के लिए भी जाएं।

    • छोटे टुकड़ों में लिस्प। यह पुस्तक सिखाती है कि एक 2 विद्वान कंपाइलर को कैसे लिखना है जो सी को संकलित करता है। इस पुस्तक से कई सबक सीखे जा सकते हैं। मेरे पास इस पुस्तक की एक प्रति है और यह वास्तव में किसी के लिए भी अच्छा है दिलचस्प है लिस्प, लेकिन शायद आपकी चाय का कप नहीं।

      यह शब्दार्थ और भाषाओं के पूरे लिस्प परिवार के कार्यान्वयन का एक व्यापक खाता है, अर्थात् लिस्प, योजना और संबंधित बोलियाँ। यह 11 दुभाषियों और 2 संकलक का वर्णन करता है ...

    http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473

Dalvik7 VM, एक रजिस्टर-आधारित VM की जाँच करें। DVM एक बायलर कोड पर संकलित होता है जो जावा कंपाइलर द्वारा संकलित जावा क्लास फाइलों से बदल जाता है।

विषय, jvm- भाषाओं के बारे में एक मेलिंग सूची है।

क्या आप कहीं भी कोड अपलोड करने की योजना बना रहे हैं? मैं एक नज़र रखना चाहूंगा।


Are you planning to upload the code to anyplace?मुझे उस कोड पर गर्व नहीं है :( ... मैं शायद पूरी बात फिर से लिखूंगा। वैसे भी अगर मैं करता हूं तो आपको बता दूंगा। आपके सुझावों के लिए बहुत-बहुत धन्यवाद।

2

मैं आपको सलाह दूंगा कि आप सबसे पहले सीखें कि जेवीएम असेंबली कैसे काम करती है, अगर आप पहले से ही नहीं जानते हैं।

कई निर्देशों का रूप है ?name , जहां ?है iअगर अनुदेश एक पूर्णांक प्रकार के साथ पर काम करता है और aयह एक संदर्भ प्रकार के साथ काम करता है।

असल में, JVM बिना रजिस्टरों वाली एक स्टैक मशीन है, इसलिए सभी निर्देश स्टैक पर डेटा के साथ सीधे काम करते हैं। आप ?push/?popस्थानीय वेरिएबल्स (ऑफ़सेट द्वारा संदर्भित स्टैक स्थानों) और स्टैक के शीर्ष के बीच डेटा को पॉप / मूव कर सकते हैं और उपयोग कर सकते हैं?store/?load । कुछ अन्य महत्वपूर्ण निर्देश दिए गए हैं invoke???और if_???

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

यहां जेवीएम के एक पुराने संस्करण के लिए एक निर्देश संदर्भ है , जिसमें नए से कम निर्देश हो सकते हैं।


0

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

आप सीएलआई बाइट कोड उत्पन्न करने के लिए एक ही तकनीक (जैसे, C # का संकलन) का उपयोग कर सकते हैं या पी-कोड उत्पन्न करने के लिए पास्कल का संकलन कर सकते हैं, आदि।

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


जेवीएम के लिए संकलित करने से किसी का कोड मूल कोड की तुलना में अधिक व्यापक रूप से चलाया जा सकेगा। इसके अलावा, bytecode को संकलित करने से कोड के लिए कुछ चीजें करना संभव होगा जो कि जावा भाषा में ही संभव नहीं है।
सुपरकैट

0

बेशक एक बार एक नई भाषा लिखने के लिए जावा का उपयोग कर सकते हैं। जावा प्रतिबिंब-एपीआई के साथ आप एक लोट्टो प्राप्त कर सकते हैं। यदि गति बहुत अधिक मायने नहीं रखती है, तो मैं ASM के बजाय जावा को वरीयता दूंगा। जावा (IMHO) में प्रोग्रामिंग आसान और कम त्रुटि वाला है । RPN भाषा 7 वें पर एक नज़र डालें । यह पूरी तरह से जावा में लिखा गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.