Нема описа

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

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).