Polymorphic Functions in Compiler Design | कंपाइलर डिज़ाइन में बहुरूपी फ़ंक्शन


कंपाइलर डिज़ाइन में बहुरूपी फ़ंक्शन (Polymorphic Functions in Compiler Design)

Polymorphism Compiler Design की एक उन्नत अवधारणा है जो प्रोग्रामिंग भाषाओं को एक ही नाम वाले फ़ंक्शन या ऑब्जेक्ट को अलग-अलग प्रकार के डेटा पर कार्य करने की क्षमता प्रदान करती है। इस क्षमता के कारण कोड अधिक लचीला, पुन: प्रयोज्य (reusable) और समझने में सरल बनता है।

परिचय (Introduction)

शब्द Polymorphism का अर्थ है — “एकाधिक रूप होना।” Compiler Design के संदर्भ में इसका अर्थ है कि एक ही फ़ंक्शन या ऑब्जेक्ट विभिन्न संदर्भों में अलग-अलग व्यवहार कर सकता है। Compiler को इस बात का निर्णय करना होता है कि किस परिस्थिति में कौन-सा व्यवहार लागू होगा।

Polymorphism का उपयोग Object-Oriented Languages (जैसे C++, Java, Python) में होता है और यह Compile-Time तथा Run-Time दोनों चरणों में लागू हो सकता है।

बहुरूपी फ़ंक्शन क्या होते हैं? (What are Polymorphic Functions?)

Polymorphic Functions वे फ़ंक्शन होते हैं जो अलग-अलग प्रकार के आर्गुमेंट्स पर अलग-अलग व्यवहार करते हैं, लेकिन उनका नाम समान रहता है। Compiler Design में, इन्हें टाइप सिस्टम और टाइप चेकिंग चरण में संभाला जाता है ताकि टाइप संगति बनी रहे।

Polymorphism के प्रकार (Types of Polymorphism)

प्रकारविवरण
1. Compile-Time Polymorphismजब Compiler Compile Time पर तय करता है कि कौन-सा फ़ंक्शन कॉल होगा। (जैसे Function Overloading, Operator Overloading)
2. Run-Time Polymorphismजब प्रोग्राम रनटाइम पर निर्णय लेता है कि कौन-सा फ़ंक्शन कॉल होगा। (जैसे Virtual Functions, Method Overriding)
3. Parametric PolymorphismGeneric Programming का रूप, जहाँ एक फ़ंक्शन विभिन्न प्रकार के डेटा पर काम कर सकता है।
4. Subtype Polymorphismजब एक Derived Class का Object Base Class के रूप में उपयोग किया जा सकता है।

Compile-Time Polymorphism

इसमें Compiler पहले से तय कर लेता है कि कौन-सा फ़ंक्शन या ऑपरेटर किस टाइप पर लागू होगा। उदाहरण के लिए, Function Overloading और Operator Overloading Compile-Time Polymorphism के उदाहरण हैं।

उदाहरण:

void display(int a) {
    cout << "Integer: " << a << endl;
}

void display(float a) {
    cout << "Float: " << a << endl;
}

display(5);      // Integer version
display(3.14f);  // Float version

Run-Time Polymorphism

Run-Time Polymorphism में Compiler यह निर्णय रनटाइम के दौरान करता है कि कौन-सा फ़ंक्शन कॉल किया जाएगा। यह सामान्यतः Virtual Functions के माध्यम से प्राप्त किया जाता है।

उदाहरण:

class Base {
public:
    virtual void show() {
        cout << "Base Class" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived Class" << endl;
    }
};

Base *b;
Derived d;
b = &d;
b->show(); // Output: Derived Class

Parametric Polymorphism (Generic Functions)

यह वह स्थिति है जहाँ एक ही फ़ंक्शन किसी भी प्रकार के डेटा पर काम कर सकता है। इसे C++ में Template Functions के माध्यम से प्राप्त किया जाता है।

उदाहरण:

template 
T add(T a, T b) {
    return a + b;
}

cout << add(3, 4);
cout << add(2.5, 3.1);

Subtype Polymorphism

Subtype Polymorphism में Derived Class का Object Base Class के रूप में व्यवहार करता है। Compiler यह सुनिश्चित करता है कि सभी overridden फ़ंक्शन्स सही तरीके से टाइप चेक किए जाएँ।

Compiler Design में Polymorphic Functions की भूमिका (Role in Compiler Design)

  • Type System और Semantic Analysis चरण में Compiler यह तय करता है कि कौन-सा संस्करण कॉल होना चाहिए।
  • Symbol Table में प्रत्येक Polymorphic Function की एंट्री विभिन्न Type Signatures के साथ होती है।
  • Code Generation चरण में सही Function Binding लागू की जाती है।
  • Runtime Environment में Virtual Table (vtable) का उपयोग किया जाता है ताकि Dynamic Dispatch संभव हो सके।

Polymorphism के लाभ (Advantages)

  • कोड की पुन: प्रयोज्यता बढ़ती है।
  • कोड अधिक पठनीय और लचीला बनता है।
  • Generic Programming को सक्षम करता है।
  • Inheritance और Encapsulation के साथ मिलकर OOP को मजबूत बनाता है।

Polymorphism की सीमाएँ (Limitations)

  • Runtime Polymorphism में Virtual Table का overhead होता है।
  • Type Checking जटिल हो सकती है।
  • Debugging और Optimization कठिन हो जाते हैं।

निष्कर्ष (Conclusion)

Compiler Design में Polymorphic Functions का उपयोग कोड की लचीलापन और दक्षता दोनों बढ़ाता है। यह Compiler को इस क्षमता से लैस करता है कि वह विभिन्न संदर्भों में एक ही फ़ंक्शन का अलग-अलग व्यवहार संभाल सके। Type Checking और Semantic Analysis इन फ़ंक्शन्स के सही उपयोग को सुनिश्चित करते हैं। इस प्रकार, Polymorphism Compiler Design की एक आवश्यक नींव है।

Related Post