2017-02-16 7 views
4

Предположим, что я пишу язык программирования; для тезки, я назову его lang.Письменные языки для JVM

Чтобы начать длинный путь письма lang, я решаю начать, написав lang сам по себе. Я не могу на самом деле запустить, потому что theres ничего не запускать программу, которая работает сама.

Итак, я начинаю с написания другого компилятора для lang в Java. На этот раз, когда я закончил, я решил преобразовать его в Bytecode и оставить его на этом. У меня теперь есть рабочий компилятор, который преобразует весь мой код lang в Bytecode.

Так что я решил подключить мой самокомпилируемый компилятор для языка, в компилятор, который я только что сделал на Java. Затем я преобразую self-компилятор в Bytecode и вытаскиваю компилятор Java. У меня теперь есть lang компилятор, написанный сам по себе, преобразованный в Bytecode, готовый к использованию.

Это создает простую программу, и я понимаю все это, но мой вопрос относительно конструкции компилятора для JVM, Что делать, если я решит выпустить обновление для моего языка? Как мне обновить Bytecode? Я просто переписываю обновленную версию языка в более старой версии?

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

Это то же самое, что и с C++. C с классами был написан, а затем C++ в нем, и, наконец, C с классами был оставлен для загруженного C++. Но тогда, как они вообще обновляли язык?

+1

Отладка байтового кода может быть довольно болезненной. Я предлагаю вам написать переводчика 'lang' в' java'. Таким образом, вы увидите, что он делает и отлаживает переведенную Java. Позже вы можете написать более эффективный компилятор прямо в байтовый код. –

+2

@Peter Lawrey: «Отладка байтового кода» редко требуется. Если у вашего сгенерированного файла класса есть атрибуты отладки, определяющие имя исходного файла и сопоставление инструкций с номерами строк, вы можете отлаживать его так же гладко, как исходный код Java, независимо от того, на каком языке он был написан. – Holger

+1

Если вы обновите свой язык, вы должны реализовать новые функции, используя только функции предыдущего языка. Только после этого вы можете начать использовать новые функции в компиляторе. – Holger

ответ

2

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

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

Что делать, если JVM изменяется? В этом случае вы сохраняете старую версию JVM, настраиваете свой компилятор, чтобы справиться с новыми изменениями байтового кода, а затем скомпилируйте его со старым (это аналогично компилятору B от ранее). Это даст вам компилятор, который компилируется в новый байт-код, но работает на старой виртуальной машине. Следующий шаг - заставить его скомпилировать себя, и теперь у вас есть новый компилятор, который работает на новой виртуальной машине (аналогично компилятору C).

1

Я не думаю, что ваш компилятор - лучший способ обойти это.

Я бы начал с грамматики для моего языка.

Далее идет лексер/парсер, чтобы включить выражения на моем языке в абстрактное синтаксическое дерево (AST). AST - это правильное промежуточное представление выражения.

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

Где ваше обновление произошло?

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

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

+0

Thankyou! Однако когда вы определяете основы языка, когда я изменяю эмиссию байт-кода, должен ли я писать эмиттер в Java или предыдущую версию или коммит соответствующего языка? – finnrayment

+0

Грамматика также является хорошей основой для ссылки на язык. Однако тогда вы привязываетесь к языку реализации парсера Java, пока парсер не будет написан на языке. Но +1 –

+0

Я не сказал, что это должен быть парсер Java. Почему волнуется, если парсер написан на языке оригинала? Используйте бизон, если хотите. – duffymo

-1

Новая версия компилятора может быть скомпилирована только предыдущей версией. Например, для компиляции G ++ 4.6 вы должны использовать G ++ 4.5, но не G ++ 1.0.

BTW нет необходимости писать компилятор для lang сам по себе. Он собирается продемонстрировать, что язык «зрелый», но некоторые языки не должны демонстрировать это.

1

Первый языки компилятор может быть записан в виде подмножества из языки. И вам нужно только подмножество (bootstrap) компилятор (или даже interoreter). Это можно записать в java.

Позже более подробные компиляторы могут быть написаны на lang. Могут быть и более новые версии.


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

Смежные вопросы