Показать сообщение отдельно
Старый 15.11.2008, 14:48   #92
satan
Нуждающийся
 
Регистрация: 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/
связаться с автором пока не удалось, но буду искать

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

Да совсем забыл... Этот модуль будет базовым для ЛЮБОГО компилятора...
Вложения
Тип файла: zip Modula.zip (650.1 Кб, 452 просмотров)

Последний раз редактировалось satan, 15.11.2008 в 15:16.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
abcdef (15.11.2008)