Shivyc es un compilador Hobby C escrito en Python 3 que admite un subconjunto del estándar C11 y genera binarios razonablemente eficientes, incluidas algunas optimizaciones. Shivyc también genera útiles mensajes de error de tiempo de compilación.
Esta implementación de un trie es un ejemplo de lo que Shivyc puede compilar hoy. Para obtener una lista más completa de características, consulte el directorio de prueba de funciones.
Shivyc requiere solo Python 3.6 o posterior para compilar el código C. El ensamblaje y el enlace se realizan utilizando los binutilos GNU y GLIBC, que seguramente ya ha instalado.
Para instalar shivyc:
pip3 install shivyc
Para crear, compilar y ejecutar un programa de ejemplo:
$ vim hello . c
$ cat hello . c
#include <stdio.h>
int main () {
printf ( "hello, world!n" );
}
$ shivyc hello . c
$ ./ out
hello , world !Para ejecutar las pruebas:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
python3 -m unittest discover
Para la comodidad de aquellos que no ejecutan Linux, el docker/ Directorio proporciona un DockerFile que establece un entorno X86-64 Linux Ubuntu con todo lo necesario para Shivyc. Para usar esto, ejecute:
git clone https://github.com/ShivamSarodia/ShivyC.git
cd ShivyC
docker build -t shivyc docker/
docker/shell
Esto abrirá una carcasa en un entorno con Shivyc instalado y listo para usar con
shivyc any_c_file.c # to compile a file
python3 -m unittest discover # to run tests
El ejecutable de Docker Shivyc actualizará en vivo con cualquier cambio realizado en su directorio SHIVYC local.
Shivyc Today tiene un preprocesador muy limitado que analiza los comentarios y expande las #include #Clude. Estas características se implementan entre lexer.py y preproc.py .
El Shivyc Lexer se implementa principalmente en lexer.py . Además, tokens.py contiene definiciones de las clases de token utilizadas en Lexer y token_kinds.py contiene instancias de palabras clave y tokens de símbolos reconocidos.
El analizador Shivyc utiliza técnicas de descenso recursivas para todo el análisis. Se implementa en parser/*.py y crea un árbol de análisis de nodos definidos en tree/nodes.py y tree/expr_nodes.py .
Shivyc atraviesa el árbol de análisis para generar una IL personalizada plana (lenguaje intermedio). Los comandos para este IL están en il_cmds/*.py . Los objetos utilizados para la generación de IL están en il_gen.py , pero la mayor parte del código de generación de IL está en la función make_code de cada nodo de árbol en tree/*.py .
Shivyc lee secuencialmente los comandos IL, convirtiendo cada uno en el código de ensamblaje Intel-format x86-64. SHIVYC realiza la asignación de registros utilizando el algoritmo de Coalescing Register de George y Appel (ver las referencias a continuación). La funcionalidad de generación ASM general está en asm_gen.py , pero gran parte del código de generación de ASM está en la función make_asm de cada comando IL en il_cmds/*.py .
Las solicitudes de extracción a Shivyc son muy bienvenidas. Un buen lugar para comenzar es la página de problemas. Todos los problemas etiquetados como "característica" son tareas TODO. Los problemas etiquetados como "error" son mal compilaciones en shivyc. Si tiene alguna pregunta, no dude en hacer los comentarios del tema relevante o crear un nuevo problema etiquetado como "pregunta". Por supuesto, agregue pruebas para todas las nuevas funcionalidades.
Muchas gracias a nuestros contribuyentes actuales y pasados: