Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт ноя 29, 2022 07:20

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 180 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12
Автор Сообщение
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн мар 21, 2022 10:17 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Форт-система дошла до стадии, когда её можно отлаживать, выводя средствами форта что-то не печать.

Форт внезапно проявил отладкоустойчивость)
Выводил на печать числа. Функция WriteFile ,внезапно, дала код ошибки.
Ещё имеющийся косяк – я как-то неправильно написал примитив для деления чисел.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн мар 21, 2022 14:40 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2162
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Victor__v писал(а):
Ещё имеющийся косяк – я как-то неправильно написал примитив для деления чисел.

Может это поможет( все что касается деления - взято из Win64FasmForth Михаила Максимова )
Код:
CODE FM/MOD
40A3A7   48 89 C1                               mov     rcx,rax
40A3AA   48 8B 55 00                            mov     rdx,$00[rbp]
40A3AE   48 89 D3                               mov     rbx,rdx
40A3B1   48 8B 45 08                            mov     rax,$08[rbp]
40A3B5   48 F7 F9                               idiv    rax,rcx
40A3B8   48 85 D2                               test    rdx,rdx
40A3BB   74 0B                                  jz      $40A3C8
40A3BD   48 31 CB                               xor     rbx,rcx
40A3C0   79 06                                  jNs     $40A3C8
40A3C2   48 FF C8                               dec     rax
40A3C5   48 01 CA                               add     rdx,rcx
40A3C8   48 8D 6D 08                            lea     rbp,$08[rbp]
40A3CC   48 89 55 00                            mov     $00[rbp],rdx
40A3D0   C3                                     ret
END-CODE
( 42 bytes 14 instructions )


CODE */MOD
40A36E   48 89 C1                               mov     rcx,rax
40A371   48 8B 45 00                            mov     rax,$00[rbp]
40A375   48 F7 6D 08                            imul    rax,$08[rbp]
40A379   48 F7 F9                               idiv    rax,rcx
40A37C   48 89 55 08                            mov     $08[rbp],rdx
40A380   48 8D 6D 08                            lea     rbp,$08[rbp]
40A384   C3                                     ret
END-CODE
( 23 bytes 7 instructions )


CODE UM/MOD
40A337   48 89 C1                               mov     rcx,rax
40A33A   48 8B 55 00                            mov     rdx,$00[rbp]
40A33E   48 8B 45 08                            mov     rax,$08[rbp]
40A342   48 F7 F1                               div     rax,rcx
40A345   48 8D 6D 08                            lea     rbp,$08[rbp]
40A349   48 89 55 00                            mov     $00[rbp],rdx
40A34D   C3                                     ret
END-CODE
( 23 bytes 7 instructions )


CODE /MOD
40A305   48 89 C1                               mov     rcx,rax
40A308   48 8B 45 00                            mov     rax,$00[rbp]
40A30C   48 99                                  cwd
40A30E   48 F7 F9                               idiv    rax,rcx
40A311   48 89 55 00                            mov     $00[rbp],rdx
40A315   C3                                     ret
END-CODE
( 17 bytes 6 instructions )


CODE MOD
40A2D4   48 89 C1                               mov     rcx,rax
40A2D7   48 8B 45 00                            mov     rax,$00[rbp]
40A2DB   48 99                                  cwd
40A2DD   48 F7 F9                               idiv    rax,rcx
40A2E0   48 8D 6D 08                            lea     rbp,$08[rbp]
40A2E4   48 89 D0                               mov     rax,rdx
40A2E7   C3                                     ret
END-CODE
( 20 bytes 7 instructions )


CODE /
40A2A2   48 89 C1                               mov     rcx,rax
40A2A5   48 8B 45 00                            mov     rax,$00[rbp]
40A2A9   48 99                                  cwd
40A2AB   48 F7 F9                               idiv    rax,rcx
40A2AE   48 8D 6D 08                            lea     rbp,$08[rbp]
40A2B2   C3                                     ret
END-CODE
( 17 bytes 6 instructions )


CODE U/
40A1FB   48 89 C1                               mov     rcx,rax
40A1FE   48 8B 45 00                            mov     rax,$00[rbp]
40A202   48 31 D2                               xor     rdx,rdx
40A205   48 8D 6D 08                            lea     rbp,$08[rbp]
40A209   48 F7 F1                               div     rax,rcx
40A20C   C3                                     ret
END-CODE
( 18 bytes 6 instructions )

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Чт апр 28, 2022 22:25 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
chess, скажем так, этот дизассемблер немного censored

Правильно не cwd, а cqo

Стоило исправить, как сразу же дошёл до режима интерпретации. Правда он сейчас ни транслирует ничего кроме пробела)

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пт апр 29, 2022 00:45 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2162
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Обращайте внимание не на название, а на
значение байтов инструкции.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пт апр 29, 2022 10:39 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2162
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Victor__v писал(а):
chess, скажем так, этот дизассемблер немного censored

Правильно не cwd, а cqo

Этот дизассемблер от Bernd Paysan я немного поправил для удобства пользования, но корректность мнемоник
не проверял. Неточность по cwd ~ cqo исправил:
Код:
SEE /
CODE /
40A2A2   48 89 C1                                           mov rcx,rax
40A2A5   48 8B 45 00                                        mov rax,$00[rbp]
40A2A9   48 99                                              cqo
40A2AB   48 F7 F9                                           idiv        rax,rcx
40A2AE   48 8D 6D 08                                        lea rbp,$08[rbp]
40A2B2   C3                                                 ret
END-CODE
( 17 bytes, 6 instructions )

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Сб апр 30, 2022 23:00 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Понял почему у меня функции WriteFile и ReadFile работали в зависимости от фаз Луны.

Я умудрился прошляпить тот момент, что кода параметров больше 4, то стек надо выравнивать с учётом доп. параметров.
Не прошло и года, как говорится. Заодно и ошибки помельче пофиксил. Опять что ли уйти в сумрак?

Код:
HEADERS '(Ncall)'
POP RBX                     ; RBX указывает на структуру, где хранятся служебные данные
MOV RCX, RAX               ; засовываем первые 4 параметра
MOV RDX, [RBP]               ;
MOV r8, [RBP+CELL]            ;
MOV r9, [2*CELL+RBP]          ;
LEA RBP, [3*CELL+RBP]         

MOV RAX, [3*CELL+RBX]          ; тут у нас хранится оставшееся кол-во параметров
MOV RSI, RSP               ; сохраняем нормальную точку стека возвратов

   LEA r10, [RAX*8]         ; сколько памяти надо выделить на стеке оставшимся параметрам.
   SUB RSP, r10            ; выделяем эту память
      SUB RSP, 15            ; выравнивание на 16   
      SAR RSP, 4            ;
      SAL RSP, 4            ;

ADD RSP, r10                ; можно было сделать перемещение вида память->регистр->память, но мне было лень   
ncall:
PUSH QWORD [RBP]
LEA RBP, [RBP+CELL]
DEC RAX
JNZ ncall

SUB RSP, 32                  ; винда настолько плоха, что не может сама выделить себе 4 ячейки стека, делаем это вместо неё

CALL QWORD [RBX]            ; тут хранится либо код инициализации АПИ либо сам вызов
MOV RSP, RSI               ; нормализируем всю эту стековую вакханалию к нормальному состоянию
RET

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт май 03, 2022 19:12 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Текущий статус:

Выловил часть мелких багов. Теперь форт-система уверенно компилирует и интерпретирует данные. Однако за отладку механизма пространств еще не брался.

Возникли непонятные сложности (опять) c API. На этот раз почему-то нельзя открывать/создавать файлы. Выскакивает ошибка 87 (неправильный параметр). Буду копать.

Все остальное тут:
https://vk.com/wall-114247189_218

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вс май 08, 2022 14:25 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Вести с полей.
Своп и инициализация пространств работают штатно.
Ещё поправил несколько мелких багов.

По ходу придётся делать в словарном пространстве в LFA вместо адресов смещения, из-за чего придётся немного усложнить перебор слов или ещё как-то изващаться.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн май 09, 2022 21:33 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Проблемы с пространством, где хранятся словарные структуры.

Переписать указатели внутри при ресайзе кучи несложно, проблемы начинаются дальше.

1)
Актуализация словарей. Если они принадлежат пространству, то меняем указатели в стеке словарей и переменной CURRENT

Это несложно.

2)
А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр?

И, ЧСХ, подобные примеры у меня есть в коде.


Поэтому, чтобы не извращаться и не извращать потенциальным пользователям мозг, я сделал выделение памяти под словарные пространства статичным.
Сейчас выделяю 50 кб на это.
Для сравнения почти 400 словарных структур словаря FORTH занимают чуть больше 17 кб. Возможно, стоит ужать размеры некоторых полей. Например, навряд ли смещение до имени слова будет занимать несколько триллиардов) а длина слов. структуры превысит 65000 байтов.

Конечно, ужимать словарную структуру ради экономии памяти особенно 64-битах кажется тем еще извращением и навряд ли оно того стоит. Не говоря уж о том, что если в скомпилированной программе все эти структурки будут нафиг не нужны, то их можно спокойно выкинуть.

Также проверял форт на баги. В качестве теста пробовал скомпилировать и проверить свою либу по локальным переменным.
После нескольких часов причёсывания ошибки в форте были локализованы и устранены. Протестю форт ещё на паре либ и можно будет уже Новой делиться с общественностью)

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт май 10, 2022 13:29 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5061
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Victor__v писал(а):
А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр?

только одно, реализовывать ассоциативную память(пардон, называется как-то иначе, забыл правильное название, когда все адреса находятся в специальном массиве, хранящем реальные адреса, и вся работа ведется через этот массив, т.е. индексы а не реальные адреса) и не работать никогда с реальными адресами (конечно, будет медленнее).

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт май 10, 2022 13:41 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
Victor__v писал(а):
А что делать со словарями, чьи LFA были сохранены, например, в константы, какие-то массивы и пр?

только одно, реализовывать ассоциативную память(пардон, называется как-то иначе, забыл правильное название, когда все адреса находятся в специальном массиве, хранящем реальные адреса, и вся работа ведется через этот массив, т.е. индексы а не реальные адреса) и не работать никогда с реальными адресами (конечно, будет медленнее).


Я думал над этим.
Можно, как вариант, хранить не LFA, а указатели на код словарей, но просто перолопачивать надо будет много исходников и либ.

Поэтому решил сделать статику и не париться.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пн май 16, 2022 17:21 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
По прежнему фиксю косяки и пр. несуразицы.

Например, исправил слова для деления беззнаковых чисел.

Вопрос к нашему сообществу, посоветуйте какуе-нибудь Апи-функции, на которой можно калбеки протестить?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Пт июн 03, 2022 17:15 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Victor__v писал(а):
По прежнему фиксю косяки и пр. несуразицы.

Например, исправил слова для деления беззнаковых чисел.

Вопрос к нашему сообществу, посоветуйте какуе-нибудь Апи-функции, на которой можно калбеки протестить?


Лес рук)

Сейчас все же думаю над корректностью словарей при изменении размеров пространства под словарного пространства.

Всё-таки хочется, чтобы при изменении адреса словарного пространства LFA словаря оставался прежним.

До чего я додумался:

В пространстве будет чисто техническая запись (её не видно в поиске), которая ссылается на словарную структуру в пространстве кода.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Ср сен 28, 2022 17:01 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Все лень покопаться в тестовой версии и сделать её нормальной. Только и делаю, что компилирую псевдофорт-код в уме, дабы все было красивенько по функциональчику.

Как оно работает сейчас:
Есть 4 пространства
Код
Данные (в которых нельзя хранить переменные, ибо чревато при определенных условиях)
Словарных структур (в котором хрен знает как лучше хранить эти самые словарные структуры)
Пространство имен словарных структур.

До чего додумался:
Есть 3 пространства
Код
Данные, где хранятся только строки и массивы
Словарных структур

При этом пространство словарных структур. будет работать так:
1-й уровень (программно не доступен, хе-хе, пользователю)
-- Это массив указателей, собственно, на словарные структуры.
2-й уровень
-- это эти самые словарные структуры. При этом ими можно манипулировать словами , ALLOT DW, и пр.

Примерная реализация

: (newWORD)
WORD-STRUCT ALLOCATE THROW TO LAST-LFA
WORD-STRUCT LAST-LFA L>lenFA !
CURRENT @ L>wordFA @ >R
R@ mpos @ R@ mlen @ = IF R@ mlen @ 40 CELLS R@ mstart RESIZE THROW R@ mstart ! 40 R@ mlen +! THEN
LAST-LFA R@ mpos @ CELLS R@ mstart @ + !
R> mpos 1+!
;

: HERE .... LAST-LFA DUP L>lenFA @ + ;
: DW, ... CELL LAST-LFA L>lenFA @ + LAST-LFA RESIZE THROW TO LAST-LFA HERE DW! CELL LAST-LFA L>lenFA +! ;

В качестве LFA (ссылки на пред. слово в поиске) будет не реальный адрес, а индекс в массиве словарных структур. Адресация массива будет вестись от 1, а не от 0.
Таким образом, можно в любой момент "переключиться" на работу с каждым отдельным словом, например, чтобы "дополнить информацию".
Недостаток такого решения: нельзя будет напрямую связать поиск между словарями из разных пространств. Придется городить дополнительный огород.
Идентификатором словаря в свою очередь будет отдельная структура из двух элементов (1-й указатель на управляющую структуру пространства, 2-й индекс слова в массиве).

Также, поскольку тут и так уже все понасовано по кучам, имя слова будет храниться в хипе отдельно.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт окт 18, 2022 18:10 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1214
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Продолжаю записывать свои измышлизмы, попутно пытаясь запустить проапгрейженный 64-битный форт собственного производства)

Оптимизация готового образа с помощью псевдокода :)

Сначала превращаем форт-код в псевдокод.
Аля
10 CELLS CELL+
В
NUM 10
WORD CELLS
WORD CELL+

Потом перефигачиваем все это во что-то более приличное (например, в число 88 )
условный код обработчика: OPT: NUM+CELLS NUM-ANY WORD CELLS :>> p1 get-val CELLS p1 set-val p2 delete ;

Более злобное использование словарного пространства.
Сейчас там помимо структуры хранятся всякие доп. данные. Например, сведения для компиляции/исполнения TO и FROM, длине инлайн-слова, дополнительные точки входа в слово и пр.
Есть и идея сделать словарное пространство каждого слово более динамическим в этом плане.
Например, если в поле флагов есть флаг инлайна, то в словарной структуре ищется метка #INLINE и идущие за ними значения для компиляции инлайна. И таким образом со всеми другими интересными случаями.
Плюсы:
>> расширяемость и простота, а также наглядность даже в отладке.

Минусы данного подхода:
>> Прежде всего это дополнительные затраты поиск данных во время компиляции, а я не люблю доп. затраты во время компиляции.
>> Закон Мёрфи, етить. Нельзя дать гарантию, что при поиске внутри словарной структуры не произойдёт коллизия.
>>> Обход: после конца обязательной части слов. структуры идет значение флага (4 байта) и длинна поля под соответствующие данные (4 байта). Поиск и будет быстрее search и так проще.
>> Непонятно что делать с полем флагов. По сути оно уже становится ненужным. Максимум чуть ускорит компиляцию, сразу показав, например, что такой-то фигни тут нет.
>> Реализация POSTPONE. Просто дать указатель на словарную структуры не выйдет, поскольку там динамическая память. Текущий вариант со значением поля флагов и указателем на код гораздо проще.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 180 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB