2011-01-25 11 views
6

आज मेरे तर्कों में से एक के साथ एक तर्क था कि संक्रामक अनुकूलन सक्षम होने पर एक कंपाइलर प्रोग्राम के अर्थशास्त्र को बदल सकता है।अनुक्रम अंक, सशर्त और अनुकूलन

मेरा कॉलेग्यू बताता है कि जब अनुकूलन सक्षम होते हैं, तो एक कंपाइलर कुछ निर्देशों का क्रम बदल सकता है। ताकि:

function foo(int a, int b) 
{ 
    if (a > 5) 
    { 
    if (b < 6) 
    { 
     // Do something 
    } 
    } 
} 

के लिए बदला जा सकता है: इस मामले में

function foo(int a, int b) 
{ 
    if (b < 6) 
    { 
    if (a > 5) 
    { 
     // Do something 
    } 
    } 
} 
बेशक

, यह परिवर्तन नहीं करता कार्यक्रम सामान्य व्यवहार और वास्तव में महत्वपूर्ण नहीं है।

मेरी समझ से, मेरा मानना ​​है कि दो if (condition) संबंधित दो अलग अलग अनुक्रम अंक और कहा कि संकलक उनके आदेश को बदल नहीं सकते कि, भले ही वह बदल रहा है एक ही सामान्य व्यवहार को बनाए रखने होगा।

तो प्रिय प्रिय उपयोगकर्ताओं, इस बारे में सच क्या है?

+0

मुझे अनुक्रम बिंदुओं के बारे में वास्तविक अर्थशास्त्र नहीं पता है, लेकिन केवल कल्पना करें कि उन दोनों मामलों में 'if (a> 5 && b <6)' के बराबर हैं ... और वे बदले में कम्यूटिव हैं।एकमात्र प्रदर्शन अंतर सांख्यिकीय रूप से शॉर्ट सर्किट की संभावना से आता है। लेकिन प्रश्न बन गया है, यहां तक ​​कि उस परिवर्तन के साथ '&&' के प्रत्येक पक्ष पर दो अनुक्रम बिंदु हैं? मैं कल्पना करता हूं कि वहां होना चाहिए, क्योंकि यही एकमात्र तरीका शॉर्ट सर्किटिंग लागू किया जा सकता है। –

+2

[यह अक्सर पूछे जाने वाले प्रश्न] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4176333#4176333) सभी अनुक्रम बिंदु सूचीबद्ध करता है। क्या आपने इसे देखा है? – sbi

+0

@ एसबीआई: नहीं, मैंने नहीं किया है। लेकिन अब मैं करूँगा;) धन्यवाद। – ereOn

उत्तर

12

यदि संकलक सत्यापित कर सकता है कि उन दोनों के बीच कोई अवलोकन अंतर नहीं है, तो यह अनुकूलन करने के लिए स्वतंत्र है।

अनुक्रम बिंदु एक वैचारिक बात है: संकलक को कोड उत्पन्न करना होता है जैसे कि व्यवहार करता है जैसे अनुक्रम बिंदुओं जैसे सभी अर्थपूर्ण नियमों का पालन किया गया था। जेनरेट कोड को वास्तव में उन नियमों का पालन नहीं करना पड़ता है यदि उनका पालन नहीं किया जाता है तो कार्यक्रम के व्यवहार में कोई अवलोकन अंतर नहीं होता है।

यहां तक ​​कि अगर आप था:

if (a > 5 && b < 6) 

संकलक स्वतंत्र रूप से इस को पुनर्व्यवस्थित

if (b < 6 && a > 5) 

हो सकती है क्योंकि वहाँ (दोनों के बीच कोई नमूदार फर्क इस विशिष्ट मामले में जहां a और b हैं में है int मूल्य दोनों)। [यह मानता है कि a और b दोनों को पढ़ने के लिए सुरक्षित है; यदि उनमें से किसी एक को पढ़ने से कुछ त्रुटि हो सकती है (उदाहरण के लिए, किसी के पास जाल मूल्य होता है), तो संकलक इसे कितनी अनुकूलन कर सकता है।]

+0

बहुत बहुत धन्यवाद! – ereOn

+0

कंपाइलर इस मामले में पुनर्व्यवस्थित नहीं कर सकता है, "और" के साथ गारंटी है कि दूसरी स्थिति का मूल्यांकन नहीं किया जाएगा यदि पहला झूठा है, और मुझे नहीं लगता कि यह कितना मामूली है। – CashCow

+5

@CashCow: संकलक ऐसा कुछ भी कर सकता है जब तक कोई अवलोकन अंतर न हो (चार्ल्स बेली द्वारा दिए गए सी ++ मानक उद्धरण को देखें)। कभी-कभी अभिव्यक्ति को पुन: व्यवस्थित करने से एक अवलोकन अंतर होता है (उदा। 'पी! = न्यूल और पी-> एक्स() '' p-> x() && p! = NULL' से अलग है, लेकिन यहां कोई अंतर नहीं है। अनुक्रम बिंदु वैचारिक हैं। –

11

चूंकि कोई प्रोग्राम नहीं है दो कार्यक्रमों के बीच अंतर स्निपेट्स - प्रदान किया गया कार्यान्वयन वह है जो जाल मूल्यों या किसी और चीज का उपयोग नहीं करता है जो आंतरिक तुलना को true या false का मूल्यांकन करने के अलावा कुछ और करने का कारण बन सकता है - संकलक "जैसे" नियम के तहत दूसरे को अनुकूलित कर सकता है । यदि कुछ अवलोकन करने योग्य अंतर या कुछ तरीका है कि एक अनुरूप प्रोग्राम अलग-अलग व्यवहार कर सकता है तो संकलक गैर-अनुरूप होगा यदि यह एक रूप में दूसरे रूप में बदल जाता है।

सी ++ के लिए, देखें 1.9 [intro.execution]/5.

एक अनुरूप कार्यान्वयन एक अच्छी तरह से गठित कार्यक्रम के लिए इसी उदाहरण के संभावित निष्पादन दृश्यों में से एक के रूप में ही नमूदार व्यवहार प्रस्तुत करेगा क्रियान्वित एक ही कार्यक्रम और एक ही इनपुट के साथ सार मशीन।हालांकि, अगर इस तरह के निष्पादन अनुक्रम में एक अपरिभाषित संचालन शामिल है, तो यह अंतर्राष्ट्रीय मानक उस इनपुट के साथ उस प्रोग्राम को कार्यान्वित करने के कार्यान्वयन पर कोई आवश्यकता नहीं रखता है (पहले अपरिभाषित ऑपरेशन से पहले संचालन के संबंध में भी नहीं)।

[यह प्रावधान कभी कभी, "के रूप में यदि" नियम कहा जाता है एक कार्यान्वयन जब तक परिणाम है के रूप में यदि आवश्यकता आज्ञा का पालन किया गया था इस अंतर्राष्ट्रीय मानक के किसी भी आवश्यकता उपेक्षा करने के लिए स्वतंत्र है, जहाँ तक क्योंकि कार्यक्रम के देखने योग्य व्यवहार से निर्धारित किया जा सकता है। उदाहरण के लिए, एक वास्तविक क्रियान्वयन एक अभिव्यक्ति का हिस्सा मूल्यांकन की आवश्यकता नहीं है अगर यह मान सकते हैं कि अपने मूल्य नहीं किया जाता है और कोई साइड कार्यक्रम की नमूदार व्यवहार को प्रभावित प्रभाव का उत्पादन कर रहे हैं।]

+0

धन्यवाद आपको बहुत। काश मैं दो उत्तरों को स्वीकार कर सकता हूं, लेकिन मैं सबसे ज्यादा उत्साहित हूं और इसे निष्पक्षता के लिए उठाता हूं। – ereOn

+3

मैं जेम्स के लिए अपना अपवॉट हटा सकता हूं और अगर इससे कोई फर्क पड़ता है तो उसे नीचे छोड़ दें? ** ** –

+0

अवलोकन योग्य व्यवहार नियमों के अपवाद हैं, जैसे प्रतिलिपि बनाने वालों की अभिवादन। कंपाइलर को ऐसा करने की इजाजत है कि भले ही अवलोकन व्यवहार बदल जाए। और संकलक पुनरावर्तक को देखने योग्य व्यवहार में परिवर्तन की ओर जाता है, भले ही संकलक को स्मृति बाधाओं को जोड़ने की आवश्यकता नहीं है। –

1

हाँ, if बयान एक sequence point है।

हालांकि, एक स्मार्ट और आक्रामक संकलक अभी भी विभिन्न अभिव्यक्तियों, बयानों को पुन: व्यवस्थित कर सकता है और अनुक्रम बिंदुओं को बदल सकता है जिससे कोई दुष्प्रभाव दिखाई नहीं दे रहा है।

1

अनुक्रम बिंदु केवल सार मशीन पर लागू होते हैं।

यदि लक्ष्य विशिष्ट अनुकूलक साबित कर सकता है कि दो निर्देशों के क्रम को उलट करने से कोई साइड इफेक्ट नहीं होता है, तो यह उन्हें इच्छानुसार बदल सकता है।

0

एक पूर्ण अभिव्यक्ति का अंत (जिसमें तार्किक संरचनाओं को नियंत्रित करते हैं, जैसे, जबकि, et cetera) एक अनुक्रम बिंदु है। हालांकि, अनुक्रम बिंदु वास्तव में केवल गारंटी प्रदान करता है कि पहले मूल्यांकन किए गए बयानों के दुष्प्रभाव पूरे हो गए हैं।

यदि किसी कथन में कोई अवलोकन दुष्प्रभाव नहीं है तो संकलक ऐसा कर सकता है जो इसे लगता है।

0

सच्चाई यह है कि यदि एक> 5 बी < 6 से अधिक झूठा है तो झूठा है या इसके विपरीत अनुक्रम बहुत मामूली अंतर करेगा क्योंकि इसे अधिक अवसरों पर दोनों सशर्तों की गणना करना होगा।

हकीकत में हालांकि यह बहुत छोटा है, इस विशेष मामले में परेशान करने के लायक नहीं है।

ऐसे मामले हैं जहां यह वास्तव में एक फर्क पड़ता है, यानी जब आप कई मानदंडों पर डेटा का एक बड़ा संग्रह फ़िल्टर कर रहे हैं और यह तय करना है कि कौन से फ़िल्टर को पहले लागू करना है, खासकर यदि उनमें से केवल एक ओ (लॉग एन) है या निरंतर और बाद के चेक जो बचा है उसके माध्यम से रैखिक हैं।

0

पीसी प्रोग्रामर उत्तर बहुत सारे =)

संकलक हो सकता है, और संभावना है, गति के लिए अनुक्रम अंक का अनुकूलन होगा अगर "बी" एक जल्दी-पहुँचा रजिस्टर में कार्य करने के लिए पारित हो जाता है, जबकि "एक" पारित हो जाता है ढेर पर 8-बिट और 16-बिट एमसीयू के लिए कई कंपाइलर्स के लिए यह एक आम मामला है: एस।

अनुकूलन के माध्यम से इसे पहले "बी" ढेर करने की आवश्यकता नहीं है, फिर "ए" को एक रजिस्टर में लोड करें, फिर "ए" का मूल्यांकन करें, फिर "बी" को एक रजिस्टर में लोड करें, फिर "बी" का मूल्यांकन करें। काफी गड़बड़ मैं अपेक्षा करता हूं कि अनुक्रम बिंदुओं को पुन: व्यवस्थित करके संकलक को संभाला जाए।

हालांकि पहले से ही उल्लेख किया गया है कि मानक अनुपालन होने के लिए संकलक को यह सुनिश्चित करना होगा कि यह अनुकूलन द्वारा प्रोग्राम व्यवहार को परिवर्तित न करे।

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