7

मैं एक कठिन समय javac के कोड उन्मूलन क्षमताओं के बारे में जानकारी पाने आ रही हैं:javac कोड उन्मूलन क्षमताओं

मैंने पढ़ा है कि यदि आप निम्नलिखित की तरह कुछ है, if -statement सफाया हो जाएगा:

static final boolean DEBUG = false; 

if (DEBUG) System.out.println("Hello World!"); // will be removed 

लेकिन यह कैसे इस बारे में, उदाहरण के लिए:

static final int VALUE = 3; 

if (VALUE > 9) System.out.println("VALUE > 9 ???"); // will this be removed? 

या थी रों:

static final SomeEnum VALUE = SomeEnum.FOO; 

if (VALUE==SomeEnum.BAR) System.out.println("Bar???"); // will this be removed? 

यह बहुत मुश्किल/असंभव है के बाद से सभी मृत कोड (शायद हॉल्टिंग समस्या के समान) को खोजने के लिए एक कार्यक्रम का विश्लेषण करने, मैं कल्पना होगा केवल कुछ अच्छी तरह से परिभाषित निर्माणों (पहले की तरह देखते हैं कि ऊपर उदाहरण), जो javac भरोसेमंद पहचान और हटा देगा। क्या इन संरचनाओं की एक व्यापक सूची है?

+1

क्या आपने इसे देखने की कोशिश की है? 'javap -c' इसे बहुत स्पष्ट कर देगा ... –

+2

@ जोनस्केट मैंने अभी तक नहीं किया है, क्योंकि मैं इन संरचनाओं की एक सूची ढूंढने की उम्मीद कर रहा था, इसलिए मुझे उन्हें एक-एक करके बाहर करने की ज़रूरत नहीं है। इसके अलावा, मैं शायद सभी संभावनाओं के साथ आने में सक्षम नहीं हूं ... लेकिन, ऊपर दिखाए गए दो उदाहरणों के लिए, आप सही हैं, मैं जांच सकता हूं ... –

+1

रिकॉर्ड के लिए, पहले दो समाप्त हो गए हैं तीसरा नहीं है। – assylias

उत्तर

7

assylias लगता है इस सवाल का जवाब मिल गया है करने के लिए (मुझे सिर्फ यह सब एक साथ रखा जाने):

Chapter "14.21. Unreachable Statements" of the JLS निर्दिष्ट करता है कि सामान्य रूप में, कोड में कोई नहीं पहुंचा जा सकता बयान एक संकलन समय त्रुटि एकमात्र अपवाद if -statements की एक विशेष उपचार किया जा रहा है विशेष रूप से सशर्त compiles के लिए अनुमति देने के लिए के साथ माना जाता है।

इसलिए, केवल निर्माण कोड उन्मूलन में है कि मई परिणाम (! संकलक ऐसा करने के लिए चुनता है) है:

if (compileTimeConstantExpression) { 
    doThis(); // may be removed if compileTimeConstantExpression == false; 
} else { 
    doThat(); // may be removed if compileTimeConstantExpression == true; 
} 

(else भाग वैकल्पिक है, निश्चित रूप से)

अन्य सभी संरचनाएं जो कोड उन्मूलन की अनुमति देगी, उदाहरण के लिए while (false) ..., अस्वीकृत हैं और सशर्त संकलन के परिणामस्वरूप संकलन-समय-त्रुटि का कारण बनती हैं।

स्वीकार्य compileTimeConstantExpression का गठन करने की परिभाषा chapter "15.28. Constant Expressions" of the JLS में मिल सकती है। और उदाहरण के साथ एक और महान पेज यहां पाया जा सकता: Compile Time Constants in Java

नोट: वहाँ एक संकलक एक if -stament की "पहुँच योग्य नहीं" वर्गों को दूर करने के लिए कोई आवश्यकता नहीं है। javac यह भरोसेमंद प्रतीत होता है, लेकिन अन्य कंपाइलर नहीं हो सकते हैं। निश्चित रूप से जानने का एकमात्र तरीका डिकंपिलेशन के माध्यम से आउटपुट की जांच करना है, उदाहरण के लिए जॉन स्कीट द्वारा सुझाए गए अनुसार javap -c का उपयोग करना।

0

मुझे लगता है कि 2 उदाहरण के लिए यह बहुत हटा दिया जाता है

यह था मेरी कक्षा

public class Test { 

    public static void main(String[] args) throws Exception{ 
     final int VALUE = 3; 
     if (VALUE > 9) System.out.println("VALUE > 9 ???"); 
    } 
} 

और इस संस्करण

Compiled from "Test.java" 
public class Test extends java.lang.Object{ 
public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]) throws java.lang.Exception; 
    Code: 
    0: return 

} 
4

decompiled है मैं कुछ परीक्षण चलाने की है और ऐसा लगता है (तार्किक रूप से) कि javac कोड को हटा देता है Iif स्थिति constant expression है जो झूठी का मूल्यांकन करती है।

सारांश में, लगातार भाव भाव है कि केवल ऑपरेंड, यानि कि पुरातन, स्ट्रिंग शाब्दिक और final पुरातन या स्ट्रिंग्स चर कि एक निरंतर मूल्य के साथ initialised किया गया है के रूप में स्थिरांक का उपयोग कर रहे हैं।

ध्यान दें कि यह संकलक JLS के रूप में निर्भर है कि स्मार्ट के रूप में 14.21 के बिल्कुल नीचे समझाया होने के लिए संकलक के लिए मजबूर नहीं करता है:

एक अनुकूलन संकलक महसूस कर सकते हैं कि बयान एक्स = 3; कभी निष्पादित नहीं किया जाएगा और जेनरेट क्लास फ़ाइल से उस कथन के लिए कोड को छोड़ना चुन सकता है।

+0

ऐसा लगता है जैसे यह बहुत समझ में आता है ... क्या आपको पता है कि यह वास्तव में कहीं दस्तावेज़ों में निर्दिष्ट है या नहीं? +1 –

+0

@ मार्कस ए। मेरा संपादन देखें। – assylias

+0

मैंने आपके द्वारा प्रदान किए गए लिंक और जानकारी पर एक उत्तर निर्माण किया है। मेरा मानना ​​है कि यह इस तरह से अधिक पूर्ण/स्पष्ट है। लेकिन मुझे अभी भी लगता है कि आप शुरू में प्रासंगिक बिल्डिंग ब्लॉक प्रदान करने के लिए क्रेडिट के लायक हैं। तो, मैं सोच रहा था कि क्या आप अपना उत्तर एक और बार अपडेट करना चाहते हैं (मेरे हिस्सों को कॉपी करने के लिए स्वतंत्र महसूस करें), इसलिए मैं इसके बजाय आपकी स्वीकृति स्वीकार कर सकता हूं और हटा सकता हूं। :) –

0

मेरा अनुमान होगा कि यह कार्यान्वयन विशिष्ट है (ओरेकल, आईबीएम, ...)।

आप Oracle के संस्करण, एक अच्छी जगह संसाधनों की तलाश में OpenJDK परियोजना होगी शुरू करने के लिए में रुचि रखते हैं: http://openjdk.java.net/groups/compiler/

संबंधित मुद्दे