LINUX.ORG.RU

[c++][java][actionscript] автогенерируемый код и ограничения

 ,


0

2

Всем привет.

Потребовалось мне тут имплементировать на c/c++, java, actionscript маленькую виртуальную машинку. Итак, есть некая табличка, из которой скриптом генерится код на указанных языках. Код очень тупой, а посему должен работать без изменений во всех языках. Типа вот:

switch (opcode) { case 0xC0FE: { do_1(); do_2(); do_3(); break; } case 0xC0DE: { do_1(); do_2(); break; } default: { nop(); break; } }

Кейсов в свитче порядка 4000. И, значит, gcc это кушает без проблем, а вот в java лезет «code too large». (Честно говоря, когда это увидел и прочитал о размере методе в 64k, был в шоке - думал, это осталось в x86 real mode и на пальмах). А в actionscript и вовсе ограничение на размер модуля в 32k. Что вгоняет в печаль. Итого - как быть? Выносить это в виде данных, а не кода, предлагать пока не стоит. Сегментировать, сегменты по модулям разносить? Какое-то более изящное решение?


Ответ на: комментарий от power

Не знаю, насколько это правильно, но звучит лучше чем 4000 case`ов.

power
()
Ответ на: комментарий от power

Тогда лучше поставить if (opcode < 1000) ... else if (opcode < 2000) ... . Иначе будет ненужный вызов функций каждый раз при обращении к коду с высоким номером, а это в динамических языках дорого.

note173 ★★★★★
()
Ответ на: комментарий от note173

Похоже, придется бить примерно так плюс сегментировать по модулям, чего делать уж очень не хочется. Но сейчас сгенерированный исходник на яве/плюсах весит овер 200k, что означает, что для actionscript будет как минимум 6 сегментов.

Кстати, в поисках ответа нашел веселое:

Interestingly, I found a 1995 version of the JVM spec online at
http://sunsite.ee/java/vmspec/vmspec-1.html, and under limitations, it says:

The amount of code per method is limited to 65535 bytes by the sizes
of the indices in the code in the exception table, the line number
table, and the local variable table. This may be fixed for 1.0beta2.

dannie
() автор топика
Ответ на: комментарий от power

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

Да не вопрос сегментировать, просто я думал, что подобное осталось в прошлом, а если и не осталось, то есть методы обхода.

dannie
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.