Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб дек 04, 2021 01:35

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 143 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10
Автор Сообщение
 Заголовок сообщения: Re: Nova Дневник разработчика
СообщениеДобавлено: Вт сен 14, 2021 15:27 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 188
Откуда: Москва
Благодарил (а): 33 раз.
Поблагодарили: 6 раз.
Victor__v писал(а):
0 dup 1+
О, спасибо, сэкономил 4 байта)

Опять же по поводу 0 1, если сделать, чтобы для часто используемых чисел в коде вместо lit число было call, то, вероятно, вся форт-система очень сильно похудеет (например, моя тестовая худеет очень сильно), так что если минимизация размера - самоцель, то вполне можно заняться... Можно сделать 0 constant 0 1 constant 1 2 constant 2 и т.д. и посмотреть... Если я правильно путаю, во многих реализациях делают 0 1 2 3 отдельными словами... :D


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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1143
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Дошёл таки наконец до перебора слов.
Поскольку теперь словарные структуры жестче регламентируются, то можно сделать перебор прямо в пространстве слов.
Это пригодится при инициализации и может еще где

Код:
\ итерация всех словарных стурктур в пространстве
\ может пригодиться для перебора всех слов, например, в дереве врем. словаря.
\ будет исп. для инициализации др. пространств.
: 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, если что

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5026
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 59 раз.
Victor__v писал(а):
Слово ALL-WORDS-ITER: используется для инициализации api, если что

забавно, у меня так:
Код:
         WINAPLINK ['] @API WithList \ инициализация адресов всех импортируемых API

Все-таки ваше форматирование текста исходников я плохо воспринимаю 8(

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


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

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

Нагляднее и проще, имхо, когда код для действия над каждым элементом идёт после итератора, а не играть в калбеки, понимаешь)

Код инициализации, пример как счас:

Код:
: 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
;

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5026
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 59 раз.
Victor__v писал(а):
Нагляднее и проще, имхо, когда код для действия над каждым элементом идёт после итератора, а не играть в калбеки, понимаешь)

Неа, это, таки Форт: сначала параметры, потом действие 8)

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


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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1143
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Вот как в 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
;

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


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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1143
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
А теперь к возникшим проблемам. Все они, что неудивительно, связаны с раздельных хранением данных.

1) Некорректные имена
Если во время изменения размера пространства под имена слов, указатель на сие пространство сместился, то словарном пространстве у нас будут некорректные указатели. В общем привет кракозябры, а то и вылет.
Варианты решения
а) хранить в словарном пространстве, не указатели на имена, а смещения. Из-за этого немного усложнится печать и пр. вывод имен слов. Некритично, но все равно неприятно. К тому же мы просто перенесём сложность из одного места в другое.
б) хранить имена прямо в словарном пространстве. Решение курильщика.
в) при каждом таком изменении указателя обновлять все словарное пространство и перезаписывать там указатели на имена

2) Сломанные словарные указатели
Опять жеж, если изменится указатель на словарное пространство, то все цепочки поиска будут некорректны. А если еще кто-то связал цепочки поиска между разными пространствами...
Варианты решения.
а) Обновление всех цепочек в слов. пространстве. Реализуемо, но лень.
б) Полный пересмотр системы поиска слов. Если есть пространство и известен размер структуры слова, то их можно просто перебирать от начала и до конца. Поскольку система поиска меняется с односвязного списка на массив, то возникают доп. проблемы: как разграничивать словари? тормоза (4 списка меняем на один массив же).
в) Все LFA будут содержать не указатели, а смещения.

Короче, лучше обновить цепочки и не выпендриваться.

3) Когда обновлять размеры?

В текущем варианте, форт-система проверяет заполненность пространств при каждом шаге интерпретации.
По сути это доп. тормоза и не дает гарантии. Да, блин, слово может просто компилировать в другом пространстве, которое не обязано совпадать с CURRENT.

В общем, логичнее всего проверять и обновлять пространства при вызове соот. слов ( , allot dw, w, c, s, и пр.)

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


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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1143
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Вести с полей.

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

Последние 2 часа анализировал скомпилированный образ в IDA
Заметил и исправил пару мелких проблем (например, забыл в компилирующем примитиве LIT, префикс 64-ой операции).

Примерный объем рабочего кода 64-битной версии составит 50 кб.
В 32-битной (ЦК) размер 37 кб (правда, тут текстовый оптимизатор постарался).
После успешного старта подключим и к 64-битке текстовый оптимизатор для сжатия всяких там банальностей.

Вот слова для контроля, загрузки и свопа пространств были изматывающими. Я прям уверен, что можно сделать попроще.
К тому же мне пришлось сделать новое поле у словаря, которое будет вызывать контроллер пространств при любом вызове allot dw и иже с ними. В данном случае поле выступает некоторым аналогом интерфейса, поскольку на момент определения слов для работы с памятью корректировщик не может быть реализован или все-таки может?

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


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

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


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

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


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

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