3 голоса
 
659 просмотров
3.05.2018 / 07:55  Aladdin

Генерация Java Bytecode

Думаю сделать свой язык компилируемый в ява байт код, без совместимости с ява, принцип компиляции таков:
есть класс контейнер RTObject, структура как на jcc, только заточен под динамическую типизацию, модули библиотек написанных на самом языке и на ява наследуют от него.
Думаю сделать генерацию класса который наследует от RTObject, а функции генерировать в методы. А некоторые опкоды (например, доступ к элементу массива) заменить на вызов метода.
код на языке
  1. var e = arr[0]
код на ассемблере
  1. load 1 ; кладем в стек переменную (представим что значение - массив)
  2. ipush 3 ; кладем число, это индекс элемента массива
  3. aload ; получает индекс, потом массив из стека и кладет элемент массива по индексу
  4. store 2 ; сохраняем элемент массива в переменную
код на ява ассемблере
  1. aload_1
  2. bipush 3
  3. invokestatic langruntime/LangRuntime/arrayAccess(value/LValue,value/LValue)
  4. astore_2
примерно так.
Сам вопрос как сделать генерацию байт кода? слышал пару библиотек cglib, asm, javassist, но не знаю как ими пользоваться, как производить компиляцию. Или же просто сделать генерацию в .j а потом делать компиляцию в .class?
Ответы
 
5 голосов
 
# 3.05.2018 / 09:38  aNNiMON
Берёшь какую-нибудь библиотеку, например ASM, открываешь по ней документацию.
У себя создаёшь Visitor и пишешь код с использованием библиотеки. Получается нечто подобное:
Открыть спойлер
В каждой ноде, как видно, два метода start и finish, то есть метод accept у PrintNode будет выглядеть как-то так:
  1. @Override
  2. public void accept(Visitor visitor) {
  3.     visitor.start(this);
  4.     expression.accept(visitor);
  5.     visitor.finish(this);
  6. }

Вместо отдельного визитора можешь прям в ноде создать соответствующий метод.
  1. @Override
  2. public void codegen() {
  3.     JavaCodegen.method().getStdout();
  4.     node.codegen();
  5.     JavaCodegen.method().printLine(BOHelper.toJVMType(node.type));
  6. }
Смотри проект @aRiGaTo: https://github.com/NoxChimaera/borzhch-lang
Изм. aNNiMON от 3.05.2018 / 17:48
Всего: 1

Реклама

Мы в соцсетях

tw tg yt gt