2012-04-22 27 views
8

संकलन समय समारोह मूल्यांकन (सीटीएफई) कैसे काम करता है? मैं यह समझने की कोशिश कर रहा हूं कि कंपाइलर, यह चल रहा है, ऐसा कुछ बनाता है जो मौजूद नहीं है (उदा।, एक फ़ंक्शन) और इसे निष्पादित करता है। मुझे इस विचार के लिए उपयोग किया जाता है कि स्रोत कोड संकलन के माध्यम से एक बाइनरी फ़ाइल बन जाता है, और फिर बाइनरी निष्पादित की जाती है। तो, एक स्रोत कोड कुछ ऐसा कैसे बनता है जो संकलक चल रहा है जबकि यह चल रहा है और यह इसे चलाने में सक्षम है? क्या कोई फ़ंक्शन वास्तव में बनाया और चलाया जाता है, या यह केवल फ़ंक्शन कॉल का अनुकरण है?सीटीएफई कैसे काम करता है?

उत्तर

11

सीटीएफई एक दुभाषिया का उपयोग करता है जो कंपाइलर में बनता है - जैसा कि आप पाइथन जैसे किसी व्याख्या की गई भाषा से अपेक्षा करते हैं। जब आप कुछ इस तरह संकलन:

bool not(bool arg) { 
    return !arg; 
} 
void main() { 
    enum compileTime = not(true); // not() called at compile time 
    bool runTime = not(true);  // not() called at runtime 
} 

संकलक tokenising/lexing/पार्स और इतने पर के सामान्य चरणों के माध्यम से चला जाता है। जब enum compileTime का सामना किया जाता है (या कोई अन्य निर्माण जिसके लिए संकलन समय मान की आवश्यकता होती है), यह अभिव्यक्ति के दाईं ओर क्या है इसका मूल्यांकन करने का प्रयास करेगा। स्थिरता के मामले में यह वही करता है जो आप अपेक्षा करते हैं और निरंतर स्टोर करता है। यदि यह फ़ंक्शन कॉल से मुकाबला करता है, तो यह सीटीएफई दुभाषिया शुरू करेगा। दिए गए उदाहरण में, यह जानता है कि तर्क क्या हैं, और कार्य में बयान क्या करते हैं, यह चरण-दर-चरण के माध्यम से जाता है और प्रत्येक को व्याख्या करता है। यदि यह संकलन समय पर कथन की व्याख्या नहीं कर सकता है तो यह संकलन समय त्रुटि जारी करेगा। इस सरल उदाहरण में, यह केवल पैरामीटर को अस्वीकार करता है, लेकिन सीटीएफई यहां प्रलेखित structs, कक्षाओं, loops और बहुत कुछ व्याख्या करने में सक्षम है - http://dlang.org/function#interpretation

+4

में निर्मित करें ध्यान दें कि इसमें से सभी (या अधिकतर) एक इम्प्लेमेन हैं टेशन विवरण। कोई भी कार्यान्वयन जिसका एक ही अंत प्रभाव होता है वह भी काम करेगा। – BCS

1

यह अनिवार्य रूप से constant folding का एक उन्नत रूप है जहां संकलक मूल्यों की गणना करने का प्रयास करता है, इसलिए इसे रनटाइम पर नहीं होना चाहिए (ऑपरेशन जो संकलन समय (आईओ, मेमोरी आवंटन, ...) पर नहीं हो सकता है यह विफल)

CTFE (उदाहरण के लिए एक enum को बताए द्वारा) विशेष है कि यह स्पष्ट किया जा सकता है और यह उपयोगकर्ता परिभाषित कार्यों

व्यवहार में यह एक दुभाषिया के द्वारा किया जा सकता है का मूल्यांकन करने का प्रयास करेंगे कि कंपाइलर

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