Parameter Passing in Compiler Design | कंपाइलर डिज़ाइन में पैरामीटर पासिंग


कंपाइलर डिज़ाइन में पैरामीटर पासिंग (Parameter Passing in Compiler Design)

Parameter Passing Compiler Design का एक महत्वपूर्ण पहलू है, जो यह निर्धारित करता है कि किसी फ़ंक्शन या सबरूटीन को कॉल करते समय डेटा (arguments) कैसे पास किया जाएगा। यह प्रक्रिया Run-Time Environment और Activation Records के साथ गहराई से जुड़ी होती है। Compiler को यह निर्णय लेना होता है कि parameters को value, reference, address या name के रूप में पास किया जाएगा।

परिचय (Introduction)

प्रत्येक प्रोग्राम में Functions या Procedures होते हैं जो किसी कार्य को निष्पादित करते हैं। इन Functions में Inputs दिए जाते हैं जिन्हें Parameters कहा जाता है। Parameters पास करने के विभिन्न तरीके Compiler के रनटाइम व्यवहार को प्रभावित करते हैं। Parameter Passing का सही तरीका चुनना Performance और Memory Usage दोनों के लिए आवश्यक होता है।

Parameter Passing की आवश्यकता (Need for Parameter Passing)

  • Functions को External Data प्रदान करने के लिए।
  • Code Reusability और Modularity के लिए।
  • Scope और Lifetime Management के लिए।
  • Different Execution Contexts में Data Transfer के लिए।

Parameter Passing के प्रकार (Types of Parameter Passing)

Compiler Design में Parameters को पास करने के कई तरीके होते हैं। प्रत्येक तरीका अलग-अलग मेमोरी मॉडल और डेटा व्यवहार प्रदान करता है।

प्रकारविवरण
1. Call by ValueActual Parameter की एक कॉपी Function को दी जाती है। Function के अंदर किए गए परिवर्तन मूल डेटा को प्रभावित नहीं करते।
2. Call by ReferenceActual Parameter का Address पास किया जाता है। Function के अंदर किए गए परिवर्तन मूल डेटा पर लागू होते हैं।
3. Call by AddressVariable का Pointer Function को पास किया जाता है, जो उसी मेमोरी लोकेशन को एक्सेस करता है।
4. Call by NameExpression को Function में Textual Substitution के रूप में पास किया जाता है (ALGOL भाषा में उपयोग)।

1️⃣ Call by Value (मान द्वारा कॉल)

यह सबसे सामान्य Parameter Passing Technique है। इसमें Compiler Actual Argument की कॉपी बनाकर उसे Formal Parameter में डाल देता है। Function Execution समाप्त होने के बाद Original Data अपरिवर्तित रहता है।

उदाहरण:

void modify(int x) {
    x = x + 10;
}
int main() {
    int a = 5;
    modify(a);
    cout << a;  // Output: 5
}

विशेषताएँ:

  • Simple और सुरक्षित।
  • Data Isolation सुनिश्चित करता है।
  • Memory Overhead हो सकता है।

2️⃣ Call by Reference (संदर्भ द्वारा कॉल)

इस तकनीक में Compiler Actual Parameter का Address Function को भेजता है। Function उसी Memory Location पर कार्य करता है, इसलिए परिवर्तन स्थायी होते हैं।

उदाहरण:

void modify(int &x) {
    x = x + 10;
}
int main() {
    int a = 5;
    modify(a);
    cout << a;  // Output: 15
}

विशेषताएँ:

  • Efficient और Memory Friendly।
  • Original Data को Modify कर सकता है।
  • Type Safety का ध्यान रखना आवश्यक।

3️⃣ Call by Address (पते द्वारा कॉल)

इस तकनीक में Pointer के माध्यम से Actual Variable का Address Function को भेजा जाता है।

उदाहरण:

void modify(int *x) {
    *x = *x + 10;
}
int main() {
    int a = 5;
    modify(&a);
    cout << a;  // Output: 15
}

लाभ:

  • Low-Level Control देता है।
  • Dynamic Memory Access संभव।

हानियाँ:

  • Pointer Errors संभव।
  • Memory Corruption का जोखिम।

4️⃣ Call by Name (नाम द्वारा कॉल)

यह ALGOL जैसी भाषाओं में प्रयोग किया जाता था। इसमें Expression को Function के अंदर Substitution के रूप में Pass किया जाता है। इसका Implementation कठिन होता है क्योंकि प्रत्येक उपयोग के समय Expression Evaluate होता है।

उदाहरण (Conceptual):

procedure swap(a, b);
begin
   temp := a;
   a := b;
   b := temp;
end;
swap(x, y);

Activation Record में Parameter Passing (Parameter Passing in Activation Record)

Compiler प्रत्येक Function Call के लिए एक Activation Record बनाता है। इसमें Parameters, Return Address, और Local Variables रखे जाते हैं। Parameters को Stack Frame में क्रमबद्ध रूप से संग्रहीत किया जाता है।

Activation Record Structure:

SectionDescription
Return AddressNext instruction to return after function completes.
Dynamic LinkPrevious activation record pointer.
ParametersFunction arguments.
Local VariablesFunction’s internal data.

Compiler की भूमिका (Compiler’s Role)

  • Parameter Evaluation Order तय करता है।
  • Activation Records बनाता है।
  • Parameters को Pass और Retrieve करता है।
  • Memory Address Mapping संभालता है।

Parameter Passing का प्रभाव (Impact on Compiler Design)

  • Type Checking और Conversion पर प्रभाव डालता है।
  • Run-Time Efficiency को प्रभावित करता है।
  • Function Call Optimization में सहायक।
  • Recursion और Nested Calls के लिए Stack Management आवश्यक।

निष्कर्ष (Conclusion)

Compiler Design में Parameter Passing का सही चुनाव Function Execution की गति, Memory Utilization, और Code Safety को प्रभावित करता है। Call by Value सरल और सुरक्षित है, जबकि Call by Reference अधिक लचीला और कुशल है। आधुनिक कंपाइलर Hybrid Strategies का उपयोग करते हैं ताकि प्रदर्शन और सुरक्षा दोनों प्राप्त की जा सकें।

Related Post