আমি মনে করি আপনারা অধিকাংশই জানেন যে goto
এটি জাভা ভাষার একটি সংরক্ষিত কীওয়ার্ড তবে বাস্তবে ব্যবহৃত হয় না। এবং আপনি সম্ভবত এটিও জানেন যে goto
এটি একটি জাভা ভার্চুয়াল মেশিন (জেভিএম) অপকোড। আমি সব জাভা, Scala এবং Kotlin এর অত্যাধুনিক নিয়ন্ত্রণ প্রবাহ কাঠামো শ্রেণীভুক্ত করা হয়, জেভিএম স্তরে, কিছু সমন্বয় ব্যবহার করে বাস্তবায়িত goto
এবং ifeq
, ifle
, iflt
, ইত্যাদি
জেভিএম স্পেসটি https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto_w দেখছি আমি দেখতে পাই একটি goto_w
অপকোডও আছে। যেখানে goto
অফসেট 2-বাইট শাখা goto_w
নেয় , 4-বাইট শাখা অফসেট নেয়। জল্পনা বলে যে
যদিও geto_w নির্দেশনাটি 4-বাইট শাখা অফসেট নেয়, অন্য কারণগুলি একটি পদ্ধতির আকার 65535 বাইট (§4.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 ...
যে সংকলন? আমি জানি যে একটি একক উত্স শ্রেণীর আকারের সীমা আছে ... তবে আমি জানি না এটি সঠিকভাবে কী (কোড জেনারেশনটি কেবলমাত্র আমি দেখেছি যে কোনও কিছু আসলে এটি আঘাত করেছিল)।