Description
In constexpr-8cc, the main routine for compilations of C programs is implemented in a C++14 constexpr function.
Therefore, if you compile 8cc.cpp to a binary file by g++, compilation of a C program will be performed as a compile-time computation and the result of this C compilation will be embedded into the generated binary.
In this sense, constexpr-8cc is a compile-time C compiler.
The following is the main function in 8cc.cpp.
constexpr-8cc alternatives and similar libraries
Based on the "Miscellaneous" category.
Alternatively, view constexpr-8cc alternatives based on common mentions on social networks and blogs.
-
ZXing
ZXing ("Zebra Crossing") barcode scanning library for Java, Android -
RE2
RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library. -
ZBar
Clone of the mercurial repository http://zbar.hg.sourceforge.net:8000/hgroot/zbar/zbar -
American fuzzy lop
american fuzzy lop - a security-oriented fuzzer -
Serial Communication Library
Cross-platform, Serial Port library written in C++ -
Better Enums
C++ compile-time enum to string, iteration, in a single header file -
c-smart-pointers
Smart pointers for the (GNU) C programming language -
Mach7
Functional programming style pattern-matching library for C++ -
Experimental Boost.DI
DI: C++14 Dependency Injection Library -
UNITS
a compile-time, header-only, dimensional analysis and unit conversion library built on c++14 with no dependencies. -
outcome
Provides very lightweight outcome<T> and result<T> (non-Boost edition) -
cxx-prettyprint
A header-only library for C++(0x) that allows automagic pretty-printing of any container. -
libcpuid
a small C library for x86 CPU detection and feature extraction -
kangaru
🦘 A dependency injection container for C++11, C++14 and later -
CppVerbalExpressions
C++ regular expressions made easy -
value-category-cheatsheet
A C++14 cheat-sheet on lvalues, rvalues, xvalues, and more -
casacore
Suite of C++ libraries for radio astronomy data processing -
neither
Either and Maybe monads for better error-handling in C++ ↔️ -
StrTk
C++ String Toolkit Library https://www.partow.net/programming/strtk/index.html -
ub-canaries
collection of C/C++ programs that try to get compilers to exploit undefined behavior -
QtVerbalExpressions
This Qt lib is based off of the C++ VerbalExpressions library. [MIT] -
access_profiler
a tool to count accesses to member variables in c++ programs
Analyze your C and C++ projects with just one click.
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of constexpr-8cc or a related project?
README
constexpr-8cc: Compile-time C Compiler 
constexpr-8cc is a compile-time C compiler implemented as C++14 constant expressions. This enables you to compile while you compile! This project is a port of 8cc built on ELVM Infrastructure.
Constant expressions in C++ are expressions that can be evaluated at compile-time. In C++14, by relaxing constrains, constant expressions became so powerful that a C compiler can be implemented in!
In constexpr-8cc, the main routine for compilations of C programs is implemented in a C++14 constexpr
function.
Therefore, if you compile 8cc.cpp
to a binary file by g++, compilation of a C program will be performed as a compile-time computation and the result of this C compilation will be embedded into the generated binary.
In this sense, constexpr-8cc is a compile-time C compiler.
The following is the main
function in 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]);
}
}
In this program, the return value of eight_cc
is stored into the variable buf
with a constexpr
specifier.
Thus, you will find that the compilation of a C program is done in compile-time.
Usage
constexpr-8cc
works on Linux and OS X and requires g++ 6.2.
(The version of g++ is important!)
Compilation by run_8cc.py
In order to try constexpr-8cc easily, 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!
You can change the target language of compilations like the following:
$ ./run_8cc.py py ./test/hello.c -o ./hello.py # target language is Python
$ python ./hello.py
Hello, world!
For more information about this script, type $ ./run_8cc.py -h
.
Compilation by hand
If you want to compile 8cc.cpp
manually, please look at config.hpp
.
In this file, the variable EIGHT_CC_INPUT_FILE
is defined.
EIGHT_CC_INPUT_FILE
should be a name of a file that contains a source C program as a C++ string literal.
This string will be embedded in 8cc.cpp at pre-processing-time and used as an input of the compile-time computation.
So, before compiling 8cc.cpp
manually, you have to convert a raw program to a string literal like the following:
$ 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!
How was constexpr-8cc generated?
When you see 8cc.hpp
, you will know this program was not written by hand.
Actually, I used ELVM Compiler Infrastructure to generate it.
I just implemented a translator from ELVM IR to C++14 constexpr here.
Author
Keiichi Watanabe (udon.watanabe [at] gmail.com)
Links
- 8cc (@rui314)
- A very cool C compiler. constexpr-8cc is a C++14's constexpr port of 8cc.
- ELVM (@shinh)
- ELVM(EsoLang Virtual Machine) is a parody project of LLVM, but dedicated to Esoteric Languages. constexpr-8cc is built on ELVM infrastructure.
- 8cc.vim (@rhysd), 8cc.tex (@hak7a3)
- constexpr-8cc is influenced by these projects.
Compile-time Brainf*ck compiler (@bolero-MURAKAMI)
- I got several ideas from this program.
TMP-8cc: Another Compile-time C Compiler
- Another compile-time C compiler I created, which is implemented in C++ Template Metaprogramming
- This is generated by ELVM's C++ Template Metaprogramming backend.
- Since
TMP
neads huge amount of memories,TMP-8cc
unfortunately does not work on real machines.