Erlang 21 - 14. Compilation and Code Loading

14 संकलन और कोड लोड हो रहा है




erlang

14 संकलन और कोड लोड हो रहा है

कोड को कैसे संकलित और लोड किया जाता है, यह भाषा का मुद्दा नहीं है, बल्कि सिस्टम पर निर्भर है। यह खंड दस्तावेज़ीकरण के प्रासंगिक भागों के संदर्भ में एर्लांग / ओटीपी में संकलन और कोड लोडिंग का वर्णन करता है।

14.1 संकलन

Erlang प्रोग्राम्स को ऑब्जेक्ट कोड के लिए संकलित किया जाना चाहिए। कंपाइलर एक नई फ़ाइल उत्पन्न कर सकता है जिसमें ऑब्जेक्ट कोड होता है। वर्तमान अमूर्त मशीन, जो ऑब्जेक्ट कोड चलाता है, को BEAM कहा जाता है, इसलिए ऑब्जेक्ट फ़ाइलों को प्रत्यय .beam मिलता है। कंपाइलर एक बाइनरी भी उत्पन्न कर सकता है जिसे सीधे लोड किया जा सकता है।

कंपाइलर मॉड्यूल compile में स्थित है (कंपाइलर में compile(3) मैनुअल पेज देखें)।

compile:file(Module)
compile:file(Module, Options)

एरलैंग शेल कमांड c(Module) समझता है जो c(Module) संकलित और लोड करता है।

एक मॉड्यूल make भी है, जो UNIX प्रकार मेक फ़ंक्शंस के समान फ़ंक्शन का एक सेट प्रदान करता है, टूल में make(3) मैनुअल पेज देखें।

संकलक को ओएस प्रॉम्प्ट से भी एक्सेस किया जा सकता है, erl(1) में erl(1) मैनुअल पेज देखें।

% erl -compile Module1...ModuleN
% erl -make

erlc प्रोग्राम शेल से मॉड्यूल संकलित करने का एक और बेहतर तरीका प्रदान करता है, ERTS erlc(1) मैनुअल पेज को ERTS में देखें। यह कई झंडों को समझता है जिनका उपयोग मैक्रोज़ को परिभाषित करने के लिए किया जा सकता है, फाइलों में शामिल करने के लिए खोज पथ जोड़ें, और बहुत कुछ।

% erlc <flags> File1.erl...FileN.erl

14.2 कोड लोड हो रहा है

ऑब्जेक्ट कोड को Erlang रनटाइम सिस्टम में लोड किया जाना चाहिए। यह कोड सर्वर द्वारा नियंत्रित किया जाता है, code(3) मैनुअल पेज को कर्नेल में देखें।

कोड सर्वर कोड लोडिंग रणनीति के अनुसार कोड लोड करता है, जो या तो इंटरेक्टिव (डिफ़ॉल्ट) या एम्बेडेड है । इंटरेक्टिव मोड में, कोड एक कोड पथ में खोजा जाता है और पहली बार संदर्भित होने पर लोड किया जाता है। एम्बेडेड मोड में, बूट स्क्रिप्ट के अनुसार कोड को स्टार्ट-अप पर लोड किया जाता है। यह System Principles में वर्णित है।

14.3 कोड प्रतिस्थापन

Erlang एक रनिंग सिस्टम में कोड बदलने का समर्थन करता है। कोड प्रतिस्थापन मॉड्यूल स्तर पर किया जाता है।

एक मॉड्यूल का कोड एक सिस्टम में दो वेरिएंट में मौजूद हो सकता है: वर्तमान और पुराना । जब कोई मॉड्यूल पहली बार सिस्टम में लोड होता है, तो कोड 'करंट' बन जाता है। यदि तब मॉड्यूल का एक नया उदाहरण लोड किया जाता है, तो पिछले उदाहरण का कोड 'पुराना' हो जाता है और नया उदाहरण 'वर्तमान' बन जाता है।

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

यदि मॉड्यूल का तीसरा उदाहरण लोड किया गया है, तो कोड सर्वर पुराने कोड को हटा देता है (इसमें कोई भी प्रक्रिया नहीं होती है)। फिर तीसरा उदाहरण 'चालू' हो जाता है और पहले वाला वर्तमान कोड 'पुराना' हो जाता है।

पुराने कोड से वर्तमान कोड में बदलने के लिए, एक प्रक्रिया को पूरी तरह से योग्य फ़ंक्शन कॉल करना होगा।

उदाहरण:

-module(m).
-export([loop/0]).

loop() ->
    receive
        code_switch ->
            m:loop();
        Msg ->
            ...
            loop()
    end.

प्रक्रिया परिवर्तन कोड बनाने के लिए, संदेश code_switch को भेजें। प्रक्रिया तब m:loop() पूरी तरह से योग्य कॉल करती है और वर्तमान कोड में बदल जाती है। ध्यान दें कि m:loop/0 निर्यात किया जाना चाहिए।

काम करने के लिए fun Module:FunctionName/Arity - fun Module:FunctionName/Arity के कोड प्रतिस्थापन के लिए, वाक्यविन्यास fun Module:FunctionName/Arity उपयोग करें fun Module:FunctionName/Arity

14.4 एक मॉड्यूल लोड होने पर एक फ़ंक्शन चलाना

-on_load() एक फ़ंक्शन को निर्देश देता है जो एक मॉड्यूल लोड होने पर स्वचालित रूप से चलाया जाना है।

इसका सिंटैक्स निम्नानुसार है:

-on_load(Name/0).

फ़ंक्शन को निर्यात करना आवश्यक नहीं है। इसे एक ताज़ा स्पान्ड प्रक्रिया में कहा जाता है (जो कि फ़ंक्शन के वापस आते ही समाप्त हो जाता है)।

यदि मॉड्यूल के लिए नया वर्तमान कोड बनना है और कॉल करने योग्य बनना है तो फ़ंक्शन को ok लौटना चाहिए।

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

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

ध्यान दें

ओटीपी 19 से पहले, यदि on_load फ़ंक्शन विफल हो जाता है, तो कोई भी वर्तमान कोड पुराना हो जाएगा, अनिवार्य रूप से मॉड्यूल के किसी भी कार्यशील और पहुंच योग्य उदाहरण के बिना सिस्टम को छोड़कर ओटीपी 19 में इस समस्या को समाप्त कर दिया गया है।

एम्बेडेड मोड में, पहले सभी मॉड्यूल लोड किए जाते हैं। फिर सभी on_load फ़ंक्शन कहलाते हैं। जब तक सभी on_load फ़ंक्शन ok नहीं हो जाते, तब तक सिस्टम समाप्त हो जाता है।

उदाहरण:

-module(m).
-on_load(load_my_nifs/0).

load_my_nifs() ->
    NifPath = ...,    %Set up the path to the NIF library.
    Info = ...,       %Initialize the Info term
    erlang:load_nif(NifPath, Info).

यदि कॉल erlang:load_nif/2 करने के लिए erlang:load_nif/2 विफल रहता है, तो मॉड्यूल अनलोड किया जाता है और त्रुटि लोडर को एक चेतावनी रिपोर्ट भेजी जाती है।