इवल

From Vigyanwiki

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

eval और अप्लाई मेटा-सर्कुलर मूल्यांकनकर्ताओं के उदाहरण हैं, एक भाषा के व्याख्याकार जिन्हें भाषा के अन्दर ही लागू किया जा सकता है।[citation needed]


सुरक्षा जोखिम

अविश्वसनीय स्रोत से डेटा के साथ eval का उपयोग करने से सुरक्षा में भेद्यता आ सकती है। उदाहरण के लिए, यह मानते हुए कि get_data() फ़ंक्शन इंटरनेट से डेटा प्राप्त करता है, यह पायथन code असुरक्षित है:

session['authenticated'] = False

data = get_data()

foo = eval(data)

एक अटैकर डेटा के रूप में "session.update(authenticated=True)" स्ट्रिंग के साथ प्रोग्राम की आपूर्ति कर सकता है, जो एक प्रामाणिक कुंजी को सही होने के लिए सेट करने के लिए सत्र शब्दकोश को अपडेट करेगा। इसका समाधान करने के लिए, eval के साथ उपयोग किए जाने वाले सभी डेटो से बचा जाना चाहिए, या इसे संभावित रूप से हानिकारक कार्यों तक पहुंचे बिना चलाया जाना चाहिए।

कार्यान्वयन

व्याख्या की गई भाषाओं में, eval लगभग हमेशा उसी दुभाषिया के साथ सामान्य code के रूप में कार्यान्वित किया जाता है। संकलित भाषाओं में, प्रोग्राम को संकलित करने के लिए उपयोग किए जाने वाले एक ही कंपाइलर को eval फ़ंक्शन का उपयोग करके प्रोग्राम में एम्बेड किया जा सकता है; अलग दुभाषियों का कभी-कभी उपयोग किया जाता है, चूंकि इसके परिणामस्वरूप code दोहराव होता है।

प्रोग्रामिंग लैंग्वेज

ईसीएमएस्क्रिप्ट

जावास्क्रिप्ट

जावास्क्रिप्ट में,eval एक अभिव्यक्ति मूल्यांकनकर्ता और एक स्टेट्मन्ट निष्पादक के बीच एक संकर है। यह मूल्यांकन की गई अंतिम अभिव्यक्ति का परिणाम देता है।

अभिव्यक्ति मूल्यांकनकर्ता के रूप में उदाहरण:

foo = 2; alert(eval('foo + 2'));

एक स्टेट्मन्ट निष्पादक के रूप में उदाहरण:

foo = 2; eval('foo = foo + 2;alert(foo);');

जावास्क्रिप्ट का एक प्रयोगevalजेसन टेक्स्ट को पार्स करना है, संभवतया अजाक्स ढांचे के भाग के रूप में। चूंकि, आधुनिक ब्राउज़र इस कार्य के लिए अधिक सुरक्षित विकल्प के रूप में जेसन.पार्स प्रदान करते हैं।

एक्शन स्क्रिप्ट

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

एक्शन स्क्रिप्ट 3evalका समर्थन नहीं करता है।

एक्शन स्क्रिप्ट 3 eval लाइब्रेरी[2] और डी.एवल एपीआई[3] समकक्ष बनाने के लिए विकास परियोजनाएं थीevalएक्शन स्क्रिप्ट 3 में। दोनों समाप्त हो गए हैं, चूंकि एडोब फ्लैश प्लेयर अपने जीवन के अंत तक पहुंच गया है।

लिस्प

लिस्प 1958 में एक eval फ़ंक्शन का उपयोग करने वाली मूल भाषा थी। वास्तव में, eval फ़ंक्शन की परिभाषा के कारण भाषा दुभाषिया का पहला कार्यान्वयन का नेतृत्व किया।[4] eval फ़ंक्शन को परिभाषित करने से पहले, लिस्प फ़ंक्शंस को असेंबली लैंग्वेज स्टेटमेंट्स में मैन्युअल रूप से संकलित किया गया था। चूंकि, एक बार eval फ़ंक्शन को नियम रूप मे संकलित कर लेने के बाद इसे एक साधारण रीड-इवल-प्रिंट लूप भाग के रूप में उपयोग किया गया था, जिसने पहले लिस्प दुभाषिया का आधार बनाया था।

लिस्प eval फ़ंक्शन के बाद के संस्करणों को भी कंपाइलर के रूप में उपयोग किया गया है। लिस्प में eval फ़ंक्शन एक फॉर्म के मूल्यांकन और तर्क के रूप में निष्पादित होने की अपेक्षा करता है। दिए गए फॉर्म का रिटर्न वैल्यू कॉल टू eval का रिटर्न वैल्यू होगा।यह एक उदाहरण लिस्प code है:

<वाक्यविन्यास प्रकाश लैंग = लिस्प>

एक फॉर्म जो + फ़ंक्शन को 1,2 और 3 के साथ तर्क के रूप में कॉल करता है।
यह 6 लौटाता है।

(+ 1 2 3)

लिस्प में किसी भी रूप का मूल्यांकन किया जाना है, इसलिए
+ को कॉल किया गया था।
हम लिस्प को मूल्यांकन करने से रोक सकते हैं
उदाहरण के लिए ' के साथ उपसर्ग करके एक फॉर्म का

(सेट फॉर्म1 '(+ 1 2 3))

जब फॉर्म 1 में एक फॉर्म होता है जिसका उपयोग eval द्वारा किया जा सकता है
उदाहरण

(eval फॉर्म 1)

eval मूल्यांकन (+ 1 2 3) और 6 लौटा।

</वाक्यविन्यास हाइलाइट>

लिस्प बहुत लचीला होने के लिए जाना जाता है और इसलिए यह eval कार्य है। उदाहरण के लिए, स्ट्रिंग की सामग्री का मूल्यांकन करने के लिए, स्ट्रिंग को रीड-टू-स्ट्रिंग फ़ंक्शन का उपयोग करके पहले लिस्प फॉर्म में परिवर्तित करना होगा और फिर परिणामी फॉर्म को eval पास करना होगा:

(eval (read-from-string "(format t \"Hello World!!!~%\")"))

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

<वाक्यविन्यास लैंग = योजना>

उपरोक्त उदाहरण की तरह कुछ सरल रूप को परिभाषित करें।

(define form2 '(+ 5 2)) ;Value: form2

प्रारंभिक संदर्भ में प्रपत्र का मूल्यांकन करें।
मूल्यांकन के लिए एक संदर्भ को स्कीम स्लैंग में पर्यावरण कहा जाता है।

(eval form2 user-initial-environment) ;Value: 7

प्रारंभिक वातावरण को भ्रमित करें, जिससे + होगा
घटाव समारोह के लिए एक नाम।

(environment-define user-initial-environment '+ -) ;Value: +

फॉर्म का फिर से मूल्यांकन करें।
ध्यान दें कि लौटाया गया मान बदल गया है।

(eval form2 user-initial-environment) ;Value: 3

पर्ल

पर्ल में,eval कार्य एक अभिव्यक्ति मूल्यांकनकर्ता और एक विवरण निष्पादक के बीच एक संकर है। यह मूल्यांकन की गई अंतिम अभिव्यक्ति का परिणाम देता है (सभी कथन पर्ल प्रोग्रामिंग में अभिव्यक्ति हैं), और अंतिम अर्धविराम को छोड़े जाने की अनुमति देता है।

अभिव्यक्ति मूल्यांकनकर्ता के रूप में उदाहरण:

$foo = 2;

print eval('$foo + 2'), "\n";

एक विवरण निष्पादक के रूप में उदाहरण:

$foo = 2;

eval('$foo += 2; print "$foo\n";');

पर्ल में eval ब्लॉक भी हैं, जो इसके अपवाद हैंडलिंग तंत्र के रूप में कार्य करता है (अपवाद हैंडलिंग सिंटैक्स#पर्ल देखें)। यह eval के उपरोक्त उपयोग से अलग है जिसमें eval ब्लॉक के अंदर उस code में रन-टाइम के अतिरिक्त संकलन-समय पर व्याख्या की जाती है, इसलिए यह इस लेख में उपयोग किए गए eval का अर्थ नहीं है।

पीएचपी

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

कुछ भाषाओं के विपरीत, eval का तर्क एक या अधिक पूर्ण कथनों की एक स्ट्रिंग होना चाहिए, केवल भाव नहीं; चूंकि, कोई भी रिटर्न स्टेटमेंट में एक्सप्रेशन डालकर eval का "एक्सप्रेशन" फॉर्म प्राप्त कर सकता है, जिससे eval उस एक्सप्रेशन के परिणाम को वापस कर देता है।

कुछ भाषाओं के विपरीत, PHP का eval एक फ़ंक्शन के अतिरिक्त एक "भाषा निर्माण" है,[5] और इसलिए कुछ संदर्भों में इसका उपयोग नहीं किया जा सकता है जहां फ़ंक्शन हो सकते हैं, जैसे उच्च-क्रम के कार्य।

प्रतिध्वनि का उपयोग करने का उदाहरण:

<?php

$foo = "Hello, world!\n";
eval('echo "$foo";');
?>

मान लौटाने का उदाहरण:

<?php

$foo = "Goodbye, world!\n"; //does not work in PHP5
echo eval('return $foo;');
?>

लुआ

लुआ 5.1 में,लोडस्ट्रिंगलुआ code को एक अज्ञात फ़ंक्शन में संकलित करता है।

अभिव्यक्ति मूल्यांकनकर्ता के रूप में उदाहरण: loadstring("print('Hello World!')")()

दो चरणों में मूल्यांकन करने का उदाहरण:

a = 1

f = loadstring("return a + 1") -- compile the expression to an anonymous function
print(f()) -- execute (and print the result '2')

लुआ 5.2 स्थित लोड फ़ंक्शन के पक्ष में लोडस्ट्रिंग को बहिष्कृत करता है, जिसे स्ट्रिंग्स को स्वीकार करने के लिए संवर्धित किया गया है। इसके अतिरिक्त, यह फ़ंक्शन के वातावरण को सीधे प्रदान करने की अनुमति देता है, चूंकि वातावरण अब बंद हो गया है (कंप्यूटर विज्ञान)। load("print('Hello ' .. a)", "", "t", { a = "World!", print = print })()

परिशिष्ट भाग

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

<वाक्यविन्यास लैंग = पोस्टस्क्रिप्ट>

 ((Hello World) =) cvx exec

</वाक्यविन्यास हाइलाइट> पोस्टस्क्रिप्ट अभिव्यक्ति को परिवर्तित करता है

<वाक्यविन्यास लैंग = पोस्टस्क्रिप्ट>

 (Hello World) =

</वाक्यविन्यास हाइलाइट> जो स्टैक से हैलो वर्ल्ड स्ट्रिंग को पॉप करता है और इसे निष्पादन योग्य प्रकार के लिए स्क्रीन पर प्रदर्शित करता है, फिर निष्पादित किया जाता है।

पोस्टस्क्रिप्ट run ऑपरेटर कार्यक्षमता में समान है, लेकिन इसके अतिरिक्त दुभाषिया फ़ाइल में ही पोस्टस्क्रिप्ट एक्सप्रेशन की व्याख्या करता है।

<वाक्यविन्यास लैंग = पोस्टस्क्रिप्ट> (file.ps) चलाएँ </वाक्यविन्यास हाइलाइट>

पायथन

पायथन (भाषा) में,evalअपने सरलतम रूप में कार्य एकल अभिव्यक्ति का मूल्यांकन करता है।

evalउदाहरण (इंटरैक्टिव खोल): >>> x = 1

>>> eval('x + 1')
2
>>> eval('x') 1

evale> फ़ंक्शन दो वैकल्पिक तर्क लेता है, वैश्विक और स्थानीय, जो प्रोग्रामर को अभिव्यक्ति के मूल्यांकन के लिए एक प्रतिबंधित वातावरण स्थापित करने की अनुमति देता है। exec ई> विवरण (या exec फ़ंक्शन पायथन 3.x में) विवरणों को निष्पादित करता है:

exec उदाहरण (इंटरैक्टिव खोल):

>>> x = 1

>>> y = 1
>>> exec "x += 1; y -= 1"
>>> x
2
>>> y
0

कथनों/अभिव्यक्तियों के मूल्यांकन के लिए सबसे सामान्य रूप code ऑब्जेक्ट्स का उपयोग कर रहा है। इन्हें आह्वान करके बनाया जा सकता है compile() फ़ंक्शन और यह बताकर कि इसे किस प्रकार के इनपुट को संकलित करना है: aexecविवरण, aevalबयान या aसिंगगलकथन:

कम्पाइल उदाहरण (इंटरैक्टिव खोल):

>>> x = 1

>>> y = 2
>>> eval (compile ("print 'x + y = ', x + y", "compile-sample.py", "single"))
x + y = 3

डी

डी प्रोग्रामिंग एक सांख्यिकीय रूप से संकलित भाषा है और इसलिए इसमें सम्मलित नहीं हैevalपारंपरिक अर्थों में कथन, परंतु इसमें संबंधित "मिक्सिन" कथन सम्मलित है। अंतर यह है कि, जहां "eval" एक स्ट्रिंग को रनटाइम पर code के रूप में व्याख्या करता है, "मिक्सिन" के साथ स्ट्रिंग को सामान्य code की तरह स्थिर रूप से संकलित किया जाता है और संकलन समय पर जाना जाना चाहिए।

उदाहरण के लिए:

<वाक्यविन्यास प्रकाश लैंग = डी> आयात std.stdio;

void main() {

 int num = 0;
 mixin("num++;");
 writeln(num); // Prints 1.

} </वाक्यविन्यास हाइलाइट>

उपरोक्त उदाहरण ठीक उसी असेंबली भाषा के निर्देशों को संकलित करेगा जैसे किnum++;मिश्रित होने के अतिरिक्त सीधे लिखा गया था। मिक्सिन के तर्क को एक स्ट्रिंग शाब्दिक होने की आवश्यकता नहीं है, परंतु मनमाना अभिव्यक्ति जिसके परिणामस्वरूप एक स्ट्रिंग मान होता है, जिसमें फ़ंक्शन कॉल सम्मलित होते हैं, जिनका संकलन समय पर मूल्यांकन किया जा सकता है।

शीत संलयन

कोल्ड फ्यूजन काइवैल्यूएटफ़ंक्शन आपको रनटाइम पर स्ट्रिंग अभिव्यक्ति का मूल्यांकन करने देता है।

<cfset x = "int(1+1)">

<cfset y = Evaluate(x)>

यह विशेष रूप से तब उपयोगी होता है जब आपको उस चर को प्रोग्रामेटिक रूप से चुनने की आवश्यकता होती है जिसे आप पढ़ना चाहते हैं।

रूबी

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

किसी फ़ंक्शन के बंधन को निर्दिष्ट करने के अतिरिक्त, eval का उपयोग विशिष्ट वर्ग परिभाषा बाइंडिंग या ऑब्जेक्ट इंस्टेंस बाइंडिंग के अन्दर अभिव्यक्ति का मूल्यांकन करने के लिए भी किया जा सकता है, जिससे स्ट्रिंग्स में निर्दिष्ट नई विधियों के साथ कक्षाओं को विस्तारित किया जा सकता है।

a = 1 eval('a + 1') # (evaluates to 2)
  1. एक संदर्भ के भीतर मूल्यांकन

डेफ गेटबाइंडिंग (ए)

 बंधन

अंत eval('a+1',get_binding(3)) # (4 का मूल्यांकन करता है, चूंकि get_binding के संदर्भ में 'a' 3 है)

फोर्थ

फोर्थ के अधिकांश मानक कार्यान्वयन के दो संस्करण हैं eval: मूल्यांकन और व्याख्या ।

Win32FORTH code उदाहरण: <वाक्यविन्यास लैंग = आगे>

 S" 2 2 + ." EVALUATE \ Outputs "4"

</वाक्यविन्यास हाइलाइट>

फ्रेड

फ्रेमवर्क एफआरईडी एक इंटरएक्टिव भाषा है जिसमें eval द्वारा सभी code का स्वचालित रूप से मूल्यांकन किया जाता है। नीचे दिए गए उदाहरणों में स्ट्रिंग पैरामीटर ठीक वैसे ही चलेंगे जैसे किसी सूत्र में टाइप किए गए और निष्पादित किए गए हों या जब चयनित और निष्पादित किए गए हों। एम्परसेंड & तार संयोजन संचालिका है। इवल पुनरावर्ती रूप से इसके पैरामीटर को जोड़ता है, हल करता है और मूल्यांकन करता है। फ्रेड का एक आंतरिक कार्य भी है जिसका नाम है @value जो पैरामीटर स्ट्रिंग का मूल्यांकन करता है। @valueका वैकल्पिक दूसरा सांख्यिक पैरामीटर विशेष प्रकार जैसे दिनांक, समय के लिए इनपुट प्रकार और स्वरूपों को इंगित करता है। आदि और दिए गए मान प्रारूप को निर्धारित करता है।

सुरक्षा कारणों से @value संदर्भ का दायरा वैश्विक सापेक्ष है इसलिए @local के साथ बनाए गए स्थानीय चर @value के लिए अदृश्य हैं। उन्हें एकमात्र उसी सूत्र क्षेत्र में code द्वारा देखा जा सकता है। उसी टोकन द्वारा @value स्कोप में बनाए गए स्थानीय संस्करण केवल @value द्वारा देखे जा सकते हैं और उसी सूत्र या किसी अन्य code में code के लिए अदृश्य हैं।

फ्रेड code उदाहरण:

@value("5 + 4 + 1") # Return the numeric value 10

@value("2" & "3")           # Return the numeric value 23
@value("2" & " + 3")          # Return the numeric value 5
@value("2" & "+" & "3")        # Return the numeric value 5
@value("2 + 3")            # Return the numeric value 5 

my_var := 3, @value("2 + my_var") # Return the numeric value 5

my_var := -3, @value("2 + @abs(my_var)") # Return the numeric value 5

यह एक त्रुटि लौटाएगा चूंकि @value का दायरा वैश्विक है और @local वैश्विक संदर्भों के लिए अदृश्य है और एकमात्र अपने स्वयं के सूत्र में code द्वारा देखा जा सकता है। @local(a,b),

a := 1,
b := 2, 

@value("a + b") # return an error value (1*)

परंतु अगर a और b फ्रेम @value हैं जो वैश्विक और साथ ही सापेक्ष चर फ्रेम को संदर्भित कर सकते हैं,

a := 1,

b := 2,
@value("a + b")            # Return the numeric value 3

code की यह पंक्ति 3 वापस आ जाएगी चूंकि स्थानीय संस्करण @value दायरे में बनाए और देखे जाते हैं @value("@local(a,b),a:=1,b:=2,a+b") # Return the numeric value 3

परंतु code की अगली दो पंक्तियाँ एक अपरिभाषित संदर्भ त्रुटि लौटाएंगी चूंकि a और b स्थानीय @value स्कोप में बनाए गए हैं और सूत्र के बाकी कोड के लिए अदृश्य हैं, वास्तव में किसी भी code के लिए कहीं भी परंतु इस @value स्कोप में। @ मान (@ स्थानीय (a, b), a: = 1, b: = 2), a+b # एक अपरिभाषित संदर्भ त्रुटि लौटाता है

@value("{12/12/2012}",16) # स्ट्रिंग "12 दिसंबर, 2012"

@value("@fileload(@inputline(""Enter drive letter"",""" & @item1 & """) & " & """:\myfile.txt"")") # where @item1 is received parameter "c",

बेसिक

असली बुनियादी

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

वीबीस्क्रिप्ट

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

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

अनुप्रयोगों के लिए विजुअल बेसिक

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

स्मॉलटॉक

चूंकि स्मॉलटाक के कंपाइलर वर्ग मानक क्लास लाइब्रेरी का भाग हैं और सामान्यतः रन टाइम पर उपस्थित होते हैं, इन्हें code स्ट्रिंग का मूल्यांकन करने के लिए उपयोग किया जा सकता है। Compiler evaluate:'1 + 2'

चूंकि क्लास और मेथड की परिभाषाएँ मैसेज-सेंड्स (क्लास ऑब्जेक्ट्स) द्वारा भी लागू की जाती हैं, यहाँ तक कि code परिवर्तन भी संभव हैं: Compiler evaluate:'Object subclass:#Foo'

टीसीएल

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

set foo { while {[incr i]<10} { puts "$i squared is [expr $i*$i]" } } eval $foo

बीएस

बीएस में एक eval फ़ंक्शन है जो एक स्ट्रिंग तर्क लेता है। फ़ंक्शन अभिव्यक्ति मूल्यांकनकर्ता और कथन निष्पादक दोनों है। बाद की भूमिका में, इसका उपयोग त्रुटि से निपटने के लिए भी किया जा सकता है। निम्नलिखित उदाहरण और पाठ बीएस मैन पेज जैसा कि यूनिक्स सिस्टम वी रिलीज 3.2 प्रोग्रामर मैनुअल में दिखाई देता है।[6]

स्ट्रिंग तर्क का मूल्यांकन bs व्यंजक के रूप में किया जाता है। फ़ंक्शन संख्यात्मक स्ट्रिंग्स को संख्यात्मक आंतरिक रूप में परिवर्तित करने के लिए आसान है। eval </ code> का उपयोग संकेत के कच्चे रूप के रूप में भी किया जा सकता है, जैसा कि निम्नलिखित में है (ध्यान दें कि, bs में, code>_ (अंडरस्कोर) है संयोजन संचालिका।):

<वाक्यविन्यास लैंग = "bs"> नाम = "xyz" eval ("++" _ नाम) </वाक्यविन्यास हाइलाइट> जो चर को बढ़ाता है xyz.

इसके अतिरिक्त, eval पूछताछ ऑपरेटर, ? से पहले, उपयोगकर्ता को bs त्रुटि स्थितियों को नियंत्रित करने की अनुमति देता है। उदाहरण के लिए: <वाक्यविन्यास लैंग = "bs"> ? eval("open(\"X\", \"XXX\", \"r\")") </वाक्यविन्यास हाइलाइट> यदि "XXX" नाम की कोई फ़ाइल नहीं है, तो मान शून्य लौटाता है (इसके अतिरिक्त उपयोगकर्ता के कार्यक्रम को रोकने के)।

निम्नलिखित गोटो को L लेबल पर निष्पादित करता है (यदि यह उपस्थित है): <वाक्यविन्यास लैंग = "bs"> label = "L" if !(?eval("goto " _ label)) puterr = "no label"

</वाक्यविन्यास हाइलाइट>


कमांड-लाइन दुभाषिया

यूनिक्स गोले

मूल श (बॉर्न शेल) सहित सभी यूनिक्स शेल में eval कमांड उपस्थित है। यह रिक्त स्थान के साथ सभी तर्कों को जोड़ता है, फिर परिणाम को पार्स करता है और परिणाम को कमांड के रूप में निष्पादित करता है। sh(1) – FreeBSD General Commands Manual


विंडोज पॉवरशेल

विंडोज पॉवरशेल में, इनवोक-एक्सप्रेशन सीएमडीलेट जावास्क्रिप्ट, पीएचपी और पायथन जैसी प्रोग्रामिंग भाषाओं में eval फ़ंक्शन के समान उद्देश्य को पूरा करता है। सीएमडीलेट किसी भी विंडोज़ पावर शेल अभिव्यक्ति को चलाता है जो स्ट्रिंग के रूप में कमांड पैरामीटर के रूप में प्रदान किया जाता है और निर्दिष्ट अभिव्यक्ति के परिणाम को आउटपुट करता है। सामान्यतः,सीएम डीलेट का आउटपुट उसी प्रकार का होता है, जैसा एक्सप्रेशन को निष्पादित करने के परिणाम के रूप में होता है। चूंकि, यदि परिणाम एक खाली सरणी है, तो यह$nullआउटपुट करता है. यदि परिणाम एकल-तत्व सरणी है, तो यह उस एकल तत्व को आउटपुट करता है। जावास्क्रिप्ट के समान, विंडोज़ पावरशेल अंतिम अर्धविराम को छोड़े जाने की अनुमति देता है।

अभिव्यक्ति मूल्यांकनकर्ता के रूप में उदाहरण: PS > $foo = 2

PS > invoke-expression '$foo + 2' एक निष्पादक के रूप में उदाहरण:

PS > $foo = 2

PS > invoke-expression '$foo += 2; $foo'

माइक्रोकोड

1966 में आईबीएम संवादी प्रोग्रामिंग प्रणाली (सीपीएस) ने एक आईबीएम सिस्टम/360 मॉडल 50 पर "संशोधित पोलिश स्ट्रिंग में लिखी गई अभिव्यक्तियों का व्याख्यात्मक मूल्यांकन करने के लिए एक माइक्रोप्रोग्राम्ड फ़ंक्शन eval पेश किया।।[7] असाइनमेंट स्टेटमेंट की व्याख्या करने वाले प्रोग्राम की तुलना में इस फ़ंक्शन को माइक्रोकोडिंग पांच गुना तेजी से किया गया था।[8]


सिद्धांत

सैद्धांतिक कंप्यूटर विज्ञान में, सामान्यतः eval और अप्लाइ के बीच सावधानीपूर्वक भेद किया जाता है। एवल को एक उद्धृत स्ट्रिंग को एक कॉल करने योग्य फ़ंक्शन और उसके तर्कों में परिवर्तित करने का चरण समझा जाता है, जबकि प्रयुक्त तर्कों के दिए गए सेट के साथ फ़ंक्शन की वास्तविक कॉल है। भेद विशेष रूप से कार्यात्मक भाषाओं में ध्यान देने योग्य है, और लैम्ब्डा कैलकुस पर आधारित भाषाएं, जैसे कि एलआईएसपी और योजना इस प्रकार, उदाहरण के लिए, योजना में, एक बीच का अंतर है।

(eval '(f x) )

जहां फॉर्म (f x) का मूल्यांकन किया जाना है, और

(apply f (list x))

जहां फ़ंक्शन f को तर्क x के साथ कॉल किया जाना है।

मूल्यांकन और लागू, मूल्यांकन-लागू चक्र के दो अन्योन्याश्रित घटक हैं, जो कंप्यूटर प्रोग्राम की संरचना और व्याख्या में वर्णित लिस्प के मूल्यांकन का सार है।[9] श्रेणी सिद्धांत में, बंद मोनॉइडल श्रेणी को परिभाषित करने के लिए इवल आकारिता का उपयोग किया जाता है। इस प्रकार, उदाहरण के लिए, आकारिकी के रूप में लिए गए कार्यों के साथ सेट की श्रेणी, और कार्टेशियन उत्पाद को उत्पाद (श्रेणी सिद्धांत) के रूप में लिया जाता है, एक कार्टेशियन बंद श्रेणी बनाता है। यहां, eval (या, ठीक से बोलना, लागू करना) अपने दाहिने आसन्न के साथ, मिलकर, सरल रूप से टाइप किए गए लैम्ब्डा कैलकुलस का निर्माण करते हैं, जिसे कार्टेशियन बंद श्रेणियों के आकारिता के रूप में व्याख्या किया जा सकता है।

संदर्भ

  1. "Flash 8 LiveDocs". 2006-10-10. Archived from the original on 2006-10-10.
  2. ActionScript 3 Eval Library
  3. "The D.eval API". Archived from the original on 2013-03-14.
  4. John McCarthy, "History of Lisp - The Implementation of Lisp"
  5. "PHP: eval - Manual". PHP.net. Retrieved 2015-09-10.
  6. "Volume 1 Commands and Utilities". UNIX Programmer's Manual (PDF). AT&T. 1986. p. 41.
  7. Allen-Babcock. "Draft EVAL Microprogram" (PDF). Bitsavers.org. Retrieved Jan 17, 2016.
  8. Rochester, Nathaniel. "Conversational Programming System Progress Report" (PDF). Bitsavers.org. Retrieved Jan 17, 2016.
  9. The Metacircular Evaluator (SICP Section 4.1)


बाहरी संबंध