Нужен бэкэнд компилятор - PullRequest
7 голосов
/ 21 марта 2009

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

Можно ли использовать какое-либо программное обеспечение для оценки полученного промежуточного кода? Где я могу скачать это программное обеспечение?

Вывод выглядит примерно так:

    t1 = 0.67596e-7
    sum = t1

    t1 = 2
    t2 = 3
    t3 = t2 + t1
    i = t3

L0:
    t1 = sum
    t2 = 20
t3 = compare(t1 <= t2)
    t4 = sum
    t5 = 12
t6 = compare(t4 ~= t5)
t7 = t3 | t6
    t8 = sum
    t9 = 20
t10 = compare(t8 > t9)
t11 = t7 & t10
if t11 true then goto L1 else goto L2
L1: 
    t1 = 2
    t2 = sum
    t3 = t2 + t1
    sum = t3

    t1 = 1
    t2 = i
    t3 = t2 + t1
    i = t3
    goto L0
L2:

Спасибо за чтение.

Ответы [ 10 ]

13 голосов
/ 21 марта 2009

Генерация кода - это мое дело: -)

Комментарии на несколько вариантов:

  • CLR:

    • Pro: промышленная поддержка
    • Con: вы должны купить их систему типов почти полностью; в зависимости от того, что вы хотите сделать с типами, это может не иметь значения
    • Con: Только платформа Windows действительно качественная в прайм-тайм
  • LLVM:

    • Pro: восторженное сообщество пользователей с харизматичным лидером
    • Pro: много интересных улучшений производительности
    • Con: довольно сложный интерфейс
    • Con: история дыр в технике; поскольку LLVM созревает, ожидайте, что дыры в разработке будут закрыты, добавив к сложности интерфейса
  • C -

    • Pro: цель - это настоящий письменный язык, а не API; Вы можете легко проверять, отлаживать и редактировать свой C-- код
    • Pro: дизайн достаточно зрелый и достаточно чистый
    • Pro: поддерживает точную сборку мусора
    • Pro: большинство пользователей сообщают, что им очень легко пользоваться
    • Con: очень маленькая команда разработчиков
    • Con: по состоянию на начало 2009 года поддерживается только три аппаратные платформы (x86, PPC, ARM)
    • Con: не поставляется с сборщиком мусора
    • Con: будущее проекта неопределенно
  • C в качестве целевого языка

    • Pro: выглядит просто
    • Con: почти невозможно получить достойную производительность
    • Con: сведет вас с ума в долгосрочной перспективе; Спросите длинную очередь людей, которые пытались скомпилировать Haskell, ML, Modula-3, Scheme и другие с использованием этой техники В какой-то момент каждый из этих людей сдался и создал собственный генератор собственного кода.

Резюме: все, кроме C , является разумным выбором. Для лучшего сочетания гибкости, качества и ожидаемой долговечности я бы, вероятно, рекомендовал LLVM. Но ваш пример кода очень близок к C--, так что это может быть преимуществом.

Полное раскрытие: я связан с проектом C--.

11 голосов
/ 21 марта 2009

Взгляните на проект инфраструктуры компилятора *1001* . Он используется во многих реальных проектах. LLVM - это виртуальная машина низкого уровня, которую легко создавать и легко переводить на собственный код.

6 голосов
/ 21 марта 2009

Ваш испущенный код выглядит довольно близко к C - поэтому ваш компилятор не испускает C и не использует компилятор C в качестве бэкэнда - так работал оригинальный компилятор c ++ cfront.

3 голосов
/ 21 марта 2009

Я бы рекомендовал выплевывать код Паскаля и использовать Бесплатный паскаль .

Он изначально скомпилирован, компиляция идет быстро, и вы можете использовать множество платформ.

2 голосов
/ 21 марта 2009

Возможно, вам удастся выбрать стек компилятора и использовать промежуточный код, поддерживаемый этим стеком. Например, gcc использует RTL , регистрирующий язык передачи в качестве общего знаменателя для всех языков, поддерживаемых gcc. Я подозреваю, что .net имеет нечто подобное, что используется для таких вещей, как IronPython.

Если вы хотите использовать что-то, что предоставляет виртуальную машину для оценки кода, SPIM MIPS vm поддерживает архитектуру Motorola 68000 и с ней действительно легко работать.

2 голосов
/ 21 марта 2009

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

Еще один вариант немного более низкого уровня - создание кода IL и использование среды выполнения .NET. Если компилятор написан на .NET, вы можете использовать пространство имен Reflection.Emit для генерации сборки .NET, которую затем можно запустить в любой среде .NET.

1 голос
/ 21 марта 2009

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

Если вы не можете, тогда GNU Lightning может использоваться для генерации кода на лету (меньше и проще, чем LLVM, но без оптимизации).

1 голос
/ 21 марта 2009

NekoVM предназначен для приема высокого уровня IL, аналогичного вашему, и последующего его запуска. Предложение Нила Баттерворта использовать С также является хорошим выбором.

0 голосов
/ 07 июня 2012

настоятельно рекомендую llvm, инфраструктуру для платформы, поддержку генерации машинного кода и много проходов оптимизации. Учебник на llvm.org очень прост.

0 голосов
/ 21 марта 2009

Поскольку ваш код C -ish, вы можете попробовать C--. Это C как язык для бэкэндов компилятора. IIRC, он используется одним из основных компиляторов Haskell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...