Показать сообщение отдельно
Старый 03.11.2008, 07:26   #86
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

эх, наверное скоро язык намозолю, ... задача pascal-компилятора подготовить текстовый javaAsm-исходник.

_________
"...А у тебя я поверь, не могу смысла уловить? На кой декомпилировать class файл и потом из этого что получилось опять лепить class файл???..."

- я думаю все поняли, мне например лень разбирать class-файлы в hex-редакторе, ну можно поковырять парочку, но сотню-другую ни за что...
дизассемблер нужен для разбора/экспериментов с class-файлами, чтоб лучше уяснить их структуру и возможные вариации. Поле деятельности огромное: бери любую игрушку и декомпиль,.. а потом смотри сможет ли асссемблер сделать также, если нет - смотри в чем ошибка алгоритма.

Возможные применения java-decompiler'a:
Если для компиляции простенькой библиотеки для MIDletPascal нужно писать кучу заглушек, то можно с помощью decompiler'а сделать заготовку, изменить ее и скомпилировать библиотеку.
Или же нужно изменить логику программы (подправить несколько байт в коде), то decompiler'ом можно пользоваться как инструментом анализа class-файлов.

_________
"...Ты опиши хотя б в двух словах, что хоть на этапах построения или компиляции будет?
Типа вот так
Компилер рекурсивный..."

-я думал это и так ясно, тем более что предложил переработать исходник <pascals.zip>, в который нужно немного изменить кодо-генератор для вывода java-bytecode команд, а также добавить структуру переменных/функций и их параметров под названием Constant Pool.

В предложенном исходнике уже создана оптимизация константных выражений (над которой ты сейчас работаешь), проверка типов при вычислении и многое другое, а также все необходимые структурные единицы языка Pascal.

_________
"...и сделать транслятор Pascal - Java (для разработчиков библиотек и Java кодеров) таким образом подключив всю яву..."

-как думаю уже стало ясно, то в данном паскале можно будет вызвать любой java-метод, даже тот которого нет и ни будет,.. поэтому нужно определить стандартные функции языка pascal и сопоставить им таблицу с аналогичными java-методами, чтоб проверялся тип параметров и при разборе синтаксиса.

Выглядеть pascal-исходник будет примерно так:
TYPE
{class}
  tinteger                                 = 'I';
  tboolean                                 = 'Z';
  tprocedure                               = 'V';
  {...}
  this                                     = 'hello';
  javax_microedition_lcdui_Display         = 'javax/microedition/lcdui/Display';
  javax_microedition_lcdui_Form            = 'javax/microedition/lcdui/Form';
  javax_microedition_lcdui_TextField       = 'javax/microedition/lcdui/TextField';
  javax_microedition_lcdui_Command         = 'javax/microedition/lcdui/Command';
  javax_microedition_midlet_MIDlet         = 'javax/microedition/midlet/MIDlet';
  javax_microedition_lcdui_Displayable     = 'javax/microedition/lcdui/Displayable';
  javax_microedition_lcdui_CommandListener = 'javax/microedition/lcdui/CommandListener';
  javax_microedition_lcdui_Item            = 'javax/microedition/lcdui/Item;';

{methods}
  {append = '(Ljavax/microedition/lcdui/Item;)I';}
  function append(i : javax_microedition_lcdui_Item) : integer; external javax_microedition_lcdui_Form;

  {addCommand = '(Ljavax/microedition/lcdui/Command;)V';}
  procedure addCommand(i : javax_microedition_lcdui_Command); external javax_microedition_lcdui_Form;

  {setCommandListener = '(Ljavax/microedition/lcdui/CommandListener;)V';}
  procedure setCommandListener(i : javax_microedition_lcdui_CommandListener); external javax_microedition_lcdui_Form;

  {setCurrent = '(Ljavax/microedition/lcdui/Displayable;)V';}
  procedure setCurrent(i : javax_microedition_lcdui_Displayable); external javax_microedition_lcdui_Display;

  {getDisplay = '(Ljavax/microedition/midlet/MIDlet;)Ljavax/microedition/lcdui/Display;';}
  function getDisplay(i : javax_microedition_midlet_MIDlet) : javax_microedition_lcdui_Display; external javax_microedition_lcdui_Display;


{this.constants}
CONST
  str1 = 'hello_w';
  str2 = 'Hello World';
  str3 = '[email protected]';
  str4 = 'exit';
  int1 = 10;


{this.fields}
VAR
  display : javax_microedition_lcdui_Display;   private;         {'Ljavax/microedition/lcdui/Display;'}
  mform   : javax_microedition_lcdui_Form;      private; static; {'Ljavax/microedition/lcdui/Form;'}
  ed_text : javax_microedition_lcdui_TextField; private; static; {'Ljavax/microedition/lcdui/TextField;'}
  exitCmd : javax_microedition_lcdui_Command;   private; static; {'Ljavax/microedition/lcdui/Command;'}
  i       : integer; private; static;


{this.methods}
procedure startApp; public;
begin
  mform.append(ed_text);
  mform.addCommand(exitCmd);
  mform.setCommandListener(this);
  display.setCurrent(mform);
end;

procedure pauseApp; public;
begin
end;

procedure notifyDestroyed; public;
begin
end;

procedure destroyApp(flag : boolean); public;
begin
end;


{'(Ljavax/microedition/lcdui/Command;Ljavax/microedition/lcdui/Displayable;)V'}
procedure commandAction(c : javax_microedition_lcdui_Command;  d : javax_microedition_lcdui_Displayable); public;
begin
  if (c=exitCmd) then
  begin
    destroyApp(false);
    notifyDestroyed;
  end;
end;


{hello; public; - конструктор класса, действия, выполняемые при его создании}
begin
  display := javax_microedition_lcdui_Display.getDisplay(this);
end.
а вообще поле TYPE будет заполнено в отдельном файле, а в программах в поле TYPE будет добавляться только какой-нибудь класс из нестандартного набора. Т.е. другими словами в этом отдельном файле будут находиться “стандартные” подпрограммы языка Pascal


-если очень нужен java исходник, то его можно получить и путем дизассемблирования готового class-файла с помощью программы NMI's Java Code Viewer 6.0.



Сейчас главное определиться с необходимым набором java-команд для pascal-компилятора. И созданием необходимых структур для оформления class-файла.
_________________________________
файл stackmap_works.zip - немного доки
файл JD_.ZIP - декомпилер для экспериментов..
Опять загвоздка с разбором StackMap
его структура такова:
StackMap_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 number_of_entries;
    {
     u2 byte_code_offset;
     u2 number_of_locals;
     ty types_of_locals[number_of_locals];
     u2 number_of_stack_items;
     ty stack_item_types[number_of_stack_items];    
    } entries[number_of_entries];
}

где ty -как я понял, это записи  Constant Pool

в предыдущей версии было сделано распознавание только структуры ConstantPool_Class,
а вообще нужно сделать так:
  ....
  else if s='{utf8}StackMap' then
  begin
    writeln(hex4(rc),'h  StackMap');
    p:=get(p,2);
    pNumber_of_entries := swap2(p);
    writeln('    number_of_entries:',pNumber_of_entries^);
    for n := 1 to pNumber_of_entries^ do
    begin
      writeln(hex4(rc),'h  entries:',n,'__');
      p:=get(p,2);
      pByte_code_offset:=swap2(p);
      p:=get(p,2);
      pNumber_of_locals:=swap2(p);
      writeln('           byte_code_offset: ',pByte_code_offset^);
      writeln('           number_of_locals:[',pNumber_of_locals^,']=');
      for k := 1 to pNumber_of_locals^ do
      begin
        write(hex4(rc-1),'h ',k:3,' ');
        load_const;
      end;
      p:=get(p,2);
      pNumber_of_stack_items:=swap2(p);
      writeln('           number_of_stack_items:[',pNumber_of_stack_items^,']=');
      for k := 1 to pNumber_of_stack_items^ do
      begin
        write(hex4(rc-1),'h ',k:3,' ');
        load_const;{}
      end;
    end;
  end
  ....
и вот тут заковырка неправильно разбирается тип ConstantPool_Utf8

здесь работает нормально
       attribute_name: [1175] -> {utf8}StackMap
       attribute_length:23
0000275Ch  ANY_BLOCK [23]=
0000275C 00 02 00 0D 00 01 07 00 08 00 01 07 00 0F 00 0E    ................
0000276C 00 01 07 00 08 00 00                               .......
а здесь появляется каша после разбора UTF8-строчки в строке 00003064 .. 01 00 01 07..
       attribute_name: [1175] -> {utf8}StackMap
       attribute_length:653
00003064h  ANY_BLOCK [653]=
00003064 00 2C 00 0C 00 02 07 00 08 01 00 01 07 00 0F 00    .,..............
00003074 0D 00 02 07 00 08 01 00 00 00 42 00 03 07 00 08    ..........B.....
00003084 01 07 00 02 00 00 00 69 00 03 07 00 08 01 07 00    .......i........
00003094 02 00 00 00 8B 00 03 07 00 08 01 07 00 02 00 00    ....ï...........
000030A4 00 BE 00 03 07 00 08 01 07 00 02 00 00 00 E0 00    .╛............α.
000030B4 03 07 00 08 01 07 00 02 00 00 00 E2 00 04 07 00    ...........Γ....
000030C4 08 01 07 00 02 01 00 00 01 34 00 07 07 00 08 01    .........4......
000030D4 07 00 02 01 01 01 01 00 00 01 51 00 07 07 00 08    ..........Q.....
000030E4 01 07 00 02 01 01 01 01 00 00 01 59 00 04 07 00    ...........Y....
000030F4 08 01 07 00 02 01 00 00 01 60 00 04 07 00 08 01    .........`......
00003104 07 00 02 01 00 00 01 68 00 04 07 00 08 01 07 00    .......h........
00003114 02 01 00 00 01 70 00 04 07 00 08 01 07 00 02 01    .....p..........
00003124 00 00 01 78 00 04 07 00 08 01 07 00 02 01 00 00    ...x............
00003134 01 80 00 04 07 00 08 01 07 00 02 01 00 00 01 88    .Ç.............ê
00003144 00 04 07 00 08 01 07 00 02 01 00 00 01 8A 00 04    .............è..
00003154 07 00 08 01 07 00 02 01 00 00 01 93 00 05 07 00    ...........ô....
00003164 08 01 07 00 02 01 01 00 00 01 C0 00 05 07 00 08    ..........└.....
00003174 01 07 00 02 01 01 00 00 01 CA 00 05 07 00 08 01    .........╩......
00003184 07 00 02 01 01 00 00 01 D2 00 04 07 00 08 01 07    ........╥.......
00003194 00 02 01 00 00 01 D4 00 04 07 00 08 01 07 00 02    ......╘.........
000031A4 01 00 00 02 1B 00 04 07 00 08 01 07 00 02 01 00    ................
000031B4 00 02 1D 00 04 07 00 08 01 07 00 02 01 00 00 02    ................
000031C4 29 00 05 07 00 08 01 07 00 02 01 01 00 00 02 45    )..............E
000031D4 00 05 07 00 08 01 07 00 02 01 01 00 00 02 4B 00    ..............K.
000031E4 04 07 00 08 01 07 00 02 01 00 00 02 4D 00 04 07    ............M...
000031F4 00 08 01 07 00 02 01 00 00 02 78 00 04 07 00 08    ..........x.....
00003204 01 07 00 02 01 00 00 02 9C 00 04 07 00 08 01 07    ........£.......
00003214 00 02 01 00 00 03 0A 00 04 07 00 08 01 07 00 02    ................
00003224 01 00 00 03 75 00 04 07 00 08 01 07 00 02 01 00    ....u...........
00003234 00 03 78 00 04 07 00 08 01 07 00 02 01 00 00 03    ..x.............
00003244 9C 00 04 07 00 08 01 07 00 02 01 00 00 04 37 00    £.............7.
00003254 04 07 00 08 01 07 00 02 01 00 00 04 CF 00 04 07    ............╧...
00003264 00 08 01 07 00 02 01 00 00 06 17 00 05 07 00 08    ................
00003274 01 07 00 02 01 01 00 00 06 3D 00 05 07 00 08 01    .........=......
00003284 07 00 02 01 01 00 00 07 DF 00 10 07 00 08 01 07    ........▀.......
00003294 00 02 01 01 01 01 01 01 01 01 01 01 01 01 01 00    ................
000032A4 00 08 AA 00 18 07 00 08 01 07 00 02 01 01 01 01    ..¬.............
000032B4 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01    ................
000032C4 01 00 00 08 B2 00 04 07 00 08 01 07 00 02 01 00    ....▓...........
000032D4 00 08 B4 00 04 07 00 08 01 07 00 02 01 00 00 08    ..┤.............
000032E4 C8 00 04 07 00 08 01 07 00 02 01 00 00             ╚............
вроде так выглядит кодирование/декодирование-в utf8
function decodeutf8 : word;
var
  w : word
  n : integer;
begin
  w:=getbyte;
  if w>127 then
  begin
    if (w and $80)=$00 then n:=1;
    if (w and $E0)=$C0 then n:=2
    if (w and $F0)=$E0 then n:=3;
    w := (w and $1F);
    while (n>1) do
    beign
      w:=(w shl 6)+(getbyte and $3F);
      dec(n);
    end;
  end;
  decodeutf8:=w;
end;


putUTF8:
if (w >= 1 and w <= 177) then
begin
  data[length] = byte(w);
  inc(length);
end
else if (w > $07FF) then
begin
  data[length] := byte($E0 or ((w shr 12) and $0F));
  inc(length);
  data[length] := byte($80 or ((w shr 6) and $3F));
  inc(length);
  data[length] := byte($80 or (w and $3F));
  inc(length);
end 
else
begin
  data[length] := byte($C0 or ((w shr 6) and $1F));
  inc(length);
  data[length] := byte($80 or (w and $3F));
  inc(length);
end;
подскажите кто знает в чем ошибка!
Вложения
Тип файла: zip JD_.ZIP (53.0 Кб, 457 просмотров)
Тип файла: zip stackmap_works.zip (6.2 Кб, 526 просмотров)
(Offline)
 
Ответить с цитированием