Forth http://fforum.winglion.ru/ |
|
Nova Дневник разработчика http://fforum.winglion.ru/viewtopic.php?f=58&t=3227 |
Страница 10 из 14 |
Автор: | Total Vacuum [ Вт сен 14, 2021 15:27 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): 0 dup 1+ О, спасибо, сэкономил 4 байта) Опять же по поводу 0 1, если сделать, чтобы для часто используемых чисел в коде вместо lit число было call, то, вероятно, вся форт-система очень сильно похудеет (например, моя тестовая худеет очень сильно), так что если минимизация размера - самоцель, то вполне можно заняться... Можно сделать 0 constant 0 1 constant 1 2 constant 2 и т.д. и посмотреть... Если я правильно путаю, во многих реализациях делают 0 1 2 3 отдельными словами... |
Автор: | Victor__v [ Чт ноя 18, 2021 12:59 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Дошёл таки наконец до перебора слов. Поскольку теперь словарные структуры жестче регламентируются, то можно сделать перебор прямо в пространстве слов. Это пригодится при инициализации и может еще где Код: \ итерация всех словарных стурктур в пространстве \ может пригодиться для перебора всех слов, например, в дереве врем. словаря. \ будет исп. для инициализации др. пространств. : WORD-SPACE-ITER: \ word-space -- iter: lfa BEGIN L>wordFA @ >R R@ space.end @ R> space.start @ 2>R BEGIN 2R@ < \ на случай если где-то некорректные длины структур 2R@ = OR IF RDROP RDROP RDROP EXIT THEN R@ L>LFA 2 RPICK EXECUTE \ L>LFA это по сути 0 + R> DUP L>lenFA @ + >R AGAIN ALTERNATIVE: \ алт. режим, где код итератора внешний \ word-space xt -- iter: lfa call-xt >R AGAIN ; :NONAME 0 VOCS-ITER: L>wordFA @ SSET-IN ; \ -- sset \ получаем множество всех имеющихся в форте слов. пространств : ALL-WORDS-ITER: R> [ COMPILE, ] N>R >R BEGIN 1 RPICK WHILE 2 RPICK R@ ALT: WORD-SPACE-ITER: R> R> 1- RDROP >R >R REPEAT RDROP RDROP ; Слово ALL-WORDS-ITER: используется для инициализации api, если что |
Автор: | mOleg [ Пт ноя 19, 2021 19:54 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): Слово ALL-WORDS-ITER: используется для инициализации api, если что забавно, у меня так: Код: WINAPLINK ['] @API WithList \ инициализация адресов всех импортируемых API Все-таки ваше форматирование текста исходников я плохо воспринимаю 8( |
Автор: | Victor__v [ Пт ноя 19, 2021 23:37 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Тут, как говорится, хозяин барин. Нагляднее и проще, имхо, когда код для действия над каждым элементом идёт после итератора, а не играть в калбеки, понимаешь) Код инициализации, пример как счас: Код: : WINAPI-FREE
ALL-WORDS-ITER: L>CFA @ >R R@ ['] (stdcall) CALL-in-addr? R@ ['] (Cdecl) CALL-in-addr? R@ ['] (N-Cdecl) CALL-in-addr? OR OR IF R@ >param 0! THEN RDROP ; |
Автор: | mOleg [ Сб ноя 20, 2021 08:27 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): Нагляднее и проще, имхо, когда код для действия над каждым элементом идёт после итератора, а не играть в калбеки, понимаешь) Неа, это, таки Форт: сначала параметры, потом действие 8) |
Автор: | Victor__v [ Сб ноя 20, 2021 16:56 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Вот как в 64-битной версии будет выглядеть инициализация (по сути сброс) внешних функций. Код: : API-INIT
['] (0call) ['] (1call) ['] (2call) ['] (3call) ['] (4call) ['] (Ncall) ['] (Cdecl) ['] (N-Cdecl) 8 \ задаём множество из 8 функций ['] NDROP >R \ удаляем множество на обратном ходу ALL-WORDS-ITER: L>CFA @ >R R@ GET-CALL 0= IF DROP RDROP EXIT THEN \ если в коде слова нет вызова вообще, переходим к сл. слову \ если функция принадлежит множеству, то сбрасываем внешний указатель API на инициализатор SSET? IF ['] (init-API) R@ SKIP-CALL DROP ! THEN RDROP ; |
Автор: | Victor__v [ Сб ноя 20, 2021 17:37 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
А теперь к возникшим проблемам. Все они, что неудивительно, связаны с раздельных хранением данных. 1) Некорректные имена Если во время изменения размера пространства под имена слов, указатель на сие пространство сместился, то словарном пространстве у нас будут некорректные указатели. В общем привет кракозябры, а то и вылет. Варианты решения а) хранить в словарном пространстве, не указатели на имена, а смещения. Из-за этого немного усложнится печать и пр. вывод имен слов. Некритично, но все равно неприятно. К тому же мы просто перенесём сложность из одного места в другое. б) хранить имена прямо в словарном пространстве. Решение курильщика. в) при каждом таком изменении указателя обновлять все словарное пространство и перезаписывать там указатели на имена 2) Сломанные словарные указатели Опять жеж, если изменится указатель на словарное пространство, то все цепочки поиска будут некорректны. А если еще кто-то связал цепочки поиска между разными пространствами... Варианты решения. а) Обновление всех цепочек в слов. пространстве. Реализуемо, но лень. б) Полный пересмотр системы поиска слов. Если есть пространство и известен размер структуры слова, то их можно просто перебирать от начала и до конца. Поскольку система поиска меняется с односвязного списка на массив, то возникают доп. проблемы: как разграничивать словари? тормоза (4 списка меняем на один массив же). в) Все LFA будут содержать не указатели, а смещения. Короче, лучше обновить цепочки и не выпендриваться. 3) Когда обновлять размеры? В текущем варианте, форт-система проверяет заполненность пространств при каждом шаге интерпретации. По сути это доп. тормоза и не дает гарантии. Да, блин, слово может просто компилировать в другом пространстве, которое не обязано совпадать с CURRENT. В общем, логичнее всего проверять и обновлять пространства при вызове соот. слов ( , allot dw, w, c, s, и пр.) |
Автор: | Victor__v [ Вс ноя 28, 2021 21:06 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Вести с полей. Почти все скомпилировал, однако в компиляторе было куча мелких косяков (а вот не надо было брать работающий исходник и чуть-чуть его переделывать). Последние 2 часа анализировал скомпилированный образ в IDA Заметил и исправил пару мелких проблем (например, забыл в компилирующем примитиве LIT, префикс 64-ой операции). Примерный объем рабочего кода 64-битной версии составит 50 кб. В 32-битной (ЦК) размер 37 кб (правда, тут текстовый оптимизатор постарался). После успешного старта подключим и к 64-битке текстовый оптимизатор для сжатия всяких там банальностей. Вот слова для контроля, загрузки и свопа пространств были изматывающими. Я прям уверен, что можно сделать попроще. К тому же мне пришлось сделать новое поле у словаря, которое будет вызывать контроллер пространств при любом вызове allot dw и иже с ними. В данном случае поле выступает некоторым аналогом интерфейса, поскольку на момент определения слов для работы с памятью корректировщик не может быть реализован или все-таки может? |
Автор: | Victor__v [ Пн дек 06, 2021 15:40 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Продолжаю исследовать скомпилированный образ на предмет косяков. Косяки были найдены и ликвидированы. Также теперь компилирующие слова генерируют более красивый код без лишних стекомаханий. Понять, что значит тот или иной участок стало попроще. |
Автор: | Sotnik [ Ср дек 22, 2021 00:25 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): Продолжаю исследовать скомпилированный образ на предмет косяков. Косяки были найдены и ликвидированы. Также теперь компилирующие слова генерируют более красивый код без лишних стекомаханий. Понять, что значит тот или иной участок стало попроще. Неплохо бы всегда на последнюю версию скидывать прямую ссылку. Как будет выглядеть самый БЫСТРЫЙ вариант разложить 64 бита на байты? Как получить область памяти в 8 гег для массива? (всего 16 гег) И записать/прочитать это всё БЫСТРО в файл. (созданный массив) |
Автор: | Victor__v [ Ср дек 22, 2021 09:50 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Sotnik писал(а): Неплохо бы всегда на последнюю версию скидывать прямую ссылку. А смысл давать ссылку на то, что еще не готово? Я могу скинуть все свои наработки, без вопросов. Но там будет только исходный код 64-битного форта. Образ еще исследуется. Sotnik писал(а): Как будет выглядеть самый БЫСТРЫЙ вариант разложить 64 бита на байты? Как получить область памяти в 8 гег для массива? (всего 16 гег) И записать/прочитать это всё БЫСТРО в файл. (созданный массив) Это что и к чему это? 1) на ассемблере 2) использовать 8 1024 1024 1024 * * * ALLOCATE 3) В винде есть специфические функции для работы с файлами и пр., копайте туда. |
Автор: | Sotnik [ Ср дек 22, 2021 14:32 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): Sotnik писал(а): Неплохо бы всегда на последнюю версию скидывать прямую ссылку. А смысл давать ссылку на то, что еще не готово? Одним словом - ещё не готово... Бум сидеть на 32-х битах. |
Автор: | Victor__v [ Ср дек 22, 2021 15:53 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
У Хищника, вроде, Кварк на 64 бита уже есть) Спросите, если срочно нужен. |
Автор: | Sotnik [ Чт дек 23, 2021 01:21 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Victor__v писал(а): У Хищника, вроде, Кварк на 64 бита уже есть) Спросите, если срочно нужен. Хм. Спасибо. Посмотрю на Quark C64. Посмотрел. 2020 год... Хищник, зачем спрятал от народа 64 бита? |
Автор: | Hishnik [ Чт дек 23, 2021 02:14 ] |
Заголовок сообщения: | Re: Nova Дневник разработчика |
Sotnik писал(а): Хищник, зачем спрятал от народа 64 бита? А чего его прятать? Он методика, а не программка для скачивания. |
Страница 10 из 14 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |