Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Основной форум

Основной форум Сюда все проблемы связанные с программированием.

Ответ
 
Опции темы
Старый 26.06.2009, 00:43   #181
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
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 иначе овчинка свеч не стоит...
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 04:01   #182
Serg153
Нуждающийся
 
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений
(для 15 пользователей)
Ответ: создание MIDletPascal compiler'a

да небедет таких проблем...
твой код
function fa(i: integer): integer;
begin
  while i<1000 do begin
    i := fa(i) + 1; 
  end;
  fa:=i;
end;
----
будет преобразован в промежуточный java код
----
    
public static int fa(int i)
    {
        int varK1 = 0;
        for(; (byte)(i < 1000 ? -1 : 0) != 0; i = fa(i) + 1);
        varK1 = i;
        return j;
    }
и никакой генерации этого кода в 1000 повторениях....
затем он преобразуется в код JavaAsm для окончательной компиляции
---
.method                  public static fa(I)I
   .limit stack          2
   .limit locals         2
   .var 0 is             i I from LABEL0x0 to LABEL0x20
   .var 1 is             varK1  I from LABEL0x2 to LABEL0x20
   .line                 15
LABEL0x0:
   iconst_0              
   istore_1              
   .line                 16
LABEL0x2:
   iload_0               
   sipush                1000
   if_icmplt             LABEL0xd
   iconst_0              
   goto                  LABEL0xe
LABEL0xd:
   iconst_m1             
LABEL0xe:
   i2b                   
   ifeq                  LABEL0x1c
   iload_0               
   invokestatic          proj1/fa(I)I
   iconst_1              
   iadd                  
   istore_0              
   goto                  LABEL0x2
   .line                 17
LABEL0x1c:
   iload_0               
   istore_1              
   .line                 18
   iload_1               
   ireturn               
LABEL0x20:
.end method
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 04:20   #183
Serg153
Нуждающийся
 
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений
(для 15 пользователей)
Ответ: создание MIDletPascal compiler'a

Код условный и без смысла....
вот именно - Ключевое слово безсмысленный...
ведь я просил привести пример Реально нужный - нужный для проверки оптимизации кода....
ведь такая многоуровневая рекурсия очень редка - и она
может быть преобразована в обычный цикл - возможно транслятором - a возможно Ручками и мозгами Программиста....
---
а лучшее ... Сперва бы повторить Мидлет Паскаль - С открытым кодом -
чтобы все желающие смогли поучавствовать кто чем сможет в расширении и улучшении его... моё ИМХО...
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 15:12   #184
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Блин - вот фраза

будет преобразован в промежуточный java код
Может я не так думаю, но по моему смысл предприятия в том что бы вот этот код

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
   .limit stack          2
   .limit locals         2
   .var 0 is             i I from LABEL0x0 to LABEL0x20
   .var 1 is             varK1  I from LABEL0x2 to LABEL0x20
   .line                 15
LABEL0x0:
   iconst_0              
   istore_1              
   .line                 16
...................................
Вот я именно про эти грабли и рассказываю, когда по концепции ПАСКАЛЬ компиляторов (нисходящая рекурсия+один проход) получаем сразу байт код, без использования промежуточных машин, кодов, батников и т.д.

Короче как я понял без примера тут не обойтись... Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...

ЗЫ...

Добавил пример
Вложения
Тип файла: zip Polish.zip (3.6 Кб, 372 просмотров)

Последний раз редактировалось satan, 26.06.2009 в 16:22.
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 17:48   #185
demon112
Знающий
 
Регистрация: 18.03.2009
Сообщений: 223
Написано 10 полезных сообщений
(для 17 пользователей)
Ответ: создание MIDletPascal compiler'a

Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
__________________
И суслики вам не помогут
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 19:17   #186
Serg153
Нуждающийся
 
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений
(для 15 пользователей)
Ответ: создание MIDletPascal compiler'a

>>Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...
---
вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?...
тут то - при промежуточных трансляциях - можно будет добавлять
библиотеки написанные на Java, + вставки кода на Асме прямо в коде текста...
а также - можно будет реализовать разные Мидлет языки программирования(при соответствующих трансляторах этих языков в Java или в Асм) - а уже готовый Компилятор(один из нескольких модулей ЕХЕ, нашего IDE) - будет формировать Class файлы из Асма...
(вроде так было задумано на страницах этого топика...)
===
>>Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
из за того что официальный MidletPascal накрылся медным тазом...
даже исходников неоставили...
а вообше то почитай первые посты....
(Offline)
 
Ответить с цитированием
Старый 26.06.2009, 21:07   #187
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

 вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?...
Не понял?

Библиотеки можно писать на самом же паскале
Если писать на Java то abcdef сделал прекрасный дизасм для такого дела, более того, если и компилятор и дизасм объеденить для работы с одними (а только так и получица) структурами то и формирование пула будет автоматом происходить...

Если делать вставки типа asm end; то ассемблер пишется 15-20 минут, я уже к дизасму функцию прикручивал где по опкоду формируется мнемоника, она обратима, то есть по мнемонике можно сформировать опкод

Единственная проблема в двух компиляторах (PascalS и BeroTP) это функция Expr,
которая рекурсивно-спускаема, а Java - имеет стековую машину, для которой идеально подходит алго Декстры(ОПЗ)...

Я так и думал, что сдесь как раз и занимаются доработкой уже готового а не чего то нового...

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

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

Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов... Там же сложного ничего нет, поменять всего 2-3 функции...
(Offline)
 
Ответить с цитированием
Старый 27.06.2009, 00:13   #188
Serg153
Нуждающийся
 
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений
(для 15 пользователей)
Ответ: создание MIDletPascal compiler'a

>>Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов...
---
угу.. подскажи...
===
>>Там же сложного ничего нет, поменять всего 2-3 функции...
мдааа.. глянул я на исходник... мля... (по крайней мере у меня весь такой текст и без пробелов....
---
PROCEDURE I2(VAR T:INTEGER);
VAR I,J,SZ,FT:INTEGER;
BEGIN 
IF G3=44 THEN U5;
IF G3=0 THEN BEGIN I:=U9;
IF G16[i].I3<>3 THEN U2(133);
T:=G16[i].I2; U5;
END ELSE BEGIN IF G15=MTC THEN U2(134);
G15:=G15+1;T:=G15;
IF G3=42 THEN BEGIN U5; U6(6); FQ(T);
END ELSE BEGIN U7(45);
IF G11=MLC THEN U2(135);
G11:=G11+1;G13[G11]:=0;U6(0);SZ:=0;
REPEAT 
U8(G4,2,0); I:=G14; U5; 
WHILE G3=17 DO BEGIN
U5; U6(0); U8(G4,2,0); U5;
END;
J:=G14; U7(8); I2(FT);
REPEAT
G16[i].I2:=FT; G16[i].I8:=SZ; SZ:=SZ+G17[FT].T0; I:=I+1;
UNTIL I>J;
IF G3=18 THEN BEGIN
U5;
END ELSE BEGIN U6(22);
END;
UNTIL G3<>0;
G17[T].T0:=SZ; G17[T].I3:=2; G17[T].T4:=G13[G11]; G11:=G11-1; U7(22);
END;
END;
END;
===
[quote]Но... объясняю ситуаци%u

Последний раз редактировалось Serg153, 27.06.2009 в 00:20.
(Offline)
 
Ответить с цитированием
Старый 27.06.2009, 02:35   #189
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

А форум надо повнимательнее читать... Я же потом выкинул нормальные исходники...



ОК выкладываю ишо раз, подальше от топиков смешанных...
Вложения
Тип файла: zip pascal.zip (13.6 Кб, 365 просмотров)
(Offline)
 
Ответить с цитированием
Старый 29.06.2009, 18:35   #190
Serg153
Нуждающийся
 
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений
(для 15 пользователей)
Ответ: создание MIDletPascal compiler'a

вопросы по оптимизации...
---
подскажите как лучше организовать трансляцию из Паскаля в Javу(ассемблер)
---
может обьеденить ВСЁ приложение в один Class файл - за исключением сторонних библиотек(class)
а то ведь как происходит? -
нужна мне математическая функция к примеру Синус (из библиотеки)
так сотовый телефон в архиве Jar найдёт такой файл(библиотеку)
проинициализирует переменные, константый пул установит, свяжется со всякими Import... выполнит Init класса.. и тд. итп..
а так - всю матем библиотеку(исходник на Жаве или Асме) транслятор
присобачит к основному файлу, создаст таблицу перекрёстных ссылок
и все неиспользуемы переменные и функции удалит из текста....
может так?
а также :
- сделать развёртку циклов?(как?)
- (прикинуть примерно выходной файл в Кб.. если меньше например 50...100 кб размер файла Class) то сделать автоматическую развёртку Функций в текст откуда произошёл вызов - за исключение рекурсивных функций.... (из рефер таблицы брать самые часто?( редко) используемые функции)
ведь мне кажется важна оптимизация по Скорости...
--------------
(Offline)
 
Ответить с цитированием
Старый 16.07.2009, 11:56   #191
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Проще и правильней спроектировать, всегда сложнее чем реализовать.
Поэтому давайте глянем как все сделано в MidletPascal:
type
  _record_ = record
    x,y : integer;
  end;

var
  _real_        : real;
  _integer_     : integer;
  _char_        : char;
  _boolean_     : boolean;
  _string_      : string;
  _http_        : http;
  _resource_    : resource;
  _recordstore_ : recordstore;
  _command_     : command;
  _image_       : image;
begin
  _boolean_:=false;
  _boolean_:=true;
  _boolean_:=(3<>4);
  delay(1);
end.
получаем на java:
  public static int _real_;
  public static int _integer_;
  public static int _char_;
  public static int _boolean_;
  public static String _string_;
  public static H _http_;
  public static InputStream _resource_;
  public static RecordStore _recordstore_;
  public static Command _command_;
  public static Image _image_;
т.е. фактически все вычисления и обработка данных ведется в Integer (real, integer, char, boolean)
__
Тип String стоит особняком, т.к. есть только инструкция для передачи/получения из стека, а если нужна обработка, то она производится в спец.классе, компилятор только загружает пераметры в стек и вызывает метод, и больше не имеет к этому ни какого отношения
__
http - как в случае и с типом String: вся работа в отдельном классе, на MP операции устанавливаются ссылки на методы H.class.
__
InputStream, RecordStore - указатели как и в обычной java
__
command и image - как и в обычной java
__
ну и последнее, пользовательские типы:
public class R_1 {
public int x;
public int y;
public R_1() {
  x = 0;
  y = 0;
}
public R_1 Copy(R_1 r_1) {
  x = r_1.x;
  y = r_1.y;
  return this;
}
}
для нашего тип сгенерировался класс, с инициализацией элементов типа и оперицией копирования типа в тип.

====
Вот и все. Поправьте меня, если что-то упустил или написал не так...
(Offline)
 
Ответить с цитированием
Старый 16.07.2009, 13:50   #192
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание 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"
pause
Также имеется openSource java-верификатор "proguard" его можно поскать на http://sourceforge.net/ и о нем писал pilgrim в Canterbury Pascal for J2ME http://forum.boolean.name/showthread.php?t=6028
Но т.к. текущая разработка без использования java, т.о. его можно посмотреть для ознакомления.
__________

Теперь о собственной реализации и вставке структуры "stackmap"
Более близкое что удалось найти в сети представлено здесь:
http://asm.ow2.org/asm223/javadoc/user/org/objectweb/asm/attrs/StackMapTableAttribute.html
http://www.cs.karelia.ru/alumni/2003mag/hyppenen.ppt
http://sun.tpu.ru/teachingmaterials/download;jsessionid=b7d7cc41754158548d66f8f93900d?path=java/Safonov_Java_Seminar_new/7_JVM_CLASS.pdf
Остальное добыто компиляцией и дизассемблированием c помощью JD.exe (Java Disassembler, TurboPascal) типовых примеров, итак:

Структура "stackmap" содержит список локальных переменных и состояние стека в точках куда передается управление через goto/if_icmpne и т.д. Причем запоминается состояние виртуальной машины на операторе перехода, и записывается в участок "stackmap" со смещением где находится метка, т.о. мы указываем виртуальной машине еще до запуска, что будет в стеке или таблице локальных переменных, если в конкретное место будет переход.

Примечание: т.к. в Pascal'е переменные в подпрограммах создаются в начале, а уничтожаются при выходе, то эта часть "stackmap" будет неизменной, а меняться будет только вторая часть "состояние стека".
--
Теперь необходимо разобраться с формированием "stackmap", если в одну точку переходит несколько операторов
(*)  - Общая точка
repeat
repeat
...
until
...
until
и собрать свой алгоритм

____
p.s. нашел ссылку с очень похожей реализацией java-assembler'а и java-disassembler'а (TurboPascal), на языке java:
https://svn.forge.objectweb.org/cgi-...objectweb/asm/

Последний раз редактировалось abcdef, 16.07.2009 в 13:58.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
scimitar (25.07.2009)
Старый 16.12.2009, 13:57   #193
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

старая и последняя версия JavaClassCompiler c возможностью использовать метки
Вложения
Тип файла: zip JCC_label.ZIP (15.0 Кб, 368 просмотров)
(Offline)
 
Ответить с цитированием
Старый 13.05.2010, 13:33   #194
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

увидел программку в MIDletPascal первых попыток конвертера исходного кода из Pascal-е подобного языка в исходник Java
http://wap-project.tk/download/file.php?view=9
для сборки в jar должны использоваться: библиотеки class-файлов, java компилятор, преверификатор, zip архиватор.
Вложения
Тип файла: zip pas2java.zip (92.5 Кб, 333 просмотров)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо abcdef за это полезное сообщение:
DIMMON4IK (13.05.2010), Trazzy (25.05.2010)
Старый 24.05.2010, 13:19   #195
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

общие сведения "Compiling Pascal to Java Bytecode"
http://www.xs4all.nl/~mpdeboer/scriptie/scriptie.html
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать MidletPascal smesh Прочие вопросы 14 30.06.2011 15:57
создание MIDletPascal obfuscator abcdef Основной форум 7 22.12.2008 23:27
Русификатор MIDletPascal Тренсфер Прочие вопросы 14 26.07.2008 04:00
MidletPascal. Что это. Данил MidletPascal 12 23.10.2007 05:27


Часовой пояс GMT +4, время: 20:32.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com