कुछ प्रोग्रामिंग लैंग्वेज ट्यूरिंग पूर्ण क्यों हैं, लेकिन अन्य भाषाओं की कुछ क्षमताओं का अभाव है?


42

जब मुझे (एक) बाहरी प्रोग्राम्स / फ़ंक्शंस पर हुक करना चाहिए तो एक अजीब समस्या सामने आई। फ़ंक्शंस 'C' और 'C ++' में कार्य वेरिएडिक फ़ंक्शंस को हुक नहीं कर सकते , जैसे मैं एक फ़ंक्शन नहीं बना सकता जिसे 'printf' कहा जाता है। ठीक उसी तर्कों के साथ जो इसे मिला, और इसके बजाय एक वैकल्पिक संस्करण को कॉल करना है जो एक वैरिएड ऑब्जेक्ट लेते हैं। यह बहुत समस्याग्रस्त है क्योंकि मैं एक ऑब्जेक्ट बनाने में सक्षम होना चाहता हूं जो एक गुमनाम हुक रखता है।

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


33
आपको टारिंग टारपीट्स पर ध्यान देना चाहिए । वे एक आकर्षक प्रकार की प्रोग्रामिंग भाषा हैं जो जानबूझकर कुछ ऑपरेशन के रूप में उपलब्ध हैं जबकि अभी भी पूर्ण रूप से ट्यूरिंग हो रही हैं। उनमें से अधिकांश में बुनियादी डेटा प्रकारों, कार्यों, यहां तक ​​कि साधारण चीजों की भी कमी है, जैसे कि चर घोषित करना। व्यक्तिगत रूप से, मुझे लगता है कि उनमें कोडिंग करना बहुत मजेदार है, क्योंकि यह आपको अपने आराम क्षेत्र से बाहर निकलने के लिए मजबूर करता है, ताकि आप कुछ मुश्किल से मुश्किल काम कर सकें।
DJMcMayhem 20

8
ट्यूरिंग मशीन क्या करती है, और आप देखेंगे कि "ट्यूरिंग-कम्प्लीट" स्पष्ट होने के लिए बहुत कम बाधा है। मूल अंकगणित का समर्थन करते हुए मूल रूप से कुछ भी जो 'पढ़', 'लिख', और 'कूद' सकता है। आप जिस भाषा सुविधाओं को देख रहे हैं, उसके स्तर से काफी नीचे है।
एरोथ

2
और भी हास्यास्पद होने के लिए: एक x86 प्रोसेसर पर MOV निर्देश ट्यूरिंग-पूर्ण है। विवरण के लिए cl.cam.ac.uk/~sd601/papers/mov.pdf देखें ।
गैरेथ मैककॉघन

3
यहां तक ​​कि कार्डगेम मैजिक: द गैदरिंग ट्यूरिंग-पूर्ण है। ट्यूरिंग-पूर्णता का भाषा की सुविधाओं से कोई लेना-देना नहीं है।
मस्त

2
BTW में बहुत जटिल प्रोग्रामिंग लैंग्वेज भी हैं जो पूरी तरह से ट्यूरिंग नहीं हैं, जैसे कि प्रूफ चेकर्स।

जवाबों:


68

NkN

λ

ट्यूरिंग पूर्णता प्रकार के बारे में कुछ भी नहीं बताती है, जो सरणियों / पूर्णांक / शब्दकोशों, इनपुट / आउटपुट क्षमताओं, नेटवर्क एक्सेस, मल्टीथ्रेडिंग, डायनेमिक आवंटन, में निर्मित है ...

सिर्फ इसलिए कि जावा में फीचर X (कहते हैं, मैक्रोज़, उच्च-रैंक प्रकार या आश्रित प्रकार) नहीं है, यह अचानक पूर्ण होने से नहीं रुकता है।

ट्यूरिंग संपूर्णता और भाषा की अभिव्यक्ति दो अलग-अलग धारणाएं हैं।


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

12
आप यह भी उल्लेख कर सकते हैं कि आपके पास C / C ++ में वे चीजें हो सकती हैं। आपको बस कुछ कोड लिखना होगा जो C / C ++ में संकलक के रूप में कार्य करता है दूसरी भाषा के लिए जो उनके पास है जहां आपका कोड आपके C / C ++ कोड में एक स्ट्रिंग संकलित करता है। तब आप अपनी सी फ़ाइल के भीतर जावा जैसी किसी चीज़ की प्रोग्रामिंग कर सकते हैं। यह सब बहुत काम आएगा, लेकिन यह संभव है (क्योंकि C / C ++ ट्यूरिंग कम्प्लीट है)।
शफ़लपैंट्स

4
@ शफ्लेपेंट्स मुझे आश्चर्य है कि अगर यह कहना उपयोगी है कि "मैं इसे सी ++ में कर सकता हूं क्योंकि मैं दूसरी भाषा की व्याख्या कर सकता हूं"। उस टोकन के द्वारा, Java, ML, C ++ समतुल्य हैं। Syscalls (I / O) के लिए एक ओरेकल के साथ TM भी समकक्ष हैं। मुझे डर है कि, उस तर्क से, लगभग सभी भाषाएं समान रूप से अभिव्यंजक हैं। यदि हां, तो यह भाषाओं की तुलना करने के लिए एक उपयोगी धारणा नहीं है।
ची

9
@ आप सही हैं, वे बराबर हैं। ट्यूरिंग कम्प्लीट होने का यही मतलब है। जो कुछ भी एक ट्यूरिंग सिस्टम के साथ किया जा सकता है, वह दूसरे ट्यूरिंग सिस्टम में किया जा सकता है। यह एक विशेष प्रणाली में करने के लिए सुविधाजनक नहीं हो सकता है। और विभिन्न चीजों को करने की सुविधा प्राथमिक तरीका है जिससे हम विभिन्न प्रोग्रामिंग भाषाओं की तुलना करते हैं। लेकिन यह वही नहीं है जो सवाल पूछ रहा था।
शफलेपेंट 14

5
@Rhymoid यदि C मेमोरी एक्सेस कारणों के लिए ट्यूरिंग पूर्ण नहीं है, या किसी कनेक्टेड डिवाइस पर मनमाने सिग्नल भेजने में सक्षम होने के कारण, जिसकी मनमानी रूप से बड़ी स्टोरेज की गणना नहीं होती है, तो कोई यह तर्क दे सकता है कि कोई वास्तविक विश्व भाषा या डिवाइस ट्यूरिंग पूर्ण नहीं है । लेकिन मुझे ऐसा नहीं लगता कि यह तर्क की एक बहुत उत्पादक रेखा है।
शफ़लपैंट्स

47

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

हालांकि, यह नहीं कहा गया है कि ऐसा करना कितना सुविधाजनक है। कुछ विशेषताएं जो कुछ भाषाओं में आसान होती हैं, वे डिज़ाइन विकल्पों के कारण दूसरों के लिए बहुत मुश्किल हो सकती हैं। ट्यूरिंग पूर्णता सिर्फ इतना कहती है कि आप गणना कर सकते हैं। एक चरम उदाहरण के रूप में, C ++ में वैरेडिक फ़ंक्शंस को हुक करना मुश्किल हो सकता है, लेकिन C ++ में एक जावास्क्रिप्ट दुभाषिया लिखना संभव है, जो वैरिएड फ़ंक्शंस को हुक कर सकता है।

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

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


1
मैं (लगभग) सभी कंपाइलर्स को असंगत wrt के रूप में मानता हूँ। अधिकांश भाषाएं ट्यूरिंग-पूर्ण हैं, लेकिन अंततः विधानसभा द्वारा व्याख्या / संकलित करने की आवश्यकता है, जो नहीं है। लेकिन यह एक आवश्यक शारीरिक सीमा है - हार्डवेयर कभी भी ट्यूरिंग शक्तिशाली नहीं है। फिर भी, कम्प्यूटेबिलिटी कई उपयोगी अवधारणाएं प्रदान करती है जो वास्तविक दुनिया के कंप्यूटरों के लिए "व्यावहारिक रूप से" लागू होती हैं।
ची

3
@Wildcard उस तुच्छ अर्थ में। असेंबली (और C) में निश्चित आकार के पॉइंटर्स होते हैं, जो केवल एक सीमित मात्रा में मेमोरी को संबोधित कर सकते हैं। हम, सैद्धांतिक रूप से बोल सकते हैं, एक विधानसभा को परिभाषित कर सकते हैं जहां संकेत निर्बाध रूप से होते हैं, लेकिन मैं उस "विधानसभा" को अब और नहीं कहूंगा - मैं उस URM या ऐसा कुछ कहूंगा। व्यावहारिक रूप से हम केवल यह दिखावा करते हैं कि भौतिक सीमाएँ हमारे कार्यक्रमों को चलाने की अनुमति देने के लिए पर्याप्त बड़ी हैं, इसलिए भले ही एक कंप्यूटर केवल एक परिमित अवस्था मशीन है (इसका अर्थ है कि यह इसके अलावा प्रदर्शन नहीं कर सकता है), हम इसे ट्यूरिंग मशीन के रूप में अधिक सोचते हैं ( इसके अलावा उल्लेखनीय है)।
चि

4
@ उची बात बिलकुल सटीक नहीं है। सबसे पहले, वस्तुतः सभी लोग सी को ट्यूरिंग पूर्ण मानते हैं क्योंकि हम आम तौर पर इस धारणा को बनाए रखते हैं कि "आपके पास बहुत अधिक मेमोरी है।" बहुत कम लोगों के लिए जिन्हें अधिक सख्त शब्दों के बारे में चिंता करनी होती है जहां ऐसी धारणाएं अमान्य हैं, सी एक पॉइंटर के आकार को निर्दिष्ट नहीं करता है, और एक बाउंड को निर्दिष्ट नहीं करता है कि कितनी मेमोरी को संबोधित किया जा सकता है। इसलिए "ट्यूरिंग कम्प्लीट" के पूर्ण सख्त अर्थों में भी, सी वास्तव में ट्यूरिंग पूर्ण है।
Cort Ammon

3
@CortAmmon मुझे असहमत होना है। यदि हमने C के शब्दार्थ को औपचारिक रूप दिया, "पर्याप्त मेमोरी" धारणा को एम्बेड करने की कोशिश की, तो हम असफल हो जाएंगे क्योंकि sizeof(void *)आईएसओ सी मानक द्वारा कुछ का मूल्यांकन करने के लिए अनिवार्य है। यह हमें किसी भी कार्यक्रम के लिए मेमोरी की मात्रा को कुछ बड़े करने के लिए बाध्य करता है - लेकिन फिर भी एक बाध्य। उदाहरण के लिए, मैं एक कार्यक्रम नहीं लिख सकता हूँ जिसका शब्दार्थ दो मनमाने नीरलों को जोड़ रहा है। C को अभी भी I / O के माध्यम से Turing को शक्तिशाली बनाया जा सकता है, TM टेप जैसी फ़ाइलों का उपयोग करके (जैसा कि @Hurkyl ऊपर बताया गया है)। मैं इस बात पर सहमत हूं कि व्यवहार में यह एक गैर-मुद्दा है।
चि।

7
मैं नई भाषा C-inf का सुझाव देता हूं, जो बिल्कुल C की तरह है, सिवाय इसके कि जब बहुत अधिक मेमोरी को पुनरावृत्ति या ढेर आवंटन के माध्यम से आवंटित किया जाता है, तो प्रोग्राम को निरस्त कर दिया जाता है, आकार (शून्य *) और sizeof (size_t) के लिए एक बड़े मूल्य के साथ recompiled, और शुरू से फिर से चलना शुरू कर देता है।
gnasher729

26

विभिन्न भूमि वाहनों के रूप में प्रोग्रामिंग भाषाओं के बारे में सोचें: साइकिल, कार, होवरकार, ट्रेन।

ट्यूरिंग कंप्लीटनेस कहता है "यह वाहन कहीं भी जा सकता है कोई भी अन्य वाहन जा सकता है।" यही है, आप सभी समान कार्यों की गणना कर सकते हैं। आउटपुट पर इनपुट, समाप्त करना शुरू करें।

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


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

2
लाइट से तेज़ यात्रा संभवतः सुपर-ट्यूरिंग कम्प्यूटेशन के लिए एक बेहतर सादृश्य है। यह संभव हो सकता है, लेकिन ज्यादातर लोग सोचते हैं कि यह नहीं है।
jmite

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

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

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

17

आप जिस चीज के बारे में अनिवार्य रूप से पूछ रहे हैं, वह कम्प्यूटेशनल पावर के बीच अंतर है और जिसे आम तौर पर किसी भाषा (या कम्प्यूटेशन की प्रणाली) की अभिव्यंजक शक्ति (या सिर्फ अभिव्यक्ति ) कहा जाता है ।

कम्प्यूटेशनल पावर

कम्प्यूटेशनल क्षमता क्या समस्याओं के प्रकार भाषा की गणना कर सकता को दर्शाता है। कम्प्यूटेशनल शक्ति का सबसे प्रसिद्ध वर्ग वह है जो एक यूनिवर्सल ट्यूरिंग मशीन के बराबर है । गणना की अन्य प्रणालियों की बहुत सारी व्यवस्थाएँ हैं, जैसे कि रैंडम एक्सेस मशीनें , λ-पथरी , एसके कॉम्बिनेटर कलन , calcul-पुनरावर्ती कार्य , WHILEकार्यक्रम, और कई अन्य। और जैसा कि यह पता चला है, ये सभी एक दूसरे को अनुकरण कर सकते हैं, जिसका अर्थ है कि इन सभी में समान कम्प्यूटेशनल शक्ति है।

यह चर्च-ट्यूरिंग थीसिस को जन्म देता है ( अलोंजो चर्च के नाम पर जिसने λ-पथरी और एलन ट्यूरिंग ने यूनिवर्सल ट्यूरिंग मशीन बनाई)। चर्च-ट्यूरिंग-थीसिस दो पहलुओं के साथ संगणना पर एक परिकल्पना है:

  1. सामान्य गणना में सक्षम सभी कंप्यूटिंग सिस्टम समान रूप से शक्तिशाली हैं, और
  2. एक एल्गोरिथ्म का पालन करने वाला मनुष्य ठीक उन कार्यों की गणना कर सकता है जो एक ट्यूरिंग मशीन (और इस प्रकार अन्य प्रणालियों में से कोई भी) गणना कर सकती है।

कंप्यूटर विज्ञान की तुलना में मन के दर्शन के क्षेत्र में दूसरा महत्वपूर्ण है।

हालाँकि, चर्च-ट्यूरिंग-थीसिस की दो बातें नहीं हैं, जो आपके प्रश्न के लिए बहुत प्रासंगिक हैं:

  1. विभिन्न सिमुलेशन कितने कुशल हैं और
  2. किसी समस्या का एन्कोडिंग कितना सुविधाजनक है।

(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

तो, स्पष्ट रूप से, कुछ लोग हैं जिनके लिए लूप निर्माण की तुलना में "लूपिंग" की अवधारणा को व्यक्त करने के लिए पूंछ पुनरावृत्ति अधिक प्राकृतिक तरीका है।

सारांश

तथ्य यह है कि दो भाषाएं ट्यूरिंग-समतुल्य एक और बिल्कुल एक बात कहती हैं: कि वे प्राकृतिक संख्याओं के समान कार्यों की गणना ट्यूरिंग मशीन कर सकते हैं। बस।

यह इस बारे में कुछ नहीं कहता है कि वे कितनी तेजी से उन कार्यों की गणना करते हैं। यह उन कार्यों को व्यक्त करने में आसानी के बारे में कुछ नहीं कहता है। और यह कुछ भी नहीं कहता है कि वे प्राकृतिक संख्याओं पर कंप्यूटिंग कार्यों के अलावा और क्या कर सकते हैं (जैसे सी पुस्तकालयों से लिंक करना, उपयोगकर्ता से इनपुट पढ़ना, स्क्रीन पर आउटपुट लिखना)।

क्या इसका मतलब यह है कि प्रत्येक प्रोग्रामिंग भाषा को हल करने वाली समस्याओं का वर्ग भाषा के अनुसार अलग-अलग हो सकता है, भले ही ये सभी भाषाएं पूरी तरह से ख़त्म हों?

हाँ।

  1. ऐसी समस्याएं हैं जो "ट्यूरिंग-पूर्ण" शब्द से कवर नहीं होती हैं (जो केवल प्राकृतिक संख्याओं पर कंप्यूटिंग कार्यों के साथ ही चिंता करता है) जैसे कि स्क्रीन पर मुद्रण। दो भाषाएं ट्यूरिंग-पूर्ण हो सकती हैं लेकिन एक स्क्रीन पर मुद्रण की अनुमति दे सकती है और दूसरी नहीं।
  2. यहां तक ​​कि अगर दोनों भाषाएँ समान समस्याओं को हल कर सकती हैं, तो यह एन्कोडिंग कितना जटिल है, और इस एन्कोडिंग को व्यक्त करना कितना आसान है, इसके बारे में कुछ भी नहीं कहता है। Eg C हर समस्या को हल कर सकता है Haskell, बस C में एक Haskell दुभाषिया लिखकर ... लेकिन आपको इस तरह से एक समस्या को हल करने के लिए सबसे पहले Haskell दुभाषिया लिखना होगा!

7

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

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

इनमें से कुछ ब्याज हो सकते हैं:


5

सभी ट्यूरिंग-पूर्ण भाषा समान चीजों की गणना कर सकते हैं।

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

यहाँ कुछ उदाहरण हैं:

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

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

विशुद्ध रूप से कम्प्यूटेशनल सामान को एक लंबे समय से पहले ही निकाल दिया गया था।


4

मौजूदा उत्तर सही बताते हैं कि ट्यूरिंग पूर्णता भाषाओं की तुलना करने का एक अच्छा तरीका नहीं है। दरअसल, लगभग सभी भाषाएँ ट्यूरिंग पूरी हैं। ("यदि हर कोई विशेष है, तो कोई भी विशेष नहीं है," जैसा कि इनक्रेडिबल्स कहा करते थे।)

हालांकि, यह है गणितीय परिशुद्धता के साथ भाषाओं के अभिव्यक्ति की तुलना की जा सकती। प्रोग्रामिंग भाषाओं की एक्सप्रेसिव पावर पर फेलिसन पर एक नज़र डालें । मोटे तौर पर, यह विचार निम्नलिखित प्रश्न पूछने के लिए है: क्या मैं केवल भाषा में किसी भी कार्यक्रम को भाषा बी में एक कार्यक्रम में परिवर्तित कर सकता हूं केवल स्थानीय परिवर्तन करके? दूसरे शब्दों में, फेलेइसेन आपके अंतर्ज्ञान के लिए गणितीय रूप से सटीक रूप देता है।


2

हर किसी के जवाब के शीर्ष पर, यहाँ एक और सादृश्य है।

कपड़े धोने के लिए, आपको तीन चीजों की आवश्यकता होती है: कुछ जलाशय जो पानी रखते हैं, किसी प्रकार का एक डिटर्जेंट और एक आंदोलन तंत्र। इसे कई तरीकों से महसूस किया जा सकता है। जल भंडार कुछ भी है जो पर्याप्त पानी (जैसे एक टब, एक झील, एक नदी) रखता है। आंदोलन तंत्र एक यांत्रिक उपकरण, एक वॉशबोर्ड या यहां तक ​​कि एक चट्टान हो सकता है जिसके खिलाफ कपड़े पीटे जाते हैं। और डिटर्जेंट विभिन्न रूपों में भी आते हैं।

तो आधुनिक कम्प्यूटरीकृत वाशिंग मशीन और नदी के बगल में स्थित चट्टान के बीच क्या अंतर है?

यह तीन चीजों को उबालता है: दक्षता, सुरक्षा और सुविधा। धुलाई के कुछ तरीके कम ऊर्जा का उपयोग करते हैं, पर्यावरण को कम प्रदूषित करते हैं, कम पानी का उपयोग करते हैं, और इसी तरह। धुलाई के कुछ तरीकों को कम दोहरावदार मैनुअल गतिविधियों की आवश्यकता होती है (जिसके परिणामस्वरूप चोटें आती हैं या खराब मौसम में बाहर होती हैं। और धोने के कुछ तरीकों के लिए प्रक्रिया को ठीक करने के लिए मानव की आवश्यकता नहीं होती है।

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


2

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

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

अब सभी ट्यूरिंग मशीनों के सबलंगेज पर विचार करें जो केवल अक्षर a, b और रिक्त को पढ़ते और लिखते हैं। यह ट्यूरिंग पूर्ण है, लेकिन यह किसी भी प्रोग्राम को व्यक्त नहीं कर सकता है, उदाहरण के लिए, सभी इनपुट पर ग का उत्पादन करें, क्योंकि यह किसी भी सीएस को नहीं लिख सकता है। यह केवल इनपुट और आउटपुट पर सभी कम्प्यूटेशनल कार्यों को व्यक्त कर सकता है जैसे कि और बी एस के तार।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.