2010-11-21 14 views
9

क्या ऐसी भाषाएं हैं जहां दायरे को इस तरह से परिभाषित किया गया है जो संलग्न कार्यों तक विस्तारित नहीं होता है?क्या कोई वैश्विक चर के साथ प्रोग्रामिंग भाषाएं हैं?

>>> x = 3 
>>> def fact(n): 
...  print x 
...  return reduce(lambda u, v: u*v, xrange(1, n+1), 1) 
...  

एक त्रुटि देना होगा क्योंकि एक्स समारोह fact अंदर से परिभाषित नहीं है: दूसरे शब्दों में वहाँ एक भाषा जहां निम्नलिखित (अजगर की तरह सिंटेक्स) की तरह एक कोड है?

सामान्यतः, ऐसी भाषाएं हैं जहां का दायरा फ़ंक्शन में परिभाषित कार्यों को शामिल नहीं किया जाएगा?

संपादित करें: सूचनात्मक टिप्पणियों के लिए धन्यवाद।

समस्या क्योंकि: कारण मैं इस बारे में सोचा है कि सभी अपने युक्त कार्यों द्वारा प्रदान की पर्यावरण के लिए उपयोग होने एक आंतरिक समारोह की स्थिति संदेह से स्थिति उसके argument against OOP में जो आर्मस्ट्रांग द्वारा वर्णित करने के लिए मेरे करीब लग रहा है ऑब्जेक्ट-उन्मुख भाषाओं के साथ को यह सब अंतर्निहित वातावरण मिला है कि वे उनके साथ घूमते हैं। आप केले चाहते थे लेकिन आपको जो मिला वह केले और पूरे जंगल पकड़े हुए गोरिल्ला था।

यह भी प्रासंगिक है कि मैं यह सुनता हूं कि भाषा Newspeak में कोई वैश्विक नामस्थान नहीं है, हालांकि मुझे नहीं पता कि यह कैसे काम करता है।

मैं इस मुद्दे, नीचे ब्रायन की टिप्पणी में उठाया कल्पना कर सकते हैं, बिल्ट-इन कार्य (कई अन्य भाषाओं में Pythonspeak या सिस्टम में __builtins__ से आयात कार्यों) के हर कार्य में दुभाषिया/संकलक द्वारा कृत्रिम रूप से पेश किया। आखिरकार वे हमेशा पहले ही भाषा में विशेष रूप से इलाज करते हैं। एक और विकल्प यह है कि उन्हें किसी ऑब्जेक्ट के तरीके के रूप में कार्य करने के लिए पैरामीटर के रूप में पास किया गया हो या मॉड्यूल के रूप में आयात किया जाए।

+1

वह क्या पूरा करेगा? – Blindy

+4

ध्यान दें कि 'प्रिंट',' कम करें ', और' xrange' भी कुछ बाहरी दायरे से पहचानकर्ताओं को हल किया जा रहा है। जो दिखाता है कि यह शायद ही कभी उपयोगी क्यों है। – Brian

उत्तर

8

मैं न्यूज़पीक में यह कैसे काम करता हूं, इस बारे में मोटे तौर पर रूपरेखा करने की कोशिश करूंगा।

आपके द्वारा लिखे गए किसी भी कोड को मॉड्यूल में होना चाहिए। मॉड्यूल एक प्रकार का वर्ग है, क्योंकि न्यूज़पीक कक्षाओं में अन्य कक्षाएं हो सकती हैं, एक मॉड्यूल अनिवार्य रूप से एक शीर्ष-स्तरीय वर्ग है - जो कि किसी अन्य वर्ग में निहित नहीं है। न्यूज़पीक के बारे में विशेष क्या है कि आप अपने मॉड्यूल के बाहर कुछ भी नहीं देख सकते हैं।

तो आप न्यूजपीक में कंसोल पर कैसे प्रिंट करते हैं? प्रिंटिंग कंसोल क्लास (ए.के.ए. स्मॉलटाक की ट्रांसक्रिप्ट) से संबंधित है जो प्लेटफ़ॉर्म मॉड्यूल का हिस्सा है।कंसोल पर प्रिंट करने में सक्षम होने के लिए, आपका मॉड्यूल प्लेटफ़ॉर्म कन्स्ट्रक्टर पैरामीटर लेगा, प्लेटफॉर्म से कंसोल प्राप्त करेगा, कंसोल को स्लॉट में स्टोर करेगा, और उसके बाद प्रिंट करने के लिए इसका इस्तेमाल करेगा।

असल में यह भाषा स्तर पर लागू निर्भरता इंजेक्शन की तरह है। भाषा आईडीई और रनटाइम आपको अपने प्रोग्राम को पैकेज और बूटस्ट्रैप करने में मदद करता है, लेकिन यदि आप अधिक जानकारी चाहते हैं - Gilad Bracha's blog पर जाएं, उदाहरण के लिए this post देखें, या Newspeak Modules paper देखें।

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

+0

इसमें वैश्विक स्थिति की कमी नहीं है- कि कंसोल क्लास वैश्विक स्थिति है, यह केवल कंपाइलर द्वारा प्रबंधित की जाती है, न कि उपयोगकर्ता। – Puppy

+0

काफी नहीं। कंसोल क्लास प्लेटफ़ॉर्म मॉड्यूल का हिस्सा है, प्लेटफॉर्म उदाहरण प्राप्त किए बिना इसे प्राप्त करने का कोई तरीका नहीं है। कक्षा स्वयं मॉड्यूल की एक संपत्ति है, वासीली बाइकोव द्वारा पोस्ट की इन श्रृंखलाओं में एक बहुत अच्छी व्याख्या है: http://blog.3plus4.org/2008/12/04/a-taste-of-nested-classes-part -1/ – Yardena

+0

मुझे लगता है कि तर्क "किसी भाषा में मौजूद नहीं" की परिभाषा को उबालता है। IMHO यदि प्रोग्रामिंग भाषा का कंपाइलर और रनटाइम प्रोग्रामर को एक निश्चित अवधारणा का खुलासा नहीं करता है, तो "अवधारणा किसी भाषा में मौजूद नहीं है", उदा। जावा मेमोरी आवंटन और गोटो के बिना एक भाषा है, भले ही वे स्पष्ट रूप से हुड के नीचे होते हैं। – Yardena

-5

वास्तव में, ऐसी चीज कभी मौजूद नहीं हो सकती थी। विचार करें - जब आप कंसोल पर प्रिंट करते हैं, तो वह कंसोल हैंडल कहां से आ रहा है? जब आप किसी फ़ंक्शन का संदर्भ लेते हैं, तो वह फ़ंक्शन कहां से आया? यह निश्चित रूप से आपके द्वारा बुलाए गए फ़ंक्शन के ढेर पर भौतिक रूप से मौजूद नहीं है। यह सही है - यह एक वैश्विक है। हकीकत यह है कि ग्लोबल्स के बिना, आप कभी भी ऐसी किसी चीज का उल्लेख नहीं कर सकते जो सीधे आपके ढेर या ढेर में नहीं था - जिसका अर्थ है कि कोई मशीन निर्देश नहीं, डीईपी के लिए धन्यवाद। और ढेर के लिए, आप से एक ढेर कहाँ मिलेगा? आप कुछ वास्तविक नई स्मृति आवंटित करने के लिए ओएस फ़ंक्शन को कॉल नहीं कर सकते - यह एक वैश्विक है।

सिद्धांत रूप में, आप ऐसी भाषा या प्रोग्राम बना सकते हैं, लेकिन वास्तविकता यह है कि यह वास्तव में उपयोगी चीज़ों की तुलना में ब्रेनफक की तरह अधिक होगी।

+3

जैसा कि मैंने इस सवाल में कहा था, न्यूज़पीक ने ऐसा करने का दावा किया है (वैश्विक नामस्थान के बिना काम)। –

+0

@ मुहम्मद: मैंने विकिपीडिया लेख पढ़ा है, और यह मेरे लिए बहुत गैर-वैश्विक नहीं लगता है। यह भी घृणित रूप से अव्यवहारिक और अनुपयोगी लगता है। – Puppy

+4

@DeadMG: दर्शक की आंखों में अव्यवहारिक और अनुपयोगी है। यह एक स्मॉलटाक व्युत्पन्न है जो नया है और कुछ हित पैदा करता है। भले ही, अवधारणा आम तौर पर संदेश पास करने पर निर्भर करती है, इसलिए मैं आपको एक और उदाहरण दूंगा: एक एरलंग समवर्ती कार्यक्रम मानें जिसमें कई समानांतर प्रक्रियाएं होंगी जो संदेशों को संचारित करती हैं। विभिन्न प्रोसेसर भर में। क्या आप मुझे बता सकते हैं कि वैश्विक/साझा वातावरण क्या है? उस मामले के लिए कोई साझा-कुछ भी संदेश संदेश लें। –

0

मुझे विश्वास है कि आप एक प्रोग्रामिंग भाषा बना सकते हैं जहां वैश्विक क्षेत्र को प्रतिस्थापित किया जा सकता है, उदाहरण के लिए, एक सहयोगी सरणी जिसमें फंक्शंस और ऑब्जेक्ट्स शामिल हैं, जिन्हें तब प्रत्येक कार्य के लिए एक कार्य वातावरण के रूप में पारित किया जाएगा।

निम्नलिखित उदाहरण पर विचार करें। जब एक नियमित रूप से अजगर कार्यक्रम में आप कुछ इस तरह लिखना होगा: कोई वैश्विक के साथ एक कार्यक्रम में

import foo 

def square(x): 
    return x*x 

print(square(int(raw_input("give a number: ")))) 

आप बल्कि कुछ इस तरह लिखना होगा:

def main(environment): 
    environment['import']('foo') 
    environment['square'] = lambda x: x*x 
    environment['print'](environment['square'](int(environment['raw_input']("give a number:")))) 

और इस कोड को एक संदर्भ में निष्पादित किया जाएगा कुछ इस तरह:

def import_foo(modulename): 
    # dummy example 
    if modulename == 'foo': 
     import foo 

environment = { 
    'import': import_foo, 
    'print': print, 
    'raw_input': raw_input 
} 

main(environment) 

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

उदाहरण के लिए, वैश्विक-कम भाषा में, यदि आपके पास एक लाइब्रेरी है जो ऑपरेटिंग सिस्टम की फ़ाइल सिस्टम या नेटवर्क में डेटा तक पहुंचने के लिए डिज़ाइन की गई है, तो आप वैकल्पिक वातावरण प्रदान कर सकते हैं और I/O की निगरानी कर सकते हैं या लाइब्रेरी बना सकते हैं नियमित फ़ाइल सिस्टम और नेटवर्क की बजाय अपने स्वयं के आभासी फ़ाइल सिस्टम या वीपीएन कनेक्शन का उपयोग करें।

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

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