forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   создание MIDletPascal compiler'a (http://forum.boolean.name/showthread.php?t=6385)

abcdef 15.11.2008 10:51

Ответ: создание MIDletPascal compiler'a
 
создаваемый компилятор итак будет конкурентно-способным потому что на фоне шаблонно-сделанного MIDletPascal'я, который спотыкается при разборе программы (не дай бог вы забудете поставить точку с запятой или кавычку) помнится даже в хелпе в примерах перед else стояли запятые. по поводу другого Pascal'я о котором говорилось на форуме сказать не чего не могу, совместимость с Delphi эт не плохо, но все базируется на встроенных библиотеках а компиляция происходит по огромному шаблону функций в которых нужно еще разобраться. и здесь вроде нет оптимизации.

satan если оптимизация затрагивает только пересчет выражений то это оч. легко реализовать и в моем переделанном компиляторе: в генераторе кода смотреть на две инструкции назад, если константы- то объединять. Уже вообще-то можно приступать полностью к созданию компилятора. алгоритм оптимизации затронет изменение только 4-х функций разбора. давай свои предложения/работающие исходники. просто именно для паскаля лучший вариант все-таки от создателя (Никалус Вирт)

satan 15.11.2008 14:48

Re: создание MIDletPascal compiler'a
 
Вложений: 1
Начну с начала.

Компиляторами я занимаюсь давно. (Вообще я давно перешел на уровень создания
того, на чем люди делают что-то, редакторы, IDE, конструкторы...) но не в этом суть. Суть в том, что после 3-го или 4-го компилера я понял где основные грабли.
Вспомни первый свой декомпилер. На разбор пула ушло 2 дня, и неделя на ассемблер. Почему? Потому что это основа или нижний уровень, которых в компиляторе два - лекс. ан. и кодлгенератор.

Так как все языки семантически схожи только в одном, именно в выражениях, то и нижний уровень - ассемблер. А значит и начинать надо с него. Креншоу поэтому правильно сделал и написал с чего надо начинать.
Возмем например строку a=b+c b и посмотрим её представление в различных асмах.

Fasm:

mov eax, [esp -4] - переменная b
mov ebx, [esp -8] - переменная c
add eax, ebx - сложение
mov [esp -0], eax - приравнивание a

код относительный - от балды, теперь на Java асм

bipush 2
bipush 3
iadd
iload 1

код тоже по памяти и от вола!

Что мы видим? Похоже, очень даже... Ну да и иначе не могло и быть, асм он и в рассеи асм. Ладно, надеюсь с этим понятно. Тоесть любое выражение можно перевести (не важно на какой ассемблер) а потом перевести с асм на асм дело всего лишь техники! (Вернее дело рук в переписывании операторов).

Теперь рассмотрим ОПЗ (
http://www.wl.unn.ru/~ragozin/compiler/compil/g11.htm
http://decoding.narod.ru/practic/pol...ishrecord.html
)

Из статей понятно, что этим алгоритмом мы по сути готовим строку под ассемблер, не просто готовим, а уже получаем готовый годогенератор для
ассемблера безо всяких там рекурсий и вставкой кода...

Сравним строку a = b + c в ОПЗ и ассемблером?

b c + a =

mov eax, [esp -4] - переменная b
mov ebx, [esp -8] - переменная c
add eax, ebx - сложение
mov [esp -0], eax - приравнивание a

тут по моему становится ясным мысль о ОПЗ, но тут опять грабли, строка вида

1+a+2+b+3+c

Может вырасти в очень длинный код на ассемблере, поэтому её надо оптимизировать, тобишь привести к виду a+b+c +6, что бы уменьшить код конечного файла, что бы не падал компилятор от переполнения да и наконец - это сложно и круто! Ну и приятно...

Так вот я предлагаю, пока оставить на время верхний уровень, он нам ни черта не нужен пока и заняться нижним уровнем, а именно функцией ВЫРАЖЕНИЕ (Expression), потому что как только мы сделаем эту функцию или набор функций остальное просто останется банальностью, а именно работой сканера и вызов соответствующих функций.

Кстати когда и если мы ето замутим форум может просто лечь от наплыва студентов - курсовиков!!!

ЗЫ...

Никлаус мужик умный, тока он делал свои компилеры под свою Р-машину.
Но выкладываю его Оберон (Модула 2) переделаный для виндовс и сам себя компилящий без глюков. Сайт с документацией и описаловом
http://home.perm.ru/strannik/
Сдесь реализована поддержка 3х языков, Модула-Си-Паскаль (к стати в Оберон я влюбляюсь все более и более) И по исходникам можно глянуть реализацию сканера и т.д. Да и сам язык - это крутой паскаль!!!

Сдесь уже готовый компилер на Обероне
http://www.uni-vologda.ac.ru/job/rus/
связаться с автором пока не удалось, но буду искать

Ну вообщем вот пока мысли......................

Да совсем забыл... Этот модуль будет базовым для ЛЮБОГО компилятора...

abcdef 15.11.2008 19:39

Ответ: создание MIDletPascal compiler'a
 
Вложений: 1
satan, плюсик за хорошее сообщение, Спасибо за ссылки на интернет-ресурсы и исходник.. буду смотреть.. думаю с такой информационной поддержкой проект по созданию компилятора успешно завершится.
___
java-ассемблер завершен на 90% нужно добавить таблицу переходов на метки, генерацию структуры обработчика исключений и авто-генерацию структуры StackMap (сейчас пока вручную на уровне команд).
Код компилятора значительно упростится, когда эти задачи будут переложенны в java-ассемблер.
___
Нашел на просторах жеского диска не рекурсивный алгоритм разбора строкового выражения. Когда-то немножко переделывал. Применялся для построения графиков и т.д.
satan посмотри может появятся идеи по оптимизации константных выражений..

satan 15.11.2008 22:26

Re: создание MIDletPascal compiler'a
 
До кучи добавляю полноценный Pascal компилятор
http://66.196.80.202/babelfish/trans...rotinyp ascal

Компилит сам себя, синтаксис полный (походу), Гы... единственная проблема - ща деобфускацией его занимаюсь!!!

abcdef 16.11.2008 01:11

Ответ: создание MIDletPascal compiler'a
 
если исходник на pascal'е не форматированный как в этом примере, то примени 3-и утилитки, которые я ранее выкладывал - они должены разобрать и привести исходный код в читабельный вид.

главное компилируй в delphi, а то в pascal'e длина строки не более 255 символов
в примере отдельные строки слишком длинные из-за применения символов "#c"

satan 16.11.2008 02:05

Re: создание MIDletPascal compiler'a
 
Вложений: 1
Уже на 50% перевел в боле мене нормуль вид и восстановил переменные некоторые и функции

satan 17.11.2008 07:21

Re: создание MIDletPascal compiler'a
 
Вложений: 1
В жисти нету справедливости!!! Ковырял 2 дня паскаль, написал автору и он мне выдал полон код:-D

abcdef 18.11.2008 21:49

Ответ: создание MIDletPascal compiler'a
 
добавил структуру и алгоритм вычисления и постороения переходов с использованием меток, теперь pascal-компилятору практически ни чего не нужно знать о командах java-assembler'а, не вести пересчет смещений и т.д.

вот структура для организации переходов:
_______
const
maxlab=1024*5; {кол-во ячеек для сохранения}
typemp=0; {пустой элемент таблицы}
typlab=1; {метка}
typmod2=2; {элемент коррекции 2-х байтового смещения}
typmod4=2; {элемент коррекции 4-х байтового смещения}
var
lab:array[0..maxlab] of record
typ:byte; {тип элемента}
name:string[6]; {название метки}
adr:word; {адрес в коде}
end;
lmax:integer; {кол-во элементов}
_______
логика работы:
метка выглядит так ":имя"
в командах перехода если следующий символ не число, то прочитать имя метки и получить смещение к ней. Если метка еще не добавлена (т.е. переход вперед), то записать элемет как элемент_коррекции.
В завершении метода просматриваем таблицу меток и правим элементы_коррекции на смещение к нужным меткам.
Если метка не найдена, то генерировать ошибку.
__
т.к. размер таблицы переходов ограничен, то рекомендую сделать в pascal'e генератор имён_меток так:
метка - число, конвертируется в текст только при сохранении в выходной файл например так write(':l'+hex2(label)+' '); где label:integer - инкриментируемое число.
Т.к. таблица перехода в ассемблере имеет ограниченный размер, то:
в подпрограмме генерации метки сохраняем номер строки предыдущей метки oldStrNum, а при создании новой:
if currentStrNum<>oldStrNum then
begin
inc(label);
oldStrNum:=currentStrNum;
end;
т.е. не создаем лишних меток...

abcdef 28.11.2008 16:27

Ответ: создание MIDletPascal compiler'a
 
satan, просмотрел компиляторы, Pascal 32bit неплохо сделан, и идеи реализации интересные, правда не вооруженным взглядом видно что это модификация старого доброго PASCALS. а реализации java компиляторов несколько ограниченные. всё-таки лучше изменить pascals, чем корректировать другие. - работы, а самое главное ошибок будет меньше. и не надо изобретать велосипед...
насчет многоязыкового компилятора вспоминается со студенческих времен поговорка нашего профессора: -если при езде на автомобиле обнимать девушку, то не получится ни хорошо вести машину, ни хорошо обнимать девушку. Поэтому лучше сделать простой и не большой Pascals компилятор, чем гору кода и кучу правил, типа: в этом языке это так, а в другом эдак, и ни как иначе, а то не откомпилит. Лучше сделать отдельную версию под другой синтаксис. так что? переделываем PASCALS?

satan 28.11.2008 18:53

Re: создание MIDletPascal compiler'a
 
Согласен, только луче BeroPascal там уже все готово... Я толко распишу в комментах где что находица, уберу PE ассемблер (вместо него Java asm вставим) а место под пул там уже есть, более того он так же делает байт код промежуточный, поэтому допустим модули можно будет распространять защищёнными...

Кстати все эти паскали (в том числе и BeRo) - это улучшеные модификации PascalS а он в всвою очередь сделан по эпусам Креншоу...

Вопчем ща смотрю и комментю... Вечером приаттачу расписаную версию паскаля единственное что там нужно будет ввести - это типы string и real

abcdef 28.11.2008 19:25

Ответ: создание MIDletPascal compiler'a
 
Если честно, была сегодня идея переделать BeRoPascal, но взглянул, и сразу стало лень- эт столько переделывать табулировать, условия if менять на case и др, а еще в нем много переменных, не слишком экономно сделан, а мне б хотелось сделать реализацию и на pascal'e. сложил всё вместе и решил что PASCALS. лучше для нормальной работы добавить только цикл FOR. а промежуточный код есть и в pascals, Только он не нужен, программу ж можно декомпилировать

satan 29.11.2008 03:05

Re: создание MIDletPascal compiler'a
 
Вложений: 1
abcdef
Ты наверно издеваесся... PASCALS и BERO одно и то же, разница в том, что у Беро уже готовый модуль ассемблирования убери его и получиться полный со всеми паскалевыми выпендрезами компилятор в байт код, прикрепляю закоментированую версию, сравни их и увидиш, даже функции одни и те же... Гы...

Там где в Ассемблере я закоментил можно прочитать закоментировать Header вызов (это в нашем случае функция системного пула) и раскоментить создание байт кода...

Осталось в Беро сделать только одно перевести с МакроАссемблера на ява ассемблер (прямо тупо заменяя строки типа

Код:

        OPMul:
              begin
                OCPopEBX;
                OCPopEAX;
                OCIMulEBX;
                OCPushEAX;

на

Код:

        OPMul:
              begin
                Pop2;
                iMul;
                BiPush;

или круче, сразу в исполняемый class файл

Код:

        OPMul:
              begin
                OC(88);  //POP2 извлечение из стека двух чисел
                OC(104); //IMUL умножение
                OC(16);  //BIPUSH помещение в стек результата

Вот и все дела...
Единственная доработка в подключении типа string и real

а так как он компилит сам себя, то и отладка происходит сразу (единственная неудобство, что он ошибки если есть тоже в себя пишет, поэтому приходица типа test.exe переименовывать в test.txt и читать в какой строке ошибка!!!)

Посмори, если какие функции иль ещё чиво не понятно, я опишу их поподробнее, а так получица что из PASCALS мы просто тупо сделаем BERO и прикрутим JAsm... Гы... нафига мартышкин труд, если уже все готово...
Переменные в таблице переменных
Типы в таблице типов
Массивы описаны
Вызовы функций и т.д т.п можно сразу запихивать в пул в функции Header
после ассемблера нам доступен размер кода и смещения...

Короче уже все есть, надо просто сесть и перевести с одного асма на другой!!! И получим систему круче чем МР так как исходники будут открыты...

Если хочешь поэксперементируй с функцией Header типа запиши вместо:
Код:

  OCP:=0;
  OCS('MZ

это сигнатура PE файла
Код:

  OCP:=0;
  OCS('Кюєѕ

это сигнатура class файла (наше изболевшее CAFEBABE в CHR представлении)

satan 29.11.2008 03:32

Re: создание MIDletPascal compiler'a
 
Кстати не могу никак понять где студенты (им уже готовая дипломная тут написана)
где хакеры им уже готовый код для инжекции готов просто в функции
Код:

procedure AssembleAndLink;
var
  JCPC,I,D,CS,SA,SOCP:integer;
begin

  Header; // Закоментировать

закоментить вызов HEADER и получится чистый бинарник для инжекций, его можно даже в дизассемблере посмотреть...

Где фанаты МР тоже не понятно...

impersonalis 29.11.2008 03:56

Ответ: создание MIDletPascal compiler'a
 
Цитата:

Кстати не могу никак понять где студенты (им уже готовая дипломная тут написана)
Хорошего же ты мнения о студентах. Ничего удивительного. Да и, хацерская порода измельчала - пока на весь нет сплойт не пропиаритцо - 31337 не почешется.

kilan 08.12.2008 21:57

Re: создание MIDletPascal compiler'a
 
interesno, esli'b eto bilo 3 goda nazad to ja pervim studentom bil :)
eto tak offtop :)
a po teme jdu datu reliza :)


Часовой пояс GMT +4, время: 03:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot