ライブラリとしてgccを使用する方法はありますか?


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は、ツールのベース/ライブラリとしての使用に抵抗するように明示的に設計されました。これにはClangを使用するか、コマンドラインからGCCを呼び出す必要があります。


3
その設計決定の理由を知っていますか?
マックス

libgccjit
困難


3

これはgccでは不可能ですが、tcc(組み込み可能なCコンパイラ)は、あなたが考えていることに十分に適しているかもしれません。ディストリビューションには、「オンザフライ」でCコードをコンパイル、リンク、実行できるlibtccライブラリが付属しています。

これはCの場合のみであることに注意してください。あなたの質問にもC ++のタグが付けられていますが、C ++のtccに相当するものは見たことがありません。


お知らせtccすぐにコンパイルしますが、すべてでは最適化されていません。多くの場合、生成されたコードは、生成されるコードよりも3〜10倍遅くなりますgcc -O2
Basile Starynkevitch 16


2

(私はあなたがLinuxやMacOSXのようないくつかのPOSIXシステムを使っていると思います)

あなたは明らかになっているはずですGCCJITとして、チロSantilliで述べました。次に、生成されたコードのASTのような表現を構築します。もちろん、代わりにLLVMを検討したり、libjitGNU lightningなどのより単純なJITライブラリを検討したりすることもできます(ただしlibjitlightningコードをすばやく出力しますが、出力されたコードは遅く、最適化されていません)。

ただし、一時ファイルでCコードを発行し、そのコンパイルをフォークすることを検討することもできます(たとえば、後でdlopen(3)dlsym(3)を使用してプラグインとして動的にロードする共有ライブラリとして)。ここここを参照しください詳細については。

重要な事実に注意してください:最適化されたコードの生成には(GCCJIT、LLVM、またはを実行してgcc -O2)CPU時間を要します。これは難しいタスクだからです。したがって、gccプロセスをフォークする(またはのような他のコンパイラを使用する)オーバーヘッドclangはごくわずかです(GCCJITやLLVMなどのライブラリを使用して書き込まれます)。

実際、私の経験(GCC MELTでの)は、現在のデスクトップとラップトップでは、数百行のCコードを発行し、それらのコンパイルをフォークすることで、ユーザーの操作と互換性を持つのに十分な速さ(1/10秒)です。そのため、今日、それを行うREPLを検討することができます。この関連する回答も参照してください。

Common LispおよびSBCL調べてください。これは、REPLのすべての対話でマシンコードにコンパイルされる実装です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.