व्याख्या और संकलित कोड के बीच का अंतर शायद एक कल्पना है, जैसा कि राफेल की टिप्पणी से रेखांकित किया गया है :
the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...
तथ्य यह है कि कोड की व्याख्या हमेशा सॉफ़्टवेयर द्वारा, हार्डवेयर या दोनों के संयोजन से की जाती है, और संकलन प्रक्रिया यह नहीं बता सकती है कि यह कौन सा होगा।
संकलन के रूप में आप जो अनुभव करते हैं वह एक भाषा (स्रोत के लिए) से दूसरी भाषा (लक्ष्य के लिए) के लिए एक अनुवाद प्रक्रिया है । और, लिए दुभाषिया आमतौर पर लिए दुभाषिया से अलग होता है ।STST
संकलित कार्यक्रम का अनुवाद एक वाक्य-रचना रूप से दूसरे वाक्य- रूप , जैसे कि, और , और भाषाओं के को देखते हुए समान कम्प्यूटेशनल व्यवहार है, जो आमतौर पर आप कुछ करने की कोशिश कर रहे हैं परिवर्तन, संभवतः अनुकूलन करने के लिए, जैसे कि जटिलता या सरल दक्षता (समय, स्थान, सतह, ऊर्जा की खपत)। मैं कार्यात्मक तुल्यता की बात नहीं करने की कोशिश कर रहा हूं, क्योंकि इसके लिए सटीक परिभाषाओं की आवश्यकता होगी।P T T S T P S P TPSPTSTPSPT
कुछ कंपाइलरों का उपयोग वास्तव में कोड के आकार को कम करने के लिए किया गया है, न कि "सुधार" निष्पादन के लिए। यह प्लेटो प्रणाली में प्रयुक्त भाषा के लिए मामला था (हालांकि उन्होंने इसे संकलन नहीं कहा था)।
आप अपने कोड को पूरी तरह से संकलित मान सकते हैं, यदि संकलन प्रक्रिया के बाद, आपको लिए दुभाषिया की आवश्यकता नहीं है । कम से कम, यह एकमात्र तरीका है जो मैं आपके प्रश्न को सैद्धांतिक प्रश्न के बजाय एक इंजीनियरिंग के रूप में पढ़ सकता हूं (चूंकि, सैद्धांतिक रूप से, मैं हमेशा दुभाषिया का पुनर्निर्माण कर सकता हूं)।S
एक बात जो समस्या खड़ी कर सकती है, वह है, मेटा-सर्कुलरिटी । ऐसा तब होता है जब कोई प्रोग्राम अपनी स्रोत भाषा में वाक्य रचनाओं में हेरफेर करेगा , जिससे प्रोग्राम के टुकड़े पैदा होंगे जो कि उस समय के रूप में जैसे कि वे मूल कार्यक्रम का हिस्सा थे। चूँकि आप भाषा में मनमाने ढंग से प्रोग्राम के टुकड़े पैदा कर सकते हैं , अर्थहीन वाक्य-विन्यास के टुकड़ों में हेरफेर करने के परिणामस्वरूप मनमाने ढंग से गणना करने के परिणामस्वरूप, मुझे लगता है कि आप इस प्रोग्राम को भाषा में संकलित करने के लिए लगभग असंभव (इंजीनियरिंग के दृष्टिकोण से) बना सकते हैं , ताकि यह अब टुकड़े उत्पन्न करता है । इसलिए के लिए दुभाषिया की आवश्यकता होगी, या कम से कम संकलक के लिएS T T S S S T SSSTTSST के लिए ऑन-द-मक्खी संकलन में उत्पन्न टुकड़ों के (यह भी देखें इस दस्तावेज़ )।S
लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक से औपचारिक रूप दिया जा सकता है (और इसके लिए अभी समय नहीं है)। और असंभव एक ऐसे मुद्दे के लिए एक बड़ा शब्द है जो औपचारिक नहीं है।
फखर की टिप्पणी
36 घंटे के बाद जोड़ा गया। आप इसे बहुत लंबी अगली कड़ी छोड़ सकते हैं।
इस प्रश्न के लिए कई टिप्पणियां समस्या के दो दृष्टिकोण दिखाती हैं: एक सैद्धांतिक दृष्टिकोण जो इसे अर्थहीन के रूप में देखता है, और एक इंजीनियरिंग दृष्टिकोण जो दुर्भाग्य से इतनी आसानी से औपचारिक नहीं है।
व्याख्या और संकलन को देखने के कई तरीके हैं, और मैं कुछ हद तक स्केच करने की कोशिश करूंगा। मैं प्रबंधन करने के लिए अनौपचारिक होने का प्रयास करूंगा
टॉम्बस्टोन आरेख
प्रारंभिक औपचारिकरण में से एक (1960 के दशक के अंत से 1990 तक) टी या
समाधि का चित्र है । इन आरेखों ने रचनाकार आलेखीय तत्वों को दुभाषिया या संकलक की कार्यान्वयन भाषा, स्रोत भाषा की व्याख्या या संकलित की जा रही भाषा, और संकलक के मामले में लक्ष्य भाषा प्रस्तुत की। अधिक विस्तृत संस्करण विशेषताएँ जोड़ सकते हैं। इन ग्राफिक अभ्यावेदन को स्वयंसिद्ध, अनुमान नियमों के रूप में देखा जा सकता है, जो स्वयंसिद्ध रूप से व्युत्पन्न प्रोसेसर पीढ़ी से स्वयंसिद्ध, अ ला करी-हावर्ड (हालांकि मुझे यकीन नहीं है कि छठे दशक में किया गया था) से अस्तित्व में आने के योग्य है।
आंशिक मूल्यांकन
एक और दिलचस्प दृश्य आंशिक मूल्यांकन प्रतिमान है। मैं एक प्रकार के फ़ंक्शन कार्यान्वयन के रूप में कार्यक्रमों का एक सरल दृष्टिकोण ले रहा हूं, जो कुछ इनपुट डेटा दिए गए उत्तर की गणना करता है। फिर भाषा के लिए एक दुभाषिया
एक प्रोग्राम है जो
में लिखा गया प्रोग्राम है और उस प्रोग्राम के लिए डेटा , और के शब्दार्थ के अनुसार परिणाम की गणना करता है । आंशिक मूल्यांकन दो तर्कों और कार्यक्रम की विशेषज्ञता के लिए एक तकनीक है , जब केवल एक तर्क, , को जाना जाता है। जब आप अंततः दूसरा तर्क प्राप्त करते हैं तो इरादे का तेज़ मूल्यांकन होता है एस पी एस एस डी एस एक 1 एक 2 एक 1 एक 2ISSpSSdSa1a2a1a2 । यह विशेष रूप से उपयोगी है यदि से अधिक बार क्योंकि साथ आंशिक मूल्यांकन की लागत को उन सभी पर परिशोधन किया जा सकता है जहां केवल बदल रहा है।a2a1a1a2
एल्गोरिथ्म डिज़ाइन में यह अक्सर स्थिति होती है (अक्सर एसई-सीएस पर पहली टिप्पणी का विषय), जब डेटा का कुछ और स्थिर भाग पूर्व-संसाधित होता है, ताकि सभी अनुप्रयोगों पर पूर्व-प्रसंस्करण की लागत को बढ़ाया जा सके एल्गोरिथ्म इनपुट डेटा के अधिक चर भागों के साथ।
यह भी दुभाषियों की बहुत ही स्थिति है, क्योंकि पहले तर्क को निष्पादित करने का कार्यक्रम है, और आमतौर पर कई बार अलग-अलग डेटा के साथ निष्पादित किया जाता है (या अलग-अलग डेटा के साथ कई बार निष्पादित किया गया है)। अत: इस कार्यक्रम पर पहले तर्क के रूप में आंशिक रूप से मूल्यांकन करके किसी कार्यक्रम के तेजी से मूल्यांकन के लिए दुभाषिया का विशेषज्ञ बनना एक स्वाभाविक विचार है। इसे कार्यक्रम को संकलित करने के तरीके के रूप में देखा जा सकता है, और इसके पहले (कार्यक्रम) तर्क पर दुभाषिया के आंशिक मूल्यांकन द्वारा संकलन पर महत्वपूर्ण शोध कार्य किया गया है।
स्मन प्रमेय
आंशिक मूल्यांकन दृष्टिकोण के बारे में अच्छी बात यह है कि यह अपनी जड़ें सिद्धांत में लेता है (हालांकि सिद्धांत झूठे हो सकते हैं), विशेष रूप से
क्लेन के स्मन प्रमेय में । मैं यहां इसकी सहज प्रस्तुति देने की कोशिश कर रहा हूं, उम्मीद है कि यह शुद्ध सिद्धांतकारों को परेशान नहीं करेगा।
एक गोडेल नंबर को देखते हुए पुनरावर्ती कार्यों की, तो आप देख सकते हैं अपने हार्डवेयर के रूप में है, ताकि गोडेल संख्या को देखते हुए
(पढ़ वस्तु कोड ) एक कार्यक्रम के समारोह द्वारा परिभाषित किया गया (यानी वस्तु कोड द्वारा पर अभिकलन आपका हार्डवेयर)।φφpφpp
अपने सरलतम रूप में, प्रमेय को विकिपीडिया में निम्नानुसार बताया गया है (संकेतन में एक छोटे से परिवर्तन तक):
पुनरावर्ती कार्यों की एक Gödel नंबरिंग को देखते हुए , निम्नलिखित संपत्ति के साथ दो तर्कों का एक आदिम पुनरावर्ती फ़ंक्शन है: प्रत्येक Gödel संख्या के लिए आंशिक तर्कपूर्ण फ़ंक्शन के लिए दो तर्क, अभिव्यक्ति और को प्राकृतिक संख्याओं और के समान संयोजनों के लिए परिभाषित किया गया है , और ऐसे किसी भी संयोजन के लिए उनके मूल्य समान हैं। दूसरे शब्दों में, फ़ंक्शंस की निम्न आयामी समानता हर :
φσqfφσ(q,x)(y)f(x,y)xyxφσ(q,x)≃λy.φq(x,y).
अब, लेने दुभाषिए के रूप में , एक कार्यक्रम के स्रोत कोड के रूप में , और के रूप में डेटा है कि कार्यक्रम के लिए, हम लिख सकते हैं:
qISxpSydφσ(IS,pS)≃λd.φIS(pS,d).
φIS
को हार्डवेयर पर दुभाषिया के निष्पादन के रूप में देखा जा सकता है , अर्थात, भाषा में लिखे गए कार्यक्रमों की व्याख्या करने के लिए एक ब्लैक-बॉक्स तैयार है ।ISS
फ़ंक्शन को एक फ़ंक्शन के रूप में देखा जा सकता है जो आंशिक मूल्यांकन में प्रोग्राम लिए दुभाषिया को माहिर करता है । इस प्रकार Gödel संख्या देखी जा सकती है जिसमें ऑब्जेक्ट कोड है जो प्रोग्राम का संकलित संस्करण है ।σISPSσ(IS,pS)pS
तो फ़ंक्शन को एक फ़ंक्शन के रूप में देखा जा सकता है ,
जो भाषा में लिखे प्रोग्राम के स्रोत कोड को तर्क के रूप में लेते हैं , और उस प्रोग्राम के लिए ऑब्जेक्ट कोड संस्करण वापस करते हैं। तो वह है जिसे आमतौर पर कंपाइलर कहा जाता है।CS=λqS.σ((IS,qS)qSSCS
कुछ निष्कर्ष
हालाँकि, जैसा कि मैंने कहा: "सिद्धांत एक झूठा हो सकता है", या वास्तव में एक प्रतीत होता है। समस्या यह है कि हम फ़ंक्शन का कुछ भी नहीं जानते हैं । वास्तव में ऐसे कई कार्य हैं, और मेरा अनुमान है कि प्रमेय का प्रमाण इसके लिए एक बहुत ही सरल परिभाषा का उपयोग कर सकता है, जो इंजीनियरिंग के दृष्टिकोण से, राफेल द्वारा प्रस्तावित समाधान की तुलना में बेहतर नहीं हो सकता है: बस सीधे बंडल करने के लिए स्रोत कोड दुभाषिया । यह हमेशा किया जा सकता है, ताकि हम कह सकें: संकलन हमेशा संभव है।क्ष एस मैं एसσqSIS
एक संकलक की अधिक प्रतिबंधात्मक धारणा को औपचारिक रूप देने से अधिक सूक्ष्म सैद्धांतिक दृष्टिकोण की आवश्यकता होगी। मुझे नहीं पता कि उस दिशा में क्या किया गया होगा। आंशिक मूल्यांकन पर किया गया बहुत वास्तविक काम इंजीनियरिंग के दृष्टिकोण से अधिक यथार्थवादी है। और निश्चित रूप से कंपाइलर्स लिखने की अन्य तकनीकें हैं, जिसमें उनके विनिर्देशन के प्रमाण से कार्यक्रमों का निष्कर्षण शामिल है, जैसा कि करी-हावर्ड आइसोमोर्फिज्म पर आधारित टाइप-थ्योरी के संदर्भ में विकसित किया गया है, लेकिन मैं अपनी योग्यता के क्षेत्र से बाहर हो रहा हूं। ।
यहां मेरा उद्देश्य यह दिखाना है कि राफेल की टिप्पणी "पागल" नहीं है, लेकिन एक समझदार अनुस्मारक है कि चीजें स्पष्ट नहीं हैं, और सरल भी नहीं है। यह कहना कि कुछ असंभव है एक मजबूत कथन है जिसके लिए सटीक परिभाषा और प्रमाण की आवश्यकता होती है, यदि केवल यह समझना कि यह कैसे और क्यों असंभव है, इसकी सटीक समझ होनी चाहिए । लेकिन इस तरह के प्रमाण को व्यक्त करने के लिए एक उचित औपचारिकता का निर्माण करना काफी मुश्किल हो सकता है।
यह कहा गया है, भले ही एक विशिष्ट सुविधा के लिए उपयुक्त नहीं है, इंजीनियरों द्वारा समझ में आता है, मानक संकलन तकनीक हमेशा ऐसे कार्यक्रमों के कुछ हिस्सों पर लागू की जा सकती है जो इस तरह की सुविधा का उपयोग नहीं करते हैं, जैसा कि गिल्स के उत्तर द्वारा टिप्पणी की गई है।
गाइल्स की प्रमुख टिप्पणियों का पालन करने के लिए, भाषा के आधार पर, कुछ चीजें संकलन-समय पर की जा सकती हैं, जबकि अन्य को रन-टाइम पर किया जाना चाहिए, इस प्रकार विशिष्ट कोड की आवश्यकता होती है, हम देख सकते हैं कि संकलन की अवधारणा वास्तव में है अ-परिभाषित, और शायद किसी भी संतोषजनक तरीके से निश्चित नहीं है। संकलन केवल एक अनुकूलन प्रक्रिया है, जैसा कि मैंने आंशिक मूल्यांकन अनुभाग में दिखाने की कोशिश की , जब मैंने इसकी तुलना कुछ एल्गोरिदम में स्थैतिक डेटा प्रीप्रोसेसिंग के साथ की।
एक जटिल अनुकूलन प्रक्रिया के रूप में, संकलन की अवधारणा वास्तव में एक सातत्य से संबंधित है। भाषा, या कार्यक्रम की विशेषता के आधार पर, कुछ जानकारी सांख्यिकीय रूप से उपलब्ध हो सकती है और बेहतर अनुकूलन के लिए अनुमति दे सकती है। रन-टाइम के लिए अन्य चीजों को स्थगित करना पड़ता है। जब चीजें वास्तव में खराब हो जाती हैं, तो सब कुछ कम से कम कार्यक्रम के कुछ हिस्सों के लिए रन-टाइम पर किया जाना चाहिए, और दुभाषिया के साथ स्रोत-कोड को बंडल करना आप सभी कर सकते हैं। इसलिए यह संकलन इस निरंतरता का निम्न अंत है। संकलक पर किए गए अधिकांश शोध वैधानिक रूप से करने के तरीके खोजने के बारे में हैं जो गतिशील रूप से किया जाता था। संकलन-समय कचरा संग्रह एक अच्छा उदाहरण लगता है।
ध्यान दें कि संकलन प्रक्रिया को मशीन कोड का उत्पादन करना चाहिए कोई मदद नहीं है। यह ठीक है कि बंडलिंग क्या कर सकता है क्योंकि दुभाषिया मशीन कोड है (ठीक है, क्रॉस-कंपार्टमेंट के साथ चीज़ थोड़ी अधिक जटिल हो सकती है)।