11

के साथ विस्तारित करना मैं सी प्रोग्रामिंग भाषा के विस्तार के रूप में अपनी प्रोग्रामिंग भाषा लिखना चाहता हूं। मैं जिस प्रोग्रामिंग भाषा का आविष्कार कर रहा हूं वह केवल लघुरूप है जो वैध सी कोड में अनुवाद करता है। उदाहरण के लिए:सी प्रोग्रामिंग भाषा को जीसीसी

namespace TcpConnection { 
    void* connect(char *addr) 
} 

अनुवाद करने के लिए होगा:

void* TcpConnection_connect(char *addr) 

सब किया जाता है एक साधारण नाम प्रतिस्थापन है। यह एक विस्तार का केवल एक उदाहरण है जिसे मैं प्रदान करना चाहता हूं। एक और सरल विस्तार कार्य ओवरलोडिंग होगा (यह फ़ंक्शन नाम के अंत में इसके तर्कों के प्रकार के साथ मिल जाएगा।

किसी भी मामले में, परिणाम पूरी तरह से मान्य सी कोड है। क्या इसमें जाने के बिना ऐसा करने का कोई तरीका है जीसीसी कोड?

उत्तर

13

आप एक पूर्वप्रक्रमक कि अपनी भाषा को पार्स करता है और सी है, जो तब जीसीसी को दिया जाता है करने के लिए इसे संकलित लिख सकते हैं। इस तरह से सी ++ के प्रारंभिक कार्यान्वयन काम किया। हालांकि, अगर आप LLVM के बजना पर हैक पसंद कर सकते हैं है, जिसे कई सी-पारिवारिक भाषाओं का समर्थन करने के लिए डिज़ाइन किया गया है और, एलएलवीएम के हिस्से के रूप में, अधिक मॉड्यूलर और विस्तार करने में आसान बनाने के लिए डिज़ाइन किया गया है।

2

प्रोटोटाइप के लिए, शायद एक प्रीप्रोसेसर के साथ जाएं आपकी पसंद की भाषा में लिखा गया है (सी, पर्ल, पायथन ...) और फिर इसे अपने मेकफ़ाइल नियमों में बनाएं। बस इसे आसान बनाने के लिए एक आसान, कम लागत वाला तरीका प्राप्त करने के लिए ...

एक अलग फ़ाइल एक्सटेंशन का उपयोग करें, और .foo को .c में चालू करें।

0

आप http://cil.sourceforge.net/

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

1

मैंने कुछ सी 99 मैक्रो जादू और पर्ल का उपयोग करके कस्टम बाइटकोड प्रारूप के लिए एक असेंबली भाषा एम्बेड करने के समान कुछ किया।

मैक्रो

#define x3_pragma_(...) _Pragma(#__VA_ARGS__) 
#define x3_asm(...) ((const struct x3instruction []){ \ 
    x3_pragma_(X3 ASM __VA_ARGS__) \ 
}) 

पाने के लिए

((const struct x3instruction []){ 
#pragma X3 ASM exit = find val(0) 
}) 

जो एक पर्ल स्क्रिप्ट के माध्यम से पहुंचाया जाता है के रूप में बदल

x3_asm(exit = find val(0)) 

((const struct x3instruction []){ 
{ { { X3_OPFINDVAL, { .as_uint = (0) } }, { X3_OPEXIT, { 0 } } } }, 
}) 

जीसीसी और पर्ल का एक नमूना मंगलाचरण इस प्रकार दिखाई देगा:

gcc -E foo.c | perl x3pp.pl | gcc -o foo.o -x c - 

यह stricly आवश्यकता से अधिक जटिल है, लेकिन मैं इसे लाभकारी सी पूर्वप्रक्रमक अपने कस्टम पूर्वप्रक्रमक से पहले चलाता है कि मिल गया है, और मैं भी इसे पसंद किया है कि का उपयोग करके pragmas, स्रोत कानूनी सी रहता है

संबंधित मुद्दे