आप जिस चीज के बारे में अनिवार्य रूप से पूछ रहे हैं, वह कम्प्यूटेशनल पावर के बीच अंतर है और जिसे आम तौर पर किसी भाषा (या कम्प्यूटेशन की प्रणाली) की अभिव्यंजक शक्ति (या सिर्फ अभिव्यक्ति ) कहा जाता है ।
कम्प्यूटेशनल पावर
कम्प्यूटेशनल क्षमता क्या समस्याओं के प्रकार भाषा की गणना कर सकता को दर्शाता है। कम्प्यूटेशनल शक्ति का सबसे प्रसिद्ध वर्ग वह है जो एक यूनिवर्सल ट्यूरिंग मशीन के बराबर है । गणना की अन्य प्रणालियों की बहुत सारी व्यवस्थाएँ हैं, जैसे कि रैंडम एक्सेस मशीनें , λ-पथरी , एसके कॉम्बिनेटर कलन , calcul-पुनरावर्ती कार्य , WHILE
कार्यक्रम, और कई अन्य। और जैसा कि यह पता चला है, ये सभी एक दूसरे को अनुकरण कर सकते हैं, जिसका अर्थ है कि इन सभी में समान कम्प्यूटेशनल शक्ति है।
यह चर्च-ट्यूरिंग थीसिस को जन्म देता है ( अलोंजो चर्च के नाम पर जिसने λ-पथरी और एलन ट्यूरिंग ने यूनिवर्सल ट्यूरिंग मशीन बनाई)। चर्च-ट्यूरिंग-थीसिस दो पहलुओं के साथ संगणना पर एक परिकल्पना है:
- सामान्य गणना में सक्षम सभी कंप्यूटिंग सिस्टम समान रूप से शक्तिशाली हैं, और
- एक एल्गोरिथ्म का पालन करने वाला मनुष्य ठीक उन कार्यों की गणना कर सकता है जो एक ट्यूरिंग मशीन (और इस प्रकार अन्य प्रणालियों में से कोई भी) गणना कर सकती है।
कंप्यूटर विज्ञान की तुलना में मन के दर्शन के क्षेत्र में दूसरा महत्वपूर्ण है।
हालाँकि, चर्च-ट्यूरिंग-थीसिस की दो बातें नहीं हैं, जो आपके प्रश्न के लिए बहुत प्रासंगिक हैं:
- विभिन्न सिमुलेशन कितने कुशल हैं और
- किसी समस्या का एन्कोडिंग कितना सुविधाजनक है।
(1) के लिए एक सरल उदाहरण: रैंडम एक्सेस मशीन पर, किसी सरणी को कॉपी करने से सरणी की लंबाई के लिए आनुपातिक समय लगता है। ट्यूरिंग मशीन पर, हालांकि, यह सरणी की लंबाई के वर्ग के लिए आनुपातिक लगता है , क्योंकि ट्यूरिंग मशीन में यादृच्छिक मेमोरी एक्सेस नहीं है, यह केवल एक समय में एक सेल टेप पर स्थानांतरित कर सकता है। इसलिए, उन्हें कॉपी करने के लिए सरणी n के एन तत्वों के पार जाना होगा। इसलिए, गणना के विभिन्न मॉडलों में अलग-अलग प्रदर्शन विशेषताएं हो सकती हैं, यहां तक कि स्पर्शोन्मुख मामले में भी, जहां हम कार्यान्वयन विवरणों से दूर रहने की कोशिश करते हैं।
(2) के लिए उदाहरण: λ-पथरी और पायथन दोनों ट्यूरिंग-पूर्ण हैं। लेकिन क्या आप बल्कि पायथन में या λ-पथरी में एक कार्यक्रम लिखेंगे?
एक तीसरी शिकन भी है जिसे मैंने अब तक चारों ओर बढ़ाया है: उन सभी मूल प्रणालियों को तर्कशास्त्रियों, दार्शनिकों या गणितज्ञों द्वारा डिज़ाइन किया गया था, न कि कंप्यूटर वैज्ञानिकों द्वारा ... बस इसलिए कि कंप्यूटर और इस प्रकार कंप्यूटर विज्ञान मौजूद नहीं था। कोनराड ज़ूस के पहले प्रयोगों (जो कि प्रोग्रामेबल और / या ट्यूरिंग-पूर्ण नहीं थे) से पहले ही ये सभी 1930 के दशक के प्रारंभ में वापस चले गए । वे केवल "प्राकृतिक संख्याओं पर कम्प्यूटेशनल कार्यों" के बारे में बात करते हैं।
अब, जैसा कि यह पता चला है, बहुत कुछ है जिसे आप प्राकृतिक संख्याओं पर फ़ंक्शन के रूप में व्यक्त कर सकते हैं - आखिरकार, हमारे आधुनिक कंप्यूटर भी इससे बहुत कम मिलते हैं (मूल रूप से संख्या 0 और 1 पर 3-4 फ़ंक्शन, और यही वह है) ), लेकिन, उदाहरण के लिए, एक ऑपरेटिंग सिस्टम क्या कार्य करता है?
आई / ओ की यह धारणा, दुष्प्रभाव, पर्यावरण के साथ बातचीत, "प्राकृतिक संख्याओं पर कार्य" के विचार द्वारा कब्जा नहीं किया जाता है। और फिर भी, यह महत्वपूर्ण है, क्योंकि साइमन पेयटन जोन्स ने एक बार इसे "बिना किसी साइड-इफेक्ट के सभी शुद्ध कार्य करता है, जो आपके सीपीयू को गर्म करता है" , जिसके लिए एक दर्शक सदस्य ने उत्तर दिया "वास्तव में, यह एक पक्ष है।" -अच्छी तरह, भी!
एडविन ब्रैडी , इदरीस के डिजाइनर , (केवल आधा) मजाक में उपयोग करता है (मुझे नहीं पता कि उसने इसका आविष्कार किया है) "टेट्रिस-पूर्ण" शब्द के बीच इस अंतर को व्यक्त करने के लिए "प्राकृतिक संख्याओं पर किसी भी कम्प्यूटेशनल फ़ंक्शन की गणना कर सकते हैं" और "। गैर-तुच्छ कार्यक्रमों को लिखने के लिए उपयोग किया जाता है जो पर्यावरण के साथ बातचीत करते हैं ”। इससे भी अधिक विडंबना यह है कि वह इदरीस में एक अंतरिक्ष आक्रमणकारी क्लोन के कार्यान्वयन के द्वारा यह प्रदर्शित करता है , लेकिन वह कहता है कि उसे विश्वास है कि टेट्रिस अंतरिक्ष आक्रमणकारियों को कम करता है।
का कहना है के लिए एक और बात यह है कि न केवल जरूरी नहीं कि ट्यूरिंग-तुल्यता है पर्याप्त के बारे में वास्तव में लिख "उपयोगी" कार्यक्रमों बात करने के लिए है, यह भी हो सकता है OTOH भी नहीं necesssary । Eg SQL केवल ANSI SQL: 1999 के साथ ट्यूरिंग-समतुल्य बन गया है , लेकिन यह इससे पहले भी उपयोगी था। वास्तव में, कुछ का तर्क हो सकता है कि इसे ट्यूरिंग-समतुल्य बनाना इसकी उपयोगिता में बिल्कुल भी नहीं जोड़ा गया है। कई डोमेन-विशिष्ट भाषाएँ हैं जो ट्यूरिंग-समतुल्य नहीं हैं। डेटा विवरण भाषा आम तौर पर नहीं होती है (और नहीं होनी चाहिए)। कुल भाषाएँ स्पष्ट रूप से ट्यूरिंग-समतुल्य नहीं हो सकतीं, फिर भी आप उनमें इवेंट लूप, वेब सर्वर या ऑपरेटिंग सिस्टम लिख सकते हैं। ऐसी भाषाएं भी हैं जो ट्यूरिंग-समतुल्य हैं लेकिन जहां यह वास्तव में एक गलती मानी जाती है।
इसलिए, सभी में, ट्यूरिंग-तुल्यता बहुत दिलचस्प नहीं है, जब तक कि आप कार्यक्रमों का सांख्यिकीय विश्लेषण नहीं करना चाहते हैं।
अभिव्यक्ति
यह मानते हुए कि हमारी गणना प्रणाली कम्प्यूटेशनल रूप से इतनी शक्तिशाली है कि वह हमारी समस्या को भी हल कर सके, इसके लिए हमें आगे क्या करना है, उस प्रणाली के लिए किसी प्रकार की औपचारिक संकेतन में उस समस्या को हल करने के लिए अपने एल्गोरिथ्म को व्यक्त करना है। दूसरे शब्दों में: हमें कुछ कंप्यूटर भाषा में एक कार्यक्रम लिखने की आवश्यकता है। यहीं से अभिव्यक्ति की धारणा सामने आती है।
यह अनिवार्य रूप से, "आसान" या "सुखद" को संदर्भित करता है, यह हमारे प्रोग्राम को हमारी विशेष प्रोग्रामिंग भाषा में लिखना है। जैसा कि आप देख सकते हैं, धारणा काफी अस्पष्ट, व्यक्तिपरक और तकनीकी से अधिक मनोवैज्ञानिक है।
हालांकि, अधिक सटीक परिभाषाओं में प्रयास हैं। सबसे प्रसिद्ध एक (और सबसे कठोर एक जिसे मैं जानता हूं) मैथियास फेलेइसेन ने अपने पेपर ऑन द एक्सप्रेसिव पावर ऑफ प्रोग्रामिंग लैंग्वेजेज में लिखा है (पहले दो पन्नों में एक सौम्य परिचय है, बाकी कागज अधिक भावपूर्ण है)।
मुख्य अंतर्ज्ञान यह है: एक कार्यक्रम को भाषा से दूसरी भाषा में अनुवाद करते समय, आपके द्वारा किए जाने वाले परिवर्तनों में से कुछ स्थानीय रूप से निहित हैं (जैसे कि FOR
छोरों को WHILE
छोरों या सशर्त में छोरों में GOTO
बदलना), और कुछ को वैश्विक परिवर्तन की आवश्यकता होती है कार्यक्रम की संरचना।
जब आप किसी एक भाषा की एक विशेषता को किसी अन्य भाषा की एक अलग विशेषता के साथ केवल स्थानीय परिवर्तनों द्वारा बदल सकते हैं, तो इन विशेषताओं को अभिव्यंजक शक्ति पर कोई प्रभाव नहीं पड़ता है। इसे सिंटैक्टिक शुगर कहा जाता है ।
दूसरी ओर, यदि इसके लिए कार्यक्रम की वैश्विक संरचना में बदलाव की आवश्यकता है, तो आप जिस भाषा में अनुवाद कर रहे हैं, वह सुविधा को व्यक्त करने में असमर्थ है। और जिस भाषा से आप अनुवाद कर रहे हैं, उसे और अधिक अर्थपूर्ण (इस सुविधा के संबंध में) कहा जाता है।
ध्यान दें कि यह स्पष्टता की एक उद्देश्यपूर्ण औसत दर्जे की परिभाषा देता है। यह भी ध्यान दें कि धारणा सुविधा पर संदर्भ-निर्भर है, और यह तुलनात्मक है। इसलिए, यदि भाषा ए में प्रत्येक कार्यक्रम को केवल स्थानीय परिवर्तनों के साथ भाषा बी में अनुवादित किया जा सकता है , और भाषा बी में कम से कम एक कार्यक्रम है जिसे केवल स्थानीय परिवर्तनों के साथ ए में अनुवाद नहीं किया जा सकता है , तो भाषा बी भाषा की तुलना में कड़ाई से अधिक अभिव्यंजक है। ए। हालाँकि, अधिक संभावना परिदृश्य यह है कि दोनों भाषाओं में कई कार्यक्रमों का अनुवाद आगे और पीछे किया जा सकता है, लेकिन दोनों कार्यक्रमों में कुछ ऐसे कार्यक्रम हैं जिनका अनुवाद दूसरे के लिए नहीं किया जा सकता है। इसका मतलब यह है कि न तो भाषा दूसरे की तुलना में अधिक स्पष्ट रूप से अधिक अभिव्यंजक है, उनके पास बस अलग-अलग विशेषताएं हैं जो विभिन्न कार्यक्रमों को अलग-अलग तरीकों से व्यक्त करने की अनुमति देती हैं।
यह "अधिक अभिव्यंजक" होने का अर्थ है की एक औपचारिक परिभाषा देता है, लेकिन यह अभी भी घटना के पीछे मनोवैज्ञानिक धारणाओं पर कब्जा नहीं करता है। उदाहरण के लिए, इस मॉडल के अनुसार, वाक्य रचना चीनी, किसी भाषा की अभिव्यंजक शक्ति को नहीं बढ़ाती है, क्योंकि इसका अनुवाद केवल स्थानीय परिवर्तनों का उपयोग करके किया जा सकता है। हालांकि, हम अनुभव से पता है कि होने FOR
, WHILE
और IF
उपलब्ध, भले ही वे सशर्त के लिए बस वाक्यात्मक चीनी हैं GOTO
हमारे इरादे को व्यक्त करता है आसान ।
तथ्य यह है, विभिन्न भाषाओं में अलग-अलग विशेषताएं हैं जो किसी समस्या के बारे में सोचने के विभिन्न तरीकों को आसान या कठिन बना देती हैं। और कुछ लोगों को अपने इरादे को आसान और दूसरों को एक अलग तरीके से व्यक्त करने का एक तरीका मिल सकता है।
एक उदाहरण जो मुझे स्टैकऑवरफ्लो पर रूबी टैग में मिला: रूबी टैग का पालन करने वाले कई उपयोगकर्ता दावा करते हैं कि लूप को पुनरावृत्ति की तुलना में समझना आसान है और पुनरावृत्ति केवल उन्नत कार्यात्मक प्रोग्रामर के लिए है और लूप नए लोगों के लिए अधिक सहज हैं, लेकिन मैंने कई मामलों को देखा है इस तरह से कोड लिखने वाले नए लोगों को पूरा करें:
def rock_paper_scissors
get_user_input
determine_outcome
print_winner
rock_paper_scissors # start from the top
end
जो आमतौर पर कई लोगों को टिप्पणी करता है कि "यह काम नहीं करता है" और "वे इसे गलत कर रहे हैं" और "सही तरीका" यह है:
def rock_paper_scissors
loop do
get_user_input
determine_outcome
print_winner
end
end
तो, स्पष्ट रूप से, कुछ लोग हैं जिनके लिए लूप निर्माण की तुलना में "लूपिंग" की अवधारणा को व्यक्त करने के लिए पूंछ पुनरावृत्ति अधिक प्राकृतिक तरीका है।
सारांश
तथ्य यह है कि दो भाषाएं ट्यूरिंग-समतुल्य एक और बिल्कुल एक बात कहती हैं: कि वे प्राकृतिक संख्याओं के समान कार्यों की गणना ट्यूरिंग मशीन कर सकते हैं। बस।
यह इस बारे में कुछ नहीं कहता है कि वे कितनी तेजी से उन कार्यों की गणना करते हैं। यह उन कार्यों को व्यक्त करने में आसानी के बारे में कुछ नहीं कहता है। और यह कुछ भी नहीं कहता है कि वे प्राकृतिक संख्याओं पर कंप्यूटिंग कार्यों के अलावा और क्या कर सकते हैं (जैसे सी पुस्तकालयों से लिंक करना, उपयोगकर्ता से इनपुट पढ़ना, स्क्रीन पर आउटपुट लिखना)।
क्या इसका मतलब यह है कि प्रत्येक प्रोग्रामिंग भाषा को हल करने वाली समस्याओं का वर्ग भाषा के अनुसार अलग-अलग हो सकता है, भले ही ये सभी भाषाएं पूरी तरह से ख़त्म हों?
हाँ।
- ऐसी समस्याएं हैं जो "ट्यूरिंग-पूर्ण" शब्द से कवर नहीं होती हैं (जो केवल प्राकृतिक संख्याओं पर कंप्यूटिंग कार्यों के साथ ही चिंता करता है) जैसे कि स्क्रीन पर मुद्रण। दो भाषाएं ट्यूरिंग-पूर्ण हो सकती हैं लेकिन एक स्क्रीन पर मुद्रण की अनुमति दे सकती है और दूसरी नहीं।
- यहां तक कि अगर दोनों भाषाएँ समान समस्याओं को हल कर सकती हैं, तो यह एन्कोडिंग कितना जटिल है, और इस एन्कोडिंग को व्यक्त करना कितना आसान है, इसके बारे में कुछ भी नहीं कहता है। Eg C हर समस्या को हल कर सकता है Haskell, बस C में एक Haskell दुभाषिया लिखकर ... लेकिन आपको इस तरह से एक समस्या को हल करने के लिए सबसे पहले Haskell दुभाषिया लिखना होगा!