2009-05-15 16 views
10

एरलांग कंपाइलर संकलन समय में अपरिभाषित कार्यों का पता क्यों नहीं लगाता है।एरलांग क्यों करता है: foo() संकलित करें?

अगर मैं test.erl लिखें:

-module(test). 
-export([start/0]). 

start() -> 
     erlang:foo(). 

यह ठीक संकलित करता है।

Eshell V5.6.5 (abort with ^G) 
1> c(test). 
{ok,test} 
2> 

लेकिन रनटाइम क्रैश हो जाता है।

2> test:start(). 
** exception error: undefined function erlang:foo/0 

कंपाइलर संकलन के दौरान इस बारे में कोई त्रुटि या चेतावनी क्यों जारी नहीं करता है? इसे निर्यात किए गए कार्यों के बारे में पता होना चाहिए, है ना?

उत्तर

16

एरलांग एक गतिशील भाषा है। यह अच्छा अभ्यास है हालांकि टाइपिंग और स्थिर विश्लेषण पोस्ट-संकलन करना है।

उपकरण Dialyzer इस प्रकार की त्रुटि स्थिति की जांच के लिए उपयोग किया जाता है।

संकलन समय पर संकलक इसके बारे में नहीं जानता है क्योंकि कार्यों को रन टाइम (और रिमोट नोड से भी) कोड पथ से खोज और गतिशील रूप से लोड किया जा सकता है। डायलज़र कोड चलाने के समय कोड पथ के विरुद्ध कोड की जांच करेगा।

रिमोट नोड से कोड लोड करने की क्षमता का अर्थ है कि किसी डिवाइस पर मूल 'सिस्टम' स्थापित किया जा सकता है और डिवाइस नेटवर्क से बूटस्ट्रैप कर सकता है।

तुम भी Erlang का एक और विशेषता यह है कि आप समारोह उत्पन्न कर सकते हैं याद रखना चाहिए कॉल की तरह on the fly निर्माणों का उपयोग कर:

erlang:apply(ModuleName, FunctionName, ArgList) 

ताकि मामले में यह बस संभव नहीं पता करने के लिए समारोह संकलन समय या बिल्कुल भी नहीं मौजूद है ।

और यद्यपि मॉड्यूल और फ़ंक्शन अब संकलित समय पर मौजूद हो सकता है, फिर भी आप मॉड्यूल को स्वैप कर सकते हैं और कोड को अनलोड कर सकते हैं, इसलिए यह रन टाइम पर नहीं हो सकता है।

+1

न केवल कोड पथ बल्कि एरलंग क्लस्टर में अन्य नोड्स।कोड को एरलांग वीएम में लोड करने के लिए स्थानीय होना आवश्यक नहीं है और निष्पादित किया गया है। –

+1

मैंने वास्तव में इसके बारे में सोचा नहीं था। एरलांग कुकबुक पर एक त्वरित नज़र यह कैसे बदलता है। http://www.trapexit.org/Remote_Code_Load –

+0

इसके अलावा, आप रनटाइम पर मॉड्यूल को प्रतिस्थापित या अनलोड करने के लिए स्वतंत्र हैं, इसलिए यदि संकलक अब चेक किया गया है, तो भी यह बाद में विफल हो सकता है। – archaelus

0

मुझे लगता है कि यह एक कार्यान्वयन प्रश्न है क्योंकि एरलांग डेवलपर्स ने बिल्ड-टाइम लिंकिंग के बजाए रनटाइम लिंक करने का निर्णय लिया है। कारण का एक हिस्सा संस्करण और/या गतिशील कोड लोडिंग करने के लिए कुछ हो सकता है।

0

आप xref एप्लिकेशन का उपयोग बहिष्कृत, अपरिभाषित और अप्रयुक्त कार्यों (और अधिक!) के उपयोग की जांच के लिए कर सकते हैं।

2> xref:m(test). 
[{deprecated,[]}, 
{undefined,[{{test,start,0},{erlang,foo,0}}]}, 
{unused,[]}] 

आप चाहते हो सकता है xref के बारे में अधिक की जाँच करने के लिए यहाँ:

Erlang -- Xref - The Cross Reference Tool (Tools User's Guide)

debug_info साथ मॉड्यूल संकलित करें: xref:m/1 साथ मॉड्यूल

Eshell V6.2 (abort with ^G) 
1> c(test, debug_info). 
{ok,test} 

चेक Erlang -- xref (Tools Reference Manual)

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