बिल गोस्पर को डेटा संरचना कहने से क्या मतलब था कि यह केवल एक बेवकूफ प्रोग्रामिंग भाषा है? [बन्द है]


16

राल्फ विलियम गोस्पर, जूनियर का एक उद्धरण है जो कहता है:

एक डेटा संरचना सिर्फ एक बेवकूफ प्रोग्रामिंग भाषा है।

उसे इससे क्या मतलब था? काश, मैं Google में इसके बारे में बिना किसी संदर्भ के अथक कॉपी / पेस्ट कर सकता हूँ।



1
इस प्रकार के प्रश्न पर अब हमारी मेटा-चर्चा साइट पर चर्चा की जा रही है ।

ट्यूरिंग-पूर्ण प्रकार प्रणालियों के साथ भाषाएं हैं। उनमें से कुछ मूर्ख हैं।
एसके-लॉजिक

@ एसके-तर्क: टाइप सिस्टम, ट्यूरिंग पूर्ण या अन्यथा, इस उद्धरण के साथ क्या करने के लिए मिला है?
9

1
@RehnoLindeque, क्या आपने कभी अगडा या कॉक देखा है? प्रकार ट्यूरिंग-पूर्ण हो सकते हैं।
SK-तर्क

जवाबों:


10

खैर, ऐसा लगता है जैसे बयान का दिल है:

एक डेटा संरचना सिर्फ एक ... प्रोग्रामिंग भाषा है

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

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

var C = नया होरेज़ेल्कोबजेक्ट ();
C.Function <int> ("मुख्य", टाइपोफ़ (चार [] []), टाइपोफ़ (इंट))
  । परिवर्तनीय ("i", टाइपोफ़ (int), 0)
  .While ("i", फंक (i) => i <10))
     .कॉल ("प्रिंटफ़", "% डी", "आई")
     .PostIncrement ( "मैं")
  .EndWhile ();
  .Return (0)
 .EndFunction ();

अब, पूर्ण उद्धरण के रूप में: सी में ही (कह) लेखन की तुलना में ऐसा कुछ क्यों बेवकूफ होगा? यह स्पष्ट होना चाहिए कि यह क्रिया है और लगभग C के बराबर नहीं है (और, व्यवहार में, C जो कर सकता है, उसके पूर्ण दायरे का समर्थन नहीं कर सकता है - typedefs मुश्किल होगा); इसलिए, यह डेटा संरचना सिर्फ एक "बेवकूफ" प्रोग्रामिंग भाषा है, जिसे "वास्तविक" प्रोग्रामिंग भाषा में एम्बेड किया गया है। उसी तर्क को किसी भी डेटा संरचना के लिए सामान्यीकृत किया जा सकता है जिसके बारे में आप सोच सकते हैं; लिंक की गई सूचियाँ लिस्प का एक "बेवकूफ" संस्करण है, और हैश मानचित्र कुछ सैद्धांतिक हैश प्रोग्रामिंग भाषा (हैस्प?) का सिर्फ "बेवकूफ" संस्करण हैं।

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

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

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


2

एक डेटा संरचना एक प्रोग्रामिंग भाषा की समीक्षा है। लेकिन विशेष रूप से "तेज" एक नहीं।

इसे "नोड आरेख" से देखा जा सकता है जैसे नीचे विकि लेख में:

http://en.wikipedia.org/wiki/Root_node#Terminology

फिर भी, एक डेटा संरचना एक प्रोग्रामिंग भाषा के रूप में INCOMPLETE है, क्योंकि इसमें वाक्य रचना और पूर्ण विचारों का अभाव है जो एक प्रोग्रामर के लिए समझदारी होगी। डेटा संरचना की "भाषा" की तुलना उस बच्चे से की जा सकती है जिसने कुछ ऐसा कहा है, "मुझे, ठंडा हो जाओ। कोट।"

"भाषा" खंडित है, लेकिन समझा जा सकता है। बच्चा कह रहा है कि "वह ठंडा है, और अधिक कपड़े को कवर करना पसंद करेगा।" बच्चे का उच्चारण अंग्रेजी भाषा का "बेवकूफ" संस्करण है, और इसी तरह एक प्रोग्रामिंग भाषा के संबंध में डेटा संरचना।


1

मेरा मानना ​​है कि बिल गोस्पर का इरादा यह है कि सभी डेटा संरचनाएं केवल सीमित प्रयोज्यता के साथ प्रोग्रामिंग निर्माण हैं । यह इस विचार से भी संबंधित है कि "भाषा डिज़ाइन लाइब्रेरी डिज़ाइन है और लाइब्रेरी डिज़ाइन भाषा डिज़ाइन है" [1]।

समस्या के बारे में सोचने का एक तरीका केवल एक एल्गोरिदम के आधार पर डेटा संरचनाओं पर विचार करना है। भंडारण आवश्यकताओं या पल के लिए एनोटेशन के बारे में भूल जाओ क्योंकि ये केवल सहायक हैं।

उदाहरण के लिए, आप mapदो तरीकों से एक साहचर्य सरणी (जिसे कुछ भाषाओं में कहा जाता है ) को संहिताबद्ध कर सकते हैं: या तो स्मृति में संग्रहीत किसी प्रकार के सूचकांक का उपयोग करके या एक साधारण मामले की अभिव्यक्ति का उपयोग करके।

हास्केल में आप डेटा संरचना के रूप में एक साहचर्य सरणी को संहिताबद्ध कर सकते हैं ...

let assocArray = [("a", 1),("b", 2),("c", 3)]
let key = "b"
lookup key assocArray

... या मामला अभिव्यक्ति का उपयोग करके ...

let key = "b"
case key of 
  "a" -> 1
  "b" -> 2
  "c" -> 3

... या इससे भी अधिक सीधे ...

let key = "b"
if key == "a" 
  then 1 
  else if key == "b"
    then 2
    else if key == "c"
      then 3
      else undefined

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

[१] बोली बज़्ने स्ट्रॉस्ट्रुप की बदौलत है।


0

जावास्क्रिप्ट पर विचार करें, जहां सभी डेटा कोड है। LISP पर विचार करें, जहां सभी डेटा कोड है और सभी कोड डेटा है।

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

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

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


3
मुझे यकीन नहीं है कि यह वास्तव में इसके दिल में जाता है। उदाहरण के लिए, जेनेरिक प्रोग्रामिंग विशेष रूप से डेटा संरचना-अज्ञेय एल्गोरिदम (आमतौर पर पुनरावृत्तियों या श्रेणियों के साथ) के बारे में है।
जॉन पर्पडी

4
क्या आपको यकीन है कि यह राल्फ विलियम गोस्पर, जूनियर वास्तव में था?
रॉबर्ट हार्वे

आम लिस्प में, सभी डेटा को कोड के रूप में संकलित नहीं किया जा सकता है, लेकिन सभी कोड को डेटा के रूप में माना जा सकता है। कई वाक्यविन्यास नियम नहीं हैं, लेकिन सभी कोड को एस-एक्सप्रेशन होना चाहिए, कम से कम मैक्रो प्रोसेसिंग के बाद, और सभी डेटा एस-एक्सप्रेशन नहीं हैं।
डेविड थॉर्नले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.