C कोड के लिए Tranlating एक बहुत अच्छी तरह से स्थापित आदत है। कक्षाओं के साथ मूल सी (और शुरुआती C ++ कार्यान्वयन, फिर Cfront कहा जाता है ) ने सफलतापूर्वक किया। लिस्प या योजना के कई कार्यान्वयन कि क्या कर रहे हैं, उदाहरण के लिए चिकन योजना , Scheme48 , Bigloo । कुछ लोगों ने प्रोलॉग टू सी का अनुवाद किया । और इसलिए मोजार्ट के कुछ संस्करण आए (और सी को Ocaml बायटेकोड को संकलित करने का प्रयास किया गया है )। J.Pitrat की कृत्रिम बुद्धिमत्ता CAIA प्रणाली भी बूटस्ट्रैप्ड है और इसके सभी C कोड उत्पन्न करती है। जीटीके संबंधित कोड के लिए Vala भी C में अनुवाद करता है। क्विनक की पुस्तक लिस्प इन स्माल पीसेज सी। में अनुवाद के बारे में कुछ अध्याय हैं।
सी में अनुवाद करते समय मुद्दों में से एक पूंछ-पुनरावर्ती कॉल है । सी मानक यह गारंटी नहीं देता है कि एक सी कंपाइलर उन्हें ठीक से अनुवाद कर रहा है ("एक तर्क के साथ कूदें", यानी कॉल स्टैक खाने के बिना ), भले ही कुछ मामलों में, जीसीसी के हाल के संस्करण (या क्लैंग / एलएलवीएम) का अनुकूलन करें। ।
एक और मुद्दा कचरा संग्रह है । कई कार्यान्वयन केवल बोहेम रूढ़िवादी कचरा कलेक्टर (जो सी अनुकूल है ...) का उपयोग करते हैं। यदि आप कलेक्ट कोड को कचरा करना चाहते हैं (जैसे कई लिस्प कार्यान्वयन, जैसे एसबीसीएल) एक बुरा सपना हो सकता है (आप dlclose
पॉज़िक्स पर चाहेंगे )।
फिर भी एक और मुद्दा प्रथम श्रेणी की निरंतरता और कॉल / सीसी से संबंधित है । लेकिन चालाक चालें संभव हैं (चिकन योजना के अंदर देखें)। कॉल-स्टैक तक पहुँचने के लिए बहुत सारी ट्रिक्स की आवश्यकता होती है (लेकिन GNU बैकट्रेस इत्यादि देखें ...)। ओर्थोगोनल हठ निरंतरता की (ढेर या धागे की यानी) सी में मुश्किल होगा
अपवाद हैंडलिंग अक्सर longjmp आदि के लिए चतुर कॉल का उत्सर्जन करने का मामला है ...
आप (अपने उत्सर्जित सी कोड में) उचित #line
निर्देश उत्पन्न करना चाह सकते हैं । यह उबाऊ है और बहुत काम लेता है (आप चाहते हैं कि उदाहरण के लिए और अधिक आसानी से gdb
-debuggable कोड का उत्पादन करें )।
मेरे पिघल lispy डोमेन विशिष्ट भाषा (अनुकूलित या विस्तार करने के लिए जीसीसी ) सेल्सियस के लिए अनुवाद किया है (वास्तव में गरीब सेल्सियस तक ++ अब)। इसका अपना एक जेनरेशनल कॉपी करने वाला कचरा संग्राहक है। (आप Qish या Ravenbrook MPS से दिलचस्पी ले सकते हैं )। दरअसल, जेनेरिक जीसी हाथ से लिखे सी कोड की तुलना में मशीन जनरेट सी कोड में आसान है (क्योंकि आप अपने राइट-बैरियर और जीसी मशीनरी के लिए अपने सी कोड जनरेटर को दर्जी करेंगे)।
मैं किसी भी भाषा कार्यान्वयन को वास्तविक C ++ कोड में अनुवाद करना नहीं जानता , अर्थात कुछ "संकलन-समय कचरा संग्रह" तकनीक का उपयोग करके C ++ कोड का बहुत सारे STL टेम्प्लेट का उपयोग करके और RAII मुहावरे का सम्मान करना । (कृपया बताएं कि क्या आप एक जानते हैं)।
आज जो मजेदार बात है वह यह है कि (वर्तमान लिनक्स डेस्कटॉप पर) C संकलक काफी तेजी से हो सकता है ताकि C के लिए अनुवादित इंटरएक्टिव टॉप लेवल रीड-इवेल-प्रिंट-लूप को लागू किया जा सके : आप हर उपयोगकर्ता पर C कोड (कुछ सौ पंक्तियाँ) का उत्सर्जन करेंगे सहभागिता, आप fork
इसे एक साझा वस्तु में संकलित करेंगे , जिसे आप तब करेंगे dlopen
। (एमईएलटी कर रहा है कि सभी तैयार हैं, और यह आमतौर पर काफी तेज है)। यह सब कुछ सेकंड का दसवां हिस्सा हो सकता है और एंड-यूजर्स द्वारा स्वीकार्य हो सकता है।
जब संभव हो, मैं C को अनुवाद करने की सलाह दूंगा, C ++ को नहीं, विशेष रूप से क्योंकि C ++ संकलन धीमा है।
अगर आप अपनी भाषा को लागू कर रहे हैं, तो आप भी (सी कोड उत्सर्जन के बजाय) कुछ पर विचार हो सकता JIT तरह पुस्तकालयों libjit , जीएनयू बिजली , asmjit , या यहाँ तक LLVM या GCCJIT । यदि आप सी में अनुवाद करना चाहते हैं, तो आप कभी-कभी टिनीसीसी का उपयोग कर सकते हैं : यह कोड को धीमा करने के लिए बहुत जल्दी उत्पन्न सी कोड (यहां तक कि मेमोरी में) का संकलन करता है । लेकिन सामान्य तौर पर आप एक वास्तविक सी संकलक द्वारा किए गए अनुकूलन का लाभ उठाना चाहते हैं जैसे जीसीसी
यदि आप अपनी भाषा में सी का अनुवाद करते हैं, तो पहले मेमोरी में उत्पन्न सी कोड के पूरे एएसटी का निर्माण करना सुनिश्चित करें (यह भी पहले सभी घोषणाओं को उत्पन्न करना आसान बनाता है, फिर सभी परिभाषाएं और फ़ंक्शन कोड)। आप इस तरह से कुछ अनुकूलन / सामान्यीकरण करने में सक्षम होंगे। इसके अलावा, आप कई GCC एक्सटेंशन (जैसे कंप्यूटेड गोटो) में दिलचस्पी ले सकते हैं । आप संभवतः विशाल सी फ़ंक्शन उत्पन्न करने से बचना चाहते हैं - उदाहरण के लिए उत्पन्न सी की एक सौ हजारों लाइन - (आप बेहतर छोटे टुकड़ों में विभाजित करेंगे) क्योंकि सी कंपाइलर का अनुकूलन बहुत बड़े सी फ़ंक्शन (व्यवहार में,) से बहुत नाखुश हैं प्रयोगात्मक,gcc -O
बड़े कार्यों का संकलन समय फ़ंक्शन कोड आकार के वर्ग के लिए आनुपातिक है)। तो अपने उत्पन्न सी कार्यों के आकार को कुछ हज़ार लाइनों तक सीमित करें।
सूचना है कि दोनों बजना (के माध्यम से LLVM ) और जीसीसी (के माध्यम से libgccjit ) सी और सी ++ compilers किसी तरह कुछ आंतरिक इन compilers के लिए अनुकूल अभ्यावेदन फेंकना प्रस्तुत करते हैं, लेकिन ऐसा करने से हो सकता है (या नहीं) उत्सर्जक सी (या सी ++) कोड की तुलना में कठिन हो सकता है, और प्रत्येक संकलक के लिए विशिष्ट है।
यदि C को अनुवादित करने के लिए कोई भाषा डिज़ाइन की जा रही है, तो आप संभवतः अपनी भाषा के साथ C के मिश्रण को उत्पन्न करने के लिए कई तरकीबें (या निर्माण) करना चाहते हैं। मेरा DSL2011 पेपर MELT : एक ट्रांसलेटेड डोमेन विशिष्ट भाषा जो GCC कंपाइलर में एंबेडेड है, आपको उपयोगी संकेत देना चाहिए।