Saya pikir sebagian besar dari Anda tahu bahwa gotokata kunci yang disediakan dalam bahasa Jawa tetapi tidak benar-benar digunakan. Dan Anda mungkin juga tahu itu gotoadalah opcode Java Virtual Machine (JVM). Saya rasa semua struktur aliran kontrol canggih dari Jawa, Scala dan Kotlin yang, pada tingkat JVM, dilaksanakan dengan menggunakan beberapa kombinasi dari gotodan ifeq, ifle, iflt, dll
Melihat spesifikasi JVM https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto_w Saya melihat ada juga goto_wopcode. Sedangkan gotomengambil cabang offset 2-byte, goto_wmengambil cabang offset 4-byte. Spesifikasi menyatakan itu
Meskipun instruksi goto_w mengambil offset cabang 4-byte, faktor lain membatasi ukuran metode hingga 65535 byte (§4.11). Batas ini dapat dinaikkan pada rilis Java Virtual Machine yang akan datang.
Bagi saya kedengarannya seperti goto_wpembuktian di masa depan, seperti beberapa *_wopcode lainnya . Tetapi itu juga terjadi pada saya bahwa mungkin goto_wdapat digunakan dengan dua byte lebih signifikan memusatkan perhatian dan dua byte kurang signifikan sama seperti untuk goto, dengan penyesuaian yang diperlukan.
Sebagai contoh, dengan diberikan Java Switch-Case (atau Scala Match-Case):
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.
kita bisa menulis ulang sebagai
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.
Saya belum benar-benar mencoba ini, karena saya mungkin telah membuat kesalahan dengan mengubah "nomor baris" untuk mengakomodasi goto_w. Tetapi karena itu ada dalam spesifikasi, itu harus dimungkinkan untuk melakukannya.
Pertanyaan saya adalah apakah ada alasan kompiler atau generator bytecode lainnya dapat digunakan goto_wdengan batas 65535 saat ini selain untuk menunjukkan bahwa hal itu dapat dilakukan?
// ... repeat 10K times ...Kompilasi itu? Saya tahu ada batasan untuk ukuran satu sumber kelas ... tapi saya tidak tahu persis apa itu (pembuatan kode adalah satu-satunya waktu saya melihat sesuatu yang benar-benar memukulnya).