2013-08-13 4 views
5

में जीएचसी के साथ .hs से .hc तक आउटपुट नहीं कर सकता है, जब मैंने सुना कि जीएचसी सी को फाइल आउटपुट कर सकता है तो मैं चिंतित था।Haskell

ग्लासगो हास्केल कंपाइलर (जीएचसी) कई अलग-अलग आर्किटेक्चर पर देशी कोड के साथ-साथ एएनएसआई सी-सी का उपयोग करके इंटरमीडिएट भाषा के रूप में संकलित करता है।

इसलिए मैंने हास्केल प्लेटफ़ॉर्म स्थापित किया और एक सरल .hs फ़ाइल बनाई।

main = putStrLn "Hello, World!" 

और मैनुअल के अनुसार।

-सी रोक सी (.hc फ़ाइल) पैदा करने के बाद

अब मैं आदेश चला।

ghc -C test.hs 

लेकिन यह एक .hc फ़ाइल नहीं बनाता है, और न ही यह मध्य संकलन को रोकता है।

$ ls 
test.exe test.hi test.hs test.o 
+2

क्या आपने सीसी के अलावा -फविया-सी पास करने का प्रयास किया है? आईआईआरसी जीएचसी डिफ़ॉल्ट रूप से सी बैकएंड का उपयोग नहीं करता है (यह सीधे एलवीएम सहित विभिन्न मशीनों के लिए असेंबली उत्पन्न कर सकता है)। – Cubic

+0

मुझे एक चेतावनी मिली कि "-फविया-सी ध्वज कुछ भी नहीं करता है, इसे भविष्य में जीएचसी रिलीज में हटा दिया जाएगा"। अगस्तएसएस, मैं निराश क्यों होगा? –

+2

यह पूरी तरह से सी कोड के विपरीत दिखता है जो मानव लिखता है। यह मूल रूप से अपठनीय है। यह उतना ही कुशल नहीं है जितना आप उम्मीद करेंगे। सी संकलक द्वारा उत्पन्न असेंबली कोड को जोड़कर यह एकमात्र तरीका कुशल हो जाता है। – augustss

उत्तर

7

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

एक वास्तविक जवाब के बारे में कुछ प्रदान करने के लिए - आप LLVM बैकएंड पर जाने से सी उत्पन्न कर सकता है:

ghc -ddump-llvm -ddump-to-file hello_world.hs 
opt -O2 hello_world.dump-llvm | llc -O2 -march c -o hello_world.c 

लेकिन परिणाम अभी बिंदु को वर्णन होगा। यहां तक ​​कि एक छोटा fib फ़ंक्शन कोड की लगभग 80 लाइनें लेगा।

यदि आप वास्तव में गॉरी विवरण में रुचि रखते हैं, तो मैं एडवर्ड जेड यांग द्वारा this blog post के माध्यम से पढ़ने की अनुशंसा करता हूं। वह मूल रूप से हास्केल कोड के एक साधारण टुकड़े का अनुवाद करने में शामिल पूरी संकलन पाइपलाइन के माध्यम से चलता है।

+0

बहुत बढ़िया, इसे सी ++ में मिला। स्पष्ट रूप से इस पर रूपांतरण करता है: डी http://pastebin.com/r4Dy0ZD5 –

+0

जो क्लैंग और जीसीसी में टन त्रुटियों को फेंकता है: पी –

+0

ध्यान दें कि आपके द्वारा चिपकाया गया सी ++ कोड वास्तव में अंतिम मशीन कोड के लिए * जनरेटर * है (पुस्तकालय के रूप में एलएलवीएम का उपयोग कर)। लेकिन इसे चलाने की कोशिश किसी भी मामले में व्यर्थ है, मेरा विश्वास करो ... –