Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн окт 21, 2019 17:33

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 36  След.
Автор Сообщение
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 14:24 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Цитата:
: FORGET COMPILE' FIND IF DUP FENCE < IF !!FENCE THEN DUP HERE! NFA>LFA @ LAST! 2DROP EXIT THEN !!WORD ;

Для < все адреса 8000..FFFF отрицательные. Так-что сравнение адреса с забором надо делать по U<


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 14:30 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Цитата:
AWORD DIVIDE,"/%"
pop bx,ax
clr dx
idiv bx
push ax,dx
AEND
Ошибка.

AWORD DIVIDE,"/%"
pop bx,ax
cwd
idiv bx
push ax,dx
AEND


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 14:35 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Цитата:
AWORD DDIVIDE,"D/%"
;; pop ax,dx,cx,bx
;; ; BX:CX /% DX:AX
; So far is for 80286 and higher
pop ebx,eax
clr edx
idiv ebx
push eax,edx
AEND
Аналогично ошибка. И да, 80386 and higher

AWORD DDIVIDE,"D/%"
;; pop ax,dx,cx,bx
;; ; BX:CX /% DX:AX
; So far is for 80286 and higher
pop ebx,eax
cdq
idiv ebx
push eax,edx
AEND


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 15:17 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Цитата:
AWORD WITHIN,"WITHIN" ; ( n b1 b2 -- flag )
; c b a
pop ax,bx,cx
clr dx
cmp bx,ax
jg @f
; b1 < b2
cmp cx,bx
jl .no
cmp ax,cx
jl .no
jmp .yes
@@:
; b1 > b2
cmp cx,ax
jl .no
cmp bx,cx
jl .no
.yes:
dec dx
.no:
push dx
AEND
Даже лень разбирать тут твою логику. Сразу вижу, что тут применены знаковые сравнения, а значит с ходу ясно, что работать будет не всегда верно. Вот пример на котором споткнется :
>HEX
OK
8000 7000 9000 WITHIN .
> 0 OK
Неверно !

Дело в том, что WITHIN это очень красивая штука в Форте. Она должна считать единым образом, не зная имеет дело со знаковыми числами или с беззнаковыми. Главное чтобы все три числа были одного сорта.
И если я использую беззнаковые, то $7000 <= $8000 < $9000 и WITHIN должна вернуть "ИСТИНУ", поскольку $8000 внутри диапазона от меньшего $7000 до большего $9000.
А если диапазон взять от большего до меньшего, то "ИСТИНА" возвращается наоборот - если проверяемое число вне даипазона. И если я буду использовать знаковые числа, то именно так и выйдет.
Будет иметь место такое соответствие шестнадцатеричного значения слова тому числу, которое оно кодирует :
$7000 = 28672
$8000 = -32768
$9000 = -28672
и теперь диапазон $7000..$9000 станет уже диапазоном от большего 28672 до меньшего -28672. А поскольку проверяемое -32768 лежит вне этого диапазона, то опять должна возвращаться "ИСТИНА". Т.е. тут должна возвращаться "ИСТИНА" в любом случае, оперирует программист знаковыми или беззнаковыми. Знаковое или беззнаковое - это мысли программиста, WITHIN их читать не умеет.

Покажу, как я записал это слово на ассемблере :

Код:
;   WITHIN                     CORE EXT
;   ( n1|u1 n2|u2 n3|u3 -- flag )
;   Выполнить сравнение тестируемого значения n1|u1 с нижним пределом
;   n2|u2 и верхним пределом n3|u3, возвратить "истину", если
;   (n2|u2<n3|u3 и (n2|u2<=n1|u1 и n1|u1<n3|u3))
;   или (n2|u2>n3|u3 и (n2|u2<=n1|u1 или n1|u1<n3|u3)) "истина",
;   иначе вернуть "ложь".
;   Неопределенная ситуация возникает, если n1|u1, n2|u2 и n3|u3
;   не одного и того же типа.
      $CODE   6, 'WITHIN', WITHIN
      POP   CX
      POP   BX
      POP   AX
      SUB   CX, BX
      SUB   AX, BX
      CMP   AX, CX
      SBB   AX, AX
      PUSH   AX
      $NEXT


Фишка тут в том, что в традиционных языках программирования типа Си и Паскаля, когда описывается переменная, сразу указывается знакового или беззнакового она типа. А Форт - язык с другой идеологией, в нем всего два типа - ячейка CELL (все равно знаковая или беззнаковая) и беззнаковый символ CHAR. В идеологии Форта, если знаковые и беззнаковые нельзя обрабатывать единым образом (WITHIN , к примеру, обрабатывает их как раз единым образом), то типизируются не переменные (операнды), а операторы. К примеру < и U< а также / и U/


Последний раз редактировалось Ethereal Вт июн 06, 2017 16:32, всего редактировалось 1 раз.


За это сообщение автора Ethereal поблагодарил: _KROL
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 15:38 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Код:
_ : ABS 7FFF AND ;
FWORD ABS,"ABS"
dw LIT,$7FFF,_AND
FEND
Упс ...
По такой логике ABS от -1 будет равен 32767.
Видно, что есть места где ты еще плаваешь. Знаковые, беззнаковые, представление знаковых.


Чтобы не было лишних ветвлений я ABS сделал вот так :
Код:
;   ABS                     CORE
;   ( n -- u )
;   u - абсолютная величина n.
      $CODE   3, 'ABS', ABS_
      POP   AX
      CWD
      XOR   AX, DX
      SUB   AX, DX
      PUSH   AX
      $NEXT

Логика здесь такая.
Если в AX не отрицательное, то CWD занулит DX. Ксорка на ноль и вычитание нуля не изменят в числе AX ничего.
Если в AX отрицательное, то CWD запишет в DX число FFFF = -1 . Ксорка на FFFF инвертирует AX. А вычитание из AX минус единицы есть инкремент AX.
А как известно справедливо такое равенство
-X = ~X + 1
чтобы изменить знак у числа надо его инвертировать и прибавить единицу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 16:14 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Цитата:
_ : LITERAL COMPILE LIT , ;
FWORDI LITERAL,"LITERAL"
dw COMPILE,LIT,COMMA
FEND

Слово LITERAL должно быть немедленного исполнения.
И должно быть для режима компиляции. И в режиме компиляции немедленно
исполниться, снимать со стека число и компилировать такой код, который
исполняясь после будет класть это число на стек.
А в режиме интерпретации LITERAL должно ничего не делать.

Ты не сделал LITERAL немедленного исполнения и не сделал его
STATE-зависимым и в итоге используешь его в каком-то своем смысле :
Цитата:
: ," [ CHAR " LITERAL ] WORD DUP HERE SWAP ALLOT SWAP CMOVE 0 C, ;

: ( [ CHAR ) LITERAL ] WORD 2DROP ; IMMEDIATE
: .( [ CHAR ) LITERAL ] WORD TYPE ; IMMEDIATE

А так на Форте не пишет никто. Для любого фортера
[ CHAR ) LITERAL ] и [ CHAR ) ] будет означать абсолютно одно и то-же.

Смысл LITERAL вот в чем. Чтобы было можно вместо чисел писать выражения,
вычисляемые при компиляции программы, а не после во время ее исполнения.
Если вместо
: ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ 1985 . ;
написать так
: ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ 1967 18 + . ;
то это сложение будет выполняться каждый раз при исполнении программы.
А это плохо. Лучше вычислить его один раз при создании программы.
: ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ [ 1967 18 + ] LITERAL . ;

По идее должно быть вот так :

: LITERAL STATE @ IF COMPILE LIT , THEN ; IMMEDIATE

: ( [ CHAR ) ] LITERAL WORD 2DROP ; IMMEDIATE


З.Ы. Ладно, я завязываю твой исходник разглядывать. А то понаписал тут.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вт июн 06, 2017 19:30 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 359
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Спасибо, у меня действительно ошибок пока предостаточно...
(много чего пересматривал(в том числе SP-FORTH), но пока экзамены и ЦТ, руки не доходят)

---

Напоминаю! :D

macro clr [arg] { forward sub arg,arg }

и

macro FWORDI name,wname {
FWORD name,wname
__IMMEDIATE
}

---

AWORD KEY?,"KEY?"
clr al
inc al
int 0x16
xor ax,ax ; Да, здесь должно быть "clr ax"
jz @f ; Зачем "mov ax,0" когда есть "sub ax,ax"?
dec ax
@@:
push ax
AEND


AWORD DIVIDE,"/%"
pop bx,ax
clr dx ; "sub dx,dx", флаги вроде не выставляются
idiv bx
push ax,dx
AEND
Ошибка. Почему?
...

За WITHIN СПАСИБО!!!

А вот тут

_ : LITERAL COMPILE LIT , ;
FWORDI LITERAL,"LITERAL"
dw COMPILE,LIT,COMMA
FEND

я в комментарии забыл приписать IMMDEIATE (ведь FWORDI!)
Так что оно у меня просто находится внутри скобок(сам попробуй вынести).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 06:41 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
_KROL писал(а):
Напоминаю! :D

Напоминаю! :D
XOR выставляет флаг Z по результату, так-что XOR AX,AX выставит флаг Z всегда
SUB выставляет флаг Z по результату, так-что SUB AX,AX выставит флаг Z всегда
MOV AX,0 и MOV AX,-1 флага Z не изменят, поскольку команды пересылок флагов не меняют


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 06:44 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
_KROL писал(а):
Так что оно у меня просто находится внутри скобок(сам попробуй вынести).
Так внутри скобок оно не должно ничего делать :D

Почитаем Баранова и Ноздрунова :

В процессе работы текстового интерпретатора программист может
переключать его из состояния компиляции в состояние исполнения и обратно с
помощью слов [ (открывающая квадратная скобка) --> и ] (закрывающая
квадратная скобка) -->. Слово [ имеет признак немедленного исполнения и
переключает интерпретатор в состояние исполнения, а слово ] переключает его
в состояние компиляции. Обычно эти слова используются внутри определения
через двоеточие, чтобы вызвать исполнение слова или группы слов, не имеющих
признака немедленного исполнения. Например, если в тексте определения
понадобилась константа FF00 (в шестнадцатиричной системе), а текущей
используемой системой является десятичная, то было бы неправильно включить в
текст определения фрагмент HEX FF00 DECIMAL, поскольку слово HEX будет не
выполнено, а скомпилировано и число не будет воспринято правильно. Вместо
этого следует писать: [ HEX ] FF00 [ DECIMAL ] . В языке есть и другие
способы, чтобы выразить это же более точно и красиво.

Еще один пример дает использование слова LITERAL (литерал), имеющего
признак немедленного исполнения, внутри определения через двоеточие. Оно
используется в виде: [ <значение> ] LITERAL, где <значение> - слова,
вычисляющие на вершине стека значение, которое словом LITERAL будет
скомпилировано в код как число. Во время исполнения определения это значение
будет положено на стек. Таким образом, текст [ 2 2 * ] LITERAL внутри
определения через двоеточие эквивалентен употреблению слова-числа 4. Это
дает большие возможности для использования констант, "вычисляемых" во время
компиляции определения. Аналогичное соответствие имеет место и вне
определения через двоеточие, поскольку в состоянии исполнения слово
LITERAL не выполняет никаких действий
, и поэтому на стеке остается
вычисленное перед этим значение.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 07:05 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
А вообще, закину сюда мою старую модель 16-разрядного Форта в исходниках. С прямым шитым кодом.
Можешь подглядывать туда и драть любые идеи, какие заблагорассудится. :D
Заодно и для понимания полезно. Я ведь двигался точно также - читал Баранова
и Ноздрунова и мучал SP-Forth 2.x . Подглядывал и уяснял оттуда и оттуда.

Уточню, что это именно модель. Я не ставил целью написать полновесную Форт-систему для MS-DOS. Поэтому у меня там, к примеру, слов для работы с файлами нет. Для работы с портами ввода-вывода нет. Нет для работы с BIOS. Нет того, что в Форте для MS-DOS как бы обязательно.
Потому-что мне нужен был не компилятор писать программы под MS-DOS, а МОДЕЛЬ ФОРТА для портирования. Отладить на ней алгоритмы Форта, ведь под MS-DOS легко отлаживать. И после перенести ее на один микроконтроллер. А на микроконтроллере отлаживать трудно. Но когда алгоритмы отлажены переносить уже легко. Смотришь на MS-DOS-оский исходник и один в один то же пишешь для микроконтроллера.
Причем на том микроконтроллере я собирался хранить словарь отдельно, чтобы
после написания приложения его просто тереть нулями. Поэтому тут и отработана
модель со словарем отдельно от кода. Словарь тут в хвосте COM-файла.
Еще я тут отрабатывал модель, чтобы на ассемблере писать только минимальное
самораскручивающееся ядро, а остальную часть Форт-системы для ее досборки
скармливать ядру в виде исходника на Форте.
Тут так и сделано. Файл forth.bat - это пакетный файл для компиляции Форта. В нем видно как идет скармливание и досборка.
Ну и последнее - я тогда еще не разобрался с этими ONLY ALSO из ANSI-Форта и словари сделал так, как понял у Баранова и Ноздрунова. Получилось не так чтобы лучшим образом и не в соответствии с каким-либо стандартом. Зато в соответствии с Барановым-Ноздруновым. А как красиво я после подсмотрел в FIG-Forth-е. Вот там действительно красота.


Вложения:
FORTH.ZIP [128.29 Кб]
Скачиваний: 151

За это сообщение автора Ethereal поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 18:09 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 359
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
OK. Будет тебе нормальный LITERAL.
P.s. Спасибо, мне так ещё так никто не помогал!


Вложения:
Комментарий к файлу: Вот что я сам додумался о словарях(вроде правильно).
P.s. Странно, но обычный txt не загружается???

scheme.zip [371 байт]
Скачиваний: 142
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 22:27 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 359
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Достало меня одно слово: семантика - значение(поведения, как я понимаю).
Обьясни(те) пожалуйста мне, чем отличается семантика выполнения от интерпретации(а то мне кажется, что я неправильно это понимаю...).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 22:48 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 359
Благодарил (а): 16 раз.
Поблагодарили: 1 раз.
Цитата:
Причем на том микроконтроллере я собирался хранить словарь отдельно, чтобы
после написания приложения его просто тереть нулями. Поэтому тут и отработана
модель со словарем отдельно от кода. Словарь тут в хвосте COM-файла.

Теперь понятно, почему Winglion так в своём Форте для Sprinter поступал...
Это навело меня на мысль! В последнее время я подумаваю после доработки системы переделать её в целевой компилятор(наверное исходники SP-FORTH перечитал :) ).
1) Сделать поля такими
NFA ... флаги(Icx.....)
LFA ...
CFA dw ptr
где c - compilied only (я понял эту мысль и она мне понравилась)
x - exist (т.е. слово существует)
2) Основной цикл
1.Считать слово...
2.Если интерпретация - исполнить
Если компиляция, в зависимости от переменной (допустим)DESTVOC, компилировать в нужный сегмент(системы или пользовательской системы )
(!)Даже если слово не найдено в пользовательском словаре, то создаётся запись, но без флага x.
Соответственно, если раньше запись такая была(без флага), то x выставляется и "CFA:=ptr;"
...
В конце(при сохранении системы) проверяются все слова на флаг x.

Ну как вам идея? :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Ср июн 07, 2017 23:25 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 906
Благодарил (а): 1 раз.
Поблагодарили: 8 раз.
Слово для проверки на компилируемость в СПФ
: comp? state @ 0= if -312 throw then ;

В Форке от mOleg существует флаг с таким же действием

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Чт июн 08, 2017 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 588
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 23 раз.
Victor__v писал(а):
Слово для проверки на компилируемость в СПФ
: comp? state @ 0= if -312 throw then ;

В Форке от mOleg существует флаг с таким же действием
Ну так существуют два разных подхода к этому вопросу. Вообще куда ни плюнь подходов в Форте почему-то получается именно два. :) Я еще тут напишу о других таких случаях после.

1.) Определение через двоеточие любого слова, что только для режима компиляции, начинать с COMP? . COMP? проверит режим и выполнит ABORT , если режим не тот.
2.) У каждого такого слова иметь соответствующий флажок в заголовке и проверять его при интерпретации этого слова внутри INTERPRET

Второй подход мне нравится больше, поскольку легко сделать COMPILEONLY также слова, определенные а нативном коде. Например >R обязательно таким сделать, чтобы Форт-система меньше валилась, когда в исходнике что-то напутано. К тому-же традиционно в Форт-системах длина имен ограничена 31-м символом. А значит в том байте, что в словарной статье хранит длину имени есть 3 бесхозных бита. Один уйдет на флаг IMMEDIATE. А из двух остальных один можно сделать COMPILEONLY

Это я для KROL-а поясняю :)


Последний раз редактировалось Ethereal Чт июн 08, 2017 09:39, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 36  След.

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


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

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


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

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