Gcc'yi kütüphane olarak kullanmanın bir yolu var mı?


10

Herkes böyle bir şey çalışan bir çözüm biliyor:

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

Ben bir çatal "gcc main.c -o main" komutunu çalıştırmak ve çıktı ayrıştırmak biliyorum ... ama yukarıdaki örnek gibi daha ' güvenilir ' bir şey arıyordu .

Yanıtlar:




3

Gcc ile mümkün değildir, ancak aklınızdakiler için yeterince iyi tcc (gömülebilir bir C derleyicisi) bulabilirsiniz . Dağıtım, C kodu "anında" derlemeye, bağlamaya ve çalıştırmaya izin veren bir libtcc kütüphanesi ile birlikte gelir.

Bu sadece C için, sorunuz da C ++ olarak etiketlenmiş olduğunu unutmayın ama C ++ için tcc herhangi bir eşdeğer görmedim.


tccHızlı bir şekilde derlendiğine, ancak hiç optimize etmediğine dikkat edin . Oluşturulan kod genellikle üretilenden 3 ila 10 kat daha yavaştır gcc -O2.
Basile Starynkevitch

2

Ben gcc çatal daha iyi bir şey olduğundan şüpheliyim. Bu tür kullanım için daha tasarlanmış olan clang'ı düşünebilirsiniz.


2

(Linux veya MacOSX gibi bazı POSIX sistemlerinde olduğunuzu tahmin ediyorum)

Açıkçası Ciro Santilli tarafından belirtildiği gibi GCCJIT'e bakmalısınız . Ardından , oluşturulan kodun AST benzeri bir temsilini oluşturacaksınız. Tabii ki düşünebilirsiniz LLVM yerine, hatta bazı basit JIT gibi kütüphane libjit veya GNU yıldırım (ancak ve hızlı kod yayan, ama yayılan kod yavaş ve optimize edilmemiş olan).libjitlightning

Bununla birlikte, geçici bir dosyada bazı C kodları yayınlamayı ve bir derlemeyi istemeyi düşünebilirsiniz (örneğin, daha sonra dlopen (3) ve dlsym (3) kullanarak dinamik olarak eklenti olarak yükleyeceğiniz paylaşılan kitaplık olarak ), buraya & buraya bakın detaylar için.

Önemli bir gerçeğe dikkat edin: optimize edilmiş kod oluşturmak CPU zamanını alır (GCCJIT veya LLVM ile veya çalışarak gcc -O2) çünkü zor bir görevdir. Bu nedenle, bir gccsüreci çatallamanın yükü (veya başka bir derleyici kullanmak gibi clang) önemsizdir (GCCJIT veya LLVM gibi bir kütüphane kullanarak wrt).

Aslında, deneyimim ( GCC MELT'te ), mevcut masaüstü ve dizüstü bilgisayarlarda, birkaç yüz satır C kodu yayan ve bunların derlenmesini sağlayan, kullanıcı etkileşimi ile uyumlu olacak kadar hızlı (bir veya iki saniye) olmasıdır. Bugün, bunu yapacak bir REPL almayı düşünebilirsiniz . Bu ilgili cevaba da bakınız .

Ayrıca , her REPL etkileşiminde makine kodunu derleyen bir uygulama olan Common Lisp ve SBCL'yi de inceleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.