Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн дек 06, 2021 22:30

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Nova Дневник разработчика
Автор Сообщение
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Продолжаю исследовать скомпилированный образ на предмет косяков.
Косяки были найдены и ликвидированы.

Также теперь компилирующие слова генерируют более красивый код без лишних стекомаханий. Понять, что значит тот или иной участок стало попроще.
Сообщение Добавлено: Пн дек 06, 2021 15:40
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Вести с полей.

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

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

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

Вот слова для контроля, загрузки и свопа пространств были изматывающими. Я прям уверен, что можно сделать попроще.
К тому же мне пришлось сделать новое поле у словаря, которое будет вызывать контроллер пространств при любом вызове allot dw и иже с ними. В данном случае поле выступает некоторым аналогом интерфейса, поскольку на момент определения слов для работы с памятью корректировщик не может быть реализован или все-таки может?
Сообщение Добавлено: Вс ноя 28, 2021 21:06
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
А теперь к возникшим проблемам. Все они, что неудивительно, связаны с раздельных хранением данных.

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

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

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

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

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

В общем, логичнее всего проверять и обновлять пространства при вызове соот. слов ( , allot dw, w, c, s, и пр.)
Сообщение Добавлено: Сб ноя 20, 2021 17:37
  Заголовок сообщения:  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
;
Сообщение Добавлено: Сб ноя 20, 2021 16:56
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Victor__v писал(а):
Нагляднее и проще, имхо, когда код для действия над каждым элементом идёт после итератора, а не играть в калбеки, понимаешь)

Неа, это, таки Форт: сначала параметры, потом действие 8)
Сообщение Добавлено: Сб ноя 20, 2021 08:27
  Заголовок сообщения:  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
;
Сообщение Добавлено: Пт ноя 19, 2021 23:37
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Victor__v писал(а):
Слово ALL-WORDS-ITER: используется для инициализации api, если что

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

Все-таки ваше форматирование текста исходников я плохо воспринимаю 8(
Сообщение Добавлено: Пт ноя 19, 2021 19:54
  Заголовок сообщения:  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, если что
Сообщение Добавлено: Чт ноя 18, 2021 12:59
  Заголовок сообщения:  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 отдельными словами... :D
Сообщение Добавлено: Вт сен 14, 2021 15:27
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Total Vacuum писал(а):
Victor__v писал(а):
Соответственно, если подскажете где ещё можно ужать не прибегая к машинным кодам, то буду рад :lol:

Ну тут сразу бросается в глаза повторяющийся 4 раза фрагмент r@ @, возможно, этот момент можно как-то обыграть, чтобы сэкономить пару байт (но это зависит от используемого шитого кода)...
Кроме того, 1 строка лучше, чем 2 (это опять же зависит от реализации строк), т.е. можно было бы сразу работать со строкой S" > "...
А еще лучше вообще без строк, а недостающие по фэншую пробелы выводить словом spaces...
Если числа 64-битные, то, возможно, фрагмент 0 1 будет короче, если написать 0 dup 1+
А еще, если я правильно уловил мысль, сейчас словарь выводится группами по 4 слова, а не проще ли было выводить по одному слову, а после каждого четвертого делать перевод строки?
Но это все оптимизации ради оптимизации... :) Ведь главное, чтобы работало и реализация была понятной автору... :D


r@ @
Пробовал обыгрывать, преимуществ нет)

spaces
В моей реализации нет этого слова) Однако реализовал, выигрыш теперь 14 байт)

0 dup 1+
О, спасибо, сэкономил 4 байта)

а не проще ли было выводить по одному слову, а после каждого четвертого делать перевод строки?
Там 4 цепочки поиска. Соот-но, за один цикл должны выводиться по одному слову из каждой цепочки.
Может и проще, но хочется еще и выразительности. Вертикальные столбцы более красивы)
Сообщение Добавлено: Вт сен 14, 2021 14:38
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Victor__v писал(а):
Соответственно, если подскажете где ещё можно ужать не прибегая к машинным кодам, то буду рад :lol:

Ну тут сразу бросается в глаза повторяющийся 4 раза фрагмент r@ @, возможно, этот момент можно как-то обыграть, чтобы сэкономить пару байт (но это зависит от используемого шитого кода)...
Кроме того, 1 строка лучше, чем 2 (это опять же зависит от реализации строк), т.е. можно было бы сразу работать со строкой S" > "...
А еще лучше вообще без строк, а недостающие по фэншую пробелы выводить словом spaces...
Если числа 64-битные, то, возможно, фрагмент 0 1 будет короче, если написать 0 dup 1+
А еще, если я правильно уловил мысль, сейчас словарь выводится группами по 4 слова, а не проще ли было выводить по одному слову, а после каждого четвертого делать перевод строки?
Но это все оптимизации ради оптимизации... :) Ведь главное, чтобы работало и реализация была понятной автору... :D
Сообщение Добавлено: Вт сен 14, 2021 11:37
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
О WORDS замолвите слово

Реализация слова WORDS в нынешнем виде это просто слабочитаемый перечень всех слов в каждой цепочке поиска.
Хотелось чего-то понагляднее.
Набросал штук 4 варианта от самого наглядного к самому трешовому.
И вот мне захотелось, внезапно, сделать реализацию слова наиболее компактной при компиляции.
Вечер был свободный, поэтому уложился в 637 байта :))
Мне вот реально делать нехрен)

Код:
\ печать слова или его отсутствия
:NONAME \ maxlen pos -- maxlen
S"                              " DROP >R
." > "
>R
R@ @
IF
R@ @ L>NFA @ R@ @ L>countFA W@ DUP >R TYPE 
2 RPICK OVER R> -  TYPE
R@ @ @ R> !
RDROP
ELSE
RDROP
R> OVER TYPE
THEN 

; >R

:NONAME 0 1 CURRENT @ WORDS-ITER: L>countFA W@ MAX >R 1+ R> ; \ -- cnt maxlen

: WORDS4
[ COMPILE, ]

RP@ [ VOC-THREADS CELLS LIT, ] - RP!
CURRENT @ L>LLFA  RP@ [ VOC-THREADS CELLS LIT, ]  MOVE

BEGIN
2R@
2 RPICK
3 RPICK
OR OR OR WHILE

RP@                   [ R@ COMPILE, ]
RP@ CELL+             [ R@ COMPILE, ]
RP@ [ 2 CELLS LIT, ] +       [ R@ COMPILE, ]
RP@ [ 3 CELLS LIT, ] +       [ R@ COMPILE, ]

                  [ RDROP ]

CR
REPEAT
RDROP RDROP
RDROP RDROP
DROP
." all-words: " . CR

;


Соответственно, если подскажете где ещё можно ужать не прибегая к машинным кодам, то буду рад :lol:
Изображение
Сообщение Добавлено: Пн сен 13, 2021 18:27
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Когда-то я релизовывал на Нове стековый комбинатор, то использовал для него самопальный ассемблер.
Проблема ассемблера в том, что его лень писать)
А тут ещё и на 64-бита переводить.

Ладно, это все лирика.

Заметил, что у меня оказывается местами в исходниках как раз часть кода на стековом комбинаторе. Переделать фигня.
Но я удивился другому.
Спустя 2 года, когда я вообще не лез в синтаксис комбинатора, я прекрасно в нем разобрался.
Как-то умудрился сделать его интуитивно-понятным)

Так что после перевода Новы на 64 бита, сделаю новую реализацию стек. комбинатора)
Но на этот раз буду создавать на лету исходники и скармливать его Фасму).
К несчастью, фасм не умеет компилировать строки. Придётся заниматься файломаханием, зато относительно портируемо)

Также "слияние" с фасмом, позволит, страдать наслаждаться созданием оптимизатора :)
Сообщение Добавлено: Ср авг 25, 2021 14:54
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Текущаяя ситуация.

Где-то примерно 75 % кода подготовлено и компилируется без ошибок. Сейчас допиливаю ОС-зависимую часть.
Все рутинно, аж скучно.

А теперь перйдём к надуманным проблемам)

1) Ужасный ЦК.
Нет, серьёзно, почти весь ЦК находится в одном файле). Удобно, но потом надо будет всё же разнести.

2) Меньше ОСа!
Откомпилированы примитивы для поддержки API.
Вместе с ними так же написал на асме GetLoadLibraryA и GetProcAddress.
Просто мне показалось идиотизмом реализовывать обёртки над этими функции, поскольку в обёртках есть вызов этих же функций :)

3) EXE
Надо будет подрихтовать образ EXE, дабы при старте ОС давала память (сколько я там обычно ставил?) пусть на один мегабайт.


Эх, чую придётс мне форт под Идой запускать, по-любому где-нибудь ошибусь)
Сообщение Добавлено: Пн авг 23, 2021 11:30
  Заголовок сообщения:  Re: Nova Дневник разработчика  Ответить с цитатой
Всё-таки помимо преимуществ заимствования кода напрямую из образов есть и недостатки.

Так, совершенно случайно обнаружил, что слово INLINE ведёт себя некорректно.
Так, ежели перед нами короткое слово, то инлайн должен вычислить его размер и записать в поле флагов.
И вот тут-то нас ждёт засада.

В CFA хранятся адреса сразу пригодные для форт-образа, а не реальные. а слово HERE как раз даёт реальный адрес...
Короче, разница получившихся значений более чем существенна.
В общем, если даже слово в 1 байт, то INLINE забьёт на выяснение его размера.

Варианты решения:
1) Адекватное. Работать с образом в реальных адресах, а их после просто привести к виртуальным.
2) решение курильщика. Сделать HERE вектором и в зависимости от количества вызовов вести себя по разному :) Н - надёжность)
Сообщение Добавлено: Сб авг 07, 2021 14:32

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


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