Какой хороший и простой промежуточный код? - PullRequest
3 голосов
/ 19 июля 2010

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

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

Subset of C -> Compiler -> Code? -> VM

в котором код может быть либо в двоичном формате, либо лучше в формате ASCII (что-то вроде псевдо-ассемблера).

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

Ответы [ 5 ]

2 голосов
/ 19 июля 2010

Вы можете описать некоторую абстрактную конструкцию машины и затем предоставить ей набор инструкций в формате списка.Я маленький LISP-парсер, не разбираюсь в парсерах.

(label add-two)
(init-stack-frame 2)
(load r1 0)
(load r2 1)
(add val r1 r2)
(goto cont)

Кроме того, написание интерпретатора lisp, чтобы прочитать это, - нобрейнер.

load_labels (index, expr, env)
    if expr.first == 'label'
        env.set(expr.second, index)

interpret (machine, expr, env)
    return env.lookup(expr.first).eval(machine, expr.tail)
1 голос
/ 19 июля 2010

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

0 голосов
/ 19 июля 2010

Как насчет llvm ?

0 голосов
/ 19 июля 2010

Как насчет таргетинга на виртуальную машину Java?Не уверен, насколько это просто, но это очень хорошо задокументировано, поэтому, если студентам интересно, они могут зайти на amazon.com и получить книгу о том, что на самом деле означает промежуточный код и как работает vm.

Вы также можете просто создать настоящую сборку 80x86 или 68000, использовать ассемблер для получения машинного кода, а затем использовать эмулятор для его запуска.Реальное аппаратное обеспечение не кажется мне более сложным, чем какая-то виртуальная виртуальная машина, если вы уже писали компилятор, и у него уже есть тонны отладчиков и других утилит.

Но мне нравится LISPпредложение: -)

0 голосов
/ 19 июля 2010

Как насчет компиляции на язык сценариев (например, JavaScript)?Он читается человеком и уже сделан.

...