2017-09-01 8 views
20

में फ़ुतमुरा अनुमानों का सबूत मैंने The Three Projections of Doctor Futamura पर दान पिपोनी के उत्कृष्ट ब्लॉग पोस्ट को पढ़ा। लेख के अंत में उनके पास हास्केल में फ़ुतमुरा अनुमानों के सबूत के साथ एक परिशिष्ट है। हालांकि, मुझे लगता है कि उनके लेख में शामिल भाषाओं के बारे में जानकारी की कमी है। Futamura अनुमानों के काम करने के लिए विशेषज्ञ के स्रोत, लक्ष्य और वस्तु भाषाओं को क्या होना चाहिए? उदाहरण के लिए, क्या फुतमुरा अनुमान काम करेंगे यदि मैंने हास्केल में एलएसवीएम विशेषज्ञ को हास्केल लिखा था? यह उपयोगी होगा यदि आपने साबित करने के लिए हास्केल कार्यक्रम लिखा था जैसे कि दान पिपोनी ने अपने लेख में किया था।हास्केल

उत्तर

15

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

मेरी परिकल्पना साबित करने के लिए मैं tombstone diagrams पर आधारित प्रोग्रामों का वर्णन करने के लिए एक नया नोटेशन पेश करूंगा। एक टॉम्बस्टोन आरेख (या टी-आरेख) कंपाइलर्स और अन्य संबंधित metaprograms का एक चित्रमय प्रतिनिधित्व है। इन्हें एक ऑब्जेक्ट भाषा (टी के नीचे) में लागू एक स्रोत भाषा (टी के बायीं ओर) से एक लक्ष्य भाषा (टी के दाएं) से किसी प्रोग्राम के परिवर्तन के बारे में चित्रित करने और तर्क देने के लिए उपयोग किया जाता है। के सभी कार्यक्रमों के लिए काम करने के लिए टी-चित्र के विचार का विस्तार करते हैं:

α → β : ℒ -- A program is a function from α to β as implemented in language ℒ. 

metaprograms α और β के मामले में खुद को कार्यक्रम हैं:

(α → β :) × α → β : -- An interpreter for language as implemented in . 
(α → β :) → (α → β :) : -- A compiler from to as implemented in . 
(ι × α → β :) × ι → (α → β :) : -- A self-hosting specializer from to . 
(ι × α → β :) → (ι → (α → β :) :) : -- A compiler compiler from to . 

इस टिप्पणी सीधे में प्रकार परिभाषाएं में बदला जा सकता हास्केल। इस के साथ सशस्त्र, अब हम हास्केल में Futamura अनुमानों के प्रमाण के लिए सम्मान के साथ भाषाओं लिख सकते हैं:

{-# LANGUAGE RankNTypes #-} 

module Futamura where 

newtype Program a b language = Program { runProgram :: a -> b } 

type Interpreter source object = forall a b.  Program (Program a b source, a) b object 
type Compiler source target = forall a b.  Program (Program a b source) (Program a b target) target 
type Specializer source target = forall input a b. Program (Program (input, a) b source, input) (Program a b target) source 
type Partializer source target = forall input a b. Program (Program (input, a) b source) (Program input (Program a b target) target) target 

projection1 :: Specializer object target -> Interpreter source object -> Program a b source -> Program a b target 
projection1 specializer interpreter program = runProgram specializer (interpreter, program) 

projection2 :: Specializer object target -> Interpreter source object -> Compiler source target 
projection2 specializer interpreter = runProgram specializer (specializer, interpreter) 

projection3 :: Specializer source target -> Partializer source target 
projection3 specializer = runProgram specializer (specializer, specializer) 

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

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

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