वहाँ एक पुस्तकालय के रूप में जीसीसी का उपयोग करने का एक तरीका है?


10

कोई भी एक समाधान जानता है जो कुछ इस तरह से काम करता है:

#include <stdio.h>
#include <gcc.h> /* This .h is what I'm looking for. */

int main (void) {
    /* variables declaration (...) */

    /* The following line is supposed to be equivalent to:
     *     $ gcc main.c -o main */
    results = gcc_compile_and_link("main.c", "main");

    /* Now I want to use the warnings and errors to do something.
     * For instance, I'll print them to the console: */
    printf("warnings:\n");
    for (i=0; i<results.warns_len; i++)
        printf("%s\n", results.warings[i].msg);
    printf("errors\n");
    for (i=0; i<results.errs_len; i++)
        printf("%s\n", results.errors[i].msg);

    /* free memory and finalize (...) */
    return 0;
}

मुझे पता है कि मैं एक फोर्क में कमांड "gcc main.c -o main" चला सकता हूं और आउटपुट पार्स कर सकता हूं ... लेकिन मैं ऊपर के उदाहरण की तरह कुछ और ' विश्वसनीय ' की तलाश कर रहा था ।

जवाबों:


10

GCC को स्पष्ट रूप से एक टूल बेस / लाइब्रेरी के रूप में उपयोग करने के लिए डिज़ाइन किया गया था। इसके लिए आपको क्लैंग का उपयोग करना होगा, या कमांडलाइन के माध्यम से जीसीसी को कॉल करना होगा।


3
क्या आप उस डिज़ाइन के निर्णय का कारण जानते हैं?
मैक्स

libgccjitउस दिशा में काम कर रहा है, हालांकि यह एक कठिन लड़ाई होगी: प्रोग्रामर.स्टैकएक्सचेंज.
com/a/323821/124651

6

libgccjit

जीसीसी 5 में पेश किया गया है और अभी भी जीसीसी 6 के रूप में प्रयोगात्मक है।

डॉक्स: https://gcc.gnu.org/oniltocs/jit/

संबंधित सवाल:


3

यह gcc के साथ संभव नहीं है, लेकिन आपके मन में आपके लिए tcc (एक एम्बेड करने योग्य C संकलक) काफी अच्छा मिल सकता है। वितरण एक libtcc लाइब्रेरी के साथ आता है जो सी कोड को "मक्खी पर" संकलित करने, लिंक करने और चलाने की अनुमति देता है।

ध्यान दें कि यह केवल C के लिए है, आपके प्रश्न को C ++ भी टैग किया गया है, लेकिन मैंने C ++ के लिए tcc का कोई समकक्ष नहीं देखा है।


ध्यान दें कि tccजल्दी से संकलन करता है, लेकिन बिल्कुल भी अनुकूलन नहीं कर रहा है। उत्पन्न कोड क्या gcc -O2उत्पादन होता है की तुलना में अक्सर 3 से 10 गुना धीमा होता है।
बेसिल स्टारीनेवविच

2

मुझे शक है कि जीसीसी को फोर्क करने से बेहतर कुछ है। आप इस तरह के उपयोग के लिए डिज़ाइन किए गए क्लैंग पर विचार कर सकते हैं।


2

(मैं अनुमान लगा रहा हूं कि आप कुछ POSIX सिस्टम पर हैं, जैसे Linux या MacOSX)

आपको स्पष्ट रूप से GCCJIT में देखना चाहिए , जैसा कि Ciro Santilli ने उल्लेख किया है । फिर आप उत्पन्न कोड के कुछ एएसटी -जैसे प्रतिनिधित्व का निर्माण करेंगे । बेशक आप विचार कर सकते LLVM बजाय, या यहाँ तक कि कुछ सरल JIT तरह पुस्तकालय libjit या जीएनयू बिजली (लेकिन libjitऔर lightningजल्दी से कोड उत्सर्जक रहे हैं, लेकिन उत्सर्जित कोड धीमी गति से और unoptimized है)।

हालांकि, अगर आप अभी भी विचार कर सकते हैं कुछ सी कोड उत्सर्जक अस्थायी फ़ाइल में है और इसे का एक संकलन forking (जैसे साझा लाइब्रेरी के रूप में आप बाद में प्रभावी रूप से एक प्लगइन का उपयोग करके लोड होता है कि dlopen (3) और dlsym (3) ), देखने के लिए यहाँ और यहाँ ब्योरा हेतु।

एक महत्वपूर्ण तथ्य नोटिस करें: अनुकूलित कोड जनरेट करना CPU समय (GCCJIT, या LLVM, या रनिंग के साथ gcc -O2) लेता है क्योंकि यह एक मुश्किल काम है। तो एक gccप्रक्रिया का सामना करने का ओवरहेड (या कुछ अन्य संकलक का उपयोग करना, जैसे clang) नगण्य है (कुछ पुस्तकालय जैसे जीसीसीजेआईटी या एलएलवीएम का उपयोग करके)।

वास्तव में, मेरा अनुभव ( जीसीसी एमईएलटी में ) यह है कि वर्तमान डेस्कटॉप और लैपटॉप पर, सी कोड की कुछ सौ पंक्तियों का उत्सर्जन और उनमें से एक संकलन का उपयोग तेजी से पर्याप्त (एक या दो सेकंड के दसवें) उपयोगकर्ता बातचीत के साथ संगत होना है। तो आज, आप एक REPL होने पर विचार कर सकते हैं जो ऐसा करेगा। इससे संबंधित उत्तर भी देखें ।

कॉमन लिस्प और एसबीसीएल में भी देखें जो एक कार्यान्वयन है जो प्रत्येक आरईपीएल इंटरैक्शन में मशीन कोड में संकलित करता है।

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