Разработка языка виртуальной машины

Это мой первый пост, и я пишу с телефона, поэтому, пожалуйста, извините за проблемы с форматированием, которые, я уверен, у меня будут.

Как следует из названия, я хочу создать язык для небольшой виртуальной машины, которую я написал. В настоящее время моя виртуальная машина очень проста и поддерживает около 16 различных кодов операций. Я медленно учился оптимизировать виртуальную машину и добавлять к ней дополнительные функции. Самая большая функция, которую я хотел бы добавить, — это возможность писать программы на простом языке, производном от C.

Я застрял в том, как я мог бы даже начать писать такой "язык". Буду ли я писать его как интерпретатор, который транслирует ассемблерный код моей виртуальной машины?

Любая помощь была бы потрясающей. Статьи, книги, лекции, я готов на все. Я просто люблю учиться, и до сих пор это был мой самый большой и, безусловно, любимый проект, над которым я работал.

Редактировать

Я надеюсь, что я спросил в правильном месте и был бы более чем готов предоставить дополнительную информацию утром, если это необходимо.


person NotAPro    schedule 29.05.2014    source источник
comment
Вы в основном смотрите на портирование некоторого набора инструментов для создания двоичных файлов для вашей машины. Для части компилятора вам просто нужно создать собственный бэкэнд. Поскольку GCC и LLVM являются двумя популярными вариантами, вам следует посмотреть на них.   -  person dbrank0    schedule 29.05.2014
comment
Я полагаю, что это правильное слово, набор инструментов. Однако я никогда не планировал компилировать его в собственный код. Больше написать небольшой язык на основе C, который компилируется в исполняемый формат моих виртуальных машин.   -  person NotAPro    schedule 29.05.2014
comment
Начните с чтения книги о компиляторах.   -  person Marco van de Voort    schedule 29.05.2014
comment
Есть предложения? Я заказал копию Книги Дракона, но не решался покупать... более современные... книги.   -  person NotAPro    schedule 29.05.2014
comment
Вы составляете компилятор. Целевой собственный код оказывается вашим искусственным набором инструкций.   -  person Seva Alekseyev    schedule 30.05.2014
comment
небольшой компилятор языка на основе C является довольно большим проектом, даже если вы просто добавляете серверную часть к gcc или llvm или к какому-то другому, не имеет значения, какой набор инструкций. (более крупный проект, чем сама виртуальная машина).   -  person old_timer    schedule 14.07.2017


Ответы (3)


Предполагая, что ваш набор инструкций достаточно мощный, вы сможете создать для него компилятор (транслятор кода). Интерпретатор также возможен, но если вы можете скомпилировать из C, вы открываете вселенную кода сообщества.

По вашему комментарию вы правы, чтобы заказать библию написания компиляторов: Компиляторы : Принципы, методы и инструменты Я бы воздержался от других книг, пока вы не освоите эту; тогда вы будете знать, куда вы хотите пойти.

Вы изучите грамматики, парсеры и все такое, но затем вам нужно будет принять некоторые практические решения. Одним из способов избежать большей части работы по созданию компилятора является просто создание серверной части для существующего компилятора, такого как GCC или Clang (через LLVM). Создав серверную часть, вы также потенциально можете скомпилировать интерфейсную часть на одном из нескольких языков, таких как D; так что одним усилием вы получаете компилятор для C++, D и т.д.

person N8allan    schedule 09.06.2014

После покупки/прочитания книги по компилятору и понимания того, как работает компилятор, я бы предложил использовать LLVM для вашей задачи. В частности, сосредоточьтесь на создании цели и вообще не беспокойтесь о внешнем интерфейсе (лексический анализ/генератор парсеров/AST). Таким образом, вы можете поддерживать любой язык, который генерирует LLVM IR.

Начните с просмотра платформы генератора кода LLVM, независимой от цели, именно здесь вы будете творить свое волшебство:

http://llvm.org/docs/CodeGenerator.html

Генератор кода, не зависящий от цели LLVM, представляет собой структуру, предоставляющую набор повторно используемых компонентов для преобразования внутреннего представления LLVM в машинный код для указанной цели — либо в форме сборки (подходит для статического компилятора), либо в формате двоичного машинного кода ( можно использовать для JIT-компилятора).

Кроме того, LLVM достаточно удобен для того, чтобы помочь вам в разработке бэкенда, той части, которая вам будет интересна:

http://llvm.org/docs/WritingAnLLVMBackend.html

В нем изложены предварительные условия чтения, необходимые для выполнения такой задачи. Сюда входят примеры кода, методы оптимизации, способы выбора и печати инструкций (для вашей виртуальной машины). Наконец, как поддерживать JITing, если это желательно.

Если вы загрузите исходный код, вы увидите множество полных серверных частей, которые вы можете разветвлять и изменять в соответствии с требованиями вашей виртуальной машины.

person wbennett    schedule 10.06.2014
comment
Большое спасибо за ваш вклад. Спасибо и за ссылки. У меня было не так много времени, как хотелось бы, чтобы сесть и изучить компиляторы и полностью прочитать эти статьи, но, судя по первым абзацам, они представляют собой отличные ресурсы. - person NotAPro; 11.06.2014

Я должен спросить, это виртуальная машина на основе стека или регистра?

Каждый из них имеет преимущества и недостатки. Если вы хотите, чтобы ваш язык работал как можно быстрее, я советую регистровую машину; если вы хотите, чтобы это было просто, чем стековая машина.

Как и другие, вы можете просто скомпилировать язык в LLVM, конечно, зависит от ваших потребностей.

person Nergal    schedule 13.07.2017