![]() |
Re: создание MIDletPascal compiler'a
varK1 = d[с]
varK2 = a[varK1] varK3 = c - varK2 varK4 = d[varK3] x := d[varK4] То есть дополнительные переменные??? Ужос... Для одной строки 4 переменных, а если у меня 1 рекурсия на 35635 итераций? получим 35635*4 переменных (более того их не как не оптимизишь - ибо рекурсия подразумевает обработку своего же кода), в итоге транслятор 35635 раз сгенерирует один и тот же код... Пример: function a(i: integer): integer; begin while i<1000 do begin i:=a(i)+1; end; Result:=i; end; Код условный и без смысла.... Ну да не в этом суть, в принципе легче в таких случаях (использование внешнего компилятора) вообще взять JOB и транслировать Pascal->Modula Cмысл (я так считаю) сделать продукт выше по возможностям MidletPascal иначе овчинка свеч не стоит... |
Ответ: создание MIDletPascal compiler'a
да небедет таких проблем...
твой код Код:
function fa(i: integer): integer; будет преобразован в промежуточный java код ---- Код:
затем он преобразуется в код JavaAsm для окончательной компиляции --- Код:
.method public static fa(I)I |
Ответ: создание MIDletPascal compiler'a
Цитата:
ведь я просил привести пример Реально нужный - нужный для проверки оптимизации кода.... ведь такая многоуровневая рекурсия очень редка - и она может быть преобразована в обычный цикл - возможно транслятором - a возможно Ручками и мозгами Программиста.... --- а лучшее ... Сперва бы повторить Мидлет Паскаль - С открытым кодом - чтобы все желающие смогли поучавствовать кто чем сможет в расширении и улучшении его... моё ИМХО... :-) |
Re: создание MIDletPascal compiler'a
Вложений: 1
Блин - вот фраза
Цитата:
function fa(i: integer): integer; begin while i<1000 do begin i := fa(i) + 1; end; fa:=i; end; сразу переводить в этот Код:
.method public static fa(I)I Короче как я понял без примера тут не обойтись... Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm... ЗЫ... Добавил пример |
Ответ: создание MIDletPascal compiler'a
Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
|
Ответ: создание MIDletPascal compiler'a
>>Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...
--- вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?... тут то - при промежуточных трансляциях - можно будет добавлять библиотеки написанные на Java, + вставки кода на Асме прямо в коде текста... а также - можно будет реализовать разные Мидлет языки программирования(при соответствующих трансляторах этих языков в Java или в Асм) - а уже готовый Компилятор(один из нескольких модулей ЕХЕ, нашего IDE) - будет формировать Class файлы из Асма... (вроде так было задумано на страницах этого топика...) === >>Можно такой нескромный вопрос? Что вы собираетесь делать вообще?) из за того что официальный MidletPascal накрылся медным тазом... даже исходников неоставили... а вообше то почитай первые посты.... :-) |
Re: создание MIDletPascal compiler'a
Код:
вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?... Библиотеки можно писать на самом же паскале Если писать на Java то abcdef сделал прекрасный дизасм для такого дела, более того, если и компилятор и дизасм объеденить для работы с одними (а только так и получица) структурами то и формирование пула будет автоматом происходить... Если делать вставки типа asm end; то ассемблер пишется 15-20 минут, я уже к дизасму функцию прикручивал где по опкоду формируется мнемоника, она обратима, то есть по мнемонике можно сформировать опкод Единственная проблема в двух компиляторах (PascalS и BeroTP) это функция Expr, которая рекурсивно-спускаема, а Java - имеет стековую машину, для которой идеально подходит алго Декстры(ОПЗ)... Я так и думал, что сдесь как раз и занимаются доработкой уже готового а не чего то нового... Вообще по данным этих топиков компилятор можно написать за день, причем хороший... Но... объясняю ситуацию насчет себя, - во первых меня не втыкает ява, тупой язык, тупая машина, тупая реализация Во вторых я занимаюсь похожим компилятором, ток не для явы... И времени на переключение пока нет... Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов... Там же сложного ничего нет, поменять всего 2-3 функции... |
Ответ: создание MIDletPascal compiler'a
>>Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов...
--- угу.. подскажи... === >>Там же сложного ничего нет, поменять всего 2-3 функции... мдааа.. глянул я на исходник... мля... (по крайней мере у меня весь такой текст и без пробелов.... --- Код:
PROCEDURE I2(VAR T:INTEGER); [quote]Но... объясняю ситуаци%u |
Re: создание MIDletPascal compiler'a
Вложений: 1
А форум надо повнимательнее читать... Я же потом выкинул нормальные исходники...
:-D:-D:-D ОК выкладываю ишо раз, подальше от топиков смешанных... |
Ответ: создание MIDletPascal compiler'a
вопросы по оптимизации...
--- подскажите как лучше организовать трансляцию из Паскаля в Javу(ассемблер) --- может обьеденить ВСЁ приложение в один Class файл - за исключением сторонних библиотек(class) а то ведь как происходит? - нужна мне математическая функция к примеру Синус (из библиотеки) так сотовый телефон в архиве Jar найдёт такой файл(библиотеку) проинициализирует переменные, константый пул установит, свяжется со всякими Import... выполнит Init класса.. и тд. итп.. а так - всю матем библиотеку(исходник на Жаве или Асме) транслятор присобачит к основному файлу, создаст таблицу перекрёстных ссылок и все неиспользуемы переменные и функции удалит из текста.... может так? а также : - сделать развёртку циклов?(как?) - (прикинуть примерно выходной файл в Кб.. если меньше например 50...100 кб размер файла Class) то сделать автоматическую развёртку Функций в текст откуда произошёл вызов - за исключение рекурсивных функций.... (из рефер таблицы брать самые часто?( редко) используемые функции) ведь мне кажется важна оптимизация по Скорости... -------------- |
Ответ: создание MIDletPascal compiler'a
Проще и правильней спроектировать, всегда сложнее чем реализовать.
Поэтому давайте глянем как все сделано в MidletPascal: Код:
type Код:
public static int _real_; __ Тип String стоит особняком, т.к. есть только инструкция для передачи/получения из стека, а если нужна обработка, то она производится в спец.классе, компилятор только загружает пераметры в стек и вызывает метод, и больше не имеет к этому ни какого отношения __ http - как в случае и с типом String: вся работа в отдельном классе, на MP операции устанавливаются ссылки на методы H.class. __ InputStream, RecordStore - указатели как и в обычной java __ command и image - как и в обычной java __ ну и последнее, пользовательские типы: Код:
public class R_1 { ==== Вот и все. Поправьте меня, если что-то упустил или написал не так... |
Ответ: создание MIDletPascal compiler'a
немножко вернемся назад к java-assembler'у на Turbo Pascal.
О верификации и создании структуры stackmap (или stackmaptable). __________ Повторюсь (писал об этом ранее): в WTK имеется утилита "preverify1.1.exe", и файлы "cldcapi11.jar", "midpapi20.jar". Чтобы легко провести верификацию надо сделать запускной bat-файл и скопировать эти 4-е файла в отдельный каталог, а также создать в нем два подкаталога "class" и "tmp". Для верификации поместить "сырые" class-файлы в подкаталог "tmp" и после запуска bat-файла в подкаталоге "class" появятся проверенные классы с добавленной структурой "stackmap". Вот пример bat-файла для этого случая: Код:
preverify1.1 -nofp -nofinalize -nonative -classpath midpapi20.jar;cldcapi11.jar; -d "class" "tmp" Но т.к. текущая разработка без использования java, т.о. его можно посмотреть для ознакомления. __________ Теперь о собственной реализации и вставке структуры "stackmap" Более близкое что удалось найти в сети представлено здесь: Код:
http://asm.ow2.org/asm223/javadoc/user/org/objectweb/asm/attrs/StackMapTableAttribute.html Структура "stackmap" содержит список локальных переменных и состояние стека в точках куда передается управление через goto/if_icmpne и т.д. Причем запоминается состояние виртуальной машины на операторе перехода, и записывается в участок "stackmap" со смещением где находится метка, т.о. мы указываем виртуальной машине еще до запуска, что будет в стеке или таблице локальных переменных, если в конкретное место будет переход. Примечание: т.к. в Pascal'е переменные в подпрограммах создаются в начале, а уничтожаются при выходе, то эта часть "stackmap" будет неизменной, а меняться будет только вторая часть "состояние стека". -- Теперь необходимо разобраться с формированием "stackmap", если в одну точку переходит несколько операторов Код:
(*) - Общая точка ____ p.s. нашел ссылку с очень похожей реализацией java-assembler'а и java-disassembler'а (TurboPascal), на языке java: https://svn.forge.objectweb.org/cgi-...objectweb/asm/ |
Ответ: создание MIDletPascal compiler'a
Вложений: 1
старая и последняя версия JavaClassCompiler c возможностью использовать метки
|
Ответ: создание MIDletPascal compiler'a
Вложений: 1
увидел программку в MIDletPascal первых попыток конвертера исходного кода из Pascal-е подобного языка в исходник Java
http://wap-project.tk/download/file.php?view=9 для сборки в jar должны использоваться: библиотеки class-файлов, java компилятор, преверификатор, zip архиватор. |
Ответ: создание MIDletPascal compiler'a
общие сведения "Compiling Pascal to Java Bytecode"
http://www.xs4all.nl/~mpdeboer/scriptie/scriptie.html |
Часовой пояс GMT +4, время: 15:13. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot