Forth
http://fforum.winglion.ru/

Моя система(_KROL)
http://fforum.winglion.ru/viewtopic.php?f=2&t=3127
Страница 35 из 36

Автор:  mOleg [ Вт июн 05, 2018 17:57 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
Правда пока только голый скелет.

Я не видел пока удачной реализации форта на Си 8(

Автор:  Hishnik [ Ср июн 06, 2018 01:16 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
Что-нибудь скажете? Надо же от чего-то отталкиваться!

В целом это довольно стандартный стартовый набор.

Для практической работы интереснее два других аспекта.
1. Как этот Форт взаимодействует с другими программами. Можно ли его подключить к проекту, у которого есть наглядные, красивые и распространенные вещи. Например, самостоятельно рисовать кнопки или реализовывать сеть в Форте - долго, сложно и не приводит к заметному выигрышу. Проще пользоваться готовыми библиотеками, но для этого надо либо к Форту что-то подключить, либо Форт к чему-то подключить.
2. Как Форт взаимодействует с пользователем и окружением сам по себе. Есть только консоль? И всегда только консоль? Как он открывает-закрывает файлы?
В целом, эти пункты (и даже один из них) могут быть основанием для того, чтобы еще раз написать "базовый набор слов" самостоятельно.

Автор:  _KROL [ Чт мар 14, 2019 13:08 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Всем привет! Как время летит, а форт никак не возможно забыть :)
Как знаете, я много раньше эксперементировал, когда писал свою систему. При выборе шитого кода мне больше понравился прямой, т.к. он проще. Однако, косвенный обладает более широкими возможностями, например, к переносу кода и создния модулей. Наверное, поэтому это классический подход для форта.
И вот, когда я пытался использовать КШК, у меня возникли с пониманием, как там должно быть организован код на поле исполнение DOES>.
На какой тогда код указывает CFA и PFA?
Подскажите, пожалуйста! Быть может я что в этот раз создам интересное... надеюсь :shuffle;

Автор:  zma [ Чт мар 14, 2019 22:41 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Как вариант: DOES> среди прочего компилирует в словарь машинный код, который кладёт PFA на стек и устанавливает указатель адресного интерпретатора на ШК за этим кодом. Поле кода создаваемых слов указывает на этот маш. код. PFA как указывал на поле параметров после поля кода, так и продолжает указывать.

Автор:  ath [ Пт мар 15, 2019 19:46 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
И вот, когда я пытался использовать КШК, у меня возникли с пониманием, как там должно быть организован код на поле исполнение DOES>.
На какой тогда код указывает CFA и PFA?
Подскажите, пожалуйста! Быть может я что в этот раз создам интересное... надеюсь :shuffle;

Как раз этим занимаюсь. Есть знание английского? Могу дать ссылки на очень хорошие объяснения, умных людей. :shuffle;

Если своими словами, есть две реализации DOES>

1. ФигФорта, <BUILDS DOES>

Она мало интересна сегодня, но проще всего реализуется в Гарвардской архитектуре вроде 8051.

2. CREATE DOES>

Вот про неё и напишу. Главное правило КШК, что поле кода (CFA) всегда содержит адрес программы в машинном коде. DOES> делает вид для программиста, что обработчик написан на Форте. Но на низком уровне в поле кода всё равно сидит адрес машинного кода, таковы требования КШК.

В теории обработчик слова, созданного CREATE DOES> , должен быть всегда DODOES — но ему необходим параметр, где лежит ШК настоящего высокоуровневого обработчика. Этот ШК скомпилирован после каждого DOES> индивидуально. Поэтому до него компилируется индивидуальный кусочек машинного кода (на него и ставится ссылка в поле кода), запускающий интерпретацию ШК.

Теперь на практике.
Код:
: CONSTANT CREATE , DOES> @ ;
5 CONSTANT FIVE
10 CONSTANT TEN

Компилируются так в КШК:
Код:
Поле имени: 8 "CONSTANT"
Поле кода: CALL ( обычное для всех двоеточий)
Поле параметров:
CREATE
,
(;DOES)
DOCON: ( метка, для полей кода констант)
Машинный код, например JSR DODOES и адрес нашего ШК в стеке
@ ( тут уже наш обработчик пошёл)
EXIT

Поле имени: 4 "FIVE"
Поле кода: DOCON
Поле параметров: 5

Поле имени: 3 "TEN"
Поле кода: DOCON
Поле параметров: 10

Поле связи я не пишу, оно тут роли не играет. Интересно, что (;DOES) одно и тоже как для DOES> так и для низкоуровневого ;DOES

Автор:  Hishnik [ Пт мар 15, 2019 20:56 ]
Заголовок сообщения:  Re: Моя система(_KROL)

ath писал(а):
Как раз этим занимаюсь.

А заниматься надо разъяснением, что имелось в виду под "незаконным преследованием тех, кто соблюдает требования ANS". Даю время до конца недели на приведение фактов, подтвержденных документально, либо принесение извинений подписчикам за сознательное введение в заблуждение. Невыполнение данного требования приведет к блокированию аккаунта. Любое сообщение на посторонние темы вместо затребованного разъяснения - аналогично.

Автор:  Ethereal [ Чт апр 18, 2019 21:58 ]
Заголовок сообщения:  Re: Моя система(_KROL)

ath писал(а):
Если своими словами, есть две реализации DOES>
1. ФигФорта, <BUILDS DOES>
Она мало интересна сегодня, но проще всего реализуется в Гарвардской архитектуре вроде 8051.
2. CREATE DOES>
В общем-то <BUILDS можно свести к
: <BUILDS CREATE CELL ALLOT ;
так-что <BUILDS это почти что CREATE , но все-же не оно.

Из некоего 32-разрядного FIG :
: <BUILDS 0 CONSTANT ;
: DOES> R> LATEST PFA ! (;CODE) ассемблерное_бла_бла
Код:
      ENTRY   7, '<BUILDS', BUILDS
; Used within a colon-definition:
;     : cccc  <BUILDS  ...
;               DOES>  ...  ;
; Each time cccc is executed, <BUILDS defines a new word with a
; high-level execution procedure. Executing cccc in the form:
;     cccc nnnn
; uses <BUILDS to create a dictionary entry for nnnn with a call to
; the DOES> part for nnnn. When nnnn is later executed, it has the
; address of its parameter area on the stack and executes the words
; after DOES> in cccc. <BUILDS and DOES> allow runtime procedures to
; be written in high-level rather than in assembler code (as required
; by ;CODE ).
      DD   DoCOLON
      DD   ZERO, CONSTANT, SEMI_S

      ENTRY   5, 'DOES>', DOES
; A word which defines the run-time action within a high-level
; defining word. DOES> alters the code field and first parameter of
; the new word to execute the sequence of compiled word addresses
; following DOES>. Used in combination with <BUILDS. When the DOES>
; part executes it begins with the address of the first parameter of
; the new word on the stack. This allows interpretation using this
; area or its contents. Typical uses include the Forth assembler,
; multidimensional arrays, and compiler generation.
      DD   DoCOLON
      DD   R_FROM, LATEST, PFA, STORE_
      DD   _SEMI_CODE_
DoDOES:      sub   ebp, 4
      mov   [ebp], esi
      mov   esi, [eax+4]
      push   ebx
      lea   ebx, [eax+8]
      NEXT$

Автор:  Ethereal [ Чт апр 18, 2019 22:10 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
И вот, когда я пытался использовать КШК, у меня возникли с пониманием, как там должно быть организован код на поле исполнение DOES>.
Вот как раз если КШК, то лучше сделать <BUILDS DOES> , потому-что CREATE DOES> тут как серпом по яйцам. CREATE DOES> хорошо для любого другого шитого кода, но не КШК. Не, сделать конечно можно, но не красиво. Придется в словарной статье зарезервировать ячейку, которая будет использоваться только у слов с DOES> и будет бесхозной у всех остальных.

Автор:  _KROL [ Пн май 20, 2019 14:41 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Здравствуйте! :)
Я всё-таки почти сделал (частично) свою новую систему с использование КШК (основываясь на форте Winglion)...
Однако, с хотением нормальной поддержки словарей (через CONTEXT) у меня появился вопрос.
Как я понял, нельзя ссылаться в CFA на код на форте, так как никакого нативного CALL нету. Так что, реализовывать примитив (VOCABULARY) на ассемблере? Тогда и весь контекст? Но это не очень удобно.
p.s. Спасибо за ответы! На счёт отличия <BUILDS и CREATE я понял.
p.p.s. Если что, делать я на той неделе по вдохновению начал :roll:

Автор:  _KROL [ Пн май 20, 2019 14:54 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Ладно, добавлю примитив does>. Ведь нету других вариантов же?

Автор:  Ethereal [ Вт май 21, 2019 07:42 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Это как раз тот случай когда не стоит на ассемблере, а стоит шитым кодом. Потому-что вот такое у меня (точнее в классическом Фиг, который я перенес на 32-разрядную почву) получилось определение
Код:
HEX

: VOCABULARY
  <BUILDS
     A0202083 ,
     CURRENT @ CELL- ,
     HERE VOC-LINK @ , VOC-LINK !
     IMMEDIATE
  DOES>
    CELL+ CONTEXT !
;
и в ассемблерном исходнике оно косвенным шитый кодом записывается так
Код:
      ENTRY   10, 'VOCABULARY', VOCABULARY
; A defining word used in the form:
;     VOCABULARY cccc
; to create a vocabulary definition cccc. Subsequent use of cccc will
; make it the CONTEXT vocabulary which is searched first by INTERPRET.
; The sequence "cccc DEFINITIONS" will also make cccc the CURRENT
; vocabulary into which new definitions are placed. In fig-FORTH, cccc
; will be so chained as to include all definitions of the vocabulary
; in which cccc is itself defined. All vocabularys ultimately chain to
; Forth. By convention, vocabulary names are to be declared IMMEDIATE.
; See VOC-LINK
         DD   DoCOLON
         DD   BUILDS, LIT, 0A0202083h, COMMA
         DD   CURRENT, FETCH, CELL_MINUS, COMMA
         DD   HERE, VOC_LINK, FETCH, COMMA, VOC_LINK, STORE_
         DD   IMMEDIATE
         DD   DOES
DoVOC      DD   CELL_PLUS, CONTEXT, STORE_, SEMI_S
Ну а образчик самого словаря можно увидеть в слове FORTH которое суть корневой словарь
Код:
      ENTRY   5+40h, 'FORTH', FORTH
; The name of the primary vocabulary.
; Execution makes FORTH the CONTEXT vocabulary. Until additional user
; vocabularies are defined, new user definitions become a part of
; FORTH. FORTH is immediate, so it will execute during the creation of
; a colon-definition, to select this vocabulary at compile time.
            DD   DoDOES
            DD   DoVOC
            DD   0A0202083h
            DD   LAST_NAME
LAST_VOCAB   DD   0
Константа 0A0202083 выше это просто имя из трех пробелов у фейковой словарной статьи через который словарь сшивается с родителем. Это такой изящный прибамбас Фиг-Форта.
А LAST_NAME - это метка при последнем слове в исходнике, вот такая
LAST_NAME: ENTRY 4, 'SAVE', SAVE
...

------------------------------------------------------------------
Как видишь выше вообще нет примитива (VOCABULARY). Словарь создается словом VOCABULARY внутри которого есть <BUILDS DOES>. И поэтому у всех словарей есть общий DOES>-ный код, назовем его doer, он по метке DoVОC и он не на ассемблере. А шитым кодом.

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

Автор:  Ethereal [ Вт май 21, 2019 08:46 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
Как я понял, нельзя ссылаться в CFA на код на форте, так как никакого нативного CALL нету. Так что, реализовывать примитив (VOCABULARY) на ассемблере?
Как-то логика твоей мысли ускользает. Ячейка CFA может ссылаться на (содержать адрес)
Код:
DoCOLON:   sub   ebp, 4
      mov   [ebp], esi
      lea   esi, [eax+4]
      NEXT$
тогда сразу после CFA (т.е. в PFA) располагается шитый код.

CFA может ссылаться на
Код:
DoDOES:      sub   ebp, 4
      mov   [ebp], esi
      mov   esi, [eax+4]
      push   ebx
      lea   ebx, [eax+8]
      NEXT$
тогда сразу после CFA (в первой ячейке PFA) располагается адрес где находится шитый код.

Кстати именно из-за наличия этого адреса в первой ячейке PFA при КШК требуется не CREATE , а отдельное слово <BUILDS. CREATE ведь создает слово, которое возращает адрес совершенно пустого в момент создания PFA. А <BUILDS одну ячейку в PFA под дело занимает. Под то дело, что надо-же куда-то положить адрес, который в ПШК вмонтирован в инструкцию call.

Так-что от того, что в КШК нету call-а неизбежность ассемблерности чего-либо никак не вытекает.

Автор:  _KROL [ Вт май 21, 2019 17:37 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Ethereal писал(а):
HEX

: VOCABULARY
<BUILDS
A0202083 ,
CURRENT @ CELL- ,
HERE VOC-LINK @ , VOC-LINK !
IMMEDIATE
DOES>
CELL+ CONTEXT !
;
Ethereal писал(а):
DD DoDOES
DD DoVOC
DD 0A0202083h
DD LAST_NAME
У меня такое чувство, что тут немного разные порядки хранения данных...

Я вообще хотел сделать стек контекста, но видно мне пока и достаточно того, как реализовано в твоём форте (я что-то про него забыл).

Автор:  _KROL [ Вт май 21, 2019 18:15 ]
Заголовок сообщения:  Re: Моя система(_KROL)

У меня должно примерно линковаться следующим образом:
Код:
0<-forth<-abc<-voc1<-...
                ^-some1<-some2

или по другому?
p.s. И должно ли поле связи слов словаря указывать в конце на сам словарь?

Автор:  Ethereal [ Вт май 21, 2019 18:22 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Они одинаковые. Пусть ты создал словарь BLABLA. Тогда первое слово в нем будет иметь LFA указывающий на 0A0202083 словаря-родителя. А сам словарь BLABLA будет иметь
DD 0A0202083h
DD адрес_последнего_слова_словаря_BLABLA
DD адрес_такого-же_поля_в_словаре_созданном_предпоследним

Страница 35 из 36 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/