हास्केल में हास्केल दुभाषिया लिखें


90

एक क्लासिक प्रोग्रामिंग अभ्यास लिस्प / स्कीम में एक लिस्प / स्कीम दुभाषिया लिखना है। भाषा की सबसेट के लिए दुभाषिया का उत्पादन करने के लिए पूरी भाषा की शक्ति का लाभ उठाया जा सकता है।

क्या हास्केल के लिए एक समान व्यायाम है? मैं इंजन के रूप में हास्केल का उपयोग करके हास्केल के सबसेट को लागू करना चाहता हूं। बेशक, यह किया जा सकता है, लेकिन क्या कोई ऑनलाइन संसाधन देखने के लिए उपलब्ध हैं?


यहाँ बैकस्टोरी है।

मैं एक डिस्क्रीट स्ट्रक्चर्स के पाठ्यक्रम में कुछ अवधारणाओं का पता लगाने के लिए एक भाषा के रूप में हास्केल का उपयोग करने के विचार की खोज कर रहा हूं जो मैं सिखा रहा हूं। इस सेमेस्टर के लिए मैं मिरांडा पर बसा हुआ हूं , जो एक छोटी भाषा है जिसने हास्केल को प्रेरित किया। मिरांडा 90% के बारे में क्या मैं यह करना चाहते हैं, लेकिन हास्केल लगभग 2000% करता है। :)

इसलिए मेरा विचार एक ऐसी भाषा का निर्माण करना है जिसमें हास्केल की विशेषताएं हैं जो मैं चाहता हूं और बाकी सब को नापसंद करता हूं। छात्रों की प्रगति के रूप में, मैं मूल रूप से मूल विशेषताओं में महारत हासिल करने के बाद चुनिंदा "विभिन्न सुविधाओं" को चालू कर सकता हूं।

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


मेरे पास एक WIP हास्केल बोली है जिसे बेस के रूप में हास्केल में टाइपिंग हास्केल के साथ लागू किया गया है। यहाँ इसका एक डेमो है chrisdone.com/toys/duet-delta यह सार्वजनिक ओपन सोर्स रिलीज़ के लिए तैयार नहीं है, लेकिन अगर रुचि हो तो मैं आपके साथ स्रोत साझा कर सकता हूं।
क्रिस्टोफर ने

जवाबों:


76

मुझे आपके लक्ष्य से प्यार है, लेकिन यह एक बड़ा काम है। संकेत के एक जोड़े:

  • मैंने जीएचसी पर काम किया है, और आप स्रोतों का कोई हिस्सा नहीं चाहते हैं। हग्स एक बहुत सरल, क्लीनर कार्यान्वयन है लेकिन दुर्भाग्य से यह सी में है।

  • यह पहेली का एक छोटा सा टुकड़ा है, लेकिन मार्क जोन्स ने हास्केल में टाइपिंग हास्केल नामक एक सुंदर पेपर लिखा, जो आपके सामने के छोर के लिए एक शानदार शुरुआती बिंदु होगा।

सौभाग्य! कक्षा से समर्थन साक्ष्य के साथ हास्केल के लिए भाषा के स्तर की पहचान करना, समुदाय के लिए बहुत लाभकारी होगा और निश्चित रूप से एक युवा परिणाम होगा!


2
मुझे आश्चर्य है कि जीएचसी के बारे में टिप्पणी अभी भी सटीक है। जीएचसी जटिल है, लेकिन यह काफी अच्छी तरह से प्रलेखित है। विशेष रूप से, आंतरिक Notesनिम्न-स्तरीय विवरणों को समझने में सहायक होते हैं, और द आर्किटेक्चर ऑफ ओपन-सोर्स एप्लिकेशन में जीएचसी पर अध्याय एक उत्कृष्ट उच्च-स्तरीय अवलोकन प्रदान करता है।
sjy

37

एक पूरा हास्केल पार्सर है: http://hackage.haskell.org/package/haskell-src-xts

एक बार जब आप इसे पार कर लेते हैं, तो कुछ चीजों को अलग करना या छोड़ना आसान होता है। मैंने आयात स्टेटमेंट को हटाने, शीर्ष-स्तरीय परिभाषाओं का समर्थन करने आदि के लिए tryhaskell.org के लिए ऐसा किया।

बस मॉड्यूल को पार्स करें:

parseModule :: String -> ParseResult Module

फिर आपके पास मॉड्यूल के लिए एएसटी है:

Module SrcLoc ModuleName [ModulePragma] (Maybe WarningText) (Maybe [ExportSpec]) [ImportDecl] [Decl]    

Decl प्रकार व्यापक है: http://hackage.haskell.org/packages/archive/haskell-src-exts/1.9.0/doc/html/Language-Haskell-Exts-Synt.html.htmlt%3ADecl

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

data SrcLoc = SrcLoc
     { srcFilename :: String
     , srcLine :: Int
     , srcColumn :: Int
     }

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

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


24

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

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

इसलिए आपको काम करने के लिए हास्केल के एक बहुत छोटे उप-समूह को परिभाषित करना चाहिए और फिर योजना-उदाहरण चरण को चरणबद्ध करके शुरू करना चाहिए।

इसके अलावा:

ध्यान दें कि हास्केल में, आपके पास व्याख्याताओं एपीआई (कम से कम जीएचसी के तहत) में पार्सर, कंपाइलर और निश्चित रूप से दुभाषियों तक पूरी पहुंच है।

उपयोग करने के लिए पैकेज संकेत (Language.Haskell। *) है । मैंने दुर्भाग्यवश इस पर न तो ऑनलाइन ट्यूटोरियल ढूंढे हैं और न ही इसे खुद आजमाया है लेकिन यह काफी आशाजनक लग रहा है।


12
ध्यान दें कि टाइप-इनफेरेंस वास्तव में बहुत आसान है, 20-30 लाइन एल्गोरिदम। यह अपनी सादगी में सुंदर है। आलसी मूल्यांकन भी सांकेतिक शब्दों में बदलना मुश्किल नहीं है। मैं कहूंगा कि कठिनाई पागल वाक्यविन्यास, पैटर्न मिलान और भाषा में सामान की बड़ी मात्रा में निहित है।
क्लाउडीयू

रुचिकर - क्या आप टाइप-इनविज़न एल्गो के लिए लिंक पोस्ट कर सकते हैं?
दरियो

5
हाँ, इस निशुल्क पुस्तक की जाँच करें - cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04-26 -, यह पृष्ठ 273 (पीडीएफ का 289) पर है। एल्ग छद्मकोड P296 पर है।
क्लाउडीयू


1
हालांकि, टाइप-क्लास के साथ टाइप करना आसान नहीं है।
क्रिस्टोफर ने

20

एक ऐसी भाषा बनाएं जिसमें हास्केल की विशेषताएं हैं जो मैं चाहता हूं और बाकी सब को नापसंद करता हूं। छात्रों की प्रगति के रूप में, मैं मूल रूप से मूल विशेषताओं में महारत हासिल करने के बाद चुनिंदा "विभिन्न सुविधाओं" को चालू कर सकता हूं।

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

यह HLint के समान होगा (और इसके विपरीत की तरह भी):

एचएलआईएनटी (पूर्व में डॉ। हास्केल) हास्केल कार्यक्रमों को पढ़ता है और उन परिवर्तनों को सुझाता है जो उम्मीद करते हैं कि उन्हें पढ़ना आसान है। HLint भी अवांछित सुझावों को अक्षम करना और अपने स्वयं के कस्टम सुझावों को जोड़ना आसान बनाता है।

  • उन सुविधाओं का उपयोग न करने के लिए जिन्हें आप अनुमति नहीं देते हैं, अपने स्वयं के HLint "सुझावों" को लागू करें
  • सभी मानक HLint सुझावों को अक्षम करें।
  • अपने आवरण को अपना संशोधित HLint पहले चरण के रूप में चलाएं
  • त्रुटियों के रूप में HLint सुझावों को समझें। यही है, अगर एचएलआईएनटी ने "शिकायत की" तो कार्यक्रम संकलन चरण तक आगे नहीं बढ़ता है

16

बास्केल एक शिक्षण कार्यान्वयन है, http://hackage.haskell.org/package/baskell

आप बस शुरू करने के लिए कह सकते हैं, कहते हैं, लागू करने के लिए प्रकार प्रणाली। यह योजना के लिए दुभाषिया के रूप में जटिल है, http://hackage.haskell.org/package/thih


6

संकलक की ईएचसी श्रृंखला शायद सबसे अच्छी शर्त है: यह सक्रिय रूप से विकसित है और जैसा आप चाहते हैं वैसा ही प्रतीत होता है - हास्केल '98 में समापन वाले छोटे लैंबडा कैल्की कम्पाइलर / दुभाषियों की एक श्रृंखला।

लेकिन आप पियर्स के प्रकार और प्रोग्रामिंग लैंग्वेज में विकसित विभिन्न भाषाओं को देख सकते हैं , या हीलियम दुभाषिया (छात्रों के लिए एक अपंग हास्केल http://en.wikipedia.org/wiki/Helium_(Hellell) )।


6

यदि आप हास्केल के सबसेट की तलाश कर रहे हैं जो लागू करना आसान है, तो आप टाइप कक्षाएं और टाइप चेकिंग कर सकते हैं। प्रकार वर्गों के बिना, आपको हास्केल कोड का मूल्यांकन करने के लिए प्रकार की आवश्यकता नहीं है।

मैंने कोड गोल्फ चुनौती के लिए एक स्व-संकलन हास्केल सबसेट कंपाइलर लिखा था । यह इनपुट पर हास्केल सबसेट कोड लेता है और आउटपुट पर C कोड तैयार करता है। मुझे खेद है कि अधिक पठनीय संस्करण उपलब्ध नहीं है; मैंने इसे आत्म-संकलन बनाने की प्रक्रिया में हाथ से नेस्टेड परिभाषाओं को उठाया।

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

  • आलसी मूल्यांकन। यदि दुभाषिया हास्केल में है, तो आपको इसके लिए कुछ भी नहीं करना पड़ सकता है।

  • पैटर्न-मिलान किए गए तर्कों और गार्ड के साथ फ़ंक्शन की परिभाषा। केवल चर, विपक्ष, शून्य और _पैटर्न के बारे में चिंता करें ।

  • सरल अभिव्यक्ति सिंटैक्स:

    • पूर्णांक शाब्दिक

    • चरित्र शाब्दिक

    • [] (शून्य)

    • समारोह आवेदन (बाएं सहयोगी)

    • Infix :(बुरा, सही सहयोगी)

    • कोष्टक

    • चर नाम

    • फ़ंक्शन नाम

अधिक संक्षेप में, एक दुभाषिया लिखें जो इसे चला सके:

-- tail :: [a] -> [a]
tail (_:xs) = xs

-- append :: [a] -> [a] -> [a]
append []     ys = ys
append (x:xs) ys = x : append xs ys

-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
zipWith _ _      _      = []

-- showList :: (a -> String) -> [a] -> String
showList _    []     = '[' : ']' : []
showList show (x:xs) = '[' : append (show x) (showItems show xs)

-- showItems :: (a -> String) -> [a] -> String
showItems show []     = ']' : []
showItems show (x:xs) = ',' : append (show x) (showItems show xs)

-- fibs :: [Int]
fibs = 0 : 1 : zipWith add fibs (tail fibs)

-- main :: String
main = showList showInt (take 40 fibs)

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


"आलसी मूल्यांकन। यदि दुभाषिया हास्केल में है, तो आपको इसके लिए कुछ भी नहीं करना पड़ सकता है।" यह सच नहीं हो सकता है। हास्केल में एक आलसी दुभाषिया को लागू करने के बारे में अधिक जानकारी के लिए Naylor का लेख haskell.org/wikiupload/0/0a/TMR-Issue10.pdf में देखें ।
जेरेड अपडेटेड


3

यह एक अच्छा विचार हो सकता है - हास्केल में नेटलोगो का एक छोटा संस्करण बनाएं। यहाँ छोटे दुभाषिया है।


लिंक मर चुके हैं। किसी भी मौका यह सामग्री अभी भी कहीं और मौजूद है? मुझे उत्सुकता होगी ...
निकोलस पैलेट

हम्म यह एक ब्लॉग पोस्ट था और मुझे नहीं पता कि इसके लिए खोज करने के लिए किन कीवर्ड का उपयोग करना है। एक अच्छा सबक जब ... एक लिंक प्रदान अधिक पर्याप्त जानकारी शामिल करने के लिए
Claudiu

1
"Netlogo haskell" के लिए एक Google खोज जारी है ... यह प्रश्न। वैसे भी कोई बड़ी बात नहीं। धन्यवाद!
निकोलस पैलेट



2

मुझे बताया गया है कि इदरीस के पास एक काफी कॉम्पैक्ट पार्सर है, निश्चित रूप से अगर यह परिवर्तन के लिए उपयुक्त नहीं है, लेकिन यह हास्केल में लिखा गया है।


2

रूसी बाउर की प्रोग्रामिंग भाषा चिड़ियाघरलेडी में विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषा का एक छोटा सा कार्यान्वयन है जिसे कुछ हद तक "मिनीस्केल" नाम दिया गया है। यह OCaml की लगभग 700 लाइनें हैं, इसलिए इसे पचाना बहुत आसान है।

साइट में ML-style, Prolog-style और OO प्रोग्रामिंग भाषाओं के टॉय वर्जन भी हैं।


1

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

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

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


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

0

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

  • कॉन्फ़िगर करने योग्य पूर्ववर्तीता, सहक्रियाशीलता और नियतता वाले ऑपरेटर
  • नेस्टेड टिप्पणियाँ
  • लेआउट नियम
  • पैटर्न वाक्यविन्यास
  • do- ब्लॉक और monadic कोड के लिए desugaring

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

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

इसके अतिरिक्त, आपको GHC (या किसी अन्य संकलक के) दृश्यपटल का उपयोग करने में संकोच नहीं करना चाहिए। मैं यह नहीं मानूंगा कि चूंकि कस्टम LISPs मेजबान LISP सिस्टम के पार्सर का उपयोग करते हैं (कम से कम बूटस्ट्रैपिंग के दौरान)। सफाई करनाCoreस्निपेट्स को और उन्हें छात्रों के सामने प्रस्तुत करना, मूल कोड के साथ, आपको यह देखने की अनुमति देनी चाहिए कि फ्रंटएंड क्या करता है, और इसे फिर से लागू नहीं करना बेहतर क्यों है।

यहाँ CoreGHC में प्रयुक्त दस्तावेज के कुछ लिंक दिए गए हैं :

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