Constexpr-8cc adalah kompiler C kompilasi yang diimplementasikan sebagai ekspresi konstan C ++ 14. Ini memungkinkan Anda untuk mengkompilasi saat Anda mengkompilasi! Proyek ini adalah pelabuhan 8cc yang dibangun di atas infrastruktur ELVM.
Ekspresi konstan dalam C ++ adalah ekspresi yang dapat dievaluasi pada waktu kompilasi. Dalam C ++ 14, dengan melonggarkan kendala, ekspresi konstan menjadi sangat kuat sehingga kompiler C dapat diimplementasikan !
Dalam Constexpr-8cc, rutin utama untuk kompilasi program C diimplementasikan dalam fungsi C ++ 14 constexpr . Oleh karena itu, jika Anda mengkompilasi 8cc.cpp ke file biner oleh G ++, kompilasi program C akan dilakukan sebagai perhitungan waktu kompilasi dan hasil kompilasi C ini akan tertanam ke dalam biner yang dihasilkan. Dalam hal ini, Constexpr-8cc adalah kompiler C kompilasi .
Berikut ini adalah fungsi main dalam 8cc.cpp.
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]);
}
} Dalam program ini, nilai pengembalian eight_cc disimpan ke dalam variabel buf dengan spesifikasi constexpr . Dengan demikian, Anda akan menemukan bahwa kompilasi program C dilakukan dalam waktu kompilasi.
constexpr-8cc membutuhkan Linux dengan> G ++-6.2. Saya mengonfirmasi ./test/hello.c dapat dikompilasi dengan g++-6.2 , g++-8.3 dan g++-9.3 setidaknya.
-fconstexpr-loop-limit . Angka maksimum yang dapat kami tentukan adalah 2**31 - 1 .-fconstexpr-loop-limit , diperlukan -fconstexpr-ops-limit diperlukan.run_8cc.py Untuk mencoba Constexpr-8cc dengan mudah, gunakan 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 !Anda dapat mengubah bahasa target kompilasi seperti yang berikut:
$ ./run_8cc.py py ./test/hello.c -o ./hello.py # target language is Python
$ python ./hello.py
Hello, world ! Untuk informasi lebih lanjut tentang skrip ini, ketik $ ./run_8cc.py -h .
Jika Anda ingin mengkompilasi 8cc.cpp secara manual, silakan lihat config.hpp . Dalam file ini, variabel EIGHT_CC_INPUT_FILE didefinisikan. EIGHT_CC_INPUT_FILE harus menjadi nama file yang berisi program Sumber C sebagai string C ++ literal. String ini akan tertanam dalam 8cc.cpp pada waktu pra-pemrosesan dan digunakan sebagai input dari perhitungan waktu kompilasi.
Jadi, sebelum menyusun 8cc.cpp secara manual, Anda harus mengonversi program mentah menjadi string literal seperti berikut:
$ 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 ! Ketika Anda melihat 8cc.hpp , Anda akan tahu program ini tidak ditulis dengan tangan. Sebenarnya, saya menggunakan infrastruktur kompiler ELVM untuk menghasilkannya. Saya baru saja mengimplementasikan penerjemah dari ELVM IR ke C ++ 14 Constexpr di sini.
Keiichi Watanabe (udon.watanabe [at] gmail.com)
8cc (@rui314)
Elvm (@shinh)
8cc.vim (@rhysd), 8cc.tex (@hak7a3)
Compile-Time Brainf*CK Compiler (@Bolero-Murakami)
TMP-8CC: Kompiler C Compile-Time Lainnya
TMP Neads dalam jumlah besar, TMP-8cc sayangnya tidak bekerja pada mesin sungguhan.Posting blog saya (Jepang)