Автор Тема: Компилятор Oberon-07/11 для x86 Windows  (Прочитано 76321 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #45 : Декабрь 14, 2012, 07:03:39 pm »
Забавно что эта разработка опубликована здесь а не там...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #46 : Декабрь 14, 2012, 07:31:11 pm »
Оригинальный язык был XDS Oberon-2. При этом я старался не пользоваться средствами Oberon-2, отсутствующими в Oberon-07. В какой-то момент исходный код был просто переведен на Oberon-07, что было несложно сделать. Также первое время компилятор производил не машинный код, а ассемблерный masm32. Постепенно ассемблерный код был заменен машинным.
Кстати, а чем обусловлено использование в модуле Out функции WriteConsoleA а не WriteFile? Ведь у WriteConsoleA есть противная черта, она не работает с перенаправленными потоками вывода:
WriteConsole fails if it is used with a standard handle that is redirected to a file.

Поменял в Out'e на WriteFile - и перенаправление заработало. То есть теперь в консоли можно спокойно писать
HW.exe > res.txt
После выполнения появится файл res.txt, где будет содержаться то, что программа HW.exe выводила на консоль (точнее на stdout).
Y = λf.(λx.f (x x)) (λx.f (x x))

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #47 : Декабрь 14, 2012, 07:34:53 pm »
Кстати, а чем обусловлено использование в модуле Out функции WriteConsoleA а не WriteFile? Ведь у WriteConsoleA есть противная черта, она не работает с перенаправленными потоками вывода:

обусловлено моим недостаточным знанием winapi

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #48 : Декабрь 14, 2012, 07:38:56 pm »
Кстати, а чем обусловлено использование в модуле Out функции WriteConsoleA а не WriteFile? Ведь у WriteConsoleA есть противная черта, она не работает с перенаправленными потоками вывода:

обусловлено моим недостаточным знанием winapi
Ну, я тоже там не блистаю особо - наткнулся только потому, что привык редиректить, а оно не редиректится :-) Ну и фикс в одну строчку:
  (* GetProc("WriteConsoleA", kernel32, sys.ADR(WriteConsole)); *)
  GetProc("WriteFile", kernel32, sys.ADR(WriteConsole));

Пошел щупать дальше :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #49 : Декабрь 14, 2012, 08:31:54 pm »
Оригинальный язык был XDS Oberon-2. При этом я старался не пользоваться средствами Oberon-2, отсутствующими в Oberon-07. В какой-то момент исходный код был просто переведен на Oberon-07, что было несложно сделать. Также первое время компилятор производил не машинный код, а ассемблерный masm32. Постепенно ассемблерный код был заменен машинным.

А как ты оцениваешь - насколько трудоемко добавить поддержку Win64?

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #50 : Декабрь 15, 2012, 01:27:13 pm »
А как ты оцениваешь - насколько трудоемко добавить поддержку Win64?

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

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #51 : Декабрь 18, 2012, 05:49:00 pm »
Сколько времени у вас заняло написание компилятора?

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #52 : Декабрь 18, 2012, 08:37:55 pm »
Сколько времени у вас заняло написание компилятора?

Записал основные даты в истории компилятора:

18 мая 2012 - начало разработки
15 июля 2012 - самокомпиляция в ассемблер
20 сентября 2012 самокомпиляция в машкод

Параллельно с разработкой компилятора приходилось разбираться в ассемблере, структуре исполняемых файлов и многих более мелких системных вопросах (stdcall, выравнивание полей в структурах). Если бы я все это знал раньше, разработка заняла бы меньше времени. Кроме того, я почти не пользовался специализированной литературой. Если бы я воспользовался хотя бы книгой Вирта "Построение компилятора", я бы избежал многих ошибок и меньше пришлось бы вносить исправления, теряя время.

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #53 : Декабрь 18, 2012, 08:57:35 pm »
Ну вот! А тут стращали что это минимум на 2-3 года работы:)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #54 : Декабрь 19, 2012, 04:47:49 am »
Ну вот! А тут стращали что это минимум на 2-3 года работы:)
В современных условиях только сам компилятор никому не нужен. Нужна платформа -- библиотеки, желательна среда разработки, документация ко всему хозяйству и т.д. А всё это займёт куда больше чем полгода. Одно тело и за три года вряд ли управится...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #55 : Декабрь 21, 2012, 10:29:05 am »
akron1, здесь лежат исходники Оберон-07 под AVR.  Язык разработки - Активный Оберон.
Может будет полезен.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #56 : Декабрь 27, 2012, 05:40:37 pm »
А можно описать что какое поле значит в экспортируемых типах модуля DECL?

Прямо сейчас меня интересует это:
  rIDENT* = RECORD (UTILS.rITEM)
    Name: SCAN.NODE;
    line*, col*: INTEGER;
    Number*: INTEGER;
    iType*: INTEGER;
    T*: pTYPE;
    Unit*: UNIT;
    Value*: LONGREAL;
    Export: BOOLEAN;
    StProc*: INTEGER;
    VarSize: INTEGER;
    ParamSize*: INTEGER;
    LocalSize: INTEGER;
    Offset*: INTEGER;
    VarKind*: INTEGER;
    current: BOOLEAN;
    Level*: INTEGER;
    Parent*: IDENT;
    ParamCount*: INTEGER
  END;

А еще конкретней - что такое тут Offset.
Y = λf.(λx.f (x x)) (λx.f (x x))

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #57 : Декабрь 27, 2012, 05:58:22 pm »
Цитировать
А еще конкретней - что такое тут Offset.

Offset - смещение переменной (это поле применяется только для идентификаторов переменных, для любых других видов идентификаторов оно равно 0)
Для глобальных -- относительно начала секции глобальных переменных (первая объявленная глобальная переменная имеет смещение 0).
Для локальных и параметров - относительно базы кадра стека (на него указывает регистр EBP). У параметров смещение положительное, у локальных переменных отрицательное.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #58 : Декабрь 27, 2012, 06:03:44 pm »
Цитировать
А еще конкретней - что такое тут Offset.

Offset - смещение переменной (это поле применяется только для идентификаторов переменных, для любых других видов идентификаторов оно равно 0)
Для глобальных -- относительно начала секции глобальных переменных (первая объявленная глобальная переменная имеет смещение 0).
Для локальных и параметров - относительно базы кадра стека (на него указывает регистр EBP). У параметров смещение положительное, у локальных переменных отрицательное.
Смещение в байтах?

Я правильно понял, что это артефакт конкретного кодогенератора?
Y = λf.(λx.f (x x)) (λx.f (x x))

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Компилятор Oberon-07/11 для x86 Windows
« Ответ #59 : Декабрь 27, 2012, 06:07:22 pm »
Цитировать
Смещение в байтах?
Да

Цитировать
Я правильно понял, что это артефакт конкретного кодогенератора?
Не понял. В каком смысле артефакт?