forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   создание MIDletPascal compiler'a (http://forum.boolean.name/showthread.php?t=6385)

satan 26.06.2009 00:43

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 иначе овчинка свеч не стоит...

Serg153 26.06.2009 04:01

Ответ: создание 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


Serg153 26.06.2009 04:20

Ответ: создание MIDletPascal compiler'a
 
Цитата:

Код условный и без смысла....
вот именно - Ключевое слово безсмысленный... :-)
ведь я просил привести пример Реально нужный - нужный для проверки оптимизации кода....
ведь такая многоуровневая рекурсия очень редка - и она
может быть преобразована в обычный цикл - возможно транслятором - a возможно Ручками и мозгами Программиста....
---
а лучшее ... Сперва бы повторить Мидлет Паскаль - С открытым кодом -
чтобы все желающие смогли поучавствовать кто чем сможет в расширении и улучшении его... моё ИМХО... :-)

satan 26.06.2009 15:12

Re: создание MIDletPascal compiler'a
 
Вложений: 1
Блин - вот фраза

Цитата:

будет преобразован в промежуточный 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...

ЗЫ...

Добавил пример

demon112 26.06.2009 17:48

Ответ: создание MIDletPascal compiler'a
 
Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)

Serg153 26.06.2009 19:17

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

satan 26.06.2009 21:07

Re: создание MIDletPascal compiler'a
 
Код:

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

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

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

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

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

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

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

Но могу просто дать совет по преобразованию BeroTyniPascal в JavaPascal без лишних замутов... Там же сложного ничего нет, поменять всего 2-3 функции...

Serg153 27.06.2009 00:13

Ответ: создание 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

satan 27.06.2009 02:35

Re: создание MIDletPascal compiler'a
 
Вложений: 1
А форум надо повнимательнее читать... Я же потом выкинул нормальные исходники...

:-D:-D:-D

ОК выкладываю ишо раз, подальше от топиков смешанных...

Serg153 29.06.2009 18:35

Ответ: создание MIDletPascal compiler'a
 
вопросы по оптимизации...
---
подскажите как лучше организовать трансляцию из Паскаля в Javу(ассемблер)
---
может обьеденить ВСЁ приложение в один Class файл - за исключением сторонних библиотек(class)
а то ведь как происходит? -
нужна мне математическая функция к примеру Синус (из библиотеки)
так сотовый телефон в архиве Jar найдёт такой файл(библиотеку)
проинициализирует переменные, константый пул установит, свяжется со всякими Import... выполнит Init класса.. и тд. итп..
а так - всю матем библиотеку(исходник на Жаве или Асме) транслятор
присобачит к основному файлу, создаст таблицу перекрёстных ссылок
и все неиспользуемы переменные и функции удалит из текста....
может так?
а также :
- сделать развёртку циклов?(как?)
- (прикинуть примерно выходной файл в Кб.. если меньше например 50...100 кб размер файла Class) то сделать автоматическую развёртку Функций в текст откуда произошёл вызов - за исключение рекурсивных функций.... (из рефер таблицы брать самые часто?( редко) используемые функции)
ведь мне кажется важна оптимизация по Скорости...
--------------

abcdef 16.07.2009 11:56

Ответ: создание 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;
}
}

для нашего тип сгенерировался класс, с инициализацией элементов типа и оперицией копирования типа в тип.

====
Вот и все. Поправьте меня, если что-то упустил или написал не так...

abcdef 16.07.2009 13:50

Ответ: создание 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.12.2009 13:57

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
старая и последняя версия JavaClassCompiler c возможностью использовать метки

abcdef 13.05.2010 13:33

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
увидел программку в MIDletPascal первых попыток конвертера исходного кода из Pascal-е подобного языка в исходник Java
http://wap-project.tk/download/file.php?view=9
для сборки в jar должны использоваться: библиотеки class-файлов, java компилятор, преверификатор, zip архиватор.

abcdef 24.05.2010 13:19

Ответ: создание 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