2010-03-05 4 views
6

आप एक प्रोग्रामिंग भाषा कहलाते हैं जो अपना कोड निष्पादित कर सकता है (एक स्ट्रिंग अक्षर के रूप में पारित)?प्रोग्रामिंग भाषाओं की कक्षा का नाम जो अपना कोड निष्पादित करता है

string eight = "5+3" 
int result = run(eight) 

run कहाँ कीवर्ड है: मेरे मन में सेटिंग इस के लिए कुछ इसी तरह (कोड, परिणाम का एक पल टाइपिंग के लिए भूल, आदि) है। क्या यह एक प्रतिबिंबित प्रोग्रामिंग भाषा है?

+1

क्या आपका मतलब व्याख्या किया गया है? http://en.wikipedia.org/wiki/Interpreted_language – Pool

+1

एसक्यूएल में वे इसे "एसक्यूएल इंजेक्शन" कहते हैं; सी/सी ++ में वे इसे "शोषण" कहते हैं। –

+4

"एक eval function है" इसका संदर्भ देने का एक आम तरीका है। – Javier

उत्तर

1

मुझे लगता है कि आप Meta-circular evaluators के बारे में बात कर रहे हैं। आपके run कमांड evaleval-apply cycle में है, जो कंप्यूटर प्रोग्राम के संरचना और कार्यान्वयन में वर्णित है।

+1

यह मूल रूप से वह शब्द है जिसका उपयोग हमने अपनी स्नातक भाषा डिजाइन कक्षा में किया था। इस प्रकार की चीजों के साथ खेलने के लिए LISP एक अच्छी भाषा है। ~ 150 लाइनों में LISP का उपयोग करके एक साधारण LISP मूल्यांकनकर्ता लिखने का प्रयास करें। यह अच्छा मजा है! : डी –

1

Self-hosting संभवतः। मुझे पता है कि लिस्प ऐसी भाषा है, और विकिपीडिया ने इसे स्वयं-होस्टिंग कंपाइलर के रूप में संदर्भित किया है।

+0

AFAIK, स्वयं-होस्ट की गई भाषा का अर्थ है कि एक ही भाषा में एक कार्यान्वयन लिखा गया है। – Javier

0

हाँ, मैं हमेशा सोचा कि यह Reflection से घिरा था।

+0

जैसा कि मैंने इसे समझा, प्रतिबिंब एक प्रोग्राम है जो अपने स्वयं के निर्माण की जांच करने में सक्षम है, न कि मनमानी कोड निष्पादित करने में सक्षम होने के बारे में। उदाहरण के लिए, सी # और जावा दोनों में प्रतिबिंब सुविधाएं हैं, लेकिन स्ट्रिंग के रूप में प्रदान किए गए कोड को निष्पादित करने के लिए न तो कोई कीवर्ड है। – itowlson

+0

विकिपीडिया पृष्ठ से: "एक स्ट्रिंग का मूल्यांकन करें जैसे कि यह रनटाइम पर एक स्रोत कोड कथन था" यह एकमात्र चीज प्रतिबिंब नहीं है, लेकिन यह इसका सबसेट है। –

+0

हां विकिपीडिया उद्धरण की तरह कुछ। –

1

Homoiconicity एक संबंधित अवधारणा है, लेकिन मुझे नहीं लगता है कि यह वास्तव में है कि आप या तो क्या ढूंढ रहे हैं।

कंप्यूटर प्रोग्रामिंग में, homoiconicityहोमो अर्थ ही से, कुछ प्रोग्रामिंग भाषाओं, जिसमें कार्यक्रमों के प्राथमिक प्रतिनिधित्व भी अपने आप में भाषा की एक आदिम प्रकार में एक डेटा संरचना है की संपत्ति है और आइकन अर्थ प्रतिनिधित्व। यह मेटाप्रोग्रामिंग को इस संपत्ति के बिना किसी भाषा में आसान बनाता है।

+0

जिसे मैं ढूंढ रहा था वह एक स्ट्रिंग निर्माण में कोड को evals। जो कुछ मैं देखता हूं, होमियोइकोनिसिटी में 'कोड' प्रकार भी शामिल है। लेकिन हाँ, काफी करीब है। –

2

आपके द्वारा पूछे जाने वाले भाषाओं की श्रेणी "self-hosting" भाषाओं के बराबर है। एक स्व-होस्टिंग भाषा वह है, जिसके लिए एक ही भाषा में संकलक या दुभाषिया के कार्यान्वयन मौजूद हैं।

यहां एक सबूत है।

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

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

execute ARGV[0] 

तो, हम साबित कर दिया है कि वांछित संपत्ति के साथ प्रत्येक भाषा के स्वयं की मेजबानी है, और प्रत्येक स्वयं की मेजबानी भाषा इस संपत्ति है:

यहाँ इस दुभाषिया कैसे दिखाई देते हैं। इसका मतलब है कि आपके द्वारा अनुरोधित वर्ग स्वयं-होस्टिंग भाषाओं की कक्षा के बराबर है।

+0

लेकिन जब आप कछुओं से बाहर निकलते हैं तो क्या होता है? – SamB

3

सबसे अच्छा आप उस के साथ आ सकते हैं क्या आप के लिए किया जाता है (के रूप में अपने प्रश्न का उसकी टिप्पणी में जेवियर ने उल्लेख किया) "एक eval कार्य है" पूछना ठीक है।

स्व-होस्टिंग आवश्यक नहीं है और न ही यह आवश्यक है जो आप चाहते हैं। दो उदाहरण हैं: सी एक स्वयं होस्टेड भाषा है जो स्ट्रिंग में अपना कोड निष्पादित नहीं कर सकती है लेकिन टीसीएल एक स्वयं होस्टेड भाषा नहीं है जो स्ट्रिंग में दिए गए अपने कोड को निष्पादित कर सकती है।

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

  • साइड-साइड नोट। यदि हम ऐसा करने के लिए धोखा दे सकते हैं और "बाहरी कंपाइलर निष्पादित करें" मार्ग का उपयोग कर सकते हैं तो एक भाषा को जो भी आप चाहते हैं उसे करने के लिए स्वयं होस्टिंग करने की आवश्यकता नहीं है। इसे अपने स्वयं के कंपाइलर को कॉल करने के लिए केवल एक निष्पादन फ़ंक्शन की आवश्यकता होती है (जिसे अक्सर सी में लिखा जाता है)।

प्रतिबिंब/आत्मनिरीक्षण के साथ

ही, अपने आप को INTROSPECT करने के लिए इसका मतलब यह नहीं कि आप एक स्ट्रिंग में कोड निष्पादित कर सकते हैं की क्षमता होने। उन दो भाषाओं के उदाहरण जिनमें प्रतिबिंब है लेकिन इसमें अंतर्निहित eval नहीं है सी # और जावा हैं।

  • एक साइड नोट के रूप में, एक बार जब आपके पास एक eval फ़ंक्शन हो तो आप आम तौर पर प्रतिबिंबित/आत्मनिरीक्षण कर सकते हैं।

आत्म-व्याख्यात्मक स्वयं परिभाषा के रूप में अपनी परिभाषा के साथ एक ही समस्या है। टीसीएल एक ऐसी भाषा है जहां इसका eval फ़ंक्शन स्वयं में लिखा नहीं जाता है - यह केवल सी

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

तो, मैं बस इतना कहूंगा कि किसी भी भाषा में "एक eval function है" जो आप पूछ रहे हैं वह कर सकते हैं।

संबंधित मुद्दे