|
Основной форум Сюда все проблемы связанные с программированием. |
15.11.2008, 10:51
|
#91
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
создаваемый компилятор итак будет конкурентно-способным потому что на фоне шаблонно-сделанного MIDletPascal'я, который спотыкается при разборе программы (не дай бог вы забудете поставить точку с запятой или кавычку) помнится даже в хелпе в примерах перед else стояли запятые. по поводу другого Pascal'я о котором говорилось на форуме сказать не чего не могу, совместимость с Delphi эт не плохо, но все базируется на встроенных библиотеках а компиляция происходит по огромному шаблону функций в которых нужно еще разобраться. и здесь вроде нет оптимизации.
satan если оптимизация затрагивает только пересчет выражений то это оч. легко реализовать и в моем переделанном компиляторе: в генераторе кода смотреть на две инструкции назад, если константы- то объединять. Уже вообще-то можно приступать полностью к созданию компилятора. алгоритм оптимизации затронет изменение только 4-х функций разбора. давай свои предложения/работающие исходники. просто именно для паскаля лучший вариант все-таки от создателя (Никалус Вирт)
|
(Offline)
|
|
15.11.2008, 14:48
|
#92
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
Начну с начала.
Компиляторами я занимаюсь давно. (Вообще я давно перешел на уровень создания
того, на чем люди делают что-то, редакторы, 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/
связаться с автором пока не удалось, но буду искать
Ну вообщем вот пока мысли......................
Да совсем забыл... Этот модуль будет базовым для ЛЮБОГО компилятора...
Последний раз редактировалось satan, 15.11.2008 в 15:16.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.11.2008, 19:39
|
#93
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
satan, плюсик за хорошее сообщение, Спасибо за ссылки на интернет-ресурсы и исходник.. буду смотреть.. думаю с такой информационной поддержкой проект по созданию компилятора успешно завершится.
___
java-ассемблер завершен на 90% нужно добавить таблицу переходов на метки, генерацию структуры обработчика исключений и авто-генерацию структуры StackMap (сейчас пока вручную на уровне команд).
Код компилятора значительно упростится, когда эти задачи будут переложенны в java-ассемблер.
___
Нашел на просторах жеского диска не рекурсивный алгоритм разбора строкового выражения. Когда-то немножко переделывал. Применялся для построения графиков и т.д.
satan посмотри может появятся идеи по оптимизации константных выражений..
Последний раз редактировалось abcdef, 16.11.2008 в 00:37.
|
(Offline)
|
|
15.11.2008, 22:26
|
#94
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
До кучи добавляю полноценный Pascal компилятор
http://66.196.80.202/babelfish/trans...rotinyp ascal
Компилит сам себя, синтаксис полный (походу), Гы... единственная проблема - ща деобфускацией его занимаюсь!!!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.11.2008, 01:11
|
#95
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
если исходник на pascal'е не форматированный как в этом примере, то примени 3-и утилитки, которые я ранее выкладывал - они должены разобрать и привести исходный код в читабельный вид.
главное компилируй в delphi, а то в pascal'e длина строки не более 255 символов
в примере отдельные строки слишком длинные из-за применения символов "#c"
|
(Offline)
|
|
16.11.2008, 02:05
|
#96
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
Уже на 50% перевел в боле мене нормуль вид и восстановил переменные некоторые и функции
|
(Offline)
|
|
17.11.2008, 07:21
|
#97
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
В жисти нету справедливости!!! Ковырял 2 дня паскаль, написал автору и он мне выдал полон код
|
(Offline)
|
|
18.11.2008, 21:49
|
#98
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание 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;
т.е. не создаем лишних меток...
|
(Offline)
|
|
28.11.2008, 16:27
|
#99
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
satan, просмотрел компиляторы, Pascal 32bit неплохо сделан, и идеи реализации интересные, правда не вооруженным взглядом видно что это модификация старого доброго PASCALS. а реализации java компиляторов несколько ограниченные. всё-таки лучше изменить pascals, чем корректировать другие. - работы, а самое главное ошибок будет меньше. и не надо изобретать велосипед...
насчет многоязыкового компилятора вспоминается со студенческих времен поговорка нашего профессора: -если при езде на автомобиле обнимать девушку, то не получится ни хорошо вести машину, ни хорошо обнимать девушку. Поэтому лучше сделать простой и не большой Pascals компилятор, чем гору кода и кучу правил, типа: в этом языке это так, а в другом эдак, и ни как иначе, а то не откомпилит. Лучше сделать отдельную версию под другой синтаксис. так что? переделываем PASCALS?
|
(Offline)
|
|
28.11.2008, 18:53
|
#100
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
Согласен, только луче BeroPascal там уже все готово... Я толко распишу в комментах где что находица, уберу PE ассемблер (вместо него Java asm вставим) а место под пул там уже есть, более того он так же делает байт код промежуточный, поэтому допустим модули можно будет распространять защищёнными...
Кстати все эти паскали (в том числе и BeRo) - это улучшеные модификации PascalS а он в всвою очередь сделан по эпусам Креншоу...
Вопчем ща смотрю и комментю... Вечером приаттачу расписаную версию паскаля единственное что там нужно будет ввести - это типы string и real
|
(Offline)
|
|
28.11.2008, 19:25
|
#101
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: создание MIDletPascal compiler'a
Если честно, была сегодня идея переделать BeRoPascal, но взглянул, и сразу стало лень- эт столько переделывать табулировать, условия if менять на case и др, а еще в нем много переменных, не слишком экономно сделан, а мне б хотелось сделать реализацию и на pascal'e. сложил всё вместе и решил что PASCALS. лучше для нормальной работы добавить только цикл FOR. а промежуточный код есть и в pascals, Только он не нужен, программу ж можно декомпилировать
|
(Offline)
|
|
29.11.2008, 03:05
|
#102
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
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 типа запиши вместо:
это сигнатура PE файла
это сигнатура class файла (наше изболевшее CAFEBABE в CHR представлении)
Последний раз редактировалось satan, 29.11.2008 в 03:22.
|
(Offline)
|
|
29.11.2008, 03:32
|
#103
|
Нуждающийся
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений (для 28 пользователей)
|
Re: создание MIDletPascal compiler'a
Кстати не могу никак понять где студенты (им уже готовая дипломная тут написана)
где хакеры им уже готовый код для инжекции готов просто в функции
procedure AssembleAndLink;
var
JCPC,I,D,CS,SA,SOCP:integer;
begin
Header; // Закоментировать
закоментить вызов HEADER и получится чистый бинарник для инжекций, его можно даже в дизассемблере посмотреть...
Где фанаты МР тоже не понятно...
|
(Offline)
|
|
29.11.2008, 03:56
|
#104
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: создание MIDletPascal compiler'a
Кстати не могу никак понять где студенты (им уже готовая дипломная тут написана)
|
Хорошего же ты мнения о студентах. Ничего удивительного. Да и, хацерская порода измельчала - пока на весь нет сплойт не пропиаритцо - 31337 не почешется.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
08.12.2008, 21:57
|
#105
|
AnyKey`щик
Регистрация: 06.09.2006
Сообщений: 3
Написано 0 полезных сообщений (для 0 пользователей)
|
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
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:20.
|