2010-01-06 24 views
8

के लिए मैं कुछ अच्छा जावा कम्पाइलर देखा है hacks आप replace assertions by throw-exception statements, आप कर सकते हैं कर सकते हैं जिसमें स्वत: जनरेट क्षेत्रों के लिए properties और इतने पर ...ऑपरेटर ओवरलोडिंग प्लगइन जावा

मैं बस सोच रहा था ...

क्या जावा कंपाइलर हैक करना संभव है ताकि यह ऑपरेटर ओवरलोडिंग का समर्थन कर सके?

संपादित करें:

ऐसा नहीं है कि मैं जावा या कुछ में अधिक भार ऑपरेटर याद आ रही है नहीं है। मैं सिर्फ यह जानना चाहता हूं कि ऊपर दिए गए लिंक में उल्लिखित हैक्स का उपयोग करके इसे कार्यान्वित करना संभव है या नहीं। तो कृपया मुझे स्कैला जैसी कुछ अन्य भाषा में स्विच करने का सुझाव न दें (जिसे मैं पहले से ही सीख रहा हूं!: डी)।

संपादित करें:

कृपया बस मुझे बताओ कि क्या यह JSR 269 या ऐसा ही कुछ का उपयोग कर यह करने के लिए संभव है। : |

धन्यवाद।

+0

आप Sca स्विच कर लेना चाहिए ... ओह प्रतीक्षा करें ... – skaffman

+2

मैं जाना चाहते हैं परियोजना लंबोक समूह पर पूछना - Reinier Zwitserloot और रोएल Spilker उपकरण/कंपाइलर्स की एक श्रृंखला में बहुत सारे कंपाइलर हैक्स कर रहे हैं, इसलिए वे शायद आपको सही दिशा में इंगित करने में सक्षम होंगे - http://groups.google.com/group/project-lombok – McDowell

+0

ऐसा लगता है कि संकलक सिद्धांत में कुछ भी संभव करने के लिए संकलक को हैक कर सकता है। नीचे मतदान –

उत्तर

5

संपादित प्रश्न के जवाब में, जावा में सत्य ऑपरेटर ओवरलोडिंग को लागू करने का एकमात्र तरीका यह है कि इसे भाषा में जोड़ना है। इसका मतलब यह है कि आपको या तो अपने कोड को संकलित करने के लिए कंपाइलर को बदलना होगा या एक प्रीप्रोसेसर लिखना होगा जो आपके कोड को मानक जावा में परिवर्तित करता है। पूर्व के लिए, आप GNU या OpenJDK प्रोजेक्ट से लगभग पूर्ण FOSS जावा कार्यान्वयन डाउनलोड कर सकते हैं। उत्तरार्द्ध के लिए, आप या तो जावासीसी आदि जैसी चीजों का उपयोग करके अपना खुद का पार्सर लिख सकते हैं (उदाहरण इस page पर हैं) या आप JFront का उपयोग अपने स्वयं के वाक्यविन्यास को जोड़ने के लिए आधार के रूप में कर सकते हैं।

+1

ऐसा करने के लिए आपको भाषा (वाक्यविन्यास) को क्यों संशोधित करना होगा? ऑपरेटर लोडिंग एक अर्थपूर्ण मुद्दा है। पहचानकर्ता असंबद्धता के अलावा, पार्सिंग चरणों को बदलने की ज़रूरत नहीं है। – xcut

+0

वाक्यविन्यास को संशोधित किए बिना आप ऑपरेटर ओवरलोडिंग कैसे जोड़ेंगे? आपको या तो 'ऑपरेटर' कीवर्ड जोड़ना होगा या फ़ंक्शन नामों के रूप में '+', '-' आदि को अनुमति देना होगा। दोनों को सिंटैक्स स्वीकार्य है बदलने के लिए दोनों की आवश्यकता है। –

+0

मुझे एहसास है कि आप __sum __() इत्यादि जैसे प्रत्येक वर्ग के अंदर विशेष तरीकों को प्रदान करके ऐसा कर सकते हैं ध्यान दें कि मैंने केवल प्री-प्रोसेसर लिखने के साथ संयोजन में पार्सिंग का उल्लेख किया है। –

1

यदि आप ऑपरेटर ओवरलोडिंग चाहते हैं, तो आप Scala पर जाने पर विचार कर सकते हैं। स्कैला कोड आपके जावा कक्षाओं के साथ अंतःक्रियाशील है और ऑपरेटर ओवरलोडिंग का समर्थन करता है।

2

JFront जावा भाषा के लिए एक प्री-प्रोसेसर है जो आपको अपने स्वयं के वर्गों के लिए ऑपरेटर ओवरलोडिंग को लागू करने की अनुमति देता है। अफसोस की बात है, यह मानक कक्षाओं (BigInteger et al।) के लिए यह क्षमता जोड़ने की प्रतीत नहीं होती है।

+0

यह एक अच्छा चाल होगा यदि यह 'जावा। *' एपीआई कक्षाओं के लिए कर सकता है, लेकिन मुझे लगता है कि यह बाइटकोड या स्रोत संशोधन का उपयोग करता है, जो 'जावा' * के लिए एक विकल्प नहीं है (कुछ फैंसी क्लासलोडर फुटवर्क के बिना वैसे भी)। – skaffman

1

एक और दृष्टिकोण ग्रोवी पुस्तकालयों का उपयोग कर रहा है, ग्रोवी के पास पहले ही ऑपरेटर ओवरलोडिंग है।

https://o24j.dev.java.net/

वर्तमान कार्यान्वयन ग्रूवी का उपयोग करता है से अधिक भार के लिए। इस दृष्टिकोण में एक दोष है: ग्रोवी लाइब्रेरी को परियोजना के साथ वितरित करना होगा।

2

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

+0

इससे मुझे क्या हासिल करने में मदद मिलेगी? क्या आप कृपया अधिक स्पष्ट हो सकते हैं? –

+0

आप ऑपरेटरों आदि के साथ फ्लोट (उदाहरण के लिए) का उपयोग करके अपना सभी कोड लिख सकते हैं और इसके बदले अपने इच्छित प्रकार का उपयोग करने के लिए कोड को बदलने के लिए बाइट कोड प्रतिस्थापन का उपयोग कर सकते हैं। –

4

कुछ हैक्स के साथ जेएसआर 26 9 का उपयोग कर जावा ऑपरेटर ओवरलोडिंग को कार्यान्वित करना संभव है।javac और ग्रहण जेडीटी के लिए जावा-ऊ प्लगइन्स को देखो:

http://amelentev.github.com/java-oo/

+0

अच्छा लगता है। जैसा कि बिगइंटर, इत्यादि पर काम करता है। – Dukeling

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