C'è un modo per usare gcc come libreria?


10

Chiunque conosce una soluzione che funziona in questo modo:

#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;
}

So di poter eseguire il comando "gcc main.c -o main" in un fork e analizzare l'output ... ma stavo cercando qualcosa di più " affidabile " come nell'esempio sopra.

Risposte:




3

Con gcc non è possibile, ma potresti trovare tcc (un compilatore C incorporabile) abbastanza buono per quello che hai in mente. La distribuzione viene fornita con una libreria libtcc che consente di compilare, collegare ed eseguire il codice C "al volo".

Nota che questo è solo per C, la tua domanda è anche taggata C ++ ma non ho visto alcun equivalente di tcc per C ++.


Si noti che si tcccompila rapidamente, ma non si ottimizza affatto. Il codice generato è spesso da 3 a 10 volte più lento di quello gcc -O2che produrrebbe.
Basile Starynkevitch,

2

Dubito che ci sia qualcosa di meglio del fork di gcc. Potresti prendere in considerazione il clang, che è più progettato per questo tipo di utilizzo.


2

(Immagino che tu sia su un sistema POSIX, come Linux o MacOSX)

Ovviamente dovresti esaminare GCCJIT , come menzionato da Ciro Santilli . Costruirai quindi una rappresentazione simile al codice AST del codice generato. Ovviamente potresti considerare invece LLVM , o anche qualche libreria JIT più semplice come libjit o GNU lightning (ma libjite lightningstanno emettendo codice rapidamente, ma il codice emesso è lento e non ottimizzato).

Tuttavia, potresti comunque considerare di emettere del codice C in un file temporaneo e di crearne una compilazione (ad esempio come libreria condivisa che successivamente caricheresti dinamicamente come plug-in usando dlopen (3) e dlsym (3) ), vedi qui e qui per dettagli.

Notare un fatto importante: la generazione di codice ottimizzato richiede tempo della CPU (con GCCJIT, o LLVM o in esecuzione gcc -O2) perché è un compito difficile. Quindi il sovraccarico di fork di un gccprocesso (o l'utilizzo di qualche altro compilatore, come clang) è trascurabile (wrt utilizzando una libreria come GCCJIT o LLVM).

In realtà, la mia esperienza (in GCC MELT ) è che su desktop e laptop attuali, l'emissione di alcune centinaia di righe di codice C e l'inoltro di una loro compilation è abbastanza veloce (uno o due decimi di secondo) per essere compatibile con l'interazione dell'utente. Quindi oggi potresti prendere in considerazione l' idea di avere un REPL che lo farebbe. Vedi anche questa risposta correlata.

Guarda anche Common Lisp e SBCL che è un'implementazione che si compila in codice macchina ad ogni interazione REPL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.