java - जावा निरंतर अभिव्यक्ति और कोड उन्मूलन




compiler-construction dead-code (2)

इससे कोई फर्क नहीं पड़ता कि आपका निरंतर क्या है यदि यह एक संकलन-समय स्थिर है जैसा कि specfication में परिभाषित किया गया है, तो इसे रेखांकित किया जाएगा। स्टेटिक फाइनल (स्थिरांक) प्रति जावा विनिर्देशों में लिखे जाते हैं (हालांकि मुझे कल्पना नहीं मिली)। यह जावा विश्व लेख कुछ विस्तार से इस विषय पर चर्चा करता है। संबंधित सामान:

जावा भाषा विशिष्टता के अनुसार, किसी भी स्थिर अंतिम फ़ील्ड को अभिव्यक्ति के साथ आरम्भ किया जाता है जिसे संकलन समय पर मूल्यांकन किया जा सकता है वह बाइट कोड को संकलित किया जाना चाहिए जो फ़ील्ड मान को "इनलाइन" करता है। यही है, क्लास मेन के अंदर कोई गतिशील लिंक मौजूद नहीं होगा, यह रनटाइम पर ए से इंटरफेस ए के मान को प्राप्त करने के लिए कह रहा है। इसके बजाय, शाब्दिक 1 मुख्यतः मेन। में संकलित करेगा I

जैसा कि यहां चर्चा की गई है , अगर जवाक और अन्य जावा कम्पाइलर कंटेंट्स के लिए कोड उन्मूलन क्षमता प्रदान कर सकते हैं जहां की स्थिति "कॉन्स्टेंट एक्सप्रेशन" है

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

उदाहरण के लिए, मान लें कि मेरे पास संबंधित निर्दिष्ट पैकेजों में निम्नलिखित कक्षाएं हैं:

package foo;

public class Foo {
    public static final boolean CONDITION = false;
}

तथा

package bar;

import foo.Foo;

public class Bar {
    public void test() {
        if (Foo.CONDITION) {
            System.out.println("This line of code could be eliminated.");
        } else {
            System.out.println("This line of code will be executed.");
        }
    }
}

जाहिर है, अगर foo -package किसी बाह्य जार-फाइल से रन-टाइम पर लोड किया जाता है, तो संकलक तकनीकी तौर पर यह नहीं मान सकता है कि Foo.CONDITION गलत होगा और if -statement के true branch को समाप्त नहीं करना चाहिए।

जबकि, अगर Foo और Bar वास्तव में एक ही पैकेज में थे, तो true ब्रांच को निश्चित रूप से समाप्त करना चाहिए (यदि कंपाइलर कोड उन्मूलन का समर्थन करता है)।

यह सवाल बिल्कुल सही नहीं है कि कैसे इस सवाल का सबसे अच्छा वाक्यांश है, लेकिन: Foo "बंद" कैसे करता है, Foo में निरंतर अभिव्यक्ति के लिए Bar को Bar में स्थिर माना जा सकता है? क्या उन्हें उसी फाइल में होना चाहिए? एक ही पैकेज? एक ही जार फ़ाइल? या इससे कोई फर्क नहीं पड़ता है (यानी क्या संकलक हमेशा Foo.CONDITION को Foo.CONDITION करेगा। Foo.CONDITION निरंतर के रूप में और संकलन समय के दौरान बिल्ड-पथ में पाया गया मान का उपयोग करें)?


चूंकि यह संदर्भित वर्ग के "हस्ताक्षर" जनता का हिस्सा है, इसलिए इसे निरंतर माना जाता है मूलतः यह विचार है कि final मतलब अंतिम है, और यदि आप इसे बदलते हैं, तो यह आपकी गलती है

यह संदर्भित कक्षाओं की वास्तविक पद्धति के हस्ताक्षर के समान है, जिसे समयबद्ध तरीके से संकलित किया जाता है। यही वजह है कि यदि आप एक लाइब्रेरी के एक संस्करण के खिलाफ अपना कोड संकलित करते हैं और इसे किसी दूसरे के विरुद्ध चलाते हैं, तो आपको NoSuchMethodError मिल सकता है।

अद्यतन: वास्तव में जेएलएस एक भी मजबूत गारंटी देता है :

यदि एक क्षेत्र एक निरंतर चर (§4.12.4) है, तो अंतिम खोजशब्द को अंतिम रूप से बदलना या उसका मूल्य बदलना पूर्व-मौजूदा बाइनरी के साथ संगतता को नहीं चलाएगा जिससे वे चलने न पाएंगे, लेकिन वे उपयोग के लिए कोई नया मान नहीं देखेंगे क्षेत्र के जब तक वे recompiled हैं। यह सच है, भले ही उपयोग खुद संकलन-समय स्थिर अभिव्यक्ति (§ 15.28) नहीं है।

यह परिणाम सशर्त संकलन का समर्थन करने का निर्णय का एक साइड-प्रभाव है, जैसा कि § 14.21 के अंत में चर्चा की गई है।





code-elimination