Skip to main content

A C compiler written in Python

Project description

Build Status Code Coverage

ShivyC is a dependency-free C compiler written in Python 3, targeting Linux x86-64 machines. ShivyC seeks to eventually support the entire C11 standard and produce reasonably efficient code. For ShivyC’s current feature set, see the test files in the tests/general_tests and tests/feature_tests directories.

ShivyC is a rewrite from scratch of my older attempt at a C compiler, ShivC, with much more emphasis on feature completeness and code quality. See the ShivC README for more details on the target improvements.

Quickstart

For compilation of C code, ShivyC only requires Python 3. Assembling and linking are done using the GNU binutils and glibc, which you almost certainly already have installed.

To install ShivyC:

pip3 install shivyc

For command line usage info:

shivyc

To create, compile, and run an example program:

printf "%s\n" '#include <stdio.h>' > test.c
printf "%s\n" 'int main() { printf("hello, world!\n"); }' >> test.c
shivyc test.c
./out

To run the tests:

git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover

Implementation Overview

Preprocessor

ShivyC currently has a very limited preprocessor that parses out comments and expands #include directives. These features are implemented between lexer.py and preproc.py. A more complete preprocessor will be implemented.

Lexer

The ShivyC lexer is implemented primarily in lexer.py. Additionally, tokens.py contains definitions of the token classes used in the lexer and token_kinds.py contains instances of recognized keyword and symbol tokens.

Parser

The ShivyC parser uses recursive descent techniques for all parsing. It is implented in parser/*.py and creates a parse tree of nodes defined in tree/nodes.py and tree/expr_nodes.py.

IL generation

ShivyC traverses the parse tree to generate a flat custom IL (intermediate language). The commands for this IL are in il_cmds/*.py. Objects used for IL generation are in il_gen.py, but most of the IL generating code is in the make_code function of each tree node in tree/*.py.

ASM generation

ShivyC sequentially reads the IL commands, converting each into x86-64 assembly code. ShivyC performs register allocation using George and Appel’s iterated register coalescing algorithm; see References below. The general ASM generation functionality is in asm_gen.py, but much of the ASM generating code is in the make_asm function of each IL command in il_cmds/*.py.

Contributing

ShivyC has so far been an entirely individual project. That said, pull requests are welcome if they pass flake8 and are well-tested.

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

shivyc-0.3.2.tar.gz (50.7 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page