मुझे पता है कि आपमें से अधिकांश को पता है कि goto
जावा भाषा में एक आरक्षित कीवर्ड है, लेकिन वास्तव में इसका उपयोग नहीं किया जाता है। और आप शायद यह भी जानते हैं कि goto
जावा वर्चुअल मशीन (जेवीएम) ओपकोड है। मैं सभी जावा, स्काला और Kotlin के परिष्कृत नियंत्रण प्रवाह संरचनाओं मानना कर रहे हैं, JVM स्तर पर, के कुछ संयोजन का उपयोग कर कार्यान्वित किया goto
और ifeq
, ifle
, iflt
, आदि
JVM कल्पना को देखते हुए https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto_w मैं देख रहा हूँ कि वहाँ भी एक goto_w
opcode है। जबकि goto
2-बाइट शाखा ऑफ़सेट goto_w
लेता है, 4-बाइट शाखा ऑफ़सेट लेता है। युक्ति बताती है कि
यद्यपि गोटो_व अनुदेश 4-बाइट शाखा ऑफसेट लेता है, अन्य कारक विधि के आकार को 65535 बाइट्स (to4.11) तक सीमित करते हैं। जावा वर्चुअल मशीन के भविष्य के रिलीज में यह सीमा बढ़ाई जा सकती है।
यह मुझे लगता है जैसे goto_w
भविष्य के प्रूफिंग है, कुछ अन्य *_w
ऑपकोड की तरह। लेकिन यह मेरे साथ भी होता है कि शायद goto_w
दो और महत्वपूर्ण बाइट्स का उपयोग शून्य से बाहर किया जा सकता है और दो कम महत्वपूर्ण बाइट्स goto
को आवश्यकतानुसार समायोजन के साथ उपयोग किया जा सकता है।
उदाहरण के लिए, यह जावा स्विच-केस (या स्काला मैच-केस) दिया गया है:
12: lookupswitch {
112785: 48 // case "red"
3027034: 76 // case "green"
98619139: 62 // case "blue"
default: 87
}
48: aload_2
49: ldc #17 // String red
51: invokevirtual #18
// Method java/lang/String.equals:(Ljava/lang/Object;)Z
54: ifeq 87
57: iconst_0
58: istore_3
59: goto 87
62: aload_2
63: ldc #19 // String green
65: invokevirtual #18
// Method java/lang/String.equals:(Ljava/lang/Object;)Z
68: ifeq 87
71: iconst_1
72: istore_3
73: goto 87
76: aload_2
77: ldc #20 // String blue
79: invokevirtual #18
// etc.
हम इसे फिर से लिख सकते हैं
12: lookupswitch {
112785: 48
3027034: 78
98619139: 64
default: 91
}
48: aload_2
49: ldc #17 // String red
51: invokevirtual #18
// Method java/lang/String.equals:(Ljava/lang/Object;)Z
54: ifeq 91 // 00 5B
57: iconst_0
58: istore_3
59: goto_w 91 // 00 00 00 5B
64: aload_2
65: ldc #19 // String green
67: invokevirtual #18
// Method java/lang/String.equals:(Ljava/lang/Object;)Z
70: ifeq 91
73: iconst_1
74: istore_3
75: goto_w 91
79: aload_2
81: ldc #20 // String blue
83: invokevirtual #18
// etc.
मैंने वास्तव में यह कोशिश नहीं की है, क्योंकि मैंने शायद goto_w
एस को समायोजित करने के लिए "लाइन नंबर" को बदलने में गलती की है । लेकिन चूंकि यह कल्पना में है, इसलिए इसे करना संभव होना चाहिए।
मेरा सवाल यह है कि क्या कोई कारण है कि बायटेकोड का कंपाइलर या अन्य जनरेटर goto_w
वर्तमान 65535 सीमा के साथ उपयोग कर सकता है, यह दिखाने के अलावा कि यह किया जा सकता है?
// ... repeat 10K times ...
वह संकलन करता है? मुझे पता है कि एकल स्रोत वर्ग के आकार की एक सीमा है ... लेकिन मुझे नहीं पता कि यह वास्तव में क्या है (कोड पीढ़ी केवल एक बार मैंने कुछ देखा है वास्तव में इसे हिट किया है)।