Refer, еще один ЯП для срыва мозга |
Здравствуйте, гость ( Вход | Регистрация )
Refer, еще один ЯП для срыва мозга |
15 Jun 2020, 12:02
Сообщение
#21
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2662 раза |
Обновление.
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 слова, каждое выполняет свою малую функцию. Получилось короче, и в исходнике, и в собранном виде. -------------------- |
|
|
18 Jun 2020, 21:37
Сообщение
#22
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2662 раза |
Обновление. Кроме упомянутого исправленного if-true:
1) Исключения теперь используются. Все примитивы контролируются на возможные переполнение стеков данных и возврата. (Например, если у слова нет параметров, не проверяется, может ли оно снять что-то лишнее со стека данных.) Некоторые примитивы переписаны через двоеточие, только чтобы было поменьше примитивов с контролем стека. Также, теперь нельзя создать определение для пустого слова. 2) Перераспределена память. 2.1) Увеличен вдвое файловый буфер, со 128 до 256 байт. 2.2) Стеки, напротив, уменьшены: были 4К стек возврата и фактически безразмерный стек данных, и они не контролировались. Теперь они по 128 байт, и их использование контролируется. 2.3) Файловый буфер и буфер памяти перемещены в старшие адреса, сразу под стеки. 2.4) Оставшаяся память это словарь, и контролируется, чтобы он не пересекал границу буфера памяти. -------------------- |
|
|
04 Jul 2020, 13:39
Сообщение
#23
|
|
😸🧡✊✌️ Сообщений: 16 023 Спасибо сказали: 2662 раза |
Новая версия, 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. Добавил пару тестов. -------------------- |
|
|
Текстовая версия | Сейчас: 18 April 2024 - 10:55 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |