Constexpr-8CCは、C ++ 14定数式として実装されたコンパイル時間Cコンパイラです。これにより、コンパイル中にコンパイルできます!このプロジェクトは、ELVMインフラストラクチャ上に建設された8ccのポートです。
C ++の定数式は、コンパイル時に評価できる式です。 C ++ 14では、制約をリラックスさせることにより、一定の表現が非常に強力になり、 Cコンパイラを実装できます!
Constexpr-8CCでは、Cプログラムのコンピレーションの主なルーチンがC ++ 14 constexpr関数に実装されています。したがって、 8cc.cpp G ++によってバイナリファイルにコンパイルすると、Cプログラムのコンパイルがコンパイル時間計算として実行され、このCコンパイルの結果は生成されたバイナリに埋め込まれます。この意味で、constexpr-8ccはコンパイル時間Cコンパイラです。
以下は、8cc.cppのmain機能です。
int main () {
// Compile-time
constexpr buffer buf = eight_cc (); // Compile C code into ELVM IR
constexpr unsigned int output_size = buf. size ;
static_assert ( 0 <= output_size && output_size < EIGHT_CC_OUTPUT_LIMIT, " 8cc: Error " );
// Run-time
for ( int i = 0 ; i < output_size; ++i) {
putchar (buf. b [i]);
}
}このプログラムでは、 eight_ccの返品値は、 constexpr仕様を使用して可変bufに保存されます。したがって、Cプログラムの編集はコンパイル時に行われることがわかります。
constexpr-8ccには、> g ++ -6.2のLinuxが必要です。 ./test/hello.cは、少なくともg++-6.2 、 g++-8.3 、およびg++-9.3でコンパイルできます。
-fconstexpr-loop-limitでConstexprのループカウントを拡大する必要がありました。指定できる最大数は2**31 - 1です。-fconstexpr-loop-limitに加えて、拡大-fconstexpr-ops-limit必要でした。run_8cc.pyによる編集constexpr-8ccを簡単に試すには、 run_8cc.py使用してください。
$ ./run_8cc.py x86 ./test/hello.c -o ./hello.exe # It takes about 3 minutes on my laptop
$ chmod +x ./hello.exe # 'hello.exe' is i386-linux binary
$ ./hello.exe
Hello, world !次のようなコンピレーションのターゲット言語を変更できます。
$ ./run_8cc.py py ./test/hello.c -o ./hello.py # target language is Python
$ python ./hello.py
Hello, world !このスクリプトの詳細については、 $ ./run_8cc.py -hと入力してください。
8cc.cpp手動でコンパイルする場合は、 config.hppをご覧ください。このファイルでは、変数EIGHT_CC_INPUT_FILEが定義されています。 EIGHT_CC_INPUT_FILE 、ソースCプログラムをC ++文字列リテラルとして含むファイルの名前である必要があります。この文字列は、前処理時に8cc.cppに埋め込まれ、コンパイル時間計算の入力として使用されます。
したがって、 8cc.cpp手動でコンパイルする前に、生プログラムを次のように文字通りの文字列に変換する必要があります。
$ sed ' 1s/^/R"(/ ' ./test/hello.c | sed ' $s/$/n)"/ ' > ./test/hello.c.txt # Convert C to string literal
$ g++-6 ./8cc.cpp -o eir_gen.out
$ ./eir_gen.out > ./test/hello.eir # eir_gen.out outputs ELVM IR
$ sed -i ' 1s/^/R"(x86/ ' ./test/hello.eir # Convert IR to string literal
$ sed -i ' $s/$/n)"/ ' ./test/hello.eir
$ g++-6 ./elc.cpp -o exe_gen.out
$ ./exe_gen.out > ./hello.exe # exe_gen.out outputs i386-linux binary
$ chmod +x ./hello.exe
$ ./hello.exe
Hello, world ! 8cc.hppが表示されると、このプログラムが手で書かれていないことがわかります。実際、ELVMコンパイラインフラストラクチャを使用して生成しました。 ELVM IRからC ++ 14 Constexprへの翻訳者をここで実装しました。
渡辺keiich (udon.watanabe [at] gmail.com)
8cc(@rui314)
elvm(@shinh)
8cc.vim(@rhysd)、8cc.tex(@hak7a3)
Compile-TimeBrainf*CKコンパイラ(@Bolero-Murakami)
TMP-8CC:別のコンパイル時間Cコンパイラ
TMP膨大な量の思い出をニードしているため、 TMP-8cc残念ながら実際のマシンでは機能しません。私のブログ投稿(日本語)