![]() |
Ответ: создание MIDletPascal compiler'a
создаваемый компилятор итак будет конкурентно-способным потому что на фоне шаблонно-сделанного MIDletPascal'я, который спотыкается при разборе программы (не дай бог вы забудете поставить точку с запятой или кавычку) помнится даже в хелпе в примерах перед else стояли запятые. по поводу другого Pascal'я о котором говорилось на форуме сказать не чего не могу, совместимость с Delphi эт не плохо, но все базируется на встроенных библиотеках а компиляция происходит по огромному шаблону функций в которых нужно еще разобраться. и здесь вроде нет оптимизации.
satan если оптимизация затрагивает только пересчет выражений то это оч. легко реализовать и в моем переделанном компиляторе: в генераторе кода смотреть на две инструкции назад, если константы- то объединять. Уже вообще-то можно приступать полностью к созданию компилятора. алгоритм оптимизации затронет изменение только 4-х функций разбора. давай свои предложения/работающие исходники. просто именно для паскаля лучший вариант все-таки от создателя (Никалус Вирт) |
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/ связаться с автором пока не удалось, но буду искать Ну вообщем вот пока мысли...................... Да совсем забыл... Этот модуль будет базовым для ЛЮБОГО компилятора... |
Ответ: создание MIDletPascal compiler'a
Вложений: 1
satan, плюсик за хорошее сообщение, Спасибо за ссылки на интернет-ресурсы и исходник.. буду смотреть.. думаю с такой информационной поддержкой проект по созданию компилятора успешно завершится.
___ java-ассемблер завершен на 90% нужно добавить таблицу переходов на метки, генерацию структуры обработчика исключений и авто-генерацию структуры StackMap (сейчас пока вручную на уровне команд). Код компилятора значительно упростится, когда эти задачи будут переложенны в java-ассемблер. ___ Нашел на просторах жеского диска не рекурсивный алгоритм разбора строкового выражения. Когда-то немножко переделывал. Применялся для построения графиков и т.д. satan посмотри может появятся идеи по оптимизации константных выражений.. |
Re: создание MIDletPascal compiler'a
До кучи добавляю полноценный Pascal компилятор
http://66.196.80.202/babelfish/trans...rotinyp ascal Компилит сам себя, синтаксис полный (походу), Гы... единственная проблема - ща деобфускацией его занимаюсь!!! |
Ответ: создание MIDletPascal compiler'a
если исходник на pascal'е не форматированный как в этом примере, то примени 3-и утилитки, которые я ранее выкладывал - они должены разобрать и привести исходный код в читабельный вид.
главное компилируй в delphi, а то в pascal'e длина строки не более 255 символов в примере отдельные строки слишком длинные из-за применения символов "#c" |
Re: создание MIDletPascal compiler'a
Вложений: 1
Уже на 50% перевел в боле мене нормуль вид и восстановил переменные некоторые и функции
|
Re: создание MIDletPascal compiler'a
Вложений: 1
В жисти нету справедливости!!! Ковырял 2 дня паскаль, написал автору и он мне выдал полон код:-D
|
Ответ: создание 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; т.е. не создаем лишних меток... |
Ответ: создание MIDletPascal compiler'a
satan, просмотрел компиляторы, Pascal 32bit неплохо сделан, и идеи реализации интересные, правда не вооруженным взглядом видно что это модификация старого доброго PASCALS. а реализации java компиляторов несколько ограниченные. всё-таки лучше изменить pascals, чем корректировать другие. - работы, а самое главное ошибок будет меньше. и не надо изобретать велосипед...
насчет многоязыкового компилятора вспоминается со студенческих времен поговорка нашего профессора: -если при езде на автомобиле обнимать девушку, то не получится ни хорошо вести машину, ни хорошо обнимать девушку. Поэтому лучше сделать простой и не большой Pascals компилятор, чем гору кода и кучу правил, типа: в этом языке это так, а в другом эдак, и ни как иначе, а то не откомпилит. Лучше сделать отдельную версию под другой синтаксис. так что? переделываем PASCALS? |
Re: создание MIDletPascal compiler'a
Согласен, только луче BeroPascal там уже все готово... Я толко распишу в комментах где что находица, уберу PE ассемблер (вместо него Java asm вставим) а место под пул там уже есть, более того он так же делает байт код промежуточный, поэтому допустим модули можно будет распространять защищёнными...
Кстати все эти паскали (в том числе и BeRo) - это улучшеные модификации PascalS а он в всвою очередь сделан по эпусам Креншоу... Вопчем ща смотрю и комментю... Вечером приаттачу расписаную версию паскаля единственное что там нужно будет ввести - это типы string и real |
Ответ: создание MIDletPascal compiler'a
Если честно, была сегодня идея переделать BeRoPascal, но взглянул, и сразу стало лень- эт столько переделывать табулировать, условия if менять на case и др, а еще в нем много переменных, не слишком экономно сделан, а мне б хотелось сделать реализацию и на pascal'e. сложил всё вместе и решил что PASCALS. лучше для нормальной работы добавить только цикл FOR. а промежуточный код есть и в pascals, Только он не нужен, программу ж можно декомпилировать
|
Re: создание MIDletPascal compiler'a
Вложений: 1
abcdef
Ты наверно издеваесся... PASCALS и BERO одно и то же, разница в том, что у Беро уже готовый модуль ассемблирования убери его и получиться полный со всеми паскалевыми выпендрезами компилятор в байт код, прикрепляю закоментированую версию, сравни их и увидиш, даже функции одни и те же... Гы... Там где в Ассемблере я закоментил можно прочитать закоментировать Header вызов (это в нашем случае функция системного пула) и раскоментить создание байт кода... Осталось в Беро сделать только одно перевести с МакроАссемблера на ява ассемблер (прямо тупо заменяя строки типа Код:
OPMul: Код:
OPMul: Код:
OPMul: Единственная доработка в подключении типа string и real а так как он компилит сам себя, то и отладка происходит сразу (единственная неудобство, что он ошибки если есть тоже в себя пишет, поэтому приходица типа test.exe переименовывать в test.txt и читать в какой строке ошибка!!!) Посмори, если какие функции иль ещё чиво не понятно, я опишу их поподробнее, а так получица что из PASCALS мы просто тупо сделаем BERO и прикрутим JAsm... Гы... нафига мартышкин труд, если уже все готово... Переменные в таблице переменных Типы в таблице типов Массивы описаны Вызовы функций и т.д т.п можно сразу запихивать в пул в функции Header после ассемблера нам доступен размер кода и смещения... Короче уже все есть, надо просто сесть и перевести с одного асма на другой!!! И получим систему круче чем МР так как исходники будут открыты... Если хочешь поэксперементируй с функцией Header типа запиши вместо: Код:
OCP:=0; Код:
OCP:=0; |
Re: создание MIDletPascal compiler'a
Кстати не могу никак понять где студенты (им уже готовая дипломная тут написана)
где хакеры им уже готовый код для инжекции готов просто в функции Код:
procedure AssembleAndLink; Где фанаты МР тоже не понятно... |
Ответ: создание MIDletPascal compiler'a
Цитата:
|
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