Il s'agit d'un port de script VIM de 8cc construit sur ELVM. En d'autres termes, il s'agit d'un compilateur C complet écrit dans le script VIM.
8cc est un petit compilateur C bien écrit pour x86_64 Linux. C'est C11-Aware and Hostald.
Elvm est un e so l ang v irtual m achine. ELVM Retargets 8cc pour émettre sa propre représentation intermédiaire, Eir. ELVM compile le code C dans EIR avec le 8cc reciblé comme frontend. Puis traduit EIR dans diverses cibles (Python, Ruby, C, BrainFxxk, Piet, Befunge, Emacs Lisp, ...) dans Backend. L'architecture ressemble à LLVM. Cette présentation est une bonne chose pour connaître l'architecture ELVM davantage (bien qu'en japonais).
ELVM peut se compiler dans diverses cibles. J'ai donc ajouté un nouveau backend «vim» et l'utiliser pour traduire le code C de 8cc en script VIM.
Maintenant, 8cc.vim est écrit dans un script Pure VIM. 8cc.vim se compose de frontend (8cc personnalisé) et de backend (ELC). Il peut compiler le code C dans le script VIM. Et bien sûr, VIM peut évaluer le code de script VIM généré.
Notez qu'il s'agit d'un projet de jouets. 8cc.vim est beaucoup plus lent. Il faut 824 (frontend: 430 + backend: 396) secondes pour compiler le programme putchar() le plus simple sur MacBook Pro début 2015 (2,7 GHz Intel Core i5). Mais en fait cela fonctionne!
Au fur et à mesure que VM s'exécute sur le script VIM, 8CC.VIM fonctionne sur Linux, OS X et (espérons-le) Windows.
Veuillez cloner ce référentiel et :packadd (veuillez consulter :help pack-add ).
Ou veuillez utiliser votre gestionnaire de plugin préféré (VIM-Plug, Dein.vim et ainsi de suite).
:EccCompile:EccRuneightcc#compile()eightcc#run()Préparez votre code C dans le tampon actuel. Voici un exemple de «Hello World».
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} Puis exécutez :EccCompile . Notez que vous pouvez utiliser plusieurs options telles que --verbose pour cela. Veuillez consulter :EccCompile --help pour plus de détails.
Cela prend beaucoup de temps 20 minutes ou plus. Reposons et obtenons un peu ☕.
En conséquence, un nouveau tampon est ouvert avec le code de script VIM qui a été compilé à partir du code C. Chargez-le par :w putchar.vim et :source putchar.vim .
Enfin, exécutez ci-dessous le code de script vim par votre main. Le code compilé est exécuté sur VM sur le script VIM. La fonction SetupVM() crée une instance VM.
:let vm = SetupVM()
:call vm.run()
Si vous voulez voir uniquement le résultat de l'exécution du script VIM, vous pouvez utiliser :EccRun pour sauter au-dessus du processus.
Correspondant à :EccCompile et :EccRun , vous pouvez utiliser les fonctions eightcc#compile() et eightcc#run() . Ils peuvent prendre un dictionnaire pour les options d'exécution.
Licence MIT
Copyright (C) 2016 Rhysd
L'autorisation est accordée gratuitement à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copie, de modification, de fusion, de publication, de distribution, de sublince et / ou de vendre des copies des conditions suivantes.
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les détenteurs de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres relations dans le logiciel.