Este es un puerto de script VIM de 8cc construido en ELVM. En otras palabras, este es un compilador C completo escrito en el script VIM.
8cc es un compilador C pequeño bien escrito para X86_64 Linux. Es c11-consecuente y autohospedado.
Elvm es un eh v irtual mcine . ELVM Redargets 8CC para emitir su propia representación intermedia, EIR. ELVM compila el código C en EIR con los 8cc retargetados como frontend. Y luego se traduce en varios objetivos (Python, Ruby, C, Brainfxxk, Piet, Befunge, Emacs Lisp, ...) en Backend. La arquitectura se asemeja a LLVM. Esta presentación es una buena cosa para conocer aún más la arquitectura ELVM (aunque en japonés).
Elvm puede compilarse en varios objetivos. Así que agregué un nuevo backend de 'VIM Script' y lo uso para traducir el código C de 8cc en el script VIM.
Ahora 8cc.vim está escrito en el script Vim puro. 8CC.VIM consiste en frontend (8cc personalizado) y backend (ELC). Puede compilar el código C en el script VIM. Y, por supuesto, VIM puede evaluar el código de script VIM generado.
Tenga en cuenta que este es un proyecto de juguete. 8cc.vim es mucho más lento. Se necesitan 824 (frontend: 430 + backend: 396) segundos para compilar el programa putchar() más simple en MacBook Pro a principios de 2015 (Intel Core i5 de 2.7 GHz). ¡Pero en realidad funciona!
A medida que VM se ejecuta en el script VIM, 8cc.vim funciona en Linux, OS X y (con suerte) Windows.
Clone este repositorio y :packadd (consulte :help pack-add ).
O use su administrador de complementos favorito (vim-plug, dein.vim, etc.).
:EccCompile:EccRuneightcc#compile()eightcc#run()Prepare su código C en el búfer actual. El siguiente es un ejemplo de 'hola mundo'.
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} Luego ejecute :EccCompile . Tenga en cuenta que puede usar varias opciones como --verbose para esto. Consulte :EccCompile --help para obtener más detalles.
Lleva mucho tiempo 20 minutos o más. Tomemos un descanso y obtengamos un poco de ☕.
Como resultado, se abre un nuevo búfer con el código de script VIM que se compiló del código C. Cárguelo por :w putchar.vim y :source putchar.vim .
Finalmente, ejecute debajo del código de script VIM por su mano. El código compilado se ejecuta en VM en el script VIM. La función SetupVM() crea una instancia de VM.
:let vm = SetupVM()
:call vm.run()
Si desea ver solo el resultado de ejecutar el script VIM, puede usar :EccRun para omitir el proceso anterior.
Correspondiente a :EccCompile y :EccRun , puede usar las funciones eightcc#compile() y eightcc#run() . Pueden tomar un diccionario para las opciones de ejecución.
Licencia de MIT
Copyright (c) 2016 Rhysd
El permiso se otorga, de forma gratuita, a cualquier persona que obtenga una copia de este software y archivos de documentación asociados (el "software"), para tratar en el software sin restricción, incluidos los derechos de los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicense y/o vender copias del software, y para permitir que las personas a quienes se les proporciona el software para hacer, sujeto a las siguientes condiciones: las siguientes condiciones: las siguientes condiciones: las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o porciones sustanciales del software.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluidas, entre otros, las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otra manera, que surge, de o en relación con el software o el uso u otros tratos en el software.