|
Основной форум Сюда все проблемы связанные с программированием. |
26.06.2009, 00:43
|
#181
|
Нуждающийся
Регистрация: 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
|
Нуждающийся
Регистрация: 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
|
Нуждающийся
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений (для 15 пользователей)
|
Ответ: создание MIDletPascal compiler'a
Код условный и без смысла....
|
вот именно - Ключевое слово безсмысленный...
ведь я просил привести пример Реально нужный - нужный для проверки оптимизации кода....
ведь такая многоуровневая рекурсия очень редка - и она
может быть преобразована в обычный цикл - возможно транслятором - a возможно Ручками и мозгами Программиста....
---
а лучшее ... Сперва бы повторить Мидлет Паскаль - С открытым кодом -
чтобы все желающие смогли поучавствовать кто чем сможет в расширении и улучшении его... моё ИМХО...
|
(Offline)
|
|
26.06.2009, 15:12
|
#184
|
Нуждающийся
Регистрация: 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...
ЗЫ...
Добавил пример
Последний раз редактировалось satan, 26.06.2009 в 16:22.
|
(Offline)
|
|
26.06.2009, 17:48
|
#185
|
Знающий
Регистрация: 18.03.2009
Сообщений: 223
Написано 10 полезных сообщений (для 17 пользователей)
|
Ответ: создание MIDletPascal compiler'a
Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
__________________
И суслики вам не помогут
|
(Offline)
|
|
26.06.2009, 19:17
|
#186
|
Нуждающийся
Регистрация: 03.01.2009
Сообщений: 93
Написано 8 полезных сообщений (для 15 пользователей)
|
Ответ: создание MIDletPascal compiler'a
>>Постораюсь накидать пример Expr который СРАЗУ переводит в JavaAsm...
---
вот.вот... при таком подходе мы загоняем себя в рамки... а как расширять?...
тут то - при промежуточных трансляциях - можно будет добавлять
библиотеки написанные на Java, + вставки кода на Асме прямо в коде текста...
а также - можно будет реализовать разные Мидлет языки программирования(при соответствующих трансляторах этих языков в Java или в Асм) - а уже готовый Компилятор(один из нескольких модулей ЕХЕ, нашего IDE) - будет формировать Class файлы из Асма...
(вроде так было задумано на страницах этого топика...)
===
>>Можно такой нескромный вопрос? Что вы собираетесь делать вообще?)
из за того что официальный MidletPascal накрылся медным тазом...
даже исходников неоставили...
а вообше то почитай первые посты....
|
(Offline)
|
|
26.06.2009, 21:07
|
#187
|
Нуждающийся
Регистрация: 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
|
Нуждающийся
Регистрация: 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
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
А форум надо повнимательнее читать... Я же потом выкинул нормальные исходники...
ОК выкладываю ишо раз, подальше от топиков смешанных...
|
(Offline)
|
|
29.06.2009, 18:35
|
#190
|
Нуждающийся
Регистрация: 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
|
Знающий
Регистрация: 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
|
Знающий
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.12.2009, 13:57
|
#193
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
старая и последняя версия JavaClassCompiler c возможностью использовать метки
|
(Offline)
|
|
13.05.2010, 13:33
|
#194
|
Знающий
Регистрация: 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 архиватор.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо abcdef за это полезное сообщение:
|
|
24.05.2010, 13:19
|
#195
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:32.
|