O Constexpr-8CC é um compilador C de tempo de compilação implementado como C ++ 14 expressões constantes. Isso permite que você compile enquanto compilar! Este projeto é uma porta de 8cc construída na infraestrutura ELVM.
Expressões constantes em C ++ são expressões que podem ser avaliadas em tempo de compilação. Em C ++ 14, por restrições relaxantes, expressões constantes se tornaram tão poderosas que um compilador C pode ser implementado !
No ConstexPR-8CC, a principal rotina para compilações dos programas C é implementada em uma função C ++ 14 constexpr . Portanto, se você compilar 8cc.cpp em um arquivo binário por g ++, a compilação de um programa C será executada como uma computação de tempo de compilação e o resultado dessa compilação C será incorporado ao binário gerado. Nesse sentido, o Constexpr-8CC é um compilador C de tempo de compilação .
A seguir, é apresentada a main função em 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]);
}
} Neste programa, o valor de retorno de eight_cc é armazenado no buf variável com um especificador constexpr . Assim, você descobrirá que a compilação de um programa C é feita no tempo de compilação.
constexpr-8cc requer Linux com> G ++-6.2. Confirmei ./test/hello.c pode ser compilado com g++-6.2 , g++-8.3 e g++-9.3 pelo menos.
-fconstexpr-loop-limit . O número máximo que podemos especificar é 2**31 - 1 .-fconstexpr-loop-limit , aumentando -fconstexpr-ops-limit .run_8cc.py Para tentar o constexpr-8cc facilmente, use 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 !Você pode alterar a linguagem de destino das compilações como as seguintes:
$ ./run_8cc.py py ./test/hello.c -o ./hello.py # target language is Python
$ python ./hello.py
Hello, world ! Para obter mais informações sobre este script, digite $ ./run_8cc.py -h .
Se você deseja compilar 8cc.cpp manualmente, consulte config.hpp . Neste arquivo, a variável EIGHT_CC_INPUT_FILE é definida. EIGHT_CC_INPUT_FILE deve ser o nome de um arquivo que contém um programa de origem C como uma string c ++ literal. Esta string será incorporada em 8cc.cpp no tempo de pré-processamento e usada como entrada da computação em tempo de compilação.
Portanto, antes de compilar 8cc.cpp manualmente, você deve converter um programa bruto em uma string literal como o seguinte:
$ 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 ! Quando você vir 8cc.hpp , você saberá que este programa não foi escrito à mão. Na verdade, usei a infraestrutura do compilador ELVM para gerá -la. Acabei de implementar um tradutor do ELVM IR para C ++ 14 Constexpr aqui.
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: Outro compilador C em tempo de compilação
TMP Neads enorme quantidade de memórias, TMP-8cc infelizmente não funciona em máquinas reais.Meu blog post (japonês)