Nenhuma descrição

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

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