Это порт сценария VIM 8CC, построенный на ELVM. Другими словами, это полный компилятор C, написанный в сценарии VIM.
8CC-это хорошо написанный компилятор C для x86_64 Linux. Это C11-Aware и самостоятельно.
ELVM - это e so l ang v irtual m achine. ELVM Retargets 8CC для излучения собственного промежуточного представления, EIR. ELVM компилирует C код в EIR с ретаргетированным 8CC в качестве фронта. А затем переводит EIR в различные цели (Python, Ruby, C, Brainfxxk, Piet, Befunge, Emacs Lisp, ...) в бэкэнд. Архитектура напоминает LLVM. Эта презентация - хорошая вещь, чтобы узнать архитектуру ELVM (хотя на японском языке).
ELVM может собирать себя в различные цели. Поэтому я добавил новый бэкэнд «Vim Script» и использую его для перевода C -кода 8CC в скрипт VIM.
Теперь 8CC.VIM написан в сценарии Pure VIM. 8cc.VIM состоит из Frontend (индивидуально 8CC) и бэкэнд (ELC). Он может составить C -код в сценарий VIM. И, конечно, Vim может оценить сгенерированный код сценария VIM.
Обратите внимание, что это игрушечный проект. 8CC.VIM намного медленнее. Требуется 824 (Frontend: 430 + Backend: 396) секунды, чтобы собрать простейшую программу putchar() на MacBook Pro в начале 2015 года (2,7 ГГц Intel Core I5). Но на самом деле это работает!
Когда виртуальная машина работает на сценарии VIM, 8CC.VIM работает на Linux, OS X и (надеюсь) Windows.
Пожалуйста, клонируйте этот репозиторий и :packadd (см :help pack-add ).
Или, пожалуйста, используйте свой любимый менеджер плагинов (Vim-Plug, Dein.vim и так далее).
:EccCompile:EccRuneightcc#compile()eightcc#run()Подготовьте свой код C в текущем буфере. Ниже приведен пример «привет мира».
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} Затем выполнить :EccCompile . Обратите внимание, что вы можете использовать несколько вариантов, таких как --verbose для этого. Пожалуйста, смотрите :EccCompile --help для более подробной информации.
Это занимает много времени 20 минут или более. Давайте отдохнем и получим ☕.
В результате, новый буфер открывается с помощью кода сценария VIM, который был составлен из C -кода. Загрузите его :w putchar.vim и :source putchar.vim .
Наконец, выполните ниже код сценария VIM рукой. Скомпилированный код запускается на виртуальной машине в сценарии VIM. Функция SetupVM() создает экземпляр VM.
:let vm = SetupVM()
:call vm.run()
Если вы хотите увидеть только результат запуска сценария VIM, вы можете использовать :EccRun , чтобы пропустить процесс выше.
В соответствии с :EccCompile и :EccRun , вы можете использовать функции eightcc#compile() и eightcc#run() . Они могут взять один словарь для вариантов исполнения.
MIT Лицензия
Copyright (c) 2016 Rhysd
Настоящим дается разрешение, бесплатно, любому лицу, получающему копию этого программного обеспечения и связанные с ними файлы документации («Программное обеспечение»), чтобы иметь дело в программном обеспечении без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распределение, сублиценность и/или продавать копии программного обеспечения и разрешения лиц, на которые программное обеспечение подходит для того, чтобы поступить так, чтобы поступить на следующие условия: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: на следующие условия: к следующим условиям: на следующие условия: на следующие условия.
Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части программного обеспечения.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной пригодности, пригодности для определенной цели и несоответствия. Ни в коем случае авторы или владельцы авторских прав не будут нести ответственность за любые претензии, убытки или другую ответственность, будь то в действии контракта, деликт или иным образом, возникающие из или в связи с программным обеспечением или использованием или другими сделками в программном обеспечении.