Aucune description

kpmy d5c58e838a dependency fix il y a 10 ans
code 088f7437ff для демо с итератором выяснилось, что типы могут быть так же расположены в скоупе процедуры, похоже что там поиск импортированых типов не работает il y a 10 ans
cp d5c58e838a dependency fix il y a 10 ans
doc 82dff8433c исправил баг в deref, нашел там же еще один il y a 10 ans
rt2 d5c58e838a dependency fix il y a 10 ans
utils 849cfa81d2 убрал паразитный fmt il y a 10 ans
xev d5c58e838a dependency fix il y a 10 ans
.gitignore 53c8edd71c загрузка CASE il y a 10 ans
.mailmap f43fc4cd8c модули загружаются и выполняют код секций в правильном порядке, как в ББ. il y a 10 ans
LICENSE 055f8c35d3 initial il y a 10 ans
README.md b5a587b996 обновил ридми, проект пока заморожен il y a 10 ans
domain.go d5c58e838a dependency fix il y a 10 ans
fw.go d5c58e838a dependency fix il y a 10 ans
fw_test.bat 7c0f6d2450 добавил тесты il y a 10 ans
fw_test_all.bat 31aa3d7863 разобрался с полями из импортированных типов il y a 10 ans
fw_test_dump.bat 03db1e7e47 добавил сравнение указателей между собой il y a 10 ans

README.md

The Framework (fw)

Фреймворк-интерпретатор для языка Component Pascal (Oberon/L, КП).
Цель проекта: отвязка языка КП от фреймворка BlackBox.

Вводные данные

Компилятор BlackBox Component Builder работает по трехзвенной схеме. Результатом первого этапа работы является абстрактное синтаксическое дерево. Это дерево сохраняется в файл (сейчас это формат GraphML).

Инструменты

Используется компилятор Go и его стандартная библиотека. Так же необходим пакет ypk. Код генерируется в BlackBox, подсистемой Xev.

Результат

Исполнение кода из модулей-графов. Перед исполнением структура дерева восстанавливается в памяти интерпретатора. Идентификация узлов сквозная для всех модулей.

Интерпретатор нацеливается на узел входа в модуль и начинает итеративно переходить от узла к узлу по заданным правилам (см. doc/ast.pdf). Каждый новый узел порождает новый уровень глубины стека обработки. Результат обработки узла, если таковой имеется, передается на обработку предыдущему узлу в стеке.

Данные хранятся в трех экземплярах менеджера данных.

  • Первый экземпляр - данные модулей, не выгружаются по завершении обработки узла входа в модуль. Таким образом достигается модульность среды исполнения.
  • Второй экземпляр - данные процедур, стек, каждый уровень существует, пока интерпретатор не вышел из тела процедуры.
  • Третий экземпляр - куча. Данные в ней размещаются динамически, в результате вызова процедуры NEW. Очистка памяти так же автоматическая, используются механизмы языка Go.

Данные в менеджере хранятся организованно, они соответствуют заданным узлам данных.

Одним из основных элементов отвязки языка от конкретного фреймворка является применение процедурных переменных, которые инициализируются фреймворком. Таким образом, в рамках правил языка доступен вызов таких процедурных переменных. Их названия и интерфейс сигнализируют фреймворку об особенностях интерпретации. Такой подход проверен в оригинальном фреймворке и в фреймворке fw.

Текущее состояние

На данном этапе выполняется интерпретация всех типов узлов, обобщенный механизм допускает появление новых узлов. Узлы с данными так же обрабатываются в полной мере. Менеджер данных поддерживает структурные типы данных КП, но для сложных типов, с наследованием и прочим - возможны ошибки.

Модуль работы с данными пока поддерживает не все типы данных, то есть, операция сложения и другие могут быть не определены для редких типов данных, типа SHORTREAL, но эта ситуация охраняется.

Концепция отвязки от среды позволила наладить процесс написания тестовых модулей для фреймворка прямо в BlackBox, что помогает в процессе разработки. Модуль SYSTEM исключен из рантайма, что позволяет добиться хорошей переносимости кода.

TODO:

  • Отладка работы со сложными типами данных
  • Реализация базовых операций для всех типов данных.
  • Реализация базовых компонентов по работе с окружающим миром, возможно на основе компонентов BlackBox (Files, Strings).