![]() |
Re: создание MIDletPascal compiler'a
Мля... полна жпа!!!!!!!!!
Пошол в сортир, втыкаю в распечатаный код, прогоняю помалень, вкуриваю... И тут... Асенило... Ептель, ты мутишь не токма дизассемблер, но и декомпилер в одном флаконе, и как тока прогоняю тему все становица на свои места! Ё... Ты так в следучий раз не шути, луче сразу колись шо ишо задумал, гы... Если ишо и деобфускатор, ваще попец полный!!! Ну да ладно, хоть ща догнал тему. Вопрос на засыпку: Скока ишо народу понимает суть дела, и ваще хто ишо тута тусу тусуит??? __________________________________________________ _____________________ satan, призываю общаться на нормальном литературном русском языке и не флудить! |
Ответ: создание MIDletPascal compiler'a
на данный момент главное - это распознать все byte-code коменды и их особенности, потому что ассемблер должен понимать обрабатывать их все. Но для компилятора языка паскаль хватит не более 30-ти штук..
что-то затянулась у нас стадия разбора команд. Участие в экспериментах пока принимать не могу (попросту нет времени). Когда все будет готово ассемблер можно будет создать за 2-а вечера. Насчет профилировщика ты правильно понял satan. Но сейчас нужно получить полностью разбор всех java-команд.. желаю удачи - у тебя хороший багаж знаний! |
Re: создание MIDletPascal compiler'a
Вопщем ассемблер там простой... Работает со стеком,
все мнемокоды вида MNEMO OP1 OP2 - где MNEMO - мнемокод а OP1 OP2 первый и второй оператор (иногда их 10-14) OP1 OP2 - байткод который идет сразу за мнемокодом комманды он может быть адресом переменной в константном пуле или адресом перехода или переменной типа WORD Стек заполняецо сверху в низ и при исполнении команды результат заменяет операнды в стеке на себя Пример 15+25 bipush 15 - грузим число 15 в стек bipush 25 - грузим число 25 в стек iadd - складываем числа в стеке и результат помещаем в верх стека тоесть щас у нас в верху стека число 40 Тоесть все настолько просто, что осталось лишь сказать спасибо ребятам с Java Sun! class calc{ public static void main(String [] args){ int a,i; i=1240; a=i+20; } } Смотрим на код. У нас две переменные, одной из них присваевается ответ. Смотрим код 0000h 11 04 D8 sipush 04D8h 0003h 3D istore_2 0004h 1C iload_2 0005h 10 14 bipush 14h 0007h 60 iadd 0008h 3C istore_1 0009h B1 return Начало кода ПОЛЮБАС оператор, значение 11 – это sipush– Загрузка в стек двухбайтового целого со знаком ,оператор двух байтовый значит следущие два байта – значение переменной 04D8h или 1240 Далее 3D istore_<n> Сохранение целого в локальной переменной Тоесть грузим 1024 в i Ну и тд. Тп. Компиляцию я показывал сверху, проводица она рекурсией причом очень простенькой |
Ответ: создание MIDletPascal compiler'a
список изменений к исходнику предложенному ранее.
1. добавить константу wide 2. заменить подпрограмму disasm; 3. добавить в подпрограмму load_attribute_info переменную "n : integer;" что еще не сделано: "lookupswitch" и некоторые др. команды. _____________________________ техника проверки disassembling'a: 1. скачиваем NMI's Java Code Viewer 6.0 http://www.samsfan.ru/soft/?action=view&id=49&parent=7 2. распаковываем лубую навороченную jar-программку, желательно работающую с double-числами. 3. диассемблируе class файлы Java Code Viewer и нашей программкой, запуск командной строки вида: программа.exe > out.txt 4. сверяем полученные участки кода, если где не состыковка, корректируем алгоритм разбора.. (так сразу видно где лишние байты прихватило) Код:
const |
Ответ: создание MIDletPascal compiler'a
satan как успехи? наш раздел по посещаемости такими темпами скоро будет бить рекорды - всем интересно...
жаль если не получим готорого продукта, а именно публичные исходники простого Pascal byte-code компилятора. Мне итак приходиться выкладывать сырые исходники, как говориться - только из под пера... чтобы не уводить разработку компилятора не потому пути.. на данный момент времени на эксперименты мало, сейчас главное получить полностью работающий java-asm компилятор и попутно разобраться в сложных командах языка java, поэтому в исходниках так много комментариев напротив java-комманд. ______ нужно сделать разбор таблицы локальных переменных и таблицу обработчика исключений, поиграться с byte-code командами и том, что не написанно в документации |
Re: создание MIDletPascal compiler'a
Я корочь ужо составляю BNF (вернее лекс организовал), тута тормоза в том, что хочу извратицо и сделать совместимость не токма с oPascal но и с Delphi, ну тоесть что бы прога работала и на том и на том.
Кстати сложного с Java командами в принципе никаких, вот только синтаксис не знаю какой, классику или ООП выбрать. Мне ООП больше прикалывает, хотя и класика тож ничо. Пилгрим - если не трудно закинь в оркестр инфу о том как в Мидлетах ООП организовываеца! Типа простенький пример инклюда объектов. Так то структуру я понимаю, а вот как инклюдить это??? ЗЫ... Ча ребят чутка потерпите, я проект один добью... Первый компилер с поддержкой рус яз... мля... перспективы... Причом по ходу, что бы была полная поддержка Java вырисовывается следующаа схема Pascal->Java (*.pas->*.java транслятор) это очень легко Java -> Class (*.java->*.class) посложнее... Причом пример соответствия Program LaLaLa; -> Class LaLaLa begin - end; соответственно {} procedure AnaHono; -> public static void AnaHono() И самый прикол, что можно сделать классически, тоесть на Pas написать пару библиотек и включить поддержку INLINE, тогда функции приобретут клёвый вид Program HelloWord; -> class HelloWorld uses System; -> подключим нашу библиотеку ..... begin -> { writeln ('Hello World!'); end; -> } Где в модуле System оформим фукцию procedure writeln(S: String); -> public static void writeln(String [] args) begin -> { inline System.out.println(S); // Вставиться без изменения end; end; -> } Короче это тока наметки но в итоге получца шойта вроде Код:
class HelloWorld{ Другой метод, сразу переводить в байт код, тоесть делать на прямую компилятор Pascal - VM ByteCode но тогда мы не сможем подключать библиотеки написанные на Java или придеца извращатся как с МП!!! |
Ответ: создание MIDletPascal compiler'a
satan, все можно сделать гораздо проще, об этом говорил еще в начале:
делаем файл, на каждой строке в котором будет полное название класса, метода и его параметры. При компиляции в байт-код будет искаться метод и проверятся параметры. т.о. можно напрямую вызывать java, будет еще список сопоставлений где команде языка Pascal ставится аналогичный Java-метод. этап Pascal->byte-code будет создавать список констант и асм-код, который обращается к ним по поводу организации ООП в java все завязано на подмене индекса класса на наш, в котором мы что-нить меняем |
Re: создание MIDletPascal compiler'a
Вложений: 1
Вот накатал сканер, пригодица для дальнейшей работы...
ЗЫ... Исправил косяки... |
Re: создание MIDletPascal compiler'a
Пора на форум ставить капчу и подтверждалку администрацией! А то уже спамеры виагру толкать начали!!! :-D:-D:-D
|
Re: создание MIDletPascal compiler'a
Вложений: 1
Народ видю заскучал...
Забрасываю начальный парсер... Парсит строки вида 1+22- 44.5678 / 44*2.345 тоесть пока без кавычек. Сканер сдвинул в отдельный модуль, кто хочет может его дорабатывать на свое усмотрение |
Ответ: создание MIDletPascal compiler'a
Вложений: 2
выбрал свободное время доработал java-decompiler, сделан в TurboPacsal7.1.
правда остались сомнения насчет разбора tableswitch и lookupswitch; также необходимо сделать разбор структуры StackMap. файл JD.ZIP (исходник, exe, пример_использования) файл JCC.ZIP - наброски java class-assembler после декомпиляции примера из архива JD.ZIP получаем структуру для ассемблируемых файлов, т.е. примерно так будет выглядеть файл для перевода в class-файл JCC.ZIP/j.txt cделал наброски общей структуры разбора и работы с константами, теперь нужно проработать формирование блока METHOD... исходники java-asseblera написанные на java (3.1 MB) можно посмотреть по адресу: http://sourceforge.net/project/showf...ease_id=438525 home page: http://jasmin.sourceforge.net/ и еще: http://sourceforge.net/project/showf...ease_id=391215 home page: http://sourceforge.net/projects/tinapoc оттуда можно подсмотреть реализацию некоторых алгоритмов, но делать как там мы не будем.. слишком раздуто.. наш ассеблер будет не хуже, но проще _____ p.s. народ не стесняемся,.. подключаемся к проекту.. |
Ответ: создание MIDletPascal compiler'a
Вложений: 1
вот, усиленно посидел пару-тройку вечеров и родил java-assembler
полностью разбирает и компилирует в hello.class собранный нами дизассемблер разбирает его, а вот NMI's Java Code Viewer 6.0 не хочет, и соответственно не хочет запускаться в эмуляторе. Возможно это из-за того что забита нулями какая-нибудь служебная переменная или не хватает еще дополнительных констант в заголовке... что не сделано, так это генерирование StackMap - структуры.. ___ в архиве так же лежит доработанный java-decompiler (перекомпилирован с дерективами проверки переменных и кое-где изменен алгоритм) т.к. компилятор TurboPascal7.1 то длина UTF8 - строчек в разбираемых классах не должна превышать 255 символов, чтобы снять это ограничение нужно перекомпилировать в Delphi ___ p.s. satan поэкспериментируй с assembler'ом, нужно немножко поправить... |
Ответ: создание MIDletPascal compiler'a
Ыыыы... А я немного въехал в тему. Хотя по-началу нифига не понял, потом стал сам классы расковыривать. За утро нашёл там всякие закономерности, байты по группам разложил. Но толком не мог понять, какой байт что значит. Только разобрался со строками. Потом зашёл снова в эту тему и резко многое понял. Я ща прямо фигею, как я всё в кассе по группам разделил, как у меня ума хватило, гг. Ну так вот. Я целей глобальных не ставлю. Мне всего лишь надо генерировать класс, в котором будет массив объявляться со значениями. На php. Короче, надо, чтобы сервер кое-чего в java проге менял. Просто сервер будет генерировать класс с объявленным массивом и запаковывать его в архив с прогой. А в проге уже другие классы, которые будут брать значение массива из того класса. Ах да, ещё нужно будет генерировать имена методов. Думаю, смогу это сделать. Всем спасибо за тему =)
|
Re: создание MIDletPascal compiler'a
Phantom_wc
Могу подкинуть на PHP создание экзешника, а там уже сам переделаешь в Java Class ЗЫ... Ща прорабатываю оптимизированый компилер (на expression уровне) |
Ответ: создание MIDletPascal compiler'a
satan, давай, буду признателен. Надеюсь пригодится. Только вопрос, несколько тупой... Что такое "экзешник"? гг
|
Часовой пояс GMT +4, время: 01:11. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot