Язык/формат вывода для игрушечного компилятора

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

Пока я еще не решил, какой язык или формат должен выводить мой компилятор. В идеале я хотел бы выводить байт-код для виртуальной машины, которая проста в использовании, а также имеет некоторые средства для отладки (, например. возможность приостановить выполнение и просмотреть стек в любой момент. )Однако я еще не нашел ни одного, который поразил бы мое воображение. Чтобы дать вам представление о том, что я ищу, вот некоторые из вариантов, которые я рассмотрел, а также их плюсы и минусы, как я их вижу:

  • Я мог бы вывести текстовый язык ассемблера x86, а затем вызвать ассемблер , такой как NASM или FASM. Это дало бы мне некоторый опыт компиляции для реального оборудования, поскольку моя предыдущая работа с компилятором выполнялась на виртуальной машине. Вероятно, я мог бы отлаживать сгенерированные программы с помощью gdb, хотя это может быть не так просто, как использование виртуальной машины с поддержкой отладки. Основным недостатком этого является то, что у меня ограниченный опыт сборки x86, и как набор инструкций CISC это немного устрашающе.

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

  • Я мог бы использовать ту же виртуальную машину, которая использовалась в моем курсе компиляторов, которая была разработана в моем университете специально для этой цели. Я уже знаком с его дизайном и набором инструкций, и он имеет приличные функции отладки, так что это огромный плюс. Тем не менее, его возможности чрезвычайно ограничены, и я чувствую, что быстро наткнусь на эти ограничения, если попытаюсь сделать что-то даже умеренно сложное.

  • Я мог бы использовать LLVM и вывести Промежуточное представление LLVM . LLVM IR кажется очень мощным, и знакомство с ним определенно может пригодиться мне в будущем. С другой стороны, я действительно понятия не имею, насколько легко с ним работать и отлаживать, поэтому я был бы очень признателен за совет от кого-то, кто имеет опыт в этой области.

  • Я мог бы спроектировать и реализовать собственную виртуальную машину. У этого есть огромный и очевидный недостаток. :По сути, я бы превратил свой проект в два проекта, что значительно уменьшило бы вероятность того, что я действительно что-то сделаю. Тем не менее, он по-прежнему несколько привлекателен тем, что позволил бы мне создать виртуальную машину с поддержкой «первого -класса» для необходимых мне функций языка — например, виртуальная машина Lua имеет поддержку первого класса -для таблиц, что упрощает работу с ними в байт-коде Lua.

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

9
задан Seki 11 June 2015 в 07:26
поделиться