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

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

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

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

Ответ
 
Опции темы
Старый 24.10.2008, 19:38   #76
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Вчера в спешке откомпилил и скинул старую версию дизассемблера, вот последняя.
Исправленны некоторые ошибки, возникающие при разборе определенных классов.

Для удобства дизассемблирования можно применить bat-файл, он преобразует длинные пути и имена с пробелами и длинными расширениями в короткие-dos.
Использование: выделить мышкой группу "*.class" файлов (до 255 шт.) и перетащить на этот батник или его ярлык. bat-файл должен находиться в каталоге с программой jd.exe.
также можно поставить настройку на "*.class" файлы "Открыть с помощью" и указываем этот bat.

____
jdisasm.bat
echo off
set prog=%~dp0jd.exe
:n1
if -%1==- goto :n2
echo %~sf1
%prog% %~sf1 > "%~dpn1.txt"
shift
goto :n1
:n2
pause
___
В случае замены константы можно поступить способом как предлогал в самом начале:
-Т.е. берем и делим бинарный *.class-файл, в месте где у нас находиться необходимая константа.
-Должно получится два кусочка: до константы и после константы.
-В проге генерируем серединку (строку-массив) и сохраняем в файл.
-И завершении склеиваем все три файла: НАЧАЛО + НАШ_КУСОЧЕК + ОСТАЛЬНАЯ_ЧАСТЬ

___
Народ! половина работы почти сделана, теперь нужно доработать java-assembler. и сделать генератор-конвертировщик с языка Pascal в asm-текстовый-исходник предоставленного формата.
Написанный ассемблер позволяет размещать структурные единицы в произвольных местах, но желательно придерживаться предложенного формата:
объявление классов
объявление имен_и_типов
прочие переменные
интерфейсы
поля
методы
___
p.s.: не откажусь от помощи, т.к. мало времени и много дел...

просьба админам добавить default-пользователя с которого можно было-бы скачивать выложенные архивы и резместить имя и логин на страничке скачивания
Вложения
Тип файла: zip jd.zip (20.2 Кб, 341 просмотров)
(Offline)
 
Ответить с цитированием
Старый 24.10.2008, 20:27   #77
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Народ! половина работы почти сделана, теперь нужно доработать java-assembler. и сделать генератор-конвертировщик с языка Pascal в asm-текстовый-исходник предоставленного формата.
Написанный ассемблер позволяет размещать структурные единицы в произвольных местах, но желательно придерживаться предложенного формата:
объявление классов
объявление имен_и_типов
прочие переменные
интерфейсы
поля
методы
А я чем занимаюсь??? Сижу и пишу парсер (с оптимизом минимальным)
как ток допишу, останецо токма разобрать структуры и контекстный пул заполнить!!!

ЗЫ...

Экзешник - исполняемый файл для Windows( типа Notepad.exe )
вот файл, написан коряво, так как надо было общюю суть передать, но работает и компилит вроде...
Вложения
Тип файла: zip php.zip (3.2 Кб, 359 просмотров)
(Offline)
 
Ответить с цитированием
Старый 24.10.2008, 21:08   #78
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: создание MIDletPascal compiler'a

Ггггг... Я так и подумал... Только вот какое он имеет отношение к Java? Я для компа никогда ничего не писал. Я Java-то толком не знаю. =) Как он мне поможет?
(Offline)
 
Ответить с цитированием
Старый 25.10.2008, 00:56   #79
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Поможет разобраться как делать файл по его описанию...
Тоесть берёте описание Class файла и с помощью php собираете его в рабочий код,
почитайте с начала темы, и поймете, что это не так уж и трудно, по смещению (не по адресу) который виден в редакторах, а по смещению от этих адресов, находить и модифицировать код какой вам нужен.
В примере создаётся файл при запуске которого вылетает ОКНО СООБЩЕНИЯ (вроде Hello Word) откройте его HEX редактором и сравните с кодом на PHP как происходит процесс записи байтов в файл, так же там комменты для того, что бы знать для чего те или иные байты в файле служат...
Ну и т.д....
(Offline)
 
Ответить с цитированием
Старый 25.10.2008, 09:19   #80
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: создание MIDletPascal compiler'a

Спасибо, поковыряю. Но мне ведь не надо писать компилятор или ассемблер. Мне вообще минимум надо реализовать. Хотя... Если азарт возьмёт верх... Особенно если быстро въеду как это делается.
(Offline)
 
Ответить с цитированием
Старый 25.10.2008, 21:50   #81
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Доработал некоторые структуры - теперь полученный class-файл дизассемблируется и декомпилиться в NMI's Java Code Viewer 6.0, но WTK 2.5 отказывается его запускать... видимо где-то несоответствие типов, выложил в архиве последнюю версию java-assembler'a адаптированную для компиляции как в TurboPascal так и Delphi.
В архиве также оригинальный class-файл сделанный в WTK 2.5,
и компилированный в нашем ассемблере...
___
satan сравни-ка, теперь нужно немножко добрать, чтоб запускался...
в MidpX не пробуй, почему-то не работает даже оригинальны hello.class, хотя WTK-эмулятор запускает нормально
Вложения
Тип файла: zip jcc.zip (31.3 Кб, 354 просмотров)
(Offline)
 
Ответить с цитированием
Старый 27.10.2008, 22:06   #82
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

нужно создавать структуру StackMap_attribute в ней записываются типы переменных которые лежат в стеке и параметров метода. это записывается на стадии верификации (проверки) класса. кто-нить найдите подробное описание, похоже там структура переменного размера
(Offline)
 
Ответить с цитированием
Старый 30.10.2008, 19:53   #83
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

нашел пару интересных сайтов по java-bytecode.
доработал java-bytecode assembler и java-bytecode disassembler.
теперь разбирают структуру StackMap_attribute,
также доработал вычисление размера стека max_stack для компилируемого метода.

Теперь созданные программы запускаются в эмуляторе WTK 2.5
___
общие принципы и методы создания java-программ.
инфа для начинающих
http://www.uran.donetsk.ua/~students...s/pro/2/2.html

грамотное описание формата класса и работы и ним на примере исходника, жаль не попадалось раньше.. тогда б несколько по иному спроектировал алгоритм java - ассемблера
http://devdaily.com/java/jwarehouse/...sm/index.shtml
___
LearnJavaByExample.zip - сохраненные страницы с представленных сайтов
java_.zip - последнии версии java ассемблера/дизассемблера.

___
p.s. необходимо проверить работу алгоритмов и профиксить погрешности. сюда заглядывают java-програмисты?.. необходима помощь в тестировании
Вложения
Тип файла: zip LearnJavaByExample.zip (78.6 Кб, 352 просмотров)
Тип файла: zip java_.zip (45.5 Кб, 351 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Piligrim (31.10.2008)
Старый 30.10.2008, 20:26   #84
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

теперь немножко о формате asm-файла для компиляции.
Файл компилируется без каких либо проверок на корректность объявленных структур, синтаксиса описания команд - частично.
Первая строка файла - команда объявление текущего класса.

команды ассемблера:
class внутренне_имя_класса его_строковый_тип
nameandtype имя_переменной его_строковый_тип
другие_константы_(string, int и т.д.) внутренне_имя строка_или_число
interface строковое_имя_ранее_объявленнго_класса
field "указываем_атрибуты" имя_переменной_nameandtype
method "указываем_атрибуты" имя_метода его_строковый_тип

между блоками method ... endmethod указываются java-bytecode команды
и объявляются блоки localvariabletable stackmap, которые обнуляются при выходе из текушего метода командой endmethod

синтаксис описания bytecode можно получить дизассемблированием программой jd.exe любого class-файла

localvariabletable имя_переменной "ее_строковый_тип"
stackmap "строковый_тип" смещение_в_стеке:_ 0_или_1,

где 0_это_параметр_локальной_переменной; 1_параметр_стековой_переменной
_____
вот пример asm-файл j2me программы hello.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class hello extends MIDlet implements CommandListener {

  private Display display;
  private static Form mform = new Form("hello_w");
  private static TextField ed_text = new TextField("Hello World", "[email protected]", 256, 0);
  private static Command exitCmd = new Command("exit", 1, 2);

  public hello() {
    display = Display.getDisplay(this);
  }

  public void startApp() {
    mform.append(ed_text);
    mform.addCommand(exitCmd);
    mform.setCommandListener(this);
    display.setCurrent(mform);
  }

  public void pauseApp() {}

  public void destroyApp(boolean flag) {}

  public void commandAction(Command c, Displayable d) {
    if(c == exitCmd) {
      destroyApp(false);
      notifyDestroyed();
    }
  }

}
class       hello                                     "hello"
class       javax_microedition_lcdui_Display          "javax/microedition/lcdui/Display"
class       javax_microedition_lcdui_Form             "javax/microedition/lcdui/Form"
class       javax_microedition_lcdui_TextField        "javax/microedition/lcdui/TextField"
class       javax_microedition_lcdui_Command          "javax/microedition/lcdui/Command"
class       javax_microedition_midlet_MIDlet          "javax/microedition/midlet/MIDlet"
class       javax_microedition_lcdui_Displayable      "javax/microedition/lcdui/Displayable"
class       javax_microedition_lcdui_CommandListener  "javax/microedition/lcdui/CommandListener"


nameandtype display                                   "Ljavax/microedition/lcdui/Display;"
nameandtype mform                                     "Ljavax/microedition/lcdui/Form;"
nameandtype ed_text                                   "Ljavax/microedition/lcdui/TextField;"
nameandtype exitCmd                                   "Ljavax/microedition/lcdui/Command;"
nameandtype append                                    "(Ljavax/microedition/lcdui/Item;)I"
nameandtype addCommand                                "(Ljavax/microedition/lcdui/Command;)V"
nameandtype setCommandListener                        "(Ljavax/microedition/lcdui/CommandListener;)V"
nameandtype setCurrent                                "(Ljavax/microedition/lcdui/Displayable;)V"
nameandtype getDisplay                                "(Ljavax/microedition/midlet/MIDlet;)Ljavax/microedition/lcdui/Display;"
nameandtype destroyApp                                "(Z)V"
nameandtype notifyDestroyed                           "()V"


string      str1                                      "hello_w"
string      str2                                      "Hello World"
string      str3                                      "[email protected]"
string      str4                                      "exit"
integer     int1                                      10


interface javax_microedition_lcdui_CommandListener


field "PRIVATE"        display
field "PRIVATE STATIC" mform
field "PRIVATE STATIC" ed_text
field "PRIVATE STATIC" exitCmd


method "PUBLIC" <init> "()V"
localvariabletable this "Lhello;"
aload_0          
invokenonvirtual {2B methodref}  javax_microedition_midlet_MIDlet:<init> "()V"
aload_0          
aload_0          
invokestatic     {2B methodref}  javax_microedition_lcdui_Display.getDisplay
putfield         {2B fieldref}   hello.display
return     
endmethod


method "PUBLIC" startApp "()V"
localvariabletable this "Lhello;"
getstatic        {2B fieldref}   hello.mform
getstatic        {2B fieldref}   hello.ed_text
invokevirtual    {2B methodref}  javax_microedition_lcdui_Form.append
pop              
getstatic        {2B fieldref}   hello.mform
getstatic        {2B fieldref}   hello.exitCmd
invokevirtual    {2B methodref}  javax_microedition_lcdui_Form.addCommand
getstatic        {2B fieldref}   hello.mform
aload_0          
invokevirtual    {2B methodref}  javax_microedition_lcdui_Form.setCommandListener
aload_0          
getfield         {2B fieldref}   hello.display
getstatic        {2B fieldref}   hello.mform
invokevirtual    {2B methodref}  javax_microedition_lcdui_Display.setCurrent
return
endmethod


method "PUBLIC" pauseApp "()V"
localvariabletable this "Lhello;"
return
endmethod


method "PUBLIC" destroyApp "(Z)V"
localvariabletable this    "Lhello;"
localvariabletable destroy "Z"
return
endmethod


method "PUBLIC" commandAction "(Ljavax/microedition/lcdui/Command;Ljavax/microedition/lcdui/Displayable;)V"
localvariabletable this "Lhello;"
localvariabletable c    "Ljavax/microedition/lcdui/Command;"
localvariabletable d    "Ljavax/microedition/lcdui/Displayable;"
aload_1          
getstatic        {2B fieldref}   hello.exitCmd
if_acmpne        $000C 
aload_0          
iconst_0         
invokevirtual    {2B methodref}  hello.destroyApp
aload_0          
invokevirtual    {2B methodref}  hello.notifyDestroyed
return
stackmap "hello" 16 0
stackmap "javax/microedition/lcdui/Command" 16 0
stackmap "javax/microedition/lcdui/Displayable" 16 0{}
endmethod


method "STATIC" <clinit> "()V"
new              {2B class}      javax_microedition_lcdui_Form
dup              
ldc1             {1B string}     str1
invokenonvirtual {2B methodref}  javax_microedition_lcdui_Form:<init> "(Ljava/lang/String;)V"
putstatic        {2B fieldref}   hello.mform
new              {2B class}      javax_microedition_lcdui_TextField
dup              
ldc1             {1B string}       str2
ldc1             {1B string}       str3
sipush           $0100 
iconst_0         
invokenonvirtual {2B methodref}  javax_microedition_lcdui_TextField:<init> "(Ljava/lang/String;Ljava/lang/String;II)V"
putstatic        {2B fieldref}   hello.ed_text
new              {2B class}      javax_microedition_lcdui_Command
dup              
ldc1             {1B string}       str4
iconst_1         
iconst_2         
invokenonvirtual {2B methodref}  javax_microedition_lcdui_Command:<init> "(Ljava/lang/String;II)V"
putstatic        {2B fieldref}   hello.exitCmd
return
endmethod
(Offline)
 
Ответить с цитированием
Старый 02.11.2008, 08:27   #85
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Вобчем хоть убей я всеравно мысли не улавливаю...
Давай обьясню чо я мутю...

Итак, делаю 4 (пока) модуля

global.pas
scaner.pas
parser.pas
codegen.pas

В первом вынес все переменные и константы.
Второй отвечает за разбор исходного текста
Третий по разобраному лепит class файл
четвертый как раз функции генерации class файла.

Принцип следующий.

scaner.pas разбирает исходный текст на слова и возвращает нам
тип слова (оператор, переменная, функция...) парсеру,
парсер в зависимоста от типа вырабатывает вызов функции кодогенератора
который в свою очередь и лепит байт к байту в соответствии с правилами
построения class файла.
Пример

program HelloWord;
begin
writeln('HelloWord');
end.

Парсер запрашивает у сканера тип первого слова
Сканер возвращает program - > оператор - начало программы
Парсер проверяет что бы за этим оператором шло название программы
и точка с запятой, если ошибок не было, парсер делает следующий запрос...

И т.д. и т.п. рекурсивно. В итоге любой язык можно транслировать в другой,
не взирая на синтаксис программиста (переносы строк и т.д) и более того,
к компилятору можно прикрутить любой выходной файл, в принципе повторить
Турбо паскаль не сложно, или бэйсик или яву... Так как функции рекурсивны, то вызов их может быть выполнен из любой точки кода...
Допустим имеем код
a:= 22+ 12.3/45 - (a+b);

За операцию присваевания будет отвечать функция assignment()
за разбор выражения - expression();
В итоге у нас наше присваевание сведется к минимальному разбору

типа assignment( expression()); и рекурсия позволит учитывать приоритет
операций.

Просто у меня пока запарка с работой, а так я уже пишу помалень оптимизированый на этом уровне код, который из строки
a:= 2+3 -1/2 +(a*2-4);

сразу же просчитает все смысловые выражения и странслирует только
a:= 4.5 + (a*2 - 4);

дальше пока не иду....

Вот где самый затор - в оптимизации, остальное все просто дело техники...


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

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

Типа вот так

Компилер рекурсивный

Исходный код на Pascal транслирует в JavaAsm
создаст контекстный пул исходя из записей таблиц переменных, функций
и констант, которые возникнут при работе парсера и сканера.

Для дальнейшего расширения, можно будет копировать сканер с анализом
Java синтаксиса и сделать транслятор Pascal - Java (для разработчиков библиотек
и Java кодеров) таким образом подключив всю яву...

Я хоть немного впилюсь в тему...
(Offline)
 
Ответить с цитированием
Старый 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 Кб, 355 просмотров)
Тип файла: zip stackmap_works.zip (6.2 Кб, 366 просмотров)
(Offline)
 
Ответить с цитированием
Старый 06.11.2008, 21:28   #87
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Доработал java decompiler, разбирает почти все структуры, добавлен алгоритм декодирования utf8, распознавание stackMap и т.д.

Если какой-либо из работающих class-файлов будет декомпилироваться с ошибками, присылайте его в упакованном виде на почтовый ящик: [email protected] с темой сообшения "class file error"

_____
нашел еще неплохой сборник исходников по разбору java-class файлов
http://svn.apache.org/viewvc/jakarta...pathrev=694866

_____
вот страничка с исходниками pascal-компиляторов
http://exmortis.narod.ru/src_pcode.html

для начальных экспериментов по генерации текстового asm-файла предлагаю посмотреть исходник http://exmortis.narod.ru/pcode_src/sc.zip на его базе можно создать пробную модель простого компилятора, а после экспериментов приступить к переработке pascals-компилятора.
Вложения
Тип файла: zip _jd.zip (23.8 Кб, 339 просмотров)
(Offline)
 
Ответить с цитированием
Старый 07.11.2008, 00:07   #88
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Ну наконец то подошли к компиляторам!!! Гы... Я поетому и молчал немножко!!!
На http://exmortis.narod.ru/ я изучил и скачал почти все компилеры (Интерес представляли тока пара 32 битных)

Тут по шагам как сделать компилер на ПАСКАЛЕ http://kit.kulichki.net/crenshaw/crenshaw.html

Советую изучить внимательно статьи и (кстати код вполне там рабочий если поправить пару строк кода) компилятор Inno Pascal - 32 бит с отладчиком по мойму и дебаггером и оптимизацией....

ЗЫ...

Кстати а линуксоиды чево не подключаются... FreePascal тож в исходниках идет!!!

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

22.44 + ((((33.66 - 5*12.5) - 4+12)-(1+5.7)/2)+11);

Ну то есть ядро любого компилера, то есть вычисления, затем, если не будет вопросов
прикручу присваивание и формирование таблицы переменных и таблицы вызовов функций...
Далее булевы операции и управляющие конструкции типа for-next if-then-else ...
И останетцо самая малая часть - разбор прецедур-функций и типизация переменных...
Вложения
Тип файла: zip cmplr.zip (4.7 Кб, 343 просмотров)

Последний раз редактировалось satan, 07.11.2008 в 07:58.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо satan за это полезное сообщение:
abcdef (07.11.2008), scimitar (12.11.2008)
Старый 15.11.2008, 00:25   #89
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Переработал простой компилятор http://exmortis.narod.ru/pcode_src/sc.zip для генерации простого текстового java-asm листинга. Который затем компилируется в class-файл.
_________
Принцип постороения программы:
имеется простой class-файл (prog.class) - эмулятор консоли, работая с методами которого созданный java-код выводит на экран: константный_текст, символ или число и получает числа с поля ввода.
Это минимально рабочий компилятор для создания java-class файлов.
Файлы созданные в полной версии должны работать без дополнительных библиотек и реализовывать все возможности java.
_________
В архиве имеется asm.bat при перетаскивании на который pascal'e-подобного исходника, (примеры: 1.txt; 2.txt; 3.txt; 4.txt) автоматически собирается файл *.cla, его переименовываем в jc.class и добавляем в архив prog.zip, который переименовываем в prog.jar и запускаем
_________
Порядок работы в ручном режиме:
compile.exe list < входной_файл_pas_листинга > выходной_asm_файл
параметр list говорит чтоб выводился только листинг, а программа не запускалась на внутреннем эмуляторе

jcc.exe выходной_class_файл.cla < входной_asm_файл

jd.exe входной_class_файл.cla > выходной_дизассемблированный_файл_для_проверки
_________
Примечание:
компилятор не генерирует структуру StackMap, она необходима если в методе встречаются команды перехода, поэтому если программа не линейная (циклы,условия) - необходимо запистить утилиту preverify.exe которая проверит class-файл на корректность и добавит структуру StackMap.
В архиве также имеется bat-файл с параметрами вызова утилиты preverify.exe, если будете использовать то создайте структуру каталогов
c:\wtk25\bin\preverify.exe
c:\wtk25\lib\midpapi10.jar;
c:\wtk25\lib\cldcapi10.jar;
c:\wtk25\lib\midpapi10.jar;
c:\wtk25\lib\cldcapi10.jar
c:\wtk25\apps\prog\classes
c:\wtk25\apps\prog\tmpclasses
и положите в tmpclasses файл jc.class
Вложения
Тип файла: zip simple.zip (64.6 Кб, 341 просмотров)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо abcdef за это полезное сообщение:
Piligrim (15.11.2008), satan (15.11.2008)
Старый 15.11.2008, 03:24   #90
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Воопче бросай хреновиной занимаца! Оч хорошо что народ разобрался со строением классов, но сейчас требуется копать не байт код компилеры, а в сторону оптимизации!
Для примеру закидываю перевод строки в ОПЗ (потому что тогда генерация в асм идет напрямую без всяких выпендрезов с рекурсией)

http://decoding.narod.ru/practic/pol...ishrecord.html

Во вторых прикрепляю наработку (считает тока целые... пока) но немного надо доточить напильником что бы полностью просчитывала строку.
Как только создадим оптимизатор, мля он станет КОНКУРЕНТНОСПОСОБНЫМ, и более того, потом паскаль просто тупо распарсим и в пул запихнем.

Вообще щас копаю модулу и компилер "странник", достал самокомпилируемые исходники и пробую перевести на паскаль с модулы...
Вложения
Тип файла: zip Scaner.zip (5.0 Кб, 351 просмотров)
(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, время: 12:25.


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