Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
Ответ: создание MIDletPascal compiler'a
спасибо! это уже что-то, хотя решение не простое, и нужно ставить java.
буду смотреть...
при беглом просмотре скачанных файлов меня заинтересовали исходники, т.е. *.class-файлы из каталога pascal.zip/pascal/pas3/mhc/compiler/
P.S. можно конечно сделать конвертирощик из pascal-исходника в java-исходник, но идея состоит именно в получении готового *.class-файла без дополнительных утилит и программ
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
Re: создание MIDletPascal compiler'a
Тогда вот пример создания PE файла, расписана почти вся структура, короче прилепить суда тока Синт. и Лексич. анализаторы и готов компилер в exe. http://sharing.ho.com.ua/freeide/test.zip бинарный файл (5.45кб)
Ща поднимаю форматы class файлов, но по памяти там вроде все в массивы запихнуто, типа
0х00 Массив структур
0х20 Массив классов
.........................
Помню что там чота оч простое.
Потом хорошоб достать Java декомпилер (ща пробую исходники достать)
А вообще надо с автором MP насчет исходников как то связаца.
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
Ответ: создание MIDletPascal compiler'a
satan сенкс, активное участие и за последнюю ссылку! правда в доке что я выкладывал написано то же, но на английском...
С PE заголовками думаю не стоит лезть в дебри, компилятор делфы, или другой сам все сделает, мы же не соревнуемся в создании самого маленького компилятора ))
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
Re: создание MIDletPascal compiler'a
Ну да... просто я к тому, что в принципе база для создания всего что нужно уже есть, причом CLASS файлы луче создавать именно массивом а не структурами, так как это работает в несколько сот раз быстрее... Гы...
весь не привожу сами увидите, ну что открываем спецификацию и пробуем разобраться
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
...........................
Разбиваем наш БК как я понял u2..u4 это кол-во байт, и согласно этому получаем
CA FE BA BE // MAGIC - магическое число u4(4 байта)
00 00 // Minor version - младшая версия Java u2(2 байта)
00 30 // Major version - старшая версия Java u2(2 байта)
00 1D // Constant_pool_count u2(2байта)
....................................
Так вот ребята, у кого старшая версия компилера (4.5) проверте мое предположение насчот u1..u2..u4 типов, если я прав, то тогда попробую расписать полностью формат CLASS файла по смещениям, потом попробуем в ручную создать, прям в байт-коде простенькое приложение, и если получица, будем хренарить уже компилер...
ЗЫ...
Магическое число прикольное - Кафе бабе, прям как у нас Кабак и Бабы :D
Последний раз редактировалось satan, 23.09.2008 в 19:37.
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
Ответ: создание MIDletPascal compiler'a
эх, прийдется все вручную делать...
вообщем вот выдрал список всех java-команд из моего отправленного файла: byte_code.zip, и список команд, используемых в предложенном компиляторе Паскаля...
сразу говорю что не все команды будут использоваться... многие из них это упрощенные константные команды
начинать надобы с простенького ассеблера, на мой взгляд лучше сделать два массива (или области памяти), 1-для записи структур заголовка, 2-й - для записи байт-кода... а еще лучше под каждую структуру заголовка отдельный массив... т.к. компилятор однопроходный, а при разборе текста программы будут добавляться новые вызываемые методы, т.е. заголовок будет расти... после компиляции заголовок а затем код сбрасываются в файл
_________
add = 0; { opcodes }
neg = 1;
mul = 2;
divd = 3;
remd = 4;
div2 = 5;
rem2 = 6;
eqli = 7;
neqi = 8;
lssi = 9;
leqi = 10;
gtri = 11;
geqi = 12;
dupl = 13;
swap = 14;
andb = 15;
orb = 16;
load = 17;
stor = 18;
hlt = 19; { terminate program }
stop = 20; { end of code }
wri = 21;
wrc = 22;
wrl = 23;
rdi = 24;
rdc = 25;
rdl = 26;
eofi = 27; { check eof }
eol = 28;
ldc = 29;
lda = 30; { load address }
ldla = 31;
ldl = 32;
ldg = 33;
stl = 34;
stg = 35;
move = 36;
copy = 37;
addc = 38;
mulc = 39;
jump = 40;
jumpz = 41;
call = 42;
adjs = 43;
sets = 44;
exit = 45;
---------------------
aconst_null = 1; //Загрузка в стек null ( пустой ссылки на объект)
iconst_m1 = 2; //Загрузка целочисленной константы -1
iconst_0 = 3; //Загрузка целочисленной константы 0
iconst_1 = 4; //Загрузка целочисленной константы 1
iconst_2 = 5; //Загрузка целочисленной константы 2
iconst_3 = 6; //Загрузка целочисленной константы 3
iconst_4 = 7; //Загрузка целочисленной константы 4
iconst_5 = 8; //Загрузка целочисленной константы 5
lconst_0 = 9; //Загрузка длинной целочисленной константы 0
lconst_1 = 10; //Загрузка длинной целочисленной константы 1
fconst_0 = 11; //Загрузка вещественного числа одинарной точности 0
fconst_1 = 12; //Загрузка вещественного числа одинарной точности 1
fconst_2 = 13; //Загрузка вещественного числа одинарной точности 2
dconst_0 = 14; //Загрузка вещественного числа двойной точности 0
dconst_1 = 15; //Загрузка вещественного числа двойной точности 1
bipush = 16; //1,Загрузка в стек однобайтового целого со знаком
sipush = 17; //2,Загрузка в стек двухбайтового целого со знаком
ldc1 = 18; //1,Загрузка в стек элемента из константного пула
ldc2 = 19; //2,Загрузка в стек элемента из константного пула
ldc2w = 20; //2,Загрузка в стек длинного целого или двойного вещественного значения из константного пула
iload = 21; //1,Загрузка целого из локальной переменной
lload = 22; //1,Загрузка длинного целого из локальной переменной
iload_0 = 26; //Загрузка целого из локальной переменной 0
iload_1 = 27; //Загрузка целого из локальной переменной 1
iload_2 = 28; //Загрузка целого из локальной переменной 2
iload_3 = 29; //Загрузка целого из локальной переменной 3
lload_0 = 30; //Загрузка длинного целого из локальной переменной 0
lload_1 = 31; //Загрузка длинного целого из локальной переменной 1
lload_2 = 32; //Загрузка длинного целого из локальной переменной 2
lload_3 = 33; //Загрузка длинного целого из локальной переменной 3
fload = 23; //1,Загрузка вещественного одинарной точности из локальной переменной
fload_0 = 34; //Загрузка вещественного одинарной точности из локальной переменной 0
fload_1 = 35; //Загрузка вещественного одинарной точности из локальной переменной 1
fload_2 = 36; //Загрузка вещественного одинарной точности из локальной переменной 2
fload_3 = 37; //Загрузка вещественного одинарной точности из локальной переменной 3
dload = 24; //1,Загрузка вещественного двойной точности из локальной переменной
dload_0 = 38; //Загрузка вещественного двойной точности из локальной переменной 0
dload_1 = 39; //Загрузка вещественного двойной точности из локальной переменной 1
dload_2 = 40; //Загрузка вещественного двойной точности из локальной переменной 2
dload_3 = 41; //Загрузка вещественного двойной точности из локальной переменной 3
aload = 25; //1,Загрузка объектной ссылки из локальной переменной
aload_0 = 42; //Загрузка объектной ссылки из локальной переменной 0
aload_1 = 43; //Загрузка объектной ссылки из локальной переменной 1
aload_2 = 44; //Загрузка объектной ссылки из локальной переменной 2
aload_3 = 45; //Загрузка объектной ссылки из локальной переменной 3
istore = 54; //1,Сохранение целого значения в локальной переменной
istore_0 = 59; //Сохранение целого в локальной переменной 0
istore_1 = 60; //Сохранение целого в локальной переменной 1
istore_2 = 61; //Сохранение целого в локальной переменной 2
istore_3 = 62; //Сохранение целого в локальной переменной 3
lstore = 55; //1,Сохранение длинного целого в локальной переменной
lstore_0 = 63; //Сохранение длинного целого в локальной переменной 0
lstore_1 = 64; //Сохранение длинного целого в локальной переменной 1
lstore_2 = 65; //Сохранение длинного целого в локальной переменной 2
lstore_3 = 66; //Сохранение длинного целого в локальной переменной 3
fstore = 56; //1,Сохранение вещественного одинарной точности в локальной переменной
fstore_0 = 67; //Сохранение вещественного одинарной точности в локальной переменной 0
fstore_1 = 68; //Сохранение вещественного одинарной точности в локальной переменной 1
fstore_2 = 69; //Сохранение вещественного одинарной точности в локальной переменной 2
fstore_3 = 70; //Сохранение вещественного одинарной точности в локальной переменной 3
dstore = 57; //1,Сохранение двойного вещественного в локальной переменной
dstore_0 = 71; //Сохранение двойного вещественного в локальной переменной 0
dstore_1 = 72; //Сохранение двойного вещественного в локальной переменной 1
dstore_2 = 73; //Сохранение двойного вещественного в локальной переменной 2
dstore_3 = 74; //Сохранение двойного вещественного в локальной переменной 3
astore = 58; //1,Сохранение объектной ссылки в локальной переменной
astore_0 = 75; //Сохранение объектной ссылки в локальной переменной 0
astore_1 = 76; //Сохранение объектной ссылки в локальной переменной 1
astore_2 = 77; //Сохранение объектной ссылки в локальной переменной 2
astore_3 = 78; //Сохранение объектной ссылки в локальной переменной 3
iinc = 132; //2,Увеличение локальной переменной на константу
wide = 196; //1,Расширенный индекс для доступа к локальным переменным для команд загрузки, сохранения и приращения
newarray = 188; //atype> T_BOOLEAN=4,T_CHAR=5,T_FLOAT=6,T_DOUBLE=7,T_BYTE=8 ,T_SHORT=9,T_INT=9,T_LONG=11
anewarray = 189; //2,Объявление нового массива из ссылок на объекты
multianewarray = 197; //2,Размещение нового многомерного массива
arraylength = 190; //Возвращает длину массива
iaload = 46; //Загрузка целого из массива
laload = 47; //Загрузка длинного целого из массива
faload = 48; //Загрузка вещественного из массива
daload = 49; //Загрузка двойного вещественного из массива
aaload = 50; //Загрузка объектной ссылки из массива
baload = 51; //Загрузка байта со знаком из массива
caload = 52; //Загрузка символа из массива
saload = 53; //Загрузка короткого из массива
iastore = 79; //Сохранение в целочисленном массиве
lastore = 80; //Сохранение в массиве из длинных целых
fastore = 81; //Сохранение в массиве из одинарных вещественных
dastore = 82; //Сохранение в массиве из двойных вещественных
aastore = 83; //Сохранение в массиве из объектных ссылок
bastore = 84; //Сохранение в массиве байтов со знаком
castore = 85; //Сохранение в символьном массиве
sastore = 86; //Сохранение в массиве из коротких целых
nop = 0; //Ничего не делает
pop = 87; //Извлечение слова с вершины стека
pop2 = 88; //Извлечение двух слов с вершины стека
dup = 89; //Дублирование слова на вершине стека
dup2 = 92; //Дублирование двух слов на вершине стека
dup_x1 = 90; //Дублирование слово на вершине стека и помещение копии в стек на два слова ниже
dup2_x1 = 93; //Дублирование двух слов на вершине стека и помещение копий на два слова ниже
dup_x2 = 91; //Дублирование вершины стека и помещение копии на три слова ниже
dup2_x2 = 94; //Дублирование двух слов на вершине стека и помещение копий на три слова ниже
swap = 95; //Обмен двух слов на вершине стека
iadd = 96; //Сложение целых
ladd = 97; //Сложение длинных целых
fadd = 98; //Сложение одинарных вещественных
dadd = 99; //Сложение двойных вещественных
isub = 100; //Вычитание целых
lsub = 101; //Вычитание длинных целых
fsub = 102; //Вычитание одинарных вещественных
dsub = 103; //Вычитание двойных вещественных
imul = 104; //Умножение целых
lmul = 105; //Умножение длинных целых
fmul = 106; //Умножение одинарных вещественных
dmul = 107; //Умножение двойных вещественных
idiv = 108; //Деление целых
ldiv = 109; //Деление длинных целых
fdiv = 110; //Деление одинарных вещественных
ddiv = 111; //Деление двойных вещественных
irem = 112; //Остаток от деления целых
lrem = 113; //Остаток от деления длинных целых
frem = 114; //Остаток от деления одинарных вещественных
drem = 115; //Остаток от деления двойных вещественных
ineg = 116; //Отрицание целого
leg = 117; //Отрицание длинного целого
fneg = 118; //Отрицание одинарного вещественного
dneg = 119; //Отрицание двойного вещественного числа
ishl = 120; //Сдвиг целого влево
ishr = 122; //Арифметический сдвиг целого вправо
iushr = 124; //Логический сдвиг целого вправо
lshl = 121; //Сдвиг длинного целого влево
lshr = 123; //Арифметический сдвиг длинного целого вправо
lushr = 125; //Логический сдвиг длинного целого вправо
iand = 126; //Логическое И с операндами целого типа
land = 127; //Логическое И с операндами длинного целого типа
ior = 128; //Логическое ИЛИ с целочисленными операндами
lor = 129; //Логическое ИЛИ с операндами длинного целого типа
ixor = 130; //Исключающее ИЛИ с целочисленными операндами
lxor = 131; //Исключающее ИЛИ с операндами длинного целого типа
i2l = 133; //Преобразование целого в длинное целое
i2f = 134; //Целое в вещественное
i2d = 135; //Целое в двойное вещественное
l2i = 136; //Длинное целое в целое
l2f = 137; //Длинное целое в вещественное
l2d = 138; //Длинное целое в двойное вещественное
f2i = 139; //Вещественное в целое
f2l = 140; //Вещественное в длинное целое
f2d = 141; //Вещественное в двойное вещественное
d2i = 142; //Двойное вещественное в целое
d2l = 143; //Двойное вещественное в длинное целое
d2f = 144; //Двойное вещественное в вещественное
int2byte = 145; //Целое в знаковый байт
int2char = 146; //Целое в символ
int2short = 147; //Целое в короткое
ifeq = 153; //2,Переход, если равно 0
ifnull = 198; //2,Переход, если пустой указатель
iflt = 155; //2,Переход, если меньше 0
ifle = 158; //2,Переход, если меньше или равно 0
ifne = 154; //2,Переход, если не равно 0
ifnonnull = 199; //2,Переход, если не пустой указатель
ifgt = 157; //2,Переход, если больше 0
ifge = 156; //2,Переход, если больше или равно 0
if_icmpeq = 159; //2,Переход, если целые равны
if_icmpne = 160; //2,Переход, если целые не равны
if_icmplt = 161; //2,Переход, если целое меньше 0
if_icmpgt = 163; //2,Переход, если целое больше 0
if_icmple = 164; //2,Переход, если целое меньше или равно
if_icmpge = 162; //2,Переход, если целое больше или равно
lcmp = 148; //Сравнение длинных целых
fcmpl = 149; //Сравнение вещественных одинарной точности (-1 при NaN)
fcmpg = 150; //Сравнение вещественных одинарной точности (1 при NaN)
dcmpl = 151; //Сравнение вещественных двойной точности(-1 при NaN)
dcmpg = 152; //Сравнение вещественных двойной точности(1 при NaN)
if_acmpeq = 165; //2,Переход, если ссылки на объект равны
if_acmpne = 166; //2,Переход, если ссылки на объект не равны
goto = 167; //2,Переход на
goto_w = 200; //4,Переход на (расширенный индекс)
jsr = 168; //2,Переход на подпрограмму
jsr_w = 201; //4,Переход на подпрограмму (расширенный индекс)
ret = 169; //1,Возврат из подпрограммы
ret_w = 209; //2,Возврат из подпрограммы (расширенный индекс)
ireturn = 172; //Возврат целого значения функции
lreturn = 173; //Возврат длинного целого значения функции
freturn = 174; //Возврат одинарного вещественного значения функции
dreturn = 175; //Возврат двойного вещественного значения функции
areturn = 176; //Возврат объектной ссылки из функции
return = 177; //Возврат(опустошающий) из процедуры
breakpoint = 202; //Остановка и передача контроля обработчику прерываний
tableswitch = 170; //Доступ к таблице перехода по индексу и переход
lookupswitch = 171; //Доступ к таблице перехода по сравнению с ключом и переход
putfield = 181; //2,Установка поля в объекте
getfield = 180; //2,Перенос поля из объекта
putstatic = 179; //2,Установка статического поля в классе
getstatic = 178; //2,Получение статического поля класса
invokevirtual = 182; //2,Вызывает метод экземпляра, основываясь на типе времени выполнения
invokenonvirtual = 183; //2,Вызывает метод экземпляра, основываясь на не виртуальном типе
invokestatic = 184; //2,Вызов метода класса (статического метода)
invokeinterface = 185; //4,Вызывает метод интерфейса
athrow = 191; //Генерация обработки или ошибки
new = 187; //2,Создает новый объект
checkcast = 192; //2,Проверяет, что объект имеет данный тип
instanceof = 193; //2,Определяет, имеет ли объект данный тип
monitorenter = 194; //Вход в контролируемую область кода
monitorexit = 195; //Выход из контролируемой области кода
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
Re: создание MIDletPascal compiler'a
Ну ты монстрище... Мля, зачот, не знаю прада как тут плюсы ставить, да и хрен с ними... Потом обставимся...
Такис, ча займусь токда переводом примера верхнего на нормальный язык.
А насчот массивов - то да, структуры можн писать write() но медленно работает, токда как BlockWrite() и массивы помойму в 10 000 раз быстрее, тем боле что сам dcc32.exe на С++ написан, а все что написано на Си по определению луче на массивы перевести. Здорово оно с ними работает.
Кста можно извратица в Delphi и сделать чота типа типизированых массивов, шоб голову не ломать с типами данных, определить тип вроде _head,_cpool...
а потом просто обращатся к ним напрямую, Header[_head][$0] = $CA
извратица б ишо как нить так Header[_head][0..3] := ([$0,$1,$2,$3]);
Ну да ето просто вопрос техники...
Я разделил на секции, что бы было понятнее. Поехали.
Сигнатура 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 или 0А в 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.
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
Re: создание MIDletPascal compiler'a
Все братва, разобрался...
Все просто, как и все простое... Гы...
Значит давайте пройдем маленький цикл компиляции в ручную, что бы понять смысл байт-кода. class HelloWorld{ public static voidmain(String [] args){ System.out.println("Hello World!"); } }
Вообщем, весь процесс сводится к записи двумерного массива примерно так, читаем сверху в низ class HelloWorld HelloWorld– это строка, значит тип UTF8 Array[1][0..0A]=” HelloWorld” 48 65 6C 6C 6F 57 6F 72 6C 64 Это класс, значит просто указываем на имя класса Array[2][0..03]=” 01”[0001]->HelloWorld07 00 01 Вызываем стандартные библиотеки Java Array[3][0..10]=”java/lang/Object” .......
И т.д, тоесть нам надо описать тип новый массива и писать в него 4 поля которые нам нужны, мы всегда знаем, это индекс массива, его длину, его содержимое и его тип, потом этот массив считываем в файл и добавляем асм код стандартных функций Java...
А теперь шо я хотел написать на форуме МП.
Здаров гандоны и пиндосы!
Шож вы паскуды заныкали исходники MP? Вам мля все наверно денег мало?
Типа считая себя пердячей косточкой вселенной, вы решили, что имеете
право делать все? Никуя... Уроды вы вонючие... Накуй нам теперь нужен
ваш ссаный код, мы решили сами написать систему, которая урыкает нах
вашу паибень, как волк овечку.
Спрашивается, на кой куй постить в форуме такие заявки?
Отвечу, мля за вас – да патаму что вы, как использованный презерватив.
Ни себе ни людям. Если вы думаете, что таким образом вы поднимете себе
рейтинг и уважение, то вы прямехонько, с такими мыслями попадаете пальцем
в попу. Причом хорошо если в свою. Суки вы бл@ продажные, теперь, кокда
мы разрабатываем систему, пусть тока хоть один инглоязычный пес пернет
на своем тухлом языке шо нить по поводу объяснения как работает система.
Не можите поступать по человечиски и к вам будет такой же отношение.
Я нах все сказал!
МЛЯ!!!
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
Ответ: создание MIDletPascal compiler'a
вложенный файл <1.zip> - кусочек из "Canterbury Pascal for J2ME" (компилятора написанного на java).
файл pascal/pas3/mhc/compiler/ClassFile.* дает структуру и некоторые алгоритмы записи.
Анализировать классы буду когда полностью спроектирую удобную структуру представления в delphi, т.е. когда корректно будут загружаться хотябы простейшие class-файлы.
кто хочет поучавствовать в проекте вот декомпилер calss-файлов: Java Code Viewer 6.0. -keyGen внутри архива
(конвертирует из *.class в *.java)
ссылка на скачивание http://www.samsfan.ru/soft/?action=get&openwin=1&id=49
если есть дельные советы прошу выкладывать кусочки кода, или ссылки для скачки исходников java-виртуальных_машин/ассемблеров/дизассемблеров/и т.д. но в пределах разумного, я каждый байт в инете считаю...
p.s. Давайте не будем ругаться,... потому что:
1. пользуемся чей-то выложенной в инете информацией
2. какой-бы не был MP, на нем другие работают
3. на данный момент у нас нет хоть какого-либо компилятора