Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
МИКРОБ (микро оберон 07 компилятор) https://zx.oberon.org/forum/viewtopic.php?f=15&t=444 |
Страница 1 из 3 |
Автор: | S.Atan [ 26 ноя 2018, 16:22 ] | ||
Заголовок сообщения: | МИКРОБ (микро оберон 07 компилятор) | ||
Всем привет! Начинаю разработку тестового компилятора совместимого с Оберон 07 но расширенного до определённых размеров! Постараюсь учесть все нюансы (FOR, унарный минус, аспекты константных массивов и т.д.) Для начала, как инструмент разработки, возьму FreePascal последней версии и максимально настрою его на работу в стиле Оберон... Во вложении заготовка для экспериментов, опишу некоторые файлы. Файл RTL.mod - это эмулятор системных функций Оберонов Код: "OBERON"
По моему тут все понятно и в коментариях не нуждается, однако оговорюсь, для пользователей, которые ещё пока не достаточно профессионально работают в Оберонах: - Это реализация внутренних функций и операторов компилятора, так что можно посмотреть как работает та или иная директива. Файл MCS.mod - это лексический анализатор, его пока не будем изучать, оставим на потом... Далее файл MCB.mod - это уже файл компилятора с начальными настройками. Именно он инициализирует настройки компилятора, создаёт базовые файлы и т.д. А так же включает в себя процедуры работы с деревом разбора синтаксических конструкций. Вот на нём и остановимся подробно! Как известно, Н.В. Вирт в своих компиляторах идёт двумя путями 1) Создаётся код, на прямую пишущийся в файл (большинство) 2) Создаётся дерево синтаксическое, а затем, если что то надо изменить, переместить и т.д. оно модифицируется и транслируется. Вот вторым путём мы и пойдём, так как он немного гибче, поэтому заведём 3 структуры Код: "OBERON"
Как видно, Item реперь не RECORD (запись) а POINTER т.е. указатель, в связи с этим изменится и поведение нашего компилятора! Две функции: Код: "OBERON"
Отвечают за инициализацию базовых типов и привязывают объекты именованые к ним, НО!!!!! посмотрите как они добавлябтся в дерево, не в конец списка, а в начало Код: "OBERON"
И наконец 3 функции отвечающие за видимость объектов (это же важно... что бы вложенные структуры видели все предыдущие объекты, но были недоступны на предыдущих уровнях. Так вот, функции: Код: "OBERON"
как раз за это и отвечают... Процедуры OpenScope и CloseScope отвечают за переключение уровней видимости Код: "OBERON"
Для каждого объекта может быть создано поле .dsc в который и попадут внутренние объекты, например параметры процедур, локальные переменные, типы и константы Во вложении маленькая программка которая и отображает выше-описаное, более того, это заготовка для экспортирования наших данных в файл экспорта!!! Пример как она работает чисто визуальный: Код: "OBERON"
Видим, что глобальная видимость у певых 4-х веточек дерева, и на этом уровне не будут видны следующие... Ну вот пока всё, в следующий раз подробно остановимся на константах, и нисходящем разборе выражений!
|
Автор: | Comdiv [ 26 ноя 2018, 16:54 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
S.Atan писал(а): Как известно, Н.В. Вирт в своих компиляторах идёт двумя путями Интересно узнать, в каких своих компиляторах Вирт применял 2-й подход?1) Создаётся код, на прямую пишущийся в файл (большинство) 2) Создаётся дерево синтаксическое, а затем, если что то надо изменить, переместить и т.д. оно модифицируется и транслируется. Код: "OBERON"
|
Автор: | S.Atan [ 26 ноя 2018, 17:58 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
Comdiv писал(а): Ничего себе микроб. Ну... я не обещал что используемый инструмент выдаст маленький файл... На Java (иже с ней) или NET пришлось бы тащить около сотни Мб... Второй подход Вирт использует в Lola2 компиляторе. |
Автор: | SovietPony [ 27 ноя 2018, 11:41 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
S.Atan писал(а): Для начала, как инструмент разработки, возьму FreePascal последней версии и максимально настрою его на работу в стиле Оберон... Я вот жалею что написал свой компилятор на сишке, а не сразу на обероне. Бросил его потому что ниасилил раскручивать, считай сделать всё заново. Так что хорошенько продумай сей момент, пока не зашёл слишком далеко.S.Atan писал(а): Как видно, Item реперь не RECORD (запись) а POINTER Выглядит достаточно странно. Если речь идёт о AST, то такие структуры называются Node и они никак не зависят от целевого процессора. Item же объект временный и живёт он в компиляторе ровно столько, сколько и нечто положенное на стек целевого процессора в рантайме, делать его динамическим нет смысла. Регистры для Item выделяются и освобождаются строго по принципу lifo, это важно.Расширение Object от Item - тоже нечто странное. Это вообще разные штуки. Рекомендую ещё раз почитать книжку Project Oberon 2013 и исходники других компиляторов с AST (OP2, BlackBox, Ofront и т.д.). Обрати внимание на структуры данных и способы их применения. |
Автор: | S.Atan [ 27 ноя 2018, 12:26 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
Паскаль и Оберон синтаксически очень схожие языки, поэтому трудностей не возникает, более того на FreePascal я как раз и эмулирую работу Оберона (NEW и Garbage Collection) 64-128 бит во FPC думаю помогут... А на счет Item - Node тут в принципе постулаты не важны (Item и есть временное хранилище для Object, а он её расширение ), более того, сам мэтр иногда плюёт на постулаты и оставляет логику за собой... Поступим и мы так же по хулигански N.Wirth (*Lola System Compiler Base*) LSB.mod: Код: "OBERON"
|
Автор: | S.Atan [ 27 ноя 2018, 12:34 ] |
Заголовок сообщения: | МИКРОБ (микро оберон 07 компилятор) |
Немножко остановлюсь на процедурах Код: "OBERON"
Первая создаёт объект и добавляет его к нашему дереву в конец списка, вторая создаёт объект для стандартного типа и добавляет его в начало. То есть дерево наше делится на два участка, один как бы растёт в конце, второй растёт в верх (условно) Код: "OBERON"
Естественно, при парсинге модуля, мы процедурой OpenScope скроем стандартные объекты (типы и функции псевдомодуля SYSTEM) и у нас при завершении разбора останется упорядоченое дерево, в котором легко ориентироватся, а если мы введём ещё и импортирование, то дерево на самом верхнем уровне будет выгядеть как то так Код: "OBERON"
При чем, объекты с одинаковыми именами, но в разных модулях не будут видеть друг друга, но будут видеть объекты предка, то есть стандартны типы и процедуры Код: "OBERON"
Поэтому упрощается поиск, но при необходимости (объект помечен для экспорта) мы с лёгкостью получим доступ к полям модуля. Возникают два вопроса: 1) Поиск в дереве идёт прямым перебором всех полей 2) Раз дерево и так классное, зачем структура Item обозначена как POINTER TO RECORD, а не как RECORD, что не значительно, но упрощает компилятор Первое описано в трудах Вирта о компьютерах за (ну... уже почти век) время работы его с ними, и показано, что вместо оптимизации процессоров, производители наращивают мощностя и оставляют совместимость, поэтому прямой поиск и оптимизированый практически не отличаются по времени при малых величинах, но упрощает компилятор и понимание кода! Вот примеры поиска Оберон 07 (MCB.ThisObj) и PO2, BlackBox (OPT.FindInScope) Код: "OBERON"
Это как раз о поиске в дереве, перебираются глобальные видимые объекты (в данном случае модули, и если объект найден по имени, переключаемся на внутреннее дерево объекта (*.dsc) и ищем в нём... Код: "OBERON"
Как говориться... Естественно вставка объекта так же громоздка... Поэтому код и понимание усложняются. На второй вопрос ответ простой, есть некоторые, не очень популярные в свете операционные системы (вроде MS Windows) в которых данные и параметры создаются добавлением в начало списка (как у нас со стандартными типами), поэтому, для генерации кода приходиться рекурсивно перемещать код (менять его местами), а значит прямая кодогенерация хоть и возможна, но немного сложна и запутана (хотя... менять местами части массива практически тоже самое, просто заставляет вводить дополнительные инструменты для выделения памяти хранения временных кусков) Ну засим всё... В следущем разе перейдём к ядру и самому важному (но не сложному) разбору выражений и синтаксическому сахару! PS... Ещё пару слов о FPC. Функции: Код: "OBERON"
Заменяют паскалевскую конструкцию x := *.Create; и добавляют созданный объект в сборщик мусора GC.Add(x); То есть прямо эмулируют внутренний оператор NEW Оберона. |
Автор: | geniepro [ 28 ноя 2018, 07:36 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
А почему был начат ещё один новый и скорее всего никому не нужный проект компилятора, вместо того, что бы допиливать какой-то из существующих? Например, компилятор от akron выглядит самым реалистичным из существующих компиляторов Оберона-07. |
Автор: | S.Atan [ 28 ноя 2018, 12:22 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
geniepro писал(а): А почему был начат ещё один новый и скорее всего никому не нужный проект компилятора Это будет даже не проект, а скорее визуальное наглядное пособие как работает компилятор и почему... Очень много в сети кода с исходниками, и очень мало объяснений почему. Вот в этом плане, конечно, уважаемые в свете Saferoll и Олежек сделали очень много, но понять почему это так работает можно лишь после того, как поймёшь как всё происходит в коде. |
Автор: | S.Atan [ 28 ноя 2018, 13:31 ] | ||
Заголовок сообщения: | МИКРОБ (микро оберон 07 компилятор) | ||
Продолжим начатое. Следующий шаг в нашем проекте - создание функций для разбора выражений. Я считаю, что это и есть ядро любого компилятора, причем самое важное. Ведь именно здесь решаются такие вопросы как: 1) Будут ли допустимы разнотипные выражения или будут сделаны приведения типов автоматически? Например выражение 1+4/3-3 имеет после вычисления тип REAL но включает в себя тип INTEGER, что не запрещается допустим в BB (BlackBox) и не допускается в Обероне 07. Тоесть строгость кодирования в 07 выше. 2) Первичные оптимизации. 3) В основном на этом этапе и принимаются решения о расширениях языка (унарные операции,константные массивы и т.д) Вобщем от слов к делу. Создаём новый модуль MCE.pas (Micro Oberon Expression) Четыре функции отвечающие за разбор выражения: Код: "OBERON"
И одна функция для проверки ошибок, симплификации(упрощения) нашего дерева, ну и вообще отвечающую за строгость реализации: Код: "OBERON"
Именно сдесь мы и будем проверять соответствие типов, считать и создавать новые узлы дерева. Я внимательно почитал изучение вопроса об унарном минусе и поэтому модифицировал MCE.Factor с учетом приоритетности унарного минуса! Во вложении как всегда пример, пример - визуальный, дерево выводится прямо на форму. Так как не очень силён в построении графов, то уж вывод сделал как мог, не судите строго! В следущем разе рассмотрим, как раз, всевозможные аспекты разбора выражений
|
Автор: | budden [ 28 ноя 2018, 23:02 ] |
Заголовок сообщения: | Re: МИКРОБ (микро оберон 07 компилятор) |
Сергей, спасибо, уже взял кое-что из ваших разъяснений. А SovietPony зажал свои записки... |
Страница 1 из 3 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |