मान लें कि आप जावा (या सबसेट-ऑफ-जावा) कंपाइलर लिख रहे हैं और आप एक यूनरी नहीं अभिव्यक्ति के लिए बाइटकोड उत्पन्न करना चाहते हैं, !E
। आप पिछले प्रकार की जांच कर रहे हैं ताकि आपको पता चल सके कि E
में boolean
टाइप है, यानी यह ऑपरेटिंग स्टैक पर 1
या 0
दबाएगा।एक यूनरी नहीं अभिव्यक्ति के लिए जेवीएम बाइटकोड उत्पन्न करना
एक तरह से यह करने के लिए (जैस्मिन वाक्य रचना में) की तरह कुछ है:
E
ifeq truelabel
iconst_0
goto stoplabel
truelabel:
iconst_1
stoplabel:
यानी अगर वहाँ ढेर धक्का 1, और धक्का 0. यह करने के लिए एक और तरीका है पर एक 0 है, का लाभ लेने तथ्य यह है कि एक boolean
है बस मूल्य 1
या 0
के साथ एक int
, !E = (E + 1) % 2
कहना और उत्पन्न
E
iconst_1
iadd
iconst_2
irem
वहाँ एक दूसरे के ऊपर का उपयोग करने का लाभ है के लिए है? या पूरी तरह से कुछ और?
जेवीएम स्पेक कहता है: "जावा आभासी मशीन 1 का उपयोग करके बूलियन सरणी घटकों को एन्कोड करता है और झूठी प्रतिनिधित्व करने के लिए 0 का प्रतिनिधित्व करता है। जहां जावा प्रोग्रामिंग भाषा बूलियन मानों को जावा वर्चुअल मशीन प्रकार int के मानों के लिए कंपाइलर्स द्वारा मैप किया जाता है, तो कंपाइलर्स का उपयोग करना चाहिए एक ही एन्कोडिंग। " http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.3.4 –
@isbadawi यह वर्णन करता है कि कैसे JVM एन्कोड * बूलियन के सरणी * और जावा कंपाइलर्स को कैसे जरूरी है स्याही के रूप में एन्कोड बूलियन * कब और यदि वे ऐसा करते हैं। * यह प्रश्न के तुरंत बाद प्रासंगिक नहीं है। – EJP
@EJP यह मेरे लिए संदिग्ध लगता है। पहला वाक्य बूलियन सरणी के बारे में है, लेकिन दूसरा बुलियन मूल्यों के बारे में है। हालांकि मैं शायद गलत हूँ। –