2012-03-09 7 views
7

यह प्रश्न this question के जवाब में एक चर्चा (अब हटा दिया गया है) पर आधारित है। यह वास्तविक प्रोग्रामिंग अर्थशास्त्र की तुलना में शब्दावली के बारे में अधिक है।सामान्य तत्कालता कब होती है (यानी, शब्द का क्या अर्थ है)?

सामान्य "तत्काल" क्या है? क्या यह संकलन समय या रन टाइम पर होता है?

मैं एडा 2012 मानक के latest draft का उल्लेख करूंगा।

शब्द का अर्थ generic_instantiation स्पष्ट है; यह एक वाक्य रचनात्मक निर्माण है,

package Inst is new Generic_Package(This => That); 

मेरा प्रश्न "तत्काल" क्रिया के बारे में है।

मैंने हमेशा "तत्काल" के बारे में सोचा है जो संकलन समय पर होता है। यह एक सामान्य टेम्पलेट का विस्तार है, और ऐसा तब होता है जब संकलक एक संकलन इकाई में generic_instantiation का सामना करता है।

लेकिन अन्य स्रोत कम से कम वैकल्पिक रूप से, रनटाइम पर "तत्काल" होने का संदर्भ लेते हैं।

This Wikipedia article का कहना है:

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

जो ऐसा लगता है कि तत्कालता या तो संकलन समय या रन टाइम पर हो सकती है। मुझे लगता है कि यह जेनेरिक_इंस्टेंटिएशन का संदर्भ दे रहा है, जो रन टाइम पर होता है - लेकिन फिर, सभी विस्तार रन टाइम पर होते हैं, हां?

मुझे एडीए आरएम से इसका एक निश्चित उत्तर प्राप्त करने में आश्चर्यजनक रूप से मुश्किल लग गई। "तत्काल" या "तत्काल" के लिए कोई शब्दावली प्रविष्टि (अनुलग्नक एन) नहीं है।

एक सामान्य शरीर के विस्तार करने के अलावा कोई अन्य प्रभाव पड़ता है की स्थापना है कि जेनेरिक:

निकटतम मैं मिल सकता है 12.2 (सामान्य निकाय) पैरा 2 में इस बयान था, "गतिशील शब्दार्थ" के अंतर्गत

तब से ElPER_Check को विफल किए बिना इकाई पर तत्काल हो सकती है।

जो परोक्ष रूप से संकेत मिलता है कि इन्स्टेन्शियशन एक रन-टाइम घटना है।

क्या क्रिया "तत्काल" ठीक से एक संकलन-समय घटना (एक सामान्य टेम्पलेट का विस्तार) का संदर्भ देता है? रन-टाइम ईवेंट (जेनेरिक_इंस्टेंटिएशन का विस्तार) करने के लिए? यदि उत्तरार्द्ध, हम पूर्व को क्या कहते हैं? क्या एडीए आरएम स्पष्ट है क्योंकि इसे इस बिंदु पर होना चाहिए?

+0

मुझे लगता है, बस अंग्रेजी पर आधारित, तत्कालता का मतलब एक उदाहरण का निर्माण है, जो निश्चित रूप से रन-टाइम की तरह लगता है। –

+0

@ डोनरोबी: आह, लेकिन "उदाहरण" क्या है? यदि कोई उदाहरण * कोड * है जो टेम्पलेट का विस्तार करने के परिणामस्वरूप होता है, तो यह संकलन-समय है। –

+0

@ डोनरोबी: एक ढीला सादृश्य: सी मैक्रो विस्तार निश्चित रूप से संकलन समय पर होता है, रन नहीं समय। आडा जेनेरिक स्पष्ट रूप से एक ही बात नहीं हैं, लेकिन कुछ सिद्धांत लागू होते हैं। –

उत्तर

0

"इंस्टेंटेशन" एक प्रकार का उदाहरण बनाने का कार्य है (या तो ऑब्जेक्ट या व्युत्पन्न प्रकार)। यह जेनेरिकों की बात करते समय पैकेज या उपप्रोग्राम के उदाहरण के निर्माण को भी संदर्भित कर सकता है।

type My_Type is 
    record 
     Range_Begin : Natural := 1; 
     Range_End : Natural := 15_000_000; 
    end record; 

type My_Type_Access is access all My_Type; 

My_Object1 : My_Type_Access := new My_Type; -- instantiation of My_Type 
              -- to create My_Object1 

My_Array_Objects : array (Positive range 1 .. 250_000) of My_Type_Access := 
    (others => new My_Type); -- creates an array of objects of My_Type 

"विस्तार" इस ​​तरह के एक पैकेज या लदान और निष्पादन के लिए कार्य के रूप में एक निर्माण तैयार करने की प्रक्रिया है: एक प्रकार का उदाहरण है कि प्रकार की एक वस्तु है। हालांकि, हाल ही में इसका अध्ययन नहीं किया है।

+0

मैंने "तत्काल" शब्द देखा है किसी प्रकार का एक उदाहरण (ऑब्जेक्ट) बनाने के लिए उपयोग किया जाता है, लेकिन यह वह नहीं है जिसके बारे में मैं बात कर रहा था; एडा में, शब्द लगभग हमेशा * जेनेरिक * तत्कालता को संदर्भित करता है। यह कहकर कि "जेनेरिक की बात करते समय यह पैकेज या उपप्रोग्राम के उदाहरण के निर्माण को संदर्भित कर सकता है" वास्तव में प्रश्न का उत्तर नहीं देता है; यह पता नहीं लगाता है कि * सृजन * संकलन समय या रन टाइम पर होता है। –

+0

हां। तुम बिलकुल सही हो। जेनेरिक तत्काल किसी भी विनिर्देश के भीतर हो सकता है - पैकेज, उपप्रोग्राम, या कार्य का घोषणात्मक भाग। एक जेनेरिक को किसी अन्य सामान्य के विनिर्देशन में तत्काल किया जा सकता है, इस मामले में यह अपने माता-पिता के तत्काल पर प्रभाव डालता है। रन-टाइम पर, किसी भी निर्माण के लिए किसी विनिर्देश के विस्तार से तत्कालता हो सकती है - जैसे कि निरंतर या आरंभिक चर का निर्माण विस्तार के दौरान हो सकता है। और हाँ, यह एक लूप के भीतर हो सकता है क्योंकि एनडब्ल्यूएस संकेत दिया गया है। –

1

the generic instantiationके अनुसार नियम 12, 13 और 14 नियमों में स्टेटिक सेमेन्टिक्स भाग में, यह संकलन समय पर किया जाता है।

लेकिन the Gnat documentation, अपने विस्तार आदेश नियंत्रण भाग में, का वर्णन है कि एक कार्यक्रम त्रुटि कुछ निश्चित परिस्थितियों में उठाया जाना होगा। इस तरह के अपवाद को प्रोग्राम चलाने के दौरान ही फेंक दिया जाता है।

तो बिंदु, जहां तक ​​मुझे समझ में आया, कि संकलन समय पर, संकलक जांच करता है कि तर्क आपके सामान्य द्वारा संचालित संचालन और श्रेणियों का समर्थन करते हैं लेकिन वास्तविक कोड रनटाइम पर किया जाता है।

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