Apakah ada cara untuk menggunakan gcc sebagai perpustakaan?


10

Ada yang tahu solusi yang bekerja seperti ini:

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

Saya tahu saya bisa menjalankan perintah "gcc main.c -o main" di fork dan mengurai output ... tapi saya mencari sesuatu yang lebih ' dapat diandalkan ' seperti contoh di atas.

Jawaban:




3

Itu tidak mungkin dengan gcc tetapi Anda mungkin menemukan tcc (kompiler C embeddable) cukup baik untuk apa yang ada dalam pikiran Anda. Distribusi hadir dengan pustaka libtcc yang memungkinkan untuk mengkompilasi, menautkan dan menjalankan kode C "on the fly".

Perhatikan bahwa ini hanya untuk C, pertanyaan Anda juga ditandai C ++ tetapi saya belum melihat yang setara dengan tcc untuk C ++.


Perhatikan bahwa tcckompilasi dengan cepat, tetapi tidak optimal sama sekali. Kode yang dihasilkan seringkali 3 hingga 10 kali lebih lambat dari yang gcc -O2akan dihasilkan.
Basile Starynkevitch

2

Saya ragu ada yang lebih baik dari forking gcc. Anda mungkin mempertimbangkan dentang, yang lebih dirancang untuk penggunaan semacam ini.


2

(Saya kira Anda menggunakan beberapa sistem POSIX, seperti Linux atau MacOSX)

Anda jelas harus melihat ke GCCJIT , seperti yang disebutkan oleh Ciro Santilli . Anda kemudian akan membangun beberapa representasi AST seperti kode yang dihasilkan. Tentu saja Anda dapat mempertimbangkan LLVM sebagai gantinya, atau bahkan beberapa perpustakaan JIT yang lebih sederhana seperti libjit atau GNU lightning (tetapi libjitdan lightningsedang memancarkan kode dengan cepat, tetapi kode yang dipancarkan lambat dan tidak dioptimalkan).

Namun, Anda mungkin masih mempertimbangkan untuk memancarkan beberapa kode C dalam file sementara dan mengompilasi kompilasi darinya (misalnya sebagai pustaka bersama yang nantinya Anda muat secara dinamis sebagai plugin menggunakan dlopen (3) & dlsym (3) ), lihat di sini & di sini untuk detail.

Perhatikan fakta penting: menghasilkan kode yang dioptimalkan membutuhkan waktu CPU (dengan GCCJIT, atau LLVM, atau dengan menjalankan gcc -O2) karena itu adalah tugas yang sulit. Jadi overhead dari forking suatu gccproses (atau menggunakan beberapa kompiler lain, seperti clang) dapat diabaikan (menggunakan beberapa perpustakaan seperti GCCJIT atau LLVM).

Sebenarnya, pengalaman saya (dalam GCC MELT ) adalah bahwa pada desktop dan laptop saat ini, memancarkan beberapa ratus baris kode C dan mengompilasi kompilasi mereka cukup cepat (satu atau dua persepuluh detik) agar kompatibel dengan interaksi pengguna. Jadi hari ini, Anda dapat mempertimbangkan memiliki REPL yang akan melakukan itu. Lihat juga jawaban terkait ini .

Lihat juga ke Common Lisp dan SBCL yang merupakan implementasi yang mengkompilasi ke dalam kode mesin di setiap interaksi REPL.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.