This is a home for Compiler project, a free for use, open source, written from scratch compiler with additional support of LLVM IR code generation and binary executable production.
A compiler supports an imperative Python-flavoured language with static typing and a main entry function. For example, a program that calculates the factorial of an integer may be written this way:
# Factorial
def fact(n: int) -> int:
if n <= 1:
return 1
return n * fact(n - 1)
# Main function
def main() -> None:
x: int = input()
x = fact(x)
print(x) # outputTo learn more about the language, supported types, and constructs, visit the docs.
The code above can be compiled to LLVM IR or even an executable file by simply running a compiler application:
compiler factorial.py --output factorial.llUnder the hood, the code from a given input file will be processed in multiple stages using different internal representations:
- preprocessing,
- lexical and syntactic analysis (parsing),
- semantic analysis (verification),
- optimizing transformations (dead code elimination, constants propagation, etc),
and more. To learn about the overall process, frontend, and backend, visit the docs.
A compiler can be built from source code using CMake, as well as with the following prerequisites:
- Ninja (this is a preferred generatior, but Unix Makefiles or MSVC++ are also supported)
- LLVM 17.0.6 or newer (to enable LLVM IR code generation and binary compilation via clang)
Another way to obtain ready-to-go environment is pull a Docker image, then open repository in Dev Container:
docker pull ghcr.io/vla5924-practice/compiler-project/devcontainer:latest
git clone https://github.com/vla5924-practice/compiler-project.git
devcontainer up --workspace-folder compiler-projectThe following commands can be used to build an application and run the unit testing:
cmake -S compiler -B build -G Ninja
cmake --build build --target cli --parallel
cmake --build build --target run_testsTo learn more about the installation process, build options, and other features, visit the docs.