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.
libgccjit
bekerja ke arah itu, meskipun akan menjadi perjuangan yang berat: programmers.stackexchange.com/a/323821/124651libgccjit
Diperkenalkan dalam GCC 5 dan masih eksperimental pada GCC 6.
Documents: https://gcc.gnu.org/onlinedocs/jit/
Pertanyaan-pertanyaan Terkait:
sumber
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 ++.
sumber
tcc
kompilasi dengan cepat, tetapi tidak optimal sama sekali. Kode yang dihasilkan seringkali 3 hingga 10 kali lebih lambat dari yanggcc -O2
akan dihasilkan.Saya ragu ada yang lebih baik dari forking gcc. Anda mungkin mempertimbangkan dentang, yang lebih dirancang untuk penggunaan semacam ini.
sumber
(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
libjit
danlightning
sedang 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 suatugcc
proses (atau menggunakan beberapa kompiler lain, seperticlang
) 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.
sumber