Компиляция строк в код

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Компиляция строк в код

витя ерыгин
Почему компиляция строк в код на асме выливается в вызов _sliteral-code?

Разве так не проще?
Или у этого решения есть подводные камни?
: <STR>
  0xE9 C, \ машинная команда. Безусловный переход
  HERE CELL+
  CHAR WORD COUNT >R R@
  DUP 1+  \ на сколько переходим
, S,
  0 C, 
  LIT, R>  LIT,
; IMMEDIATE

\ : TEST <STR> ' MIXER' 
              <STR> " QWERTY" ;



--
Виктор Ерыгин
------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/
gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Компиляция строк в код

Ruvim Pinka

2016-04-09 7:38 GMT+03:00 витя ерыгин <[hidden email]>:
Почему компиляция строк в код на асме выливается в вызов _sliteral-code?

Потому что:
1. так исторически сложилось, т.к. вначале в SP-Forth был прямой шитый код.
2. так короче (но и медленней раза в 3-4).


Разве так не проще?
Или у этого решения есть подводные камни?
: <STR>
  0xE9 C, \ машинная команда. Безусловный переход
  HERE CELL+
  CHAR WORD COUNT >R R@
  DUP 1+  \ на сколько переходим
, S,
  0 C, 
  LIT, R>  LIT,
; IMMEDIATE


Правильней будет так:

REQUIRE AHEAD lib/include/tools.f

: SLIT, ( addr u -- )
  STATE @ >R ] \ т.к. THEN требует режима компиляции
    2>R
  POSTPONE AHEAD
    2R> HERE OVER 2SWAP S, 0 C, 2>R
  POSTPONE THEN
    2R> DLIT,
  R> STATE !
  \ с управляющем стеком заметно проще,
  \ см ~pinka/model/codegen/slit-co.f.xml
;

: [S] ?COMP CHAR PARSE SLIT, ; IMMEDIATE

: TEST [S] ' MIXER' [S] " QWERTY" ;


1. Используется слово AHEAD вместо непосредственной генерации машинной команды. Нельзя смешивать уровни — из одного уровня (или модуля) лезть в детали реализации другого уровня (или модуля) — это патологическое сцепление кода (coupling).

2. Вначале определено базовое слово SLIT, и уже на его основе определено [S]. Важно всегда отделять и предоставлять постфиксный интерфейс к функционалу, который реализуется словами, делающего разбор входного потока (parsing words), или словами немедленного исполнения.

3. Форма имени [S] аналогична форме имен [CHAR] и [COMPILE] и эта форма несет ту же самую семантику.

4. Корень имени 'S' лучше сочетается со словами 'S,' 'SLIT,', 'S"' и т.п. В то время как корень 'STR' используется в популярной библиотеке str5.f

5. Слово [S] не расчитанно на режим исполнения, поэтому через '?COMP' делается проверка что режим компиляция.

6. Лучше усложнить определение [S] чтобы не требовался пробел после разделителя, т.к. случайный пропуск этого пробела не вызывает явную и понятную ошибку.

Пример определения:

REQUIRE PARSE-STRING ~pinka/lib/parse-string.f
: [S] ?COMP PARSE-STRING SLIT, ; IMMEDIATE
: TEST [S] 'MIXER' [S] "QWERTY" ;


Или даже, с поддержкой других парных символов:

\ REQUIRE PARSE-S$ http://forth.sourceforge.net/word/s-dollar/index.html
: [S] ?COMP PARSE-S$ SLIT, ; IMMEDIATE
: TEST [S] 'MIXER' [S] {QWERTY} ;

Впрочем, там уже определено и слово S$ со сходной семантикой, работающее и в режиме исполнения.

7. Для поддержки лишь второго разделителя ' для строк достаточно добавить слово S' и слово [S] не нужно.



Следующий шаг оптимизации — разделение пространства кода и пространства данных. Тогда в машинном коде не нужно перепрыгивать через блок данных. И определение "SLIT," примет вид:

: SLIT, ( addr u -- )
  HERE OVER 2SWAP S, 0 C, DLIT,
;


--
Ruvim


------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/
gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Компиляция строк в код

Ruvim Pinka

2016-04-09 16:51 GMT+03:00 Ruvim Pinka <[hidden email]>:
[...]
 
Или даже, с поддержкой других парных символов:

\ REQUIRE PARSE-S$ http://forth.sourceforge.net/word/s-dollar/index.htm

Есть в штатном репозитории:

REQUIRE PARSE-S$ ~pinka/samples/2005/lib/s-dollar.f
 
: [S] ?COMP PARSE-S$ SLIT, ; IMMEDIATE
: TEST [S] 'MIXER' [S] {QWERTY} ;

Впрочем, там уже определено и слово S$ со сходной семантикой, работающее и в режиме исполнения.



--
Ruvim


------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/
gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev