टाइप कन्वर्शन

From Vigyanwiki

कंप्यूटर विज्ञान में, टाइप कन्वर्शन,[1][2] टाइप कास्टिंग,[1][3] टाइप कोएर्सीओन,[3]और टाइप जगलिंग,[4][5] एक अभिव्यक्ति (कंप्यूटर विज्ञान) को एक डेटा टाइप से दूसरे में परिवर्तित करने के विभिन्न उपाय हैं। जिसका एक उदाहरण पूर्णांक (कंप्यूटर विज्ञान) मान का एक तैरनेवाला स्थल मान में कन्वर्शन या स्ट्रिंग (कंप्यूटर विज्ञान) के रूप में इसका शाब्दिक प्रतिनिधित्व होगा, और इसका विपरीत भी संभव है । टाइप के कन्वर्शन टाइप हायरार्की या डेटा प्रतिनिधित्व की कुछ विशेषताओं का लाभ उठा सकते हैं। एक टाइप के कन्वर्शन के दो महत्वपूर्ण पहलू हैं कि क्या यह परोक्ष रूप से (स्वचालित रूप से) या स्पष्ट रूप से होते है,[1][6] और क्या अंतर्निहित डेटा प्रतिनिधित्व को एक प्रतिनिधित्व से दूसरे में परिवर्तित किया जा सकता है, या किसी दिए गए प्रतिनिधित्व की केवल दूसरे के प्रतिनिधित्व के रूप में व्याख्या की जा सकती है।[6][7] सामान्यतः आदिम डेटा टाइप और यौगिक डेटा टाइप दोनों को परिवर्तित किया जा सकता है।

प्रत्येक प्रोग्रामिंग भाषा के अपने नियम होते हैं कि कैसे टाइपों को परिवर्तित किया जा सकता है। मजबूत टाइपिंग वाली भाषाएं सामान्यतः बहुत कम निहित कन्वर्शन करती हैं और अभ्यावेदन की पुनर्व्याख्या को हतोत्साहित करती हैं, जबकि कमजोर टाइपिंग वाली भाषाएं डेटा टाइपों के बीच कई अंतर्निहित कन्वर्शन करती हैं। कमजोर टाइपिंग भाषाएं अधिकांशतः संकलक को अलग-अलग प्रतिनिधित्व वाले डेटा कार्यक्रम की मनमाने ढंग से व्याख्या करने के लिए विवश करती है - यह एक गैर-स्पष्ट प्रोग्रामिंग त्रुटि हो सकती है, या अंतर्निहित हार्डवेयर से सीधे निपटने के लिए एक तकनीकी विधि हो सकती है।

अधिकांश भाषाओं में, निरर्थक शब्द का उपयोग एक निहित कन्वर्शन को दर्शाने के लिए किया जाता है, या तो संकलन के समय या रन टाइम (कार्यक्रम जीवनचक्र चरण) के समय। उदाहरण के लिए, पूर्णांक और फ्लोटिंग पॉइंट नंबरों (जैसे 5 + 0.1) को मिलाकर एक व्यंजक में, अनुभाषक स्वचालित रूप से पूर्णांक प्रतिनिधित्व को फ्लोटिंग पॉइंट प्रतिनिधित्व में परिवर्तित कर देगा ताकि अंश खो न जाएं। स्पष्ट टाइप के कन्वर्शन या तो अतिरिक्त कोड लिखकर संकेतित होते हैं (उदाहरण के लिए टाइप आइडेंटिफ़ायर जोड़ना या बिल्ट-इन रूटीन को कॉल करना) या अनुभाषक के उपयोग के लिए कन्वर्शन कोडिंग रूटीन द्वारा जब यह अन्यथा किसी टाइप के असंगत के साथ रुक जाएगा।

अधिकांश अल्गोल जैसी भाषाओं में, जैसे पास्कल (प्रोग्रामिंग भाषा), मॉड्यूल-2, एडा (प्रोग्रामिंग भाषा) और डेल्फी (प्रोग्रामिंग भाषा), कन्वर्शन और कास्टिंग विशिष्ट रूप से भिन्न अवधारणाएँ हैं। इन भाषाओं में, कन्वर्शन या तो निहित रूप से या स्पष्ट रूप से एक डेटा टाइप के भंडारण प्रारूप से दूसरे में मान को बदलने के लिए संदर्भित करता है, उदाहरण एक 16-बिट पूर्णांक से 32-बिट पूर्णांक में। कन्वर्शन के परिणामस्वरूप भंडारण की अवश्यकता परिवर्तित हो सकती हैं, जिसमें परिशुद्धता या ट्रंकेशन का संभावित नुकसान भी सम्मलित है। दूसरी ओर, कास्ट शब्द, एक टाइप से दूसरे टाइप के मूल्य का प्रतिनिधित्व करने वाले बिट पैटर्न की व्याख्या को स्पष्ट रूप से परिवर्तित करने को संदर्भित करता है। उदाहरण के लिए, 32 सन्निहित बिट्स को 32 बूलियन्स की एक सरणी, एक 4-बाइट स्ट्रिंग, एक अहस्ताक्षरित 32-बिट पूर्णांक या एक आईईईई एकल सटीक फ़्लोटिंग पॉइंट मान के रूप में माना जा सकता है। क्योंकि संग्रहीत बिट्स कभी नहीं परिवर्तित किए जाते हैं, प्रोग्रामर को अर्थपूर्ण रूप से कास्ट करने के लिए निम्न स्तर के विवरण जैसे प्रतिनिधित्व प्रारूप, बाइट ऑर्डर और संरेखण की आवश्यकताओं को जानना चाहिए।

भाषाओं के सी परिवार और अल्गोल 68 में, कास्ट शब्द सामान्यतः एक स्पष्ट टाइप के कन्वर्शन (एक अंतर्निहित कन्वर्शन के विपरीत) को संदर्भित करता है, जिससे कुछ अस्पष्टता पैदा होती है कि क्या यह बिट-पैटर्न या वास्तविक डेटा प्रतिनिधित्व कन्वर्शन की पुन: व्याख्या है। अधिक महत्वपूर्ण, युक्ति और नियमों का समूह है जो एक सूचक द्वारा स्थित डेटा टाइप (या कक्षा) पर लागू होता है और वस्तु (वर्ग) उत्तराधिकार जैसे मामलों में अनुभाषक द्वारा सूचक को कैसे समायोजित किया जा सकता है।

भाषा तुलना

सी जैसी भाषाएं

अंतर्निहित टाइप कन्वर्शन

अंतर्निहित टाइप का कन्वर्शन, जिसे कोएर्सीओन या टाइप की जगलिंग के रूप में भी जाना जाता है, अनुभाषक द्वारा एक स्वचालित टाइप का कन्वर्शन है। कुछ प्रोग्रामिंग भाषा अनुभाषक को प्रवलता प्रदान करने की अनुमति देता हैं; चूँकि दूसरों को इसकी आवश्यकता होती है। मिश्रित टाइप के व्यंजक में, एक या एक से अधिक उप-टाइप के डेटा को रनटाइम पर आवश्यकतानुसार सुपरटाइप में परिवर्तित किया जा सकता है जिससे प्रोग्राम सही ढंग से चल सके। उदाहरण के लिए, निम्नलिखित लीगल सी (प्रोग्रामिंग भाषा) कोड है:

double  d;
long    l;
int     i;

if (d > i)   d = i;
if (i > l)   l = i;
if (d == l)  d *= 2;


चूंकि d, l, और i अलग-अलग डेटा टाइपों से संबंधित हैं, वे हर बार तुलना या असाइनमेंट निष्पादित होने पर स्वचालित रूप से समान डेटा टाइपों में परिवर्तित हो जाएंगे। इस व्यवहार का सावधानी से उपयोग किया जाना चाहिए, क्योंकि अनपेक्षित परिणाम उत्पन्न हो सकते हैं। फ़्लोटिंग-पॉइंट से पूर्णांक में प्रस्तुतियों को परिवर्तित करते समय डेटा खो सकता है, क्योंकि फ़्लोटिंग-पॉइंट मानों के भिन्नात्मक घटकों को छोटा कर दिया जाएगा (शून्य की ओर गोल)। इसके विपरीत, पूर्णांक से फ़्लोटिंग-पॉइंट में प्रस्तुतियों को परिवर्तित करते समय सटीकता खो सकती है, क्योंकि फ़्लोटिंग-पॉइंट टाइप कुछ पूर्णांक टाइप के सभी संभावित मानों का सटीक रूप से प्रतिनिधित्व करने में असमर्थ हो सकते है। उदाहरण के लिए, float एक आईईईई 754 का एकल सटीक टाइप हो सकता है, जो पूर्णांक 16777217 का सटीक रूप से प्रतिनिधित्व नहीं कर सकता है, जबकि 32-बिट पूर्णांक टाइप कर सकता है। जैसा कि निम्नलिखित कोड द्वारा प्रदर्शित किया गया है, यह अनैच्छिक व्यवहार का कारण बन सकता है:

#include <stdio.h>

int main(void)
{
    int i_value   = 16777217;
    float f_value = 16777216.0;
    printf("The integer is: %d\n", i_value);
    printf("The float is:   %f\n", f_value);
    printf("Their equality: %d\n", i_value == f_value);
}

आईईईई एकल परिशुद्धता के रूप में फ्लोट को लागू करने वाले अनुभाषक पर, और कम से कम 32 बिट्स के रूप में, यह कोड इस असाधारण प्रिंट-आउट को देगा:

The integer is: 16777217
The float is: 16777216.000000
Their equality: 1

ध्यान दें कि 1 उपरोक्त अंतिम पंक्ति में समानता का प्रतिनिधित्व करता है। यह अनूठा व्यवहार i_valueके फ़्लोट करने के अंतर्निहित कन्वर्शन के कारण होता है जब इसकी तुलना f_value से की जाती है। जो मूल्यों को तुलना से पहले समान बनाता है।

महत्वपूर्ण टेकअवे:

  1. float को int काट-छांट का कारण बनता है, यानी आंशिक भाग को हटा देता है।
  2. double को float अंक के पूर्णांकन का कारण बनता है।
  3. long को int अतिरिक्त उच्च क्रम बिट्स को छोड़ने का कारण बनता है।

टाइप प्रमोशन

निहित टाइप के कन्वर्शन का एक विशेष उद्देश्य टाइप प्रमोशन है, जहां एक वस्तु स्वचालित रूप से मूल टाइप के सुपरसेट का प्रतिनिधित्व करने वाले दूसरे डेटा टाइप में परिवर्तित हो जाती है। लक्षित प्लेटफॉर्म की अंकगणितीय तर्क इकाई (एएलयू) के मूल टाइप से छोटे टाइप के साथ, अंकगणितीय और तार्किक संचालन से पहले, यदि एएलयू एक से अधिक टाइप के साथ काम कर सकता है तब इस तरह के संचालन को संभव बनाने के लिए, या अधिक कुशल होने पर टाइप प्रमोशन को सामान्यतः उपयोग किया जाता है। सी और सी ++ बूलियन, कैरेक्टर, वाइड कैरेक्टर, एन्यूमरेशन, और शॉर्ट इंटीजर टाइप्स के ऑब्जेक्ट्स के लिए ऐसे प्रमोशन करते हैं, जिन्हें इंट में प्रमोट किया जाता है, और टाइप फ्लोट के ऑब्जेक्ट्स के लिए, जिन्हें डबल के लिए प्रमोट किया जाता है। कुछ अन्य टाइप के कन्वर्शनों के विपरीत, प्रचार कभी भी सटीकता नहीं खोते हैं या वस्तु में संग्रहीत मूल्य को संशोधित नहीं करते हैं।

जावा (प्रोग्रामिंग भाषा) में:

int x = 3;
double y = 3.5;
System.out.println(x + y); // The output will be 6.5

स्पष्ट प्रकार कन्वर्शन

स्पष्ट टाइप का कन्वर्शन, जिसे टाइप कास्टिंग भी कहा जाता है, एक टाइप का कन्वर्शन है जिसे एक कार्यक्रम के भीतर स्पष्ट रूप से परिभाषित किया जाता है (अंतर्निहित टाइप के कन्वर्शन के लिए भाषा के नियमों के अनुसार स्वचालित रूप से किए जाने के बजाय)। यह कार्यक्रम में उपयोगकर्ता द्वारा अनुरोध किया गया है।

double da = 3.3;
double db = 3.3;
double dc = 3.4;
int result = (int)da + (int)db + (int)dc; // result == 9
// if implicit conversion would be used (as with "result = da + db + dc"), result would be equal to 10

कई प्रकार के स्पष्ट कन्वर्शन हैं।

जाँच की गई
कन्वर्शन किए जाने से पहले, यह देखने के लिए एक रनटाइम जाँच की जाती है कि क्या गंतव्य टाइप स्रोत मान को धारण कर सकता है। यदि नहीं, तो एक त्रुटि स्थिति उठाई जाती है।
अनियंत्रित
कोई जाँच नहीं की जाती है। यदि गंतव्य टाइप स्रोत मान नहीं रख सकता है, तो परिणाम अपरिभाषित है।
बिट पैटर्न
स्रोत के अनिर्मित बिट प्रतिनिधित्व को शब्दशः कॉपी किया जाता है, और गंतव्य टाइप के अनुसार इसकी फिर से व्याख्या की जाती है। यह अलियासिंग (कंप्यूटिंग) के माध्यम से भी प्राप्त किया जा सकता है।

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा में, ऑब्जेक्ट्स डाउनकास्टिंग भी हो सकते हैं: बेस क्लास का एक संदर्भ इसके व्युत्पन्न वर्गों में से एक में डाला जाता है।

सी # और सी ++

सी शार्प (प्रोग्रामिंग लैंग्वेज) C# में, टाइप कन्वर्शन सुरक्षित या असुरक्षित (यानी, सी-लाइक) विधि से किया जा सकता है, पहले वाले को चेक्ड टाइप कास्ट कहा जाता है।[8]

Animal animal = new Cat();

Bulldog b = (Bulldog) animal;  // if (animal is Bulldog), stat.type(animal) is Bulldog, else an exception
b = animal as Bulldog;         // if (animal is Bulldog), b = (Bulldog) animal, else b = null

animal = null;
b = animal as Bulldog;         // b == null

C++ में C++- स्टाइल कास्ट सिंटैक्स का उपयोग करके एक समान प्रभाव प्राप्त किया जा सकता है।

Animal* animal = new Cat;

Bulldog* b = static_cast<Bulldog*>(animal); // compiles only if either Animal or Bulldog is derived from the other (or same)
b = dynamic_cast<Bulldog*>(animal);         // if (animal is Bulldog), b = (Bulldog*) animal, else b = nullptr

Bulldog& br = static_cast<Bulldog&>(*animal); // same as above, but an exception will be thrown if a nullptr was to be returned
                                              // this is not seen in code where exception handling is avoided
animal = nullptr;
b = dynamic_cast<Bulldog*>(animal);         // b == nullptr

delete animal; // always free resources

एफिल

एफिल (प्रोग्रामिंग लैंग्वेज) में टाइप कन्वर्शन की धारणा को टाइप सिस्टम के नियमों में एकीकृत किया गया है। असाइनमेंट नियम कहता है कि एक असाइनमेंट, जैसे कि:

x := y

मान्य है अगर और केवल अगर इसकी स्रोत अभिव्यक्ति का टाइप, इस घटना में, y इसकी लक्षित इकाई,x के टाइप के साथ संगत है। इस नियम में, के साथ संगत का अर्थ है कि स्रोत अभिव्यक्ति का टाइप या तो लक्ष्य के अनुरूप या परिवर्तित हो जाता है। वस्तु-उन्मुख प्रोग्रामिंग में बहुरूपता के लिए परिचित नियमों द्वारा टाइपों के अनुरूपता को परिभाषित किया गया है। उदाहरण के लिए, ऊपर दिए गए असाइनमेंट में y का टाइप x के टाइप के अनुरूप होता है यदि जिस वर्ग परy आधारित है वह उस पर आधारित है जिस पर x आधारित है।

एफिल में टाइप कन्वर्शन की परिभाषा

एफिल में टाइप कन्वर्शन की क्रियाएं, विशेष रूप से परिवर्तित होती हैं, उन्हें इस टाइप परिभाषित किया गया है:

वर्ग सीयू पर आधारित एक टाइप एक वर्ग सीटी के आधार पर एक टाइप टी में परिवर्तित हो जाता है (और टी यू से परिवर्तित होता है) यदि या तो

कन्वर्शन टाइप के रूप में यू का उपयोग करते हुए सीटी में एक कन्वर्शन प्रक्रिया है, या
सीयू के पास कन्वर्शन टाइप के रूप में एक कन्वर्शन क्वेरी लिस्टिंग टी है

उदाहरण

एफिल माइक्रोसॉफ्ट नेट फ्रेमवर्क के लिए पूरी तरह से अनुकूल भाषा है। नेट के विकास से पहले, एफिल के पास पहले से ही व्यापक श्रेणी के पुस्तकालय थे। नेट टाइप के पुस्तकालयों का उपयोग करना, विशेष रूप से सामान्यतः उपयोग किए जाने वाले टाइपों जैसे स्ट्रिंग्स के साथ, एक कन्वर्शन समस्या उत्पन्न करता है। वर्तमान एफिल सॉफ्टवेयर एफिल लाइब्रेरी से स्ट्रिंग क्लासेस (जैसे <कोड लैंग= एफिल >STRING_8) का उपयोग करता है, लेकिन नेट के लिए लिखे गए एफिल सॉफ्टवेयर को नेट स्ट्रिंग क्लास (System. String) का उपयोग करना चाहिए, उदाहरण के लिए नेट विधियों को कॉल करते समय जो आइटम की अपेक्षा करते हैं। युक्ति के रूप में पास किए जाने वाले नेट टाइप के हैं। । इसलिए, इन टाइपों का आगे और पीछे कन्वर्शन जितना संभव हो उतना निर्बाध होना चाहिए।

    my_string: STRING_8                 -- Native Eiffel string
    my_system_string: SYSTEM_STRING     -- Native .NET string

        ...

            my_string := my_system_string

उपरोक्त कोड में, दो स्ट्रिंग घोषित किए गए हैं, प्रत्येक भिन्न टाइप में से एक (SYSTEM_STRING System.String के लिए एफिल संगत उपनाम है)। चूँकि System.String STRING_8 के अनुरूप नहीं है, तो उपरोक्त असाइनमेंट केवल तभी मान्य है जब System.String > STRING_8 में परिवर्तित हो। एफिल क्लास STRING_8 में System.String टाइप के ऑब्जेक्ट के लिए make_from_cil कन्वर्शन प्रक्रिया है। कन्वर्शन प्रक्रियाओं को भी हमेशा निर्माण प्रक्रियाओं (निर्माणकर्ताओं के समान) के रूप में निर्दिष्ट किया जाता है। निम्नलिखित STRING_8 वर्ग का अंश है:

  class STRING_8
        ...
    create
        make_from_cil
        ...
    convert
        make_from_cil ({SYSTEM_STRING})
        ...

कन्वर्शन प्रक्रिया की उपस्थिति असाइनमेंट बनाती है:

my_string := my_system_string

शब्दार्थ के बराबर:

create my_string.make_from_cil (my_system_string)

जिसमें my_string कोmy_system_stringके समतुल्य सामग्री के साथ STRING_8 टाइप की एक नई सामग्री के रूप में बनाया गया है। मूल स्रोत और लक्ष्य उलटे हुए असाइनमेंट को संभालने के लिए:

 my_system_string := my_string

क्लास STRING_8 में एक कनवर्ज़न क्वेरी to_cil भी सम्मलित है जोSTRING_8 के उदाहरण से एक System.String उत्पन्न करेगी। <कोड लैंग= एफिल >STRING_8.

 class STRING_8
        ...
    create
        make_from_cil
        ...
    convert
        make_from_cil ({SYSTEM_STRING})
        to_cil: {SYSTEM_STRING}
        ...

सौंपा गया काम:

my_system_string := my_string

फिर, इसके बराबर हो जाता है:

 my_system_string := my_string.to_cil

एफिल में, टाइप कन्वर्शन के लिए सेटअप वर्ग कोड में सम्मलित है, लेकिन फिर क्लाइंट कोड में स्पष्ट टाइप के कन्वर्शन के रूप में स्वचालित रूप से होने लगता है। इसमें केवल असाइनमेंट ही नहीं बल्कि अन्य टाइप के अटैचमेंट भी सम्मलित हैं, जैसे तर्क (पैरामीटर) प्रतिस्थापन।

जंग

जंग (प्रोग्रामिंग भाषा) प्राचीन टाइपों के बीच कोई अंतर्निहित टाइप कन्वर्शन (नियंत्रण) प्रदान नहीं करता है। लेकिन, as कीवर्ड का उपयोग करके स्पष्ट टाइप कन्वर्शन (कास्टिंग) किया जा सकता है।[9]

println!("1000 as a u16 is: {}", 1000 as u16);

सुरक्षा मुद्दे

हैकर (कंप्यूटर सुरक्षा) में,टाइपकास्टिंग टाइप कन्वर्शन का दुरुपयोग है जो अस्थायी रूप से चर (कंप्यूटर विज्ञान) के डेटा टाइप को मूल रूप से परिभाषित करने के तरीके से बदल देता है।[10] यह हैकर्स के लिए अवसर प्रदान करता है क्योंकि एक भिन्न डेटा टाइप बनने के लिए एक चर "टाइपकास्ट" होने के बाद टाइप कन्वर्शन में, संकलक उस हैक किए गए चर को उस विशिष्ट ऑपरेशन के लिए नए डेटा टाइप के रूप में मानेगा।[11]

यह भी देखें

  • डाउनकास्टिंग
  • रन-टाइम टाइप की जानकारी # डायनेमिक कास्ट और जावा कास्ट
  • पनिंग टाइप करें

संदर्भ

  1. 1.0 1.1 1.2 Mehrotra, Dheeraj (2008). S. Chand's Computer Science. pp. 81–83. ISBN 978-8121929844.
  2. Programming Languages - Design and Constructs. 2013. p. 35. ISBN 978-9381159415.
  3. 3.0 3.1 Reilly, Edwin (2004). Concise Encyclopedia of Computer Science. pp. 82, 110. ISBN 0470090952.
  4. Fenton, Steve (2017). Pro TypeScript: Application-Scale JavaScript Development. pp. xxiii. ISBN 978-1484232491.
  5. "PHP: Type Juggling - Manual". php.net. Retrieved 2019-01-27.
  6. 6.0 6.1 Olsson, Mikael (2013). C++ Quick Syntax Reference. pp. 87–89. ISBN 978-1430262770.
  7. Kruse, Rudolf; Borgelt, Christian; Braune, Christian; Mostaghim, Sanaz; Steinbrecher, Matthias (16 September 2016). Computational Intelligence: A Methodological Introduction. p. 269. ISBN 978-1447172963.
  8. Mössenböck, Hanspeter (25 March 2002). "Advanced C#: Checked Type Casts" (PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. p. 5. Retrieved 4 August 2011. at C# Tutorial
  9. "Casting - Rust By Example". doc.rust-lang.org.
  10. Jon Erickson Hacking, 2nd Edition: The Art of Exploitation 2008 1593271441 p51 "Typecasting is simply a way to temporarily change a variable's data type, despite how it was originally defined. When a variable is typecast into a different type, the compiler is basically told to treat that variable as if it were the new data type, but only for that operation. The syntax for typecasting is as follows: (typecast_data_type) variable ..."
  11. Arpita Gopal Magnifying C 2009 8120338618 p. 59 "From the above, it is clear that the usage of typecasting is to make a variable of one type, act like another type for one single operation. So by using this ability of typecasting it is possible for create ASCII characters by typecasting integer to its ..."


बाहरी संबंध