This is an experimental project of a C compiler written in C++20. The implementation follows the ISO/IEC 9899:2011 standard (i.e., C11). The main purpose of this project is to teach me compiler data structures, language design and optimization techniques.
Use cmake
to build the project:
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --target cci
Both Clang and GCC are able to compile this project.
This is still a work in progress project. Usage is to be done.
You'll need to install GoogleTest, as CCI uses it for the unit tests.
After installing GoogleTest, run unit tests with the following command:
ctest --output-on-failure
If you don't want to run unit tests, you may disable them by specifying BUILD_TESTING=NO
when generating the build files with CMake:
cmake -DBUILD_TESTING=NO -DCMAKE_BUILD_TYPE=Release ..
This document is an attempt to describe the API and project design.
Summary:
- General
- What does it mean by infrastructure?
- The project's directory skeleton
There are a few non-obvious choices and terminologies used in this project, so this section is intended to explain them.
CCI stands for C11 Compiler Infrastructure. That means this is not just a tool you can use to compile C code. CCI has an API, which you can use to manipulate C code. It allows you to scan it, generate and traverse a parse tree, generate an IR, produce an executable, write a back-end for, and so on.
include/
: Exposes the CCI's API you can use to write your own applications. There are functions for scanning, parsing, diagnosing, analysing, IRs etc.lib/
: This is where most of CCI's code base lives. APIs are implemented here.src/
: This is where some CCI tools live, where each directory is a separate project.- For example, the CCI compiler tool lives under
src/cci/
.
- For example, the CCI compiler tool lives under
unittest/
: Contains unit tests for the API.doc/
: Documentation or manuals go here.cmake/
: Contains some modules used across the build system.
Almost all directories have a README.md file explaining their structure and purpose, what they do and solve etc.
C11 is a great, challenging language to make a compiler for. It's also true that one can learn a lot by writing a compiler. That being so, C11 seems to be an option that gets the most out of the experience.
This project is licensed under the MIT license. See LICENSE.