Показать сообщение отдельно
Старый 24.09.2008, 02:36   #26
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Вкуриваем устройство JAVA компилятора!

Итак возьмем наш стандартный файл HelloWord.java и скомпилим его для разбора на косточки.

class
HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
}
}

Вот что получается при просмотре в каком нибудь HEXeditor:

CA FE BA BE ------------------------------------ Кюєѕ
00 00
------------------------------------------ ..
00 30
------------------------------------------ .0
00 1D
------------------------------------------ ..
01 00 0A
--------------------------------------- ...
48 65 6C 6C 6F 57 6F 72 6C 64 ------------------ HelloWorld
07 00 01
--------------------------------------- ...
01 00 10
--------------------------------------- ...
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 -java/lang/Object
07 00 03
--------------------------------------- ...
01 00 04
--------------------------------------- ...
6D 61 69 6E
------------------------------------ main
01 00 16
--------------------------------------- ...
28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72
69 6E 67 3B 29 56
------------------------------ ([Ljava/lang/String.)V
01 00 04
--------------------------------------- ...
43 6F 64 65
------------------------------------ Code
01 00 0F
--------------------------------------- ...
4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 --- LineNumberTable
01 00 03
--------------------------------------- ...
6F 75 74
--------------------------------------- out
01 00 15
--------------------------------------- ...
4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 ------ Ljava/io/Print
53 74 72 65 61 6D 3B
--------------------------- Stream;
0C 00 09 00 0A 01 00 10
------------------------ ........
6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D 20 java/lang/System
..................................................
07 00 0C 09 00 0D 00 0B 01 00 0C 48 65 6C 6C 6F ...........Hello
57 6F 72 6C 64 21 08 00 0F 01 00 07 70 72 69 6E World!......prin
74 6C 6E 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E tln...(Ljava/lan
67 2F 53 74 72 69 6E 67 3B 29 56 0C 00 11 00 12 g/String)V.....
01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 ...java/io/Print
53 74 72 65 61 6D 07 00 14 0A 00 15 00 13 01 00 Stream..........
06 3C 69 6E 69 74 3E 01 00 03 28 29 56 0C 00 17 .<init>...()V...
00 18 0A 00 04 00 19 01 00 0A 53 6F 75 72 63 65 ..........Source
46 69 6C 65 01 00 0F 48 65 6C 6C 6F 57 6F 72 6C File...HelloWorl
64 2E 6A 61 76 61 00 20 d.java.
..................................................
00 02 00 04 00 00 00 00 ........
00 02 00 09 00 05 00 06 00 01 00 07 00 00 00 25 ...............%
00 02 00 01 00 00 00 09 B2 00 0E 12 10 B6 00 16 ........І....¶..
B1 00 00 00 01 00 08 00 00 00 0A 00 02 00 00 00 ±...............
03 00 08 00 04 00 00 00 17 00 18 00 01 00 07 00 ................
00 00 21 00 01 00 01 00 00 00 05 2A B7 00 1A B1 ..!........*·..±
00 00 00 01 00 08 00 00 00 0A 00 02 00 00 00 01 ................
00 04 00 01 00 01 00 1B 00 00 00 02 00 1C ..............

Я разделил на секции, что бы было понятнее. Поехали.

Сигнатура CLASS файла.

CA FE BA BE Кюєѕ

Далее идет описание младшей и старшей версии компилятора

00 00 .. // Младшая 0.0
00 30 .0 // Старшая 3.0

Число объектов в описании файла

00 1D ..

Тоесть число всех наших записей в пуле

HelloWorld
java/lang/Object
main
([Ljava/lang/String)V
Code
LineNumberTable

Тут равно 29... нужно проверить на меньшее значение!?

Самое интересное начинается. Описание или КОНСТАНТНЫЙ ПУЛ

По таблице смотрим 1 байт или tag, он равен 01 или в переводе CONSTANT_Utf8, тобиш значит в описании будет срока UTF8, следующие два поля 00 0А говорят нам о количестве элементов пула, то есть по просту размер строки который тут равен 10 или в 16h
01 00 0A ...
Потом идет сама строка
48 65 6C 6C 6F 57 6F 72 6C 64 HelloWorld
Сдесь я ещё не совсем вкурил но по всему, что это CONSTANT_Class
07 00 01
Далее опять описание CONSTANT_Utf8 строки и размер
01 00 10 ...
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 java/lang/Object

И так далее и тому подобное...Тоесть проще не куда, вот поэтому наверно декомпилировать классы очень легко, но тут возникает проблемка, компилятор придется делать в купе с транслятором PASCAL->JAVA, а затем уже компилировать, можно в принципе и сразу, но писать придется на чистом ООП...

Последний раз редактировалось satan, 24.09.2008 в 02:56.
(Offline)
 
Ответить с цитированием