LINUX.ORG.RU

[forth] [2KRoN73] Зачем нужны две семантики?

 


0

0

Зачем в форте два режима - режим интерпретации и компиляции? Почему нельзя оставить только один (компиляции), а после каждого нажатия <return> компилировать и исполнять ":NONAME <код> ; EXECUTE"? Это сильно сократит словарь.

потому что сейчас ты можешь сделать аналог вычисления констант, временно перейдя в режим интерпретации

пример:

int f(x,y) { return x*x+y*y; }
const z=f(1,2); <--- вот это можно на форте, но до с++0х нельзя было на плюсах

www_linux_org_ru ★★★★★
()

интересно, а можно ли на с++0х все фортовские подсчеты констант сделать?

похоже, что нельзя, т.к. в таких условиях f не может содержать циклы (или рекурсию):

First, the function must have a non-void return type. Second, the function contents must be of the form: return expr. Third, expr must be a constant expression, after argument substitution. This constant expression may only call other functions defined as constexpr, or it may use other constant expression data variables. Lastly, a function with this label cannot be called until it is defined in this translation unit.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Это можно сделать и без интерпретатора, хитрым образом определив [ и ].
[ будет запоминать указатель, по которому происходит запись (,) при компиляции, выбирать входной поток до ] и рекурсивно вызывать компилятор, затем сразу исполнять получившийся код, перед исполнением установив указатель обратно, затем записать инструкцию «PUSH что-то».

Например:

: PI ( — pi ) some-lengthy-computation-to-calculate-pi ;

: SINUS-OF-PI ( — sin-pi ) [ PI ] SIN ;

Определение слова ":" будет выглядеть примерно так:

1. создать скрытую словарную статью с нужным именем, подготовить указатель HERE;

2. сканировать входной поток слов, для каждого слова проверять, стоит ли у него флаг IMMEDIATE; если да, то перемещать HERE в некий временный буфер, выполнять compile semantics для этого слова, потом исполнять этот буфер (CALL), затем вернуть HERE на место; если же флага IMMEDIATE нет, то записывать по адресу HERE инструкцию CALL для нужного слова.

forthnewbie
() автор топика
Ответ на: комментарий от forthnewbie

Ты придумываешь новые всё более сложные сущности :) Суть Форта именно в простоте. Проще получается вариант с двумя состояниями. И гибче.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Ты придумываешь новые всё более сложные сущности :)

Разве ещё одна семантика - не дополнительная сущность? Не сложно ли каждый раз проверять STATE для «умных» слов? Почему вариант с двумя состояниями проще?

forthnewbie
() автор топика
Ответ на: комментарий от forthnewbie

> Разве ещё одна семантика - не дополнительная сущность? Не сложно ли каждый раз проверять STATE для «умных» слов? Почему вариант с двумя состояниями проще?

потому, что __так__ форт работает, а ты пытаешься скрыть реальность от програмера

твоя попытка ее скрыть была бы полезна, если бы программер мог забыть не только о наличии STATE, а *еще* о чем-то — в этом «еще» был бы профит; так в чем профит?

ну и нафига компилировать некий код только для того, чтобы его было можно синтерпретировать? (в других языках может и да, это полезно, но форт сделан для легкости прямой интерпретации)

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> и еще я не понял, каким образом сократится словарь

Можно будет поубирать некоторые слова с запятыми на конце, например «LIT,».

а ты пытаешься скрыть реальность от програмера

Что для программера не будет происходить прозрачно при такой схеме?

ну и нафига компилировать некий код только для того, чтобы его было можно синтерпретировать?

Чтобы выкинуть интерпретатор и заменить его компилятором.

так в чем профит?

В том, что форт-система станет занимать ещё меньше места.

forthnewbie
() автор топика
Ответ на: комментарий от forthnewbie

Можно будет поубирать некоторые слова с запятыми на конце, например «LIT,».

И как компилировать вычисляемые значения тогда? :) Замена семантики [ .. ] не поможет. Заранее неизвестно, сколько чисел нужно будет скомпилировать. Так что, придётся новые слова вводить.

Чтобы выкинуть интерпретатор и заменить его компилятором.

Интерпретатор в Форте - это компилятор, расширенный на несколько слов :) И наоборот. Обычно этим один и тот же код занимается.

Если грубо, то что-то типа:

BEGIN
    BL WORD FIND DUP
WHILE
    STATE @ IF
        -1 = IF COMPILE, ELSE EXECUTE ( immediate ) THEN 
    ELSE 
        EXECUTE
    THEN 
REPEAT
2DROP

Фактически ты предлагаешь просто вынести «STATE @ IF ... ELSE EXECUTE THEN» наружу цикла, обвязав лишней семаникой :NONAME и поменяв семантику [ .. ]

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Заранее неизвестно, сколько чисел нужно будет скомпилировать. Так что, придётся новые слова вводить.

Не придётся. Можно сохранить перед рекурсивным вызовом компилятора указатель на вершину стека, а потом посмотреть, насколько он сместился. Это и даст нам число раз, которое нужно положить в HERE код, который положит константы на стек.

Фактически ты предлагаешь просто вынести «STATE @ IF ... ELSE EXECUTE THEN» наружу цикла, обвязав лишней семаникой :NONAME и поменяв семантику [ .. ]

Да, я предлагаю усложнить три слова, чтобы сделать проще почти все остальные метаслова.

forthnewbie
() автор топика
Ответ на: комментарий от forthnewbie

Дык, реализуй свою идею, благо с фортом это раз плюнуть и продемонстрируй обещанные преимущества на деле.

sdio ★★★★★
()

Зачем в форте два режима - режим интерпретации и компиляции?


Например, для реализации управляющих структур стандартными средствами Forth.
Читай главу 2.3. «Стек возвратов и реализация структур управления» в книге:
«Язык Форт и его реализации.» С.Н. Баранов, Н.Р. Ноздрунов. Лениград, «Машиностроение» Ленинградское отделение, 1988

          : IF ( ---> A )  COMPILE ?BRANCH  HERE  2 ALLOT ;  IMMEDIATE
          : THEN ( A ---> )  HERE  SWAP  !  ;  IMMEDIATE
          : ELSE ( A1 ---> A2 )  COMPILE  BRANCH  HERE
                2 ALLOT  HERE  ROT  ! ;  IMMEDIATE

     Все  эти  слова имеют признак немедленного исполнения, который придается
 им словом IMMEDIATE, исполненным сразу после завершения каждого определения.
 Это  означает, что данные слова будут исполняться, а не компилироваться, как
 остальные,  во  время  обработки  тела определений текстовым интерпретатором
 форт-системы.

Т.е. слова IF-THEN-ELSE должны исполняться в режиме компиляции для формирования корректных точек/адресов перехода.
Такая реализация проще других и обладает достаточной мощью для создания своих структур управления.
С возможностью манипулирования этими двумя режимами, тебе предоставляются механизмы создания DSL.

Neksys ★★★
()
Ответ на: комментарий от KRoN73

[code]

tib .

129 - ok [/code] по адресу 128 счётчик строки TIB, а Load интерпретирует строку со счётчиком по указанному адресу. Expect записывает нулевой символ, посему счётчик берётся из переменной Span. [code]

" 2 2 + ."

- ok

depth .

1 - ok

dup count type

2 2 + . - ok

dup .

20205 - ok

load

4 - ok

" : test 2 3 + . ;"

- ok

dup count type

: test 2 3 + . ; - ok

load

- ok

test

5 - ok [/code]

P.S. Да, ностальгия. :)

anonymous
()
Ответ на: комментарий от KRoN73
> tib .
129 - ok

по адресу 128 счётчик строки TIB, а Load интерпретирует строку со счётчиком по указанному адресу. Expect записывает нулевой символ, посему счётчик берётся из переменной Span.

> " 2 2 + ."
 - ok
> depth .
1 - ok
> dup count type
2 2 + . - ok
> dup .
20205 - ok
> load
4 - ok
> " : test 2 3 + . ;"
 - ok
> dup count type
: test 2 3 + . ; - ok
> load
 - ok
> test
5 - ok

P.S. Да, ностальгия. :)

anonymous
()
Ответ на: комментарий от anonymous

>Load интерпретирует строку со счётчиком по указанному адресу

Э... Это уже новодел, значит :) N LOAD раньше грузил файловый блок N :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Э... Это уже новодел, значит :) N LOAD раньше грузил файловый блок N :)

Обрати внимание на список библиотек и год выпуска.

					Версия 94.7 - Июль 1994 года                       
										 
  Комплект файлов Форт-системы :                                         
																		 
	 1. forth.com         - Форт-транслятор                              
	 2. frlview.com       - программа  для  просмотра   содержимого      
							библиотечных модулей формата .FRL и ис-      
							полняемых Форт-программ                      
	 3. opt.com           - программа для оптимизации кода исполня-      
							емых Форт-модулей                            
	 4. 256color.frl      - библиотека,  содержащая  низкоуровневые      
							гибкие слова для реализации  мультипли-      
							кационных эффектов в 256-цветном режиме      
							320*200 точек (VGA).                         
	 5. mtask.frl         - библиотека, содержащая слова, позволяю-      
							щие выполнять Форт-программы, представ-      
							ленные в виде взаимодействующих, но не-      
							зависимых задач. МНОГОЗАДАЧНОСТЬ!!!          
	 6. 256.com           - простой генератор  графических  образов      
							для использования их  в Форт-программах      
							вместе с модулем 256color.frl                
	 7. 4th.com           - оболочка Форт-транслятора                    
	 8. float87.frl       - математическая библиотека с использова-      
							нием сопроцессора 80x87                      
	 9. quattro.frl       - математическая библиотека, не использу-      
							ющая сопроцессора                            
	10. crt.frl           - подключаемый библиотечный  модуль,  со-      
							держащий слова для работы  с  текстовым      
							экраном, функции  оконного  интерфейса,      
							редактирования строки, работы  с  гори-      
							зонтальным меню,  обработки  символьных      
							строк в ASCIIz-формате                       
	11. dos.frl           - библиотечный модуль,  включающий  слова      
							для работы с файловой системой DOS           
	12. music.frl         - библиотечный модуль,  содержащий  слова      
							для работы с динамиком, для  проигрыва-      
							ния заданных мелодий параллельно с  ра-      
							ботой основной программы                     
	13. graph.frl         - библиотека для работы с графикой.  Под-      
							держиваются графические адаптеры : CGA,      
							EGA, VGA, MCGA, Hercules                     
	14. random.frl        - библиотека, содержащая слова для  гене-      
							рации псевдослучайных чисел                  
	15. mouse.frl         - библиотека,   содержащая   элементарные      
							слова для работы с "мышкой"                  
	16. kbdcodes.frl      - библиотечный  модуль,  содержащий  кон-      
							станты  для работы с  драйвером  клави-      
							атуры BIOS                                   
	17. forth.doc         - описание языка, библиотек и прочая  до-      
							кументация                                   
	18. forthasm.inc      - для тех, кто владеет языком ассемблера,      
							этот файл поможет писать Форт-слова  на      
							этом языке                                   
	19. fs.frt            - небольшая программа, написанная на Фор-      
							те, позволяющая сгенерировать  диалого-      
							вую версию Форт-транслятора                  
	20. pas.com           - маленькая "игрушка" - компилятор Паска-      
	21. pas.doc             ля, совместимый с Форт-транслятором.         
	22. pc.bat                                                           

Как тебе этот наборчик? В общем, не знаю как тебе, а мне этот набор, в те времена, показался восхитительным. :)

anonymous
()
Ответ на: комментарий от anonymous

>Как тебе этот наборчик? В общем, не знаю как тебе, а мне этот набор, в те времена, показался восхитительным. :)

Я помню :) Но дальше игр с многопоточностью у меня дело так с этой версией и не пошло. Я тогда баловался Jaguar Forth и Forthius16/32.

...

LOAD же - это ещё из более древних времён, когда Форт оперировал одним файловым пространством, разбитым на 1024-байтные куски по 64x16.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.