Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 18, 2024 14:04

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 225 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 15  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 14, 2007 19:05 
control-flow стек может быть как на стеке параметров, так и в отдельном. Стандарт ANS 94-го года предусматривает оба варианта.

Для отделения стека стуктур управления также есть решение ~mak/LIB/A_IF.F (instead of GOTO).

chess писал(а):
Обнаружил, что управляющие конструкции IF, BEGIN и т.п. все-таки используют стек параметров во время компиляции для контроля вложенности.

И это далеко не единственная открытая Америка. Есть ещё такое широко применяемое слово как MODULE:, которое тоже оставляет значение на стеке. Также, для большей независимости от поставленной перед компиляцией файла системы счисления часто пишут:

Код:
BASE @ HEX \ или DECIMAL
... \ исходный текст
BASE !


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 15, 2007 00:43 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 15, 2007 00:48 
Не в сети
Moderator
Moderator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 15, 2007 11:09 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Ввел стек для использования при компиляции. Практически как у ProfiTa (только без глобальной переменной).
Таким способом можно вводить необходимое количество вспомогательных стеков.
Реализация:
Код:
: STACK ( n -- )  \ использование: n STACK name
  CREATE HERE , CELLS ALLOT
;
10 STACK ST-COMP

\ ОПЕРАЦИИ СО СТЕКОМ КОМПИЛЯЦИИ

: >C  \ x -- | c: -- x  переложить со стека параметров на стек компиляции
  ST-COMP CELL OVER +! @ ! ;

: @C  \ c: x -- x | -- x  скопировать со стека компиляции на стек параметров
  ST-COMP @ @ ;

: POP \ c: x --    убрать верхний со стека компиляции
ST-COMP  DUP DUP @ = INVERT IF  CELL NEGATE SWAP +!  THEN ;

: C>  \ c: x -- | -- x  переложить со стека компиляции на стек параметров
@C POP ;

: /ST \ c: n*x --    очистить стек компиляции
ST-COMP  DUP ! ;

: DPT-C \ c: n*x -- n*x | -- n   дать глубину стека компиляции
ST-COMP DUP @ SWAP - CELL / ;

: EMP? \ -- fl  проверить на пустоту fl=1 - стек пуст
DPT-C 0= ;

\ Пример
STARTLOG

20 >C 30 >C 40 >C
@C C> @C
DPT-C .
/ST
EMP? .
DPT-C .

ENDLOG

лог-файл к примеру
Код:
2 -1 0

на стеке параметров осталось
Код:
( 40 40 30 )
Теперь параметры ассемблеру из слов немедленного исполнения, участвующих в компиляции определений через двоеточие можно передавать через такой стек.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 15, 2007 18:36 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Хищник писал(а):
Два прохода - это проще?

Пока пример травопольного двойного прохода(с меткой вперед):
Код:
0 VALUE DPS
I: dp! DP @ TO DPS ;
I: dp@ DPS DP !    ;

: CICL
dp!
L1  SJ
DUP
L1: D=A
dp@
L1  SJ
DUP
L1: D=A
;

SEN CICL

лог
Код:
CODE CICL
569760 EB06      JMP     569768           ----
569762 8945FC    MOV     FC [EBP] , EAX       |
569765 8D6DFC    LEA     EBP , FC [EBP]       |
569768 8BD0      MOV     EDX , EAX        <---
56976A C3        RET     NEAR
END-CODE

Пока я не знаю как синтаксически оформить это как-то так(в Форте я не Адепт),
Код:
2: CICL
L1  SJ
    DUP
L1: D=A
;2

но думаю это не очень сложно будет - если еще кто-нибудь бы помог (из Адептов):D

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 16, 2007 18:37 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Есть вопрос. Что-то я не нахожу готовых средств в СПФ для реализации 2-х проходной компиляции.
Нужно преобразовать 1-ю конструкцию во 2-ю:
Код:
VARIABLE DPS
1-я:
: SSS
[ DP @ DPS ! ] \ сохраняем DP
WORD1 WORD2 .... WORDn
[ DPS @ DP ! ] \ восстанавливаем DP
WORD1 WORD2 .... WORDn
;
2-я:
2: SSS
WORD1 WORD2 .... WORDn
;2
WORD1 WORD2 .... WORDn и WORD1 WORD2 .... WORDn абсолютно одинаковые последовательности слов.
Может кто нибудь подскажет как такое сделать.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 16, 2007 19:27 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
chess писал(а):
Есть вопрос. Что-то я не нахожу готовых средств в СПФ для реализации 2-х проходной компиляции.


Кроме тебя, это кому-то нужно?

Код:
REQUIRE $! ~mak\place.f

CREATE XSOURCE 0x101 ALLOT
0 VALUE X>IN
0 VALUE XDP
0 VALUE XN
VARIABLE XFP 0 ,

: 2: :
>IN @ TO X>IN
  DP @ TO XDP
  1 TO XN
  SOURCE XSOURCE $!
   SOURCE-ID FILE-POSITION
DROP
XFP 2!
;

: 2;
XN IF
   XSOURCE COUNT SOURCE!
   X>IN 1+  >IN  !
   XDP   DP   !
   XN 1- TO XN
   XFP 2@  SOURCE-ID REPOSITION-FILE DROP
   EXIT
THEN
POSTPONE ; ; IMMEDIATE

\ test
2: HI   ." Hello!!"
[ CR .( PASS=) XN . ]
2;
HI


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Mihail писал(а):
Кроме тебя, это кому-то нужно?

Михаил - спасибо. Я думаю будет нужно.
Интерпретатор может находиться в двух состояниях - компиляции и исполнения. Думаю нужно ввести еще одно состояние интерпретатора - формирование именованного отрезка входного потока.
В форуме этот вопрос уже обсуждался - не могу точто сказать когда и в каком топике(там по моему обсуждался вопрос о снятии ограничений на использование структур управления). Работа со словами, определенными в виде их исходных текстов даст дополнительные возможности при программировании(наверное каждый может их для себя определить).

_________________
С уважением, chess


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
chess писал(а):
Хищник писал(а):
Два прохода - это проще?

После введения слов 2: и 2; - я их обозначу соответственно как L: и L; от слова LABEL определения с метками вводятся просто.
Пример:
Код:
0 VALUE l1 0 VALUE l2 0 VALUE l3
I: L1 l1 ; I: L1: DP @ TO l1 ; I: L2 l2 ; I: L2: DP @ TO l2 ; I: L3 l3 ; I: L3: DP @ TO l3 ;

: SHORT-SM \ label --
1- DP @ - ;
\ JMP SHORT LABEL
I: SJ \ label --
0xEB C, SHORT-SM C, ;

L: TST
L1  SJ
L2: DUP
L3  SJ
L1: B=D
L2  SJ
L3:
L;

лог

Код:
CODE TST
569BE0 EB08               JMP     569BEA          ----
569BE2 8945FC        ---> MOV     FC [EBP] , EAX      |
569BE5 8D6DFC       |     LEA     EBP , FC [EBP]      |
569BE8 EB04         |     JMP     569BEE    ---       |
569BEA 8BDA         |     MOV     EBX , EDX    | <----
569BEC EBF4          ---  JMP     569BE2       |
569BEE C3                 RET     NEAR     <---
END-CODE

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 19, 2007 14:31 
chess писал(а):
Код:
: @C  \ c: x -- x | -- x  скопировать со стека компиляции на стек параметров
  ST-COMP @ @ ;

: POP \ c: x --    убрать верхний со стека компиляции
ST-COMP  DUP DUP @ = INVERT IF  CELL NEGATE SWAP +!  THEN ;


Набор слов управляющего стека: >CS, CS>, CS@, ?CSP, CSDROP, CSDEPTH (или CS-DROP, CS-DEPTH)
Аналогия: >R, R>, R@, RDROP.
См. Clarifications of Control-flow stack; Стандарт определяет лишь CS-PICK и CS-ROLL.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
rvm писал(а):
Набор слов управляющего стека: >CS, CS>, CS@, ?CSP, CSDROP, CSDEPTH (или CS-DROP, CS-DEPTH)
Аналогия: >R, R>, R@, RDROP.
См. Clarifications of Control-flow stack; Стандарт определяет лишь CS-PICK и CS-ROLL.

rvm - спасибо за наводку.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 19, 2007 23:41 
Цитата:
Думаю нужно ввести еще одно состояние интерпретатора - формирование именованного отрезка входного потока.
Простейшее решение — файл, он и есть именованный отрезок входного потока :)
Более сложное решение — использовать xml-based язык разметки (без вариантов).
Анонсирую: залил в SPF-репозиторий альфа-версию базового транслятора ForthML :) Управляющие конструкции в режиме исполнения — одно из требований к нему.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт фев 20, 2007 10:21 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
rvm писал(а):
Простейшее решение — файл, он и есть именованный отрезок входного потока
Более сложное решение — использовать xml-based язык разметки (без вариантов).

Под формированием именованного отрезка входного потока я подразумевал следующее:
По определенным словам во входном потоке интерпретатор переходит в режим формирования именованного отрезка входного потока, при котором следующее слово как имя вписывается в словарь, а следующие последовательности символов (до слов заканчивающих процесс формирования отрезка) вписываются в кодофайл. В дальнейшем эти "слова" могут использоваться по разному назначению(для компиляции, исполнения и для других целей). Слова, оканчивающие процесс формирования отрезков могут переводить интерпретататор
снова в режим формирования очередного отрезка или в режим компиляции или в режим исполнения.
Отрезки могут быть и неименованными с последующим присвоением им имени(как после :NONAME). При безименном формировании отрезков последовательность символов загоняется сначала в буфер, а потом уже после присвоения ей имени из буфера в словарь. Тут также возможны варианты с отделением имен от содержимого, соответствующих им отрезков.

_________________
С уважением, chess


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Прикрутил дополнительный стек для нужд компиляции к ассемблеру.
Решил сделать этот ассемблер полностью постфиксным с целью сокращения его исходника. Писать будет немного не так удобно, но зато появляются дополнительные возможности конфигурирования машинных команд за счет более гибкого механизма передачи им параметров из программы.
Надо заметить, что ассемблер построен на I-словах(словах немедленного исполнения), поэтому может помещен
во временный словарь(его создавать нужно в куче), который перед исполнением SAVE может быть удален(освобожден).
Код:
: STACK ( n -- )  \ использование: n STACK name
  CREATE HERE , CELLS ALLOT
;
10 STACK ST-COMP

\ ОПЕРАЦИИ СО СТЕКОМ КОМПИЛЯЦИИ

: >CS  \ x -- | cs: -- x  переложить со стека параметров на стек компиляции
  ST-COMP CELL OVER +! @ !
;
: CS@  \ cs: x -- x | -- x  скопировать со стека компиляции на стек параметров
  ST-COMP @ @
;
: CS-DROP \ cs: x --    убрать верхний со стека компиляции
  ST-COMP  DUP DUP @ = INVERT IF  CELL NEGATE SWAP +!  THEN
;
: CS>  \ cs: x -- | -- x  переложить со стека компиляции на стек параметров
  CS@ CS-DROP
;
: CS0 \ cs: n*x --    очистить стек компиляции
  ST-COMP  DUP !
;
: CS-DEPTH \ cs: n*x -- n*x | -- n   дать глубину стека компиляции
  ST-COMP DUP @ SWAP - CELL /
;
: ?CSP \ -- fl  проверить на пустоту fl=1 - стек пуст
  CS-DEPTH 0=
;

: I: HEADER ] HIDE IMMEDIATE ;

I: A 0 >CS ; \ EAX
I: C 1 >CS ; \ ECX
I: D 2 >CS ; \ EDX
I: B 3 >CS ; \ EBX
I: P 5 >CS ; \ EBP
I: S 6 >CS ; \ ESI

: R,R 3 LSHIFT 0xC0 OR OR C, ;

\ MOV  R1, R2
I: R=R  \ R1 R2 --
   0x8B C, CS> CS> R,R
;
: TST
  D A R=R
  B B R=R

  C [ 1 ] 1 P R=R
  S SWAP P [ 4 ] R=R;
REQUIRE SEE       lib\ext\disasm.f

: SEN
  ' DUP WordByAddr CR CR ." CODE " TYPE  REST
;
STARTLOG
  SEN TST
ENDLOG

Последние две строчки в слове TST демонстрируют полную независимость передачи параметров ассемблеру от состояния стека параметров.
лог-файл
Код:
CODE TST
559480 8BD0             MOV     EDX , EAX         \ D=A
559482 8BDB             MOV     EBX , EBX         \ B=B
559484 8945FC           MOV     FC [EBP] , EAX    \ начало кода литерала 1
559487 B801000000       MOV     EAX , # 1         \
55948C 8D6DFC           LEA     EBP , FC [EBP]    \ конец  кода литерала 1
55948F 8BCD             MOV     ECX , EBP         \ начало SWAP
559491 8B5500           MOV     EDX , 0 [EBP]     \
559494 894500           MOV     0 [EBP] , EAX     \
559497 8BC2             MOV     EAX , EDX         \ конец SWAP
559499 8BF5             MOV     ESI , EBP         \ S=P
55949B C3               RET     NEAR
END-CODE
( 1 4 ) Ok

Ассемблер этот делается с целью реализации идеи контекстной компиляции. Под контекстом здесь я в основном понимаю свободность ресурсов процессора(в основном регистров). С целью формирования быстрого кода программы этот код должен быть контекстно-зависимым(ресурсно-зависимым), то есть один и тот же кусок текста программы может иметь разный код в зависимости от его места в тексте программы (по причине разной занятости ресурсов). Анализ контекста(занятости регистров) позволит в большинстве ситуаций работать с регистрами, а не на стеке параметров и стеке возвратов. Понятно, что контекстная компиляция будет требовать гораздо большего времени, чем обычная, поэтому когда будет требоваться быстрая компиляция в ходе работы программы(правда такого рода программы-это на сегодня редкость) - контекстная компиляция д.б. отключена.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 25, 2007 21:26 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
О словах в виде исходных текстов.
T: NAME1 W1 W2 ... T;
T: NAME2 W3 W4 ... T;
T: NAME3 NAME1 NAME2 W4 W5 T;
T: - определение слова в виде текста
Выполняется аддитивный принцип наращивания семантической мощности, только не для кода(в Форте сделана попытка аддитивного наращивания семантической мощности на уровне кода - считаю, что это не совсем верно), а для исходных текстов. Для определенных аппаратных платформ (Х86 - это как раз тот случай) аддитивное наращивание семантической мощности на уровне кода дает неоптимальный код.
Слова можно изменять ( НАРАЩИВАТЬ )
T: NAME3 NAME3 W21 .. T;
Основной способ решения задач - конструирование оптимального синтаксиса(лексикона). Получение кода методом
контекстной компиляции - принцип аддитивности не соблюдается - код близок к оптимуму.

_________________
С уважением, chess


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

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


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

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


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

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