Intermediate Code Generation: Procedure Calls | इंटरमीडिएट कोड जनरेशन में प्रोसीजर कॉल्स


इंटरमीडिएट कोड जनरेशन में प्रोसीजर कॉल्स (Procedure Calls in Intermediate Code Generation)

Procedure Calls या Function Calls Compiler Design में उन स्थितियों को दर्शाते हैं जहाँ एक प्रोग्राम के अंदर किसी अन्य Subroutine या Function को निष्पादित किया जाता है। Intermediate Code Generation के दौरान, Compiler इन Procedure Calls को एक मशीन-स्वतंत्र रूप में परिवर्तित करता है ताकि Stack Management, Parameter Passing, और Control Transfer को कुशलता से संभाला जा सके।

परिचय (Introduction)

प्रोग्रामिंग भाषाओं में, Procedure या Function को बार-बार उपयोग किए जाने वाले कोड को पुनः प्रयोग (reuse) करने के लिए परिभाषित किया जाता है। जब कोई Function Call होता है, तो Compiler को कई महत्वपूर्ण कार्य करने पड़ते हैं — जैसे Parameter Values पास करना, Return Address सहेजना, और Local Variables के लिए Stack Frame बनाना।

Intermediate Code Generation चरण में, Compiler इन कार्यों को मशीन-स्वतंत्र रूप में दर्शाने के लिए विशेष प्रकार का कोड उत्पन्न करता है जिसे Activation Record और Call Sequence कहा जाता है।

Procedure Call की आवश्यकता (Need for Procedure Calls)

  • Code Reusability और Modularity प्राप्त करने के लिए।
  • Complex Programs को छोटे Subprograms में विभाजित करने के लिए।
  • Recursion और Nested Function Calls को संभालने के लिए।
  • Memory और Execution Control को संगठित करने के लिए।

Procedure Call की प्रक्रिया (Procedure Call Process)

एक Function Call में Compiler को निम्नलिखित कार्य करने होते हैं:

  1. Parameters को Pass करना।
  2. Return Address को Stack में सहेजना।
  3. Local Variables के लिए Memory Allocate करना।
  4. Control को Called Function की ओर Transfer करना।
  5. Function Execution पूरा होने पर Control को वापस लाना।

Activation Record (एक्टिवेशन रिकॉर्ड)

Compiler प्रत्येक Procedure Call के लिए एक Activation Record बनाता है जो Function Call की सभी जानकारियाँ संग्रहीत करता है।

Activation Record Structure:

FieldDescription
Return AddressFunction समाप्त होने पर कहाँ लौटना है।
ParametersCalled Function को दिए गए Arguments।
Control LinkCaller Function के Stack Frame का Pointer।
Access LinkNon-local Variable Access के लिए Pointer।
Local VariablesFunction के अंदर उपयोग किए गए Data।
Temporary DataIntermediate Results।

Intermediate Code Generation for Procedure Calls

Compiler Procedure Calls के लिए निम्नलिखित Intermediate Instructions बनाता है:

  1. Parameter Passing: सभी Actual Parameters को Evaluate कर Stack में Push किया जाता है।
  2. Function Invocation: CALL Instruction का उपयोग कर Function को Control Transfer किया जाता है।
  3. Return Handling: Function Execution पूरा होने पर RETURN Instruction से Control वापस Caller को भेजा जाता है।

उदाहरण:

call sum(a, b)

Intermediate Code Representation:

param a
param b
call sum, 2

यहाँ ‘2’ का अर्थ है कि दो Parameters Function को भेजे जा रहे हैं।

Function Definition (Intermediate Code):

sum:
   t1 = a + b
   return t1

Return Values का प्रबंधन (Return Value Handling)

Return Values को संभालने के लिए Compiler दो मुख्य रणनीतियाँ अपनाता है:

  • Register-Based Return: Return Value को एक विशेष Register में संग्रहित किया जाता है।
  • Memory-Based Return: Return Address पर एक Temporary Location में Value Store की जाती है।

उदाहरण:

t1 = call sum, 2
x = t1

Parameter Passing Mechanisms in Intermediate Code

  • Call by Value: Actual Parameter की एक Copy पास की जाती है।
  • Call by Reference: Actual Parameter का Address पास किया जाता है।
  • Call by Name: Expression के रूप में पास किया जाता है (जैसे ALGOL)।

Example (Call by Reference):

param &a
param &b
call swap, 2

Nested and Recursive Calls

Recursive Calls के लिए Compiler को Stack Frames को व्यवस्थित रूप से प्रबंधित करना पड़ता है ताकि हर Function Call के लिए अलग Activation Record बने।

उदाहरण (Recursion):

factorial(n):
   if n == 0 return 1
   else return n * factorial(n - 1)

Intermediate Code Representation:

factorial:
   if n == 0 goto L1
   t1 = n - 1
   param t1
   t2 = call factorial, 1
   t3 = n * t2
   return t3
L1: return 1

Procedure Call Optimization Techniques

  • Tail Recursion Elimination: Recursive Call को Iterative Loop में बदलना।
  • Inline Expansion: छोटे Functions को Inline Code में बदलना।
  • Register Allocation: Frequent Variables के लिए Registers Reserve करना।
  • Dead Parameter Elimination: Unused Arguments को हटाना।

Error Handling and Procedure Calls

Compiler यह सुनिश्चित करता है कि Function Calls के दौरान:

  • Parameter Count और Type सही हों।
  • Return Type Expected Type से मेल खाता हो।
  • Stack Overflow / Underflow न हो।
  • Recursive Calls Infinite न हों।

निष्कर्ष (Conclusion)

Intermediate Code Generation में Procedure Calls Compiler के सबसे महत्वपूर्ण पहलुओं में से एक हैं। यह Control Transfer, Stack Management, और Parameter Handling को मशीन-स्वतंत्र रूप में दर्शाते हैं। एक सुव्यवस्थित Activation Record और Parameter Passing Scheme Compiler को Memory Optimization, Efficiency, और Execution Control में सहायता प्रदान करते हैं। Procedure Calls Compiler Architecture का वह हिस्सा हैं जो High-Level Function Calls को Low-Level Machine Code से जोड़ता है।

Related Post