2014-07-23 12 views
9

में "यांत्रिक रूप से जेनरेट" जावा स्रोत फ़ाइलें, जैसा कि मैं जावा स्रोत कोड को देख रहा था, मुझे ByteBuffer से java.nio पैकेज में संबंधित कुछ असामान्य फाइलें मिलीं, जिनमें बहुत गन्दा स्रोत कोड था और लेबल किया गया था This file was mechanically generated: Do not edit!जावा स्रोत कोड

इन फ़ाइलों में लाइन नंबरों को बदलने से रोकने के लिए, संभवतया जवाडॉक्स (!!?) के बीच में भी रिक्त रेखाओं के बड़े हिस्से (कुछ भी शामिल हैं)। मैंने कुछ जावा डीकंपलर भी देखे हैं, जैसे कि procyon-decompiler, जिनके पास लाइन नंबर रखने का विकल्प है, लेकिन मुझे संदेह है कि यह मामला है, क्योंकि अंतिम प्रशंसा से पहले रिक्त रेखाएं डालने से कुछ भी नहीं बदलता है।

यहां इनमें से कुछ फाइलें हैं (मुझे उनसे कोई लिंक नहीं मिल सका और उन्हें पेस्टबिन नहीं किया क्योंकि मैं कोई कॉपीराइट तोड़ना नहीं चाहता हूं, लेकिन आप उन्हें src.zip फ़ोल्डर में ढूंढ सकते हैं अपने JDK स्थापना फ़ोल्डर की जड़):

  • java.nio.ByteBuffer
  • java.nio.DirectByteBufferR
  • java.nio.Bits
  • java.nio.BufferOverflowException

मैं जानने के लिए उत्सुक हो जाएगा:

  • कौन-सा टूल इन फ़ाइलों को उत्पन्न?
  • टूल लाइन संख्याओं को समान क्यों रखता है? क्या यह डिबगिंग (स्टैकट्रैस) को आसान बनाना है?
  • उन्हें उत्पन्न करने के लिए एक उपकरण का उपयोग क्यों किया जाएगा, जबकि अन्य सभी वर्ग मनुष्यों द्वारा प्रोग्राम किए जाते हैं?
  • उपकरण अंतिम प्रशंसा से पहले, या यहां तक ​​कि javadocs में, कोष्ठक के अंदर यादृच्छिक रूप से रिक्त रेखा क्यों डाल देगा?
+0

मुझे संदेह है कि आपको एक जवाब मिलेगा क्योंकि उस कोड में काफी समय लगता है- [2006 से यह ब्लॉग पोस्ट] देखें (http://www.iggdawg.com/blog/2006/09/jaaaavaaaaa /), जब जावा अभी भी सूर्य के स्वामित्व में था। – APC

+2

ऐसा लगता है कि इन फ़ाइलों को टेम्पलेट फ़ाइलों से कुछ प्रीप्रोसेसर द्वारा निर्मित के दौरान उत्पन्न किया जाता है: http://hg.openjdk.java.net/jdk9/dev/jdk/file/3b298c230549/src/share/classes/java/nio/ ByteBufferAs-X-Buffer.java.template –

+0

आईआईआरसी, सी प्रीप्रोसेसर #if या #else के बाद छोड़ने के कारण रिक्त रेखाएं डालता है। यहां, तर्क स्पष्ट है, मुझे लगता है: अगर कुछ संकलक ouput में एक त्रुटि झंडे, तो आप इसे मूल इनपुट में पाएंगे। – laune

उत्तर

9

मैं शायद सभी प्रश्नों के उत्तर नहीं दे सकता है, लेकिन कुछ पृष्ठभूमि है:

:

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile पर Makefile में, वे कुछ पूर्वप्रक्रमक के माध्यम से एक ही टेम्पलेट फ़ाइल से अलग जावा स्रोत फ़ाइलें पैदा कर रहे हैं

... 
$(BUF_GEN)/CharBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=char SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
$(BUF_GEN)/ShortBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=short SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
... 

$(X_BUF_TEMPLATE), X-Buffer.java.template को संदर्भित करता है CharBuffer, ShortBuffer और कुछ और की तरह टाइप किया बफ़र्स के लिए स्रोत है।

नोट: यूआरएल भविष्य में बदल सकता है। जावा 7 का जिक्र करने के लिए भी खेद है - जावा 8 में उन्होंने बिल्ड सिस्टम को संशोधित किया है, मुझे अब तक इसी मेकफ़ाइल नहीं मिली हैं।

कौन सा टूल इन फ़ाइलों को उत्पन्न करता है?

GEN_BUFFER_SH/GEN_BUFFER_CMD अंत में genBuffer.sh को संदर्भित करता है, तो स्क्रिप्ट जो इन फ़ाइलों को बनाता है http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh है।

उन्हें उत्पन्न करने के लिए एक उपकरण का उपयोग क्यों किया जाएगा, जबकि अन्य सभी वर्ग मनुष्यों द्वारा प्रोग्राम किए जाते हैं?

मैं इस विशेष मामले के लिए एक आधिकारिक जवाब नहीं है, लेकिन आम तौर पर प्रयोग कर रहे हैं कोड पीढ़ी उपकरण

  • यदि आप समान वर्गों का एक बहुत बनाने की जरूरत/तरीकों जो केवल में मतभेद कुछ विस्तार, लेकिन जो पर्याप्त सूक्ष्म है ताकि आप जेनेरिक या विधि पैरामीटर जैसे स्थापित तंत्र का उपयोग नहीं कर सकें (शायद यहां मामला, क्योंकि बफर जेनरिक्स के साथ उपयोग नहीं किए जा सकते हैं)
  • यदि आपको आवश्यकता है एक बहुत ही सरल प्रतिनिधित्व से जटिल एल्गोरिदम बनाएं (जैसे पार्सर उत्पन्न करना एक व्याकरण से एस)।

क्यों उपकरण लाइन नंबर एक ही रखता है? क्या यह डिबगिंग (स्टैकट्रैस) को आसान बनाना है?

मैं अनुमान लगा रहा हूँ: हाँ, इसके स्टैक ट्रेस में लाइन नंबर बनाए रखने के लिए इतना है कि वे टेम्पलेट फ़ाइलों से मेल खाते हैं। अन्य उपकरण जैसे C प्रीप्रोसेसर समान काम करते हैं।

+1

हां ये कक्षाएं आदिम प्रकारों (लघु, चार, ...) के लिए विविध हैं। एक दुर्लभ मामला भविष्य में जावा में लिपटे प्राचीन प्रकारों की कुछ जांच है, इसलिए आपके पास 'बफर ' हो सकता है। –

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