Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 00:42

...
Google Search
Forth-FAQ Spy Grafic

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




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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
x - exist (т.е. слово существует)
А это второй случай двух подходов. Этот флажок обычно называет SMUDGE битом, поскольку слово SMUDGE инвертировало этот флажок у последнего определенного слова в Фиг-Форте. Тут опять два подхода.

1.) При исполнении ":" после создания словарной статьи исполнить SMUDGE , чтобы новое слово еще не было видно в словаре. При исполнении ";" еще раз выполнить SMUDGE и теперь это слово будет видно в словаре.
Очень красиво это было сделано в Фиг-Форте. SMUDGE-бит был пятым битом в том байте, что задает длину имени слова в словарной статье (т.е. в первом байте NFA). А при поиске слова в словаре при проверке соответствия длины проверялось не 5, а 6 бит. В итоге слово, помеченное SMUDGE , автоматически эту проверку не проходило ибо у него длина имени оказывалась как бы >= 32. В итоге, помеченные SMUDGE-битом слова были не видны при поиске в словаре без какой-либо дополнительной проверки.
2.) Без SMUDGE-бита. При исполнении ":" адрес имени создаваемого слова NFA скопировать в переменную LATEST. При исполнении ";" скопировать значение переменной LATEST в ту ячейку, что хранит адрес последнего слова в CURRENT-словаре (т.е. тот адрес с которого будет начинаться поиск в этом словаре, адрес начала цепочки слов в этом словаре).

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


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

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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
Достало меня одно слово: семантика - значение(поведения, как я понимаю).
Обьясни(те) пожалуйста мне, чем отличается семантика выполнения от интерпретации(а то мне кажется, что я неправильно это понимаю...).

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

Когда ты компилируешь программу на Форте, Форт ведь ее текст интерпретирует и компилирует. Переключаются 2 режима. Интерпретирует и компилирует один раз СЕЙЧАС (исходный текст программы), чтобы получить то, что много раз будет исполняться ПОТОМ (готовая программа). Так вот семантика интерпретации и компиляции - это то, что будет делаться СЕЙЧАС, а семантика времени выполнения - это то, что будет делаться ПОТОМ.

А словечко POSTPONE как бы превращает то, что должно быть сделано сейчас в то, что сделается потом, а то, что должно быть сделано потом в то, что сделается потом потом. postpone - отложить (англ.).
: BLA ... IF ... ; <- IF исполняется сейчас и компилирует ?BRANCH , который будет исполняться потом.
: BLA ... POSTPONE IF ... ; <- IF компилируется сейчас и будучи исполнено потом скомпилирует ?BRANCH , который исполнится потом потом.
: BLA ... DROP ... ; <- DROP компилируется сейчас.
: BLA ... POSTPONE DROP ... ; <- сейчас компилируется код, который скомпилирует DROP потом, а уж исполнится это DROP потом потом.

Вообще все эти "семантики" появились только в тексте стандарта ANSI. До этого как-то проще выражались. Считай, что стандарт ANSI написан выспренным слогом, яти ее.


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
(!)Даже если слово не найдено в пользовательском словаре, то создаётся запись, но без флага x.
Соответственно, если раньше запись такая была(без флага), то x выставляется и "CFA:=ptr;"
...
В конце(при сохранении системы) проверяются все слова на флаг x.

Ну как вам идея? :D
Если я правильно понял, то таким образом можно использовать слова еще до того как они определены. И определять их после. Скажем, ввести еще одно слово в дополнение к ":" , к примеру "::" , означающее пристегни определение этого слова к уже существующей словарной статье с вот таким именем и флагом x. И писать программы не только снизу вверх, но при желании и сверху вниз. Кажется это могучая идея расширения базовой идеи Форта. Потому-что не слышал еще, что кто-либо такое реализовал.
Правда, с тем, что необходимость определить слово до его использования как серпом по яйцам я на практике сталкивался лишь однажды. Помню, что было такое, но подробности уже забыл. Понятно, что с помощью векторов эту проблему можно разрешать, но помню, что тогда мне это зело не подходило. И уже не помню почему.


Последний раз редактировалось Ethereal Чт июн 08, 2017 11:20, всего редактировалось 2 раз(а).

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

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
А как же вектора и доопределения кода?

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


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

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

Дело было с Atmel-овскими микроконтроллерами, а там свои заморочки. Может я во времянки по тактам не укладывался, не помню уже, надо старые записи подымать, вспоминать почему мне так хотелось использовать слово напрямую, до его определения.

Короче, уточню, было такое, но было лишь однажды. Когда захотелось такого свойства от Форта.
_KROL писал(а):
Теперь понятно, почему Winglion так в своём Форте для Sprinter поступал...
В конце концов для Атмеловского форта я сделал совсем красиво. Словарь хранится в 8-ногой микросхеме 24c64, которая цепляется к микроконтроллеру на 2-х линиях. Когда приложение отлажено, микросхема тупо вынимается из колодки и все - словаря нет :)


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

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Про SMUDGE я знаю :)

Ethereal писал(а):
_KROL писал(а):
(!)Даже если слово не найдено в пользовательском словаре, то создаётся запись, но без флага x.
Соответственно, если раньше запись такая была(без флага), то x выставляется и "CFA:=ptr;"
...
В конце(при сохранении системы) проверяются все слова на флаг x.

Ну как вам идея? :D
Если я правильно понял, то таким образом можно использовать слова еще до того как они определены. И определять их после. Скажем, ввести еще одно слово в дополнение к ":" , к примеру "::" , означающее пристегни определение этого слова к уже существующей словарной статье с вот таким именем и флагом x. И писать программы не только снизу вверх, но при желании и сверху вниз. Кажется это могучая идея расширения базовой идеи Форта. Потому-что не слышал еще, что кто-либо такое реализовал.
Правда, с тем, что необходимость определить слово до его использования как серпом по яйцам я на практике сталкивался лишь однажды. Помню, что было такое, но подробности уже забыл. Понятно, что с помощью векторов эту проблему можно разрешать, но помню, что тогда мне это зело не подходило. И уже не помню почему.

Я имел ввиду что это удобно для целевой компиляции. Но за вариант с VOC.LATEST спасибо(как то об этом не подумал)!


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

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Выкладываю rebuild своей системы(можно сказать даже prerelease).
Кое-что подправил(благодаря Ethereal) и ... В общем ценности пока особой не имеет, просто проверьте, может чего-нибудь ещё найдёте.


Вложения:
KR4tH009.zip [17.04 Кб]
Скачиваний: 576
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт июн 09, 2017 23:54 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Цитата:
Но CATCH THROW чрезвычайно удобны и сильно упрощают программу, когда нужно проделать сложную и сильно вложенную последовательность действий, которая может быть успешна или нет. И в случае неуспеха на любом этапе и на любом уровне вложенности, эту последовательность нужно прервать, сняв сразу все ставшие ненужными параметры со стека данных, но завершать программу не нужно. Потому-что это не ошибка была, а факт не успеха.
А без CATCH THROW нужно будет из каждого вложенного этапа последовательности возвращать код завершения, потом проверять его и выбираться из глубоких уровней через кучу таких проверок. А эти проверки просто захламляют исходный текст.

А можешь обьяснить, как это работает? А то я что-то немогу понять :shuffle;

Вот, пытался понять твой код:
Код:
VARIABLE HANDLER \ хранит адрес кадра исключения на стеке

: CATCH SP@ HANDLER @ 2>R ( R: SP HANDLER )
RP@ HANDLER ! EXECUTE ( HANDLER=RP )
R> HANDLER ! RDROP FALSE ; ( HANDLER=oldHANDLER R: S: FALSE )

: THROW ?DUP ?EXIT
HANDLER @ RP! ( RP=HANDLER )
( R: SP HANDLER )
2R> HANDLER ! ( HANDLER=oldHANDLER S: SP )
SWAP >R SP! DROP R> ; ( ...? )


Наверное у меня просто опыта маловато :|


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Да дело тут попросту в том, что обработчики исключений могут быть сколь угодно вложенными. Поэтому когда делаешь СATCH надо как-то запомнить то, что было создано предыдущими CATCH, которые еще не завершились. Для этого на стеке возвратов создается односвязный список. Каждый элемент этого списка содержит две ячейки - в одной указатель стека данных к которому надо будет откатить стек, если сработает исключение, и второй - указатель на следующий элемент списка. Переменная HANDLER всегда указывает на самый верхний элемент этого односвязного списка.

Тут все совсем просто :

: CATCH
SP@ HANDLER @ 2>R
Положили на стек возвратов элемент списка.из двух ячеек.
Сначала кладем старое значение переменной HANDLER - оно указывает на тот элемент списка, что был верхним, первым, а теперь станет вторым. А потом кладем текущее значение указателя стека данных (оно потребуется если сработает THROW, ведь тогда стек надо будет откатить к этому значению, выкинув с него все, что стало ненужным потому, что произошло исключение, откатить к состоянию на момент исполнения CATCH)
RP@ HANDLER !
Теперь переменная HANDLER указывает на тот элемент списка, что мы только что на стек возвратов положили. Он теперь первый, самый верхний.
EXECUTE <- исполняем тот исполнимый токен, что был положен на стек перед CATCH, то есть то слово, на которое мы навесили обработчик исключений.
Если исполнение попало сюда, значит THROW не было.
Что тогда надо сделать ?
R> HANDLER !
Восстановить старое значение переменной HANDLER и этим выкинуть из цепочки (начинающейся с указателя в HANDLER), ставший ненужным, самый верхний элемент списка.
RDROP
Сбросить со стека ставший ненужным указатель стека данных. Тот к которому следовало бы откатить стек по THROW, да только этого THROW не было
FALSE ;
Вернуть FALSE , чтобы программа дальше знала, что то, что было запущено по CATCH завершилось без исключений THROW.

THROW объяснять ? Или тебе надо как вообще работают исключения объяснять ? Или пример применения показать ? Говори что еще не ясно ?

============================================

: ПОДРАЗБОР
...
еще куча всякого хлама на стеке данных
проверка_какого-то_условия IF 5 THROW ( типа ошибка синт.разбора с кодом 5 ) THEN
еще всякая сложная работа с данными на стеке
проверка_какого-то_условия IF 7 THROW ( типа ошибка синт.разбора с кодом 7 ) THEN
еще всякая сложная работа с данными на стеке
...
;

: СИНТАКСИЧЕСКИЙ-РАЗБОР
...
куча всяких параметров на стеке данных лежит
ПОДРАЗБОР
...
;

['] СИНТАКСИЧЕСКИЙ-РАЗБОР CATCH ?DUP IF ." неуспешный, код ошибки " . ELSE ." успешный" THEN


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

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

Я набираю в нем
: Z ;
и он вешается.
Что тут можно еще проверять, если даже нового слова не определить ?
Любая попытка определить слово кончается крахом.

Короче, ты бы сам сначала свое творение проверил.

Кстати, у тебя по умолчанию 16-чная система счисления и ее не изменить ?
Попытка записи в BASE (а слова DECIMAL то и нет), например
E A BASE ! .
приводит к
EXCEPTION! ACCESS BEFORE FENCE.


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

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Ошибки исправлены(вроде :]).

Цитата:
Попытка записи в BASE (а слова DECIMAL то и нет), например
E A BASE ! .
приводит к
EXCEPTION! ACCESS BEFORE FENCE.

Оно так и будет. Дело всё в том, что
Стандартно | В моей системе
HERE @ | HERE
HERE ! | HERE!
Это уменьшает немного размер (особенно в системных обращениях) и ускоряет немного работу системы.
Код:
OK
>E A BASE! .
14 OK
>_

А так получается
BASE ( S: 16 ) ! ( 16<FENCE )


Вложения:
Комментарий к файлу: Пока так...
KR4tH010.zip [17.86 Кб]
Скачиваний: 551
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июн 11, 2017 14:14 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
Оно так и будет. Дело всё в том, что
Стандартно | В моей системе
HERE @ | HERE
HERE ! | HERE!
Дело в том, что HERE никогда не была переменной. Это слово, которое возвращает значение. Так-что твой пример ни о чем. Просто для всех других фортеров BASE - это как раз переменная. Так-что
BASE @ | BASE !
HERE | а вот тут как хочешь, это вне стандарта и де юре и де факто, хошь HERE! , хошь DP !

Ты вправе этому не следовать, но вот беда, тебя тогда перестанут без дополнительных объяснений понимать.


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
Это уменьшает немного размер (особенно в системных обращениях) и ускоряет немного работу системы.
Сначала ты завершаешь определения в нативном коде так :
jmp FNEXT
...
FNEXТ: cld
lodsw
jmp ax
а потом начинаешь выжимать долю процента быстродействия за счет понятности твоей системы (не внутренней кухни, а ее интерфейса) другим фортерам. Глупо, потеряв рубли, выжимать копейки.

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

А теперь смотри. jmp FNEXT - 3 байта. lodsw jmp ax вставленное инлайн в конце определения тоже 3 байта. Так в чем вопрос ? cld там лишнее, системные вызовы DOS и BIOS этот флаг не меняют, иначе перестанет работать половина ПО под MS-DOS, так-что можно сделать cld в начале программы один раз и держать этот флаг сброшенным на проход.

Хотя, как говорится, хозяин-барин. :)

_KROL писал(а):
BASE ( S: 16 ) ! ( 16<FENCE )
Так по идеологии форта все внутренности форт-системы для программиста доступны. FENCE обычно используется только для FORGET . Ну чтобы по запаре не забыть насмерть.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ethereal писал(а):
- оптимизация по скорости главный приоритет, но если не за счет сильного произрыша в оптимизации по размеру.

Главный приоритет в процессе освоения - понятность и воспроизводимость. Главный приоритет в процессе эксплуатации Форта - явно не производительность. Стековая модель сама по себе для достижения высокой производительности подходит плохо.


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Hishnik писал(а):
Главный приоритет в процессе освоения - понятность и воспроизводимость.
Освоения чего - интерфейса Форт-системы или ее исходного текста ?
У нас же про написание внутреннего кода Форт-системы разговор был. И только об этом. Или ты просто решил и тут вставить свои пять копеек ?
Исходный текст Форт-системы вообще предоставляется только от большого расположения, а в противном случае вон с отладчиком код бинарика осваивай и чем непонятнее я там накодирую тем лучше. Ну а разберешься, так чем труднее задача, тем больше чести.
Hishnik писал(а):
Главный приоритет в процессе эксплуатации Форта - явно не производительность. Стековая модель сама по себе для достижения высокой производительности подходит плохо.
Разве выше разговор шел про эксплуатацию ? Человек пока баги пачками исправляет, какая тут эксплуатация ?
И выражение "при прочих равных условиях" знакомо ? Оптимизировать по скорости можно даже программы на интерпретируемом Бейсике. Ну а уж то, что системное, а не прикладное, должно оптимизироваться всегда.


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

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


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

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


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

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