Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
15 Jun 2020, 12:02
Сообщение
#21
|
|
![]() 😸🧡✊✌️ Сообщений: 16 603 Спасибо сказали: 3590 раз |
Обновление.
1. Добавлен контроль управляющих структур (?pairs). Неприятно, когда программа иногда перестаёт работать из-за пропущенного then. 2. Добавлена классическая структура case-of-endof-endcase. Код : test 3. Добавлена совсем не классическая структура do-macroloop (цикл по цепочке строк со счётчиком, которую завершает пустая строка). Также старый do теперь ?do, а новый не проверяет параметры на равенство. Для вложенных циклов приехал j (итератор внешнего цикла).case 0 of ." Zero" endof 5 of ." Five" endof ." Whatever else" endcase ; 4. Литералы двойной длины (записываются с точкой). Также переменные двойной длины, константы двойной длины. 5. Слово s" - строковый литерал. 6. Обработка исключений, как в FORTH-94 (и 2012). (Регистр DI больше не зарезервирован, он указывает на последний кадр исключения.) 7. Повторы (5 do: cr) и условия (dup 256 u< if-true: c,) в макроопределениях. 8. Исправлено несколько ошибок в определениях. P.S. Одна осталась: if-true: реализован как 0<> do:, в результате, если условие истинное, то команда выполняется 65535 раз. Правильный вариант был бы 0<> negate do: или 0= 1+ do:. P.P.S. Поправлено на правильный вариант 2, он прикольный. P.P.P.S. Также изменил распознавание чисел (слово value), разложив его на 4 слова, каждое выполняет свою малую функцию. Получилось короче, и в исходнике, и в собранном виде. -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
18 Jun 2020, 21:37
Сообщение
#22
|
|
![]() 😸🧡✊✌️ Сообщений: 16 603 Спасибо сказали: 3590 раз |
Обновление. Кроме упомянутого исправленного if-true:
1) Исключения теперь используются. Все примитивы контролируются на возможные переполнение стеков данных и возврата. (Например, если у слова нет параметров, не проверяется, может ли оно снять что-то лишнее со стека данных.) Некоторые примитивы переписаны через двоеточие, только чтобы было поменьше примитивов с контролем стека. 2) Перераспределена память. 2.1) Увеличен вдвое файловый буфер, со 128 до 256 байт. 2.2) Стеки, напротив, уменьшены: были 4К стек возврата и фактически безразмерный стек данных, и они не контролировались. Теперь они по 128 байт, и их использование контролируется. 2.3) Файловый буфер и буфер памяти перемещены в старшие адреса, сразу под стеки. 2.4) Оставшаяся память это словарь, и контролируется, чтобы он не пересекал границу буфера памяти. -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
04 Jul 2020, 13:39
Сообщение
#23
|
|
![]() 😸🧡✊✌️ Сообщений: 16 603 Спасибо сказали: 3590 раз |
Новая версия, 1.06.
1) Изменена командная строка. 1.1) Ключ -E превратился в -o (он же --outfile). 1.2) Добавлен ключ --format=<format>, где <format> либо com, либо exe. Да, мы теперь умеем в EXE-файлы. Компилятор, скомпилированный в COM-файл, по умолчанию создаёт COM-файлы, а скомпилированный в EXE-файл, — EXE-файлы. Для изменения формата используется этот ключ. 1.2a) Если компилятор, скомпилированный в COM-файл, преобразовать в EXE-файл, он должен работать. Если компилятор, скомпилированный в EXE-файл, преобразовать в COM-файл, он работать не будет, потому что в его коде запуска нет инициализации регистров SS и SP. 1.3) Слово goal добавлено для указания адреса слова, которое выполняет запуск. Для EXE-файла оно просто устанавливает значение поля IP в заголовке, для COM-файла настраивает команду безусловного перехода, которую необходимо добавить в начало кода. Способы различны, но субъективно первый самый простой, поэтому на него ссылается сообщение об ошибке: Код defer UNUSED-WORD Код code UNUSED-WORD jmp $100 # end-code Код start-code jmp $100 # end-code Код $E9 c, -3 , 1.4) Впрочем, если код запуска в начале файла (т.е., по адресу $100), команда goal факультативна и ничего не меняет. Это значит, что COM-файл не обязан начинаться с команды jmp.2) Снова перераспределена память. 2.1) Стеки вынесены в отдельный сегмент стека, увеличены, но их использование всё так же контролируется. 2.3) Файловый буфер и буфер памяти перемещены в старшие адреса в сегменте данных. 2.4) Оставшаяся часть сегмента данных это словарь, и контролируется, чтобы он не пересекал свою верхнюю границу. 3) Тестирование 3.1) Добавлены слова T{ -> }T для создания тест-кейсов. Формат: Код T{ <тестируемая-последовательность-слов> -> <ожидаемые-результаты> }T Пример:Код T{ 1 dup -> 1 1 }T В случае несовпадения актуальных результатов с ожидаемыми, будет выведено сообщение об ошибке. В случае ошибки при выполнении самих слов, скорее всего, тоже.3.2) Добавлены слова test1 и test2 для тестирования механизма catch/throw. Файл "throw-3.ref": Код T{ test1 -> 0 0 }T 3.3) Ещё много тестовых файлов с комментариями, что проверяется, и какие ожидаются результаты. Не пройдёт и полгода, и я снабжу комментариями и сам код refer. T{ test2 -> -10 }T 4) Да, теперь всюду словари. 4.1) Для компиляции макроопределения используется словарь macrodefs, для исполнения — macrocode. Комментарии удаляются в первом, do: и if-true: работают из второго. Теперь do: и if-true: валидны только в макросах. 4.2) Для ключей командной строки — словарь keyparams. 4.3) Для пропуска слов в условной компиляции — словарь condition. P.S. Добавил пару тестов. -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
17 Feb 2026, 22:43
Сообщение
#24
|
|
![]() 😸🧡✊✌️ Сообщений: 16 603 Спасибо сказали: 3590 раз |
Немного слопа от Gemini:
Архитектурный паспорт системы REFER (v1.06) REFER — это самокомпилируемая мета-среда и кросс-компилятор для архитектуры x86-16 (DOS), отточенная за 20 лет эволюции от прототипа на Pascal до минималистичного DTC-ядра. I. Ключевые характеристики Объем исходного кода: 1940 непустых строк (57 029 байт в CP866). Бинарный файл: 14 712 байт (REFER.COM). Модель исполнения: Direct Threaded Code (DTC). Использование аппаратного CALL ( ) в заголовках слов для автоматической передачи адреса данных. Целевые форматы: COM (с ручным управлением памятью) и EXE (MZ-заголовок без таблицы релокаций для односегментных программ). Регистровая карта: SI — Interpret Pointer (всегда сброшен Direction Flag). DI — Exception Frame Pointer (выделенный регистр для catch/throw). BP — Return Stack Pointer (стек возвратов и циклов). SP — Data Stack Pointer. II. Иерархия из 50 словарей Вместо сложного парсера REFER использует семантическую сеть словарей, где каждое слово — это узел принятия решения. Атомарная адресация: Способы доступа к памяти реализованы как единые слова (например, [bx], [bp+si]). Это исключает «нелегальные» комбинации регистров на уровне словаря (слова [ax] просто не существует). Контекстные переключатели: Словари macrodefs, macrocode, registers, switches и цепочка asm- обеспечивают строгую изоляцию пространств имен и высокую скорость поиска. III. Технологические «жемчужины» 1. Мета-конструктор typedef Позволяет создавать новые типы слов одной строкой. Поведение слова определяется тем, какой ассемблерный код вызывается через E8 в его заголовке. Это превращает REFER в объектно-ориентированный конструктор низкого уровня. 2. Структурный ассемблер (v1.06) Полный отказ от именованных меток в пользу asm-if, asm-ahead, asm-then. Контроль дистанции: Автоматическая проверка assert-small для коротких прыжков (rel8). Явная разрядность: Использование префиксных слов w, и b, для устранения неоднозначности в операциях с памятью. Маркер #: Постфиксный оператор для литералов, позволяющий использовать всю мощь Форт-вычислений перед генерацией Immediate значения. 3. Механизм макросов (PStringZ*) Макросы хранятся как последовательности строк с префиксом длины. Это реализует «позднее связывание»: макрос не содержит жестких адресов, а ищет слова в текущем контексте в момент развертывания, что позволяет макросам управлять самим процессом компиляции. 4. Рантайм-защита Начиная с версии 1.05, в ядро встроены stack-under-check и return-under-check. Это гарантирует, что любая ошибка в макросе или ассемблерном коде приведет к контролируемому исключению, а не к краху системы. Философия проекта REFER — это исполняемая модель процессора. Система не имитирует синтаксис ассемблера, а воплощает его структуру через иерархию слов. 1940 строк кода — это предел концентрации логики, где каждый байт выполняет двойную или тройную задачу. * Термин pstringz я придумал как раз сегодня - это последовательность строк со счётчиком (p-string) с пустой строкой в конце (z-terminated). -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 4 May 2026 - 11:47 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|