Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 23, 2024 16:40

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: GOTO в SPF
СообщениеДобавлено: Чт апр 26, 2007 11:21 
Меня несколько обескураживает промелькивающее желание товарищей сделать GOTO в Форте. Причём именно "шоб-було-к-в-басике". Я просто целей не понимаю. Если это просто на уровне выпендрёжа, то в принципе не такая уж и плохая причина. Но всё таки несколько более достойных причин я выдумать не могу пока никак. Что я упускаю?..

Сам GOTO не так уж и плох. И он, в разной степени завуалированности, присутствует аж в трёх несвязанных между собой разработках к которым я причастен: в ~profit/lib/bac4th.f походя определено слово RUSH>, автоматы и таблицы решений из ~profit/lib/chartable.f представляют также технически представляют собой переходы (хотя и с косвенной адресацией), и даже в моих colorForth-наработках метки (именно в старом своём, алголо-бейсиковском понимании) заменяют собой все структурные операторы.

Тем не менее, делать что-то с примерно таким синтаксисом:

Код:
: r

." before a"
LABEL a
." after a"
a ;

я в рамках обычного форта не вижу смысла. В colorForth'е это играет, и даже очень, так как используется для замены отсутствующих там структурных операторов (while, repeat и прочих). В Форте же?.. Не вижу смысла.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: GOTO в SPF
СообщениеДобавлено: Чт апр 26, 2007 11:39 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
profiT писал(а):
Меня несколько обескураживает промелькивающее желание товарищей сделать GOTO в Форте. ...
я в рамках обычного форта не вижу смысла. В colorForth'е это играет, и даже очень, так как используется для замены отсутствующих там структурных операторов (while, repeat и прочих). В Форте же?.. Не вижу смысла.


Меня бы тоже обескураживало, но имеется конкретный случай
Пропускаю Си прогу через LCC компилятор и на выходе что-то близкое
к неструктурному Форт коду, хотя локальные и именованные переменные есть.
Для чего мне это нужно? - это уже другой вопрос.

P.S. Вот именно в этом контексте он мне и нужен:)
Сейчас именно через HERE и ввожу, но возможно не везде где необходимо
т.к. получаются оптимизационные перехлесты. Кроме того использование
HERE ограничивает оптимизатор. Хочется чтобы после использовании LITERAL
HERE показывал на адрес после литерала, что не всегда возможно, но
шансы с этим побороться все же есть.:)


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

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

Да - мне тоже непонятно желание Кора сделать неструктурные переходы в тексте программ. Зачем это нужно - ведь от GOTO с введением структурного программирования ушли? Если это нужно для внутренних нужд оптимизатора - еще можно понять, но непонятно зачем это использовать в текстах программ - это будет явным откатом к прошлому, со всеми старыми проблемами неструктурных переходов.
Еще раз: если это для оптимизатора(скрытно от программиста) - можно, а для программ - нет.

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


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
chess писал(а):
Еще раз: если это для оптимизатора(скрытно от программиста) - можно, а для программ - нет.


Полностью согласен со сказанным.

Хотя программисту на Форте всегда должно быть доступно больше чем кому либо другому прикладному программисту:)

P.S. Более интенсивное использование HERE позволило решить
в первом приближении данную задачу. Остается вопрос о месте
публикации библиотечки для spf.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Kopa писал(а):
Хотя программисту на Форте всегда должно быть доступно больше чем кому либо другому прикладному программисту

Если сравнивать программистов с врачами, то фортеры это хирурги. :D

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


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

Зарегистрирован: Пт дек 29, 2006 15:32
Сообщения: 27
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Цитата:
ведь от GOTO с введением структурного программирования ушли?

При этом забывается что само структорное программирование только и началось с метки, выделяющей участки кода и тем структурирующей его. И она же в скрытой форме лежит в основе всех этих процедур, функций, структур данных, без неё принципиально не реализуемых. Страшилки про GOTO передаются несколько поколений и уже почти забыто кто, почему и по каким конкретным мотивам от этого отказался. Конкретный мотив превратился в абсолютный и приобрёл облик Сатаны. Такова сила традиции..
Дело в том что goto разрушает внешнюю и только внешнюю видимую стуктуру программы-как-текста, но не внутреннюю невидимую структуру её смысла. Отказ от GOTO связан со стремлением совместить несовместимое: текст и образ. Стремлением чтобы текст выглядел, оформлялся как графика. Поскольку реально графическое написание программы было ещё невозможно, компы были слабоваты. А сейчас это возможно, но сложившаяся с тех времён идеология разработанная отцами-основателями тормозит. Но разрабатывали то её патриархи для тех компов. В графическом же представлении метка - это точка. Переход на неё - стрелка. Граф. И всё это охватывается одним взглядом. То что для текста кошмар, для графического стиля (который грядёт таки) - благо.
Цитата:
это будет явным откатом к прошлому
А не наоборот ли?


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
dvuugl писал(а):
И всё это охватывается одним взглядом. То что для текста кошмар, для графического стиля (который грядёт таки) - благо.

Графический стиль программирования известен тоже довольно давно. См, например, ЕСПД, про R-технологию... ;)
Я как нашел 2 хорошие вещи - Форт и R-технологию все пытался их скрестить... ;) Но не получалось организационно. :( Сейчас делаю очередную попытку, получается (в идейной проработке, а не в прогах :( ) даже лучше!

_________________
With best wishes, in4.


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

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

Для меня это не страшилка, страшилка это для тех, кто предпочитает догадываться, а не знать. И дело здесь не в графике, а в том, что goto противоречит принципу аддитивного накопления семантической информации в программах, а набор базовых структур управления этому принципу не противоречит и закрывает все задачи, которые раньше решались использованием goto.

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


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

Зарегистрирован: Пт дек 29, 2006 15:32
Сообщения: 27
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Набор базовых структур есть не более чем набор типовых, разрешённых применений GOTO, прикрытых фиговым листиком типа while.. if..else.. В форте он например отличается от наборов в "правильных" языках. Это дело вкуса и случая. Таких равноценных наборов, как аксиоматик геометрии, может быть не один, а переход на участок кода (условный или безусловный) один и есть принципиально неустранимая сущность, "первоэлемент".
Принципы накопления информации могут быть разными, их уже несколько поколений сменилось, не успеешь один хоть как-то понять, как уже какой-нибудь C# появляется где всё что угодно накапливается как "класс".. Потому и предпочитаю форт, где что угодно - слово, а слово пребудет вечно, как и "go туда-то".


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Надеюсь меня простит модератор за данный пост:)

Ниже приведен рабочий вариант немного переделанный вариант библиотечки для неструктурных GOTO
от MPE для spf. Комментарии из текста удалены при необходимости берутся из оригинального c2forth110.zip
Пример кода не оптимизировался и примерно соответствует создающегося с2forth.

Код:
REQUIRE LOCALS|   ~af\lib\locals.f

REQUIRE AHEAD lib\include\tools.f

0 CONSTANT NULL

: BOUNDS ( addr u -- addr+u addr ) OVER + SWAP ;
: $. COUNT TYPE ;
: on  ( a -- )  -1 SWAP ! ;
: off ( a -- )   0! ;
: C+! ( c a -- ) +! ;
: toupper DUP [CHAR] a [CHAR] z 1+ WITHIN IF [CHAR] A [CHAR] a - + THEN ;
: upper ( a u -- ) OVER + SWAP DO I C@ toupper I C! LOOP ;
: upc           \ v -- 'v
  DUP [CHAR] a [CHAR] z WITHIN IF BL - THEN
;
: icompare      \ c-addr1 u1 c-addr2 u2 -- flag
( *G CASE Insensitive version of the ANS COMPARE                        )
  ROT SWAP                      \ c-addr1 c-addr2 u1 u2
  2DUP - >R MIN                 \ c-addr1 c-addr2 minlen -- R: lendiff? --

  BEGIN
    DUP
  WHILE
    -ROT OVER C@ upc OVER C@ upc -      \ length c-addr1 c-addr2 (char1-char2)
    ?DUP IF                     \ If chars are different
        R> DROP >R              \  replace lendiff result with error code
        DROP 0                  \  and put 0 on TOS (make len==0 at BEGIN)
    ELSE                        \ otherwise
        1+ SWAP 1+ SWAP ROT 1-  \ increment addresses and decrement length
    THEN
  REPEAT
  DROP 2DROP                    \ remove addresses and null count from stack
  R> DUP IF 0< 1 OR THEN        \ make nice flag, 0 becomes 0, -ve becomes -1
                                \            and  +ve becomes 1
;
: zstrlen       \ addr -- len
  0 >R
  BEGIN
    DUP C@ 0<> IF R> 1+ >R 1+ 0
                ELSE DROP -1
               THEN
  UNTIL
  R>
;
: zcount        \ zaddr -- zaddr len
  DUP zstrlen
;
: >pos          \ n --
( *G Used in diagnostic display. Move the cursor X position to column N )
\  out @ - 1 MAX SPACES
   SPACES
;
\ =======================================================================
VARIABLE        <periodic-resolve>
                <periodic-resolve> on \ off

: periodic-resolve?
( *G Returns TRUE if periodic address resolution is required.           )
  <periodic-resolve> @
;

\ =======================================================================
( *S CPU Specific Tools.                                                )
\ =======================================================================
4 CONSTANT size-of-machine-call

: get-parent-cfa        \ xt -- addr:32
  DUP 5 + SWAP
  1+ @ +
;
: flush-opt             \ --
\  POSTPONE [o/f]
;
: [literal]             \ n -- ;
\  ['] LIT, COMPILE, ,                 
   DIS-OPT  POSTPONE LITERAL  SET-OPT 
\   POSTPONE LITERAL

: 'literal'             \ dp n --
  SWAP CELL + !
;
: CONSTANT-XT?          \ xt -- flag
  get-parent-cfa
  ['] TRUE get-parent-cfa =
;
: .dword        \ n --
  BASE @ >R HEX S>D <# # # # # # # # # #> TYPE R> BASE !
;
: c@s           \ addr -- cell
( *G Fetch character from ADDR and sign extend to a CELL.               )
  C@ DUP 255 > IF 0x0FFFFFF00 OR THEN
;
: allot&erase   \ n --
  HERE SWAP DUP ALLOT ERASE
;
: char>cell             \ signed-byte -- signed-int
  DUP 0x80000000 AND IF 0x0FFFFFF00 OR THEN
;

256 CREATE CodeStream ALLOT

: ResetStream           \ --
  0 CodeStream C!
;
: EvalStream            \ --
  CodeStream COUNT EVALUATE
;
: $>stream              \ c-addr u --
  CodeStream COUNT + >R DUP CodeStream C+! R> SWAP MOVE
;

: h>stream              \ n --
  S" $" $>stream
  BASE @ >R HEX S>D <# #S #> $>stream R> BASE !
;

\ =======================================================================
( *S The LABEL Chain Handlers                                           )
\ =======================================================================
\ struct  LBL
0
        CELL    FIELD   LBL.link
        CELL    FIELD   LBL.*name
        CELL    FIELD   LBL.flags
        CELL    FIELD   LBL.address
CONSTANT LBL \ end-struct

0x00000001       CONSTANT        LF_PUBLIC
0x00000002       CONSTANT        LF_ADDRESSVALID
0x00000004       CONSTANT        LF_DATALABEL
0x00000008       CONSTANT        LF_CODELABEL
0x00000010       CONSTANT        LF_DELETE

0 VALUE LabelChain

: .label_flags          \ n --
  DUP LF_PUBLIC         AND IF [CHAR] * ELSE BL THEN EMIT
  DUP LF_ADDRESSVALID   AND IF [CHAR] * ELSE BL THEN EMIT
  DUP LF_DATALABEL      AND IF [CHAR] * ELSE BL THEN EMIT
  DUP LF_CODELABEL      AND IF [CHAR] * ELSE BL THEN EMIT
  DUP LF_DELETE         AND IF [CHAR] * ELSE BL THEN EMIT
  DROP
;

: .label                \ *LABEL --
  CR
  DUP LBL.*name @ $. 40 >pos
  DUP LBL.address @ .dword
  SPACE
  LBL.flags @ .label_flags
;

: .l                    \ --
  CR ." Label List"
  CR ."   Name                                 | Address |PADCK|"
  LabelChain
  BEGIN
    ?DUP
  WHILE
    DUP .label
    LBL.link @
  REPEAT
  CR
;

: DestroyLabelChain     \ --
  LabelChain
  BEGIN
    ?DUP
  WHILE
    DUP LBL.*name @ ?DUP IF FREE THROW THEN
    DUP LBL.link @
    SWAP FREE THROW
  REPEAT
  NULL TO LabelChain
;
: AddLabel              \ c-addr u flags address --
  LBL ALLOCATE ABORT" Failed to allocate label storage" >R
  LabelChain R@ LBL.link !
  R@ LBL.address !
  R@ LBL.flags !
  DUP 1 CHARS + ALLOCATE ABORT" Failed to allocate label sub storage"
  DUP R@ LBL.*name !
  2DUP C!
  1 CHARS + SWAP MOVE
  R> TO LabelChain
;
: FindLabel             \ c-addr u -- *LABEL | NULL
  2>R
  LabelChain
  BEGIN
    ?DUP
  WHILE
    DUP LBL.*name @ COUNT 2R@ icompare 0= IF
        2R> 2DROP EXIT
    THEN
    LBL.link @
  REPEAT
  2R> 2DROP
  0
;
: FindResolvedLabel     \ c-addr u -- c-addr u 0 | address true
  2DUP FindLabel
  ?DUP IF
          DUP LBL.flags @ LF_ADDRESSVALID AND IF
                NIP NIP
                LBL.address @ TRUE EXIT
          ELSE
                DROP 0 EXIT
          THEN
       THEN

  \ c-addr u --

  2DUP upper
  2DUP FORTH-WORDLIST SEARCH-WORDLIST
  IF
    NIP NIP
    DUP CONSTANT-XT? IF EXECUTE THEN
    TRUE
  ELSE
    0
  THEN
;
: GarbageCollectLBL     \ --
                        { | new -- }
  0 -> new
  LabelChain
  BEGIN
    ?DUP
  WHILE
    DUP LBL.link @ >R

    DUP LBL.flags @ LF_DELETE AND IF    \ trash?
        DUP LBL.*name @
        FREE THROW
        FREE THROW
    ELSE
        new OVER LBL.link !
        -> new
    THEN

    R>
  REPEAT
  new TO LabelChain
;
: ExportLBL             \ *lbl --
  DUP LBL.address @ SWAP        \ address *lbl --
  DUP LBL.*name @ COUNT ROT     \ address c-addr u *lbl --
  LBL.flags @ LF_CODELABEL AND  \ address c-addr u code? --

  ResetStream
  IF
        S" : " $>stream
        $>stream
        S"  " $>stream
        h>stream
        S"  execute ;" $>stream
  ELSE
        ROT h>stream
        S"  constant " $>stream
        $>stream
  THEN
  EvalStream
;
: PatchLabel            \ address iflag *LABEL --
  >R
  R@ LBL.flags @
  DUP LF_ADDRESSVALID AND IF
        CR ." PatchLabel allready has a valid address"
        CR R@ LBL.*name @  $. CR CR
        ABORT
  THEN
  OR LF_ADDRESSVALID OR R@ LBL.flags !
  R> LBL.address !
;
: NewLabel              \ address iflag c-addr u --
  2SWAP LF_ADDRESSVALID OR SWAP AddLabel
;
: (label)               \ address iflag "name" --
  BL WORD COUNT         \ address iflag c-addr u --
  2DUP FindLabel        \ address iflag c-addr u *LABEL|NULL
  ?DUP IF  NIP NIP PatchLabel  ELSE  NewLabel  THEN
;
: RemoveLocalLabels     \ --
  LabelChain
  BEGIN
    ?DUP
  WHILE
     DUP LBL.flags @ LF_PUBLIC AND 0= IF
        DUP LBL.flags DUP @ LF_DELETE OR SWAP !
     THEN
     LBL.link @
  REPEAT
  GarbageCollectLBL
;
: ExportPublics         \ --
  LabelChain
  BEGIN
    ?DUP
  WHILE
    DUP LBL.flags @ LF_PUBLIC AND IF
        DUP ExportLBL
        DUP LBL.flags DUP @ LF_DELETE OR SWAP !
    THEN
    LBL.link @
  REPEAT
  GarbageCollectLBL
;
\ =======================================================================
( *S The Forward Reference Chain Handlers                               )
\ =======================================================================
0x00000001       CONSTANT        FF_CELL
\ struct FW
0
        CELL    FIELD   FW.link
        CELL    FIELD   FW.*name                \ when 0 means delete me!
        CELL    FIELD   FW.here
        CELL    FIELD   FW.offset
        CELL    FIELD   FW.flags
CONSTANT FW \ end-struct

0 VALUE FWChain

: .fw                   \ *FW --
  CR
  DUP FW.*name @ ?DUP IF  $.  ELSE ." null record (delete)" THEN  30 >pos
  DUP FW.offset @ .dword
  SPACE
  DUP FW.here @ .dword
  SPACE
  FW.flags @ FF_CELL AND IF ." Only a CELL" ELSE ." default: Literal RT" THEN
;
: .f                    \ --
  CR ." Outstanding Forward Reference Literals"
  CR ."   Name                                 | Offset  | CodeAddress"
  FWChain
  BEGIN
    ?DUP
  WHILE
    DUP .fw
    FW.link @
  REPEAT
  CR
;
: DestroyFWChain        \ --
  FWChain
  BEGIN
    ?DUP
  WHILE
    DUP FW.*name @ ?DUP IF FREE THROW THEN
    DUP FW.link @
    SWAP FREE THROW
  REPEAT
;
: $AddLitFW             \ c-addr u -- *FW
  DUP 1 CHARS + ALLOCATE ABORT" Failed namespace allocate for FW"
  2DUP C! DUP >R 1 CHARS + SWAP MOVE
  FW ALLOCATE ABORT" Failed allot for FW chain"
  R> OVER FW.*name !
  0 OVER FW.here !
  0 OVER FW.offset !
  0 OVER FW.flags !
  FWChain OVER FW.link !
  DUP TO FWChain
;
: Resolve               \ *FW -- res?
  DUP FW.*name @ COUNT
  FindResolvedLabel
  IF
        \ *FW label-address --

        OVER FW.offset @ +      \ add any offset to resolved label address
        OVER FW.here @ SWAP ROT \ dp n fw --
        FW.flags @  FF_CELL AND IF
                 OVER -  SWAP size-of-machine-call - !  \ resolve CELL
        ELSE
                'literal'       \ do the resolve for literal
        THEN
        TRUE                    \ flag, DONE IT!
  ELSE
        \ *FW c-addr u -- ; No resolved label, cannot resolve fw
        2DROP
        DROP
        FALSE
  THEN
;
: GarbageCollectFW      \ --
                        { | new -- }
  0 -> new
  FWChain
  BEGIN
    ?DUP
  WHILE
    DUP FW.link @ >R

    DUP FW.*name @ IF
      new OVER FW.link !                \ attach to new chain (still active)
      -> new
    ELSE
      FREE THROW                         \ remove
    THEN

    R>
  REPEAT
  new TO FWChain
;
: ResolveFW             \ --
  FWChain
  BEGIN
    ?DUP
  WHILE
    DUP Resolve IF
        DUP FW.*name DUP @ FREE THROW off        \ free name memory and mark
                                                \ for delete
    THEN
    FW.link @
  REPEAT
  GarbageCollectFW
;
\ =======================================================================
( *S Compilers                                                          )
\ =======================================================================

CREATE name-store 256 ALLOT

: >name-store           \ c-addr u -- 'c-addr u
  DUP name-store C!
  name-store 1 CHARS + SWAP MOVE
  name-store COUNT
;
: ParseNumericOffset    \ "offset" -- val
\  BL WORD NUMBER? 1 <> ABORT" non-numeric offset used"
\   BL WORD DROP 0  \ ?SLITERAL1  !!!!
\ !!! пока процедура заглушена на выдачу всегда 0
    0 S>D BL WORD COUNT >NUMBER 2DROP D>S
;
: CommaAddr             \ "symbol" "offset" --
  BL WORD COUNT >name-store
  FindResolvedLabel
  IF
        ParseNumericOffset +
        ,
        EXIT
  THEN

  flush-opt

  $AddLitFW >R            \ *FW --
  HERE R@ FW.here !
  ParseNumericOffset
  R@ FW.offset !
  FF_CELL R> FW.flags !

  0 ,

; IMMEDIATE

: CompileAddrLit        \ "symbol" "offset" --
  BL WORD COUNT
  >name-store
  FindResolvedLabel
  IF                    \ Found Symbol: address--
        ParseNumericOffset +
        POSTPONE LITERAL
        EXIT
  THEN                  \ No Symbol:    c-addr u --

  flush-opt

  $AddLitFW >R            \ *FW --

  HERE R@ FW.here !
  ParseNumericOffset
  R> FW.offset !
  -1 DIS-OPT POSTPONE LITERAL  \ [literal]
   HERE DROP \ !дополнительная блокировка оптимизатора.
  SET-OPT
; IMMEDIATE

: CompileCall           \ "symbol" --
  BL WORD COUNT
  >name-store
  FindResolvedLabel
  IF
        \ DUP ?compile-pause
        COMPILE,
        EXIT
  THEN

  flush-opt

  $AddLitFW >R            \ *FW --
  0 COMPILE, \ [literal]
  HERE R@ FW.here !
  FF_CELL R> FW.flags !

; IMMEDIATE

\ ----
\ : CompileJump           \ --
\  POSTPONE >R
\  ['] EXIT COMPILE, \ doexit,
\ ; IMMEDIATE

: CompileJump ( xt -- )        \ +хчєёыютэvщ яхЁхїюф яю рфЁхёє эр ёЄхъх
  DIS-OPT
  [ HERE DROP ]
  0x8B C, 0xD8 C,         \ MOV EBX, EAX
  0x8B C, 0x45 C, 0x00 C, \ MOV EAX, 0 [EBP]
  0x8D C, 0x6D C, 0x04 C, \ LEA EBP, 4 [EBP]
  0xFF C, 0xE3 C,         \ JMP EBX
  SET-OPT
; IMMEDIATE

: CompileBranch         \ "symbol" --
  BL WORD COUNT >name-store
  FindResolvedLabel
  IF
        POSTPONE AHEAD  DROP
        DUP ROT SWAP - 4 - SWAP !
  ELSE
        flush-opt
        $AddLitFW >R
        0 POSTPONE AHEAD DROP ! \ [literal]
        HERE R@ FW.here ! 
        FF_CELL R> FW.flags !
  THEN

; IMMEDIATE

: CompileCondBranch     \ "symbol" --
  POSTPONE IF
  POSTPONE CompileBranch
  POSTPONE THEN
; IMMEDIATE

\ =======================================================================
( *S Label Definitions                                                  )
\ =======================================================================

: FLABEL                \ "name" --
  flush-opt
  HERE \ NoNameGap
  LF_CODELABEL
  (label)
; IMMEDIATE

: LABEL                 \ "name" --
  flush-opt
  HERE
  LF_DATALABEL
  (label)
; IMMEDIATE

: PUBLIC                \ "name" --
\  periodic-resolve? IF ResolveFW THEN
  BL WORD
  DROP \ COUNT LF_PUBLIC -1 AddLabel
;
\ IMMEDIATE

: EXTERN                \ "name" --
  BL WORD DROP
;
: ENDPROC                \ "name" --
  periodic-resolve? IF ResolveFW THEN
  BL WORD COUNT LF_PUBLIC -1 AddLabel
; IMMEDIATE

\ EOF   \ Тестовая секция

: U>= U< 0= ;

PUBLIC _fib
: _fib
FLABEL _fib
   { $arg0 \ $loc[ 8 ] -- }
   ^ $arg0    @
2    U>=
   CompileCondBranch @2
1    CompileAddrLit @1 0
   CompileJump
LABEL  @2
   ^ $arg0    @
2    -
   CompileAddrLit _fib 0
   EXECUTE   \ Was ICALL
   $loc[ 4 +    !
   ^ $arg0    @
1    -
   CompileAddrLit _fib 0
   EXECUTE   \ Was ICALL
   $loc[ 0 +    !
   $loc[ 4 +    @
   $loc[ 0 +    @
   +
LABEL  @1
;
ENDPROC

32 _fib .


P.S. Доработанный вариант можно поместить в devel spf.
Доработки на дальнейшее усмотрение разработчиков spf.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
dvuugl писал(а):
Набор базовых структур есть не более чем набор типовых, разрешённых применений GOTO, прикрытых фиговым листиком типа while.. if..else.. В форте он например отличается от наборов в "правильных" языках. Это дело вкуса и случая. Таких равноценных наборов, как аксиоматик геометрии, может быть не один, а переход на участок кода (условный или безусловный) один и есть принципиально неустранимая сущность, "первоэлемент".

Представление чисел с помощью римской системы и ей подобных уступило место представлению с помощью позиционных систем. Представление логических функций неограниченным их набором уступило место представлению их с помощью ограниченного набора из базиса Шеффера, представление текста с помощью иероглифов уступает место слово-алфавитному, представление структур управления с помощью меток и goto уступает место представлению их как комбинации из наборов типовых структур, и т.д. и т.п.
Почему? Да потому, что так проще представлять разные информационные блоки
(в исходном базисе закладывается набор ортогональных понятий и для этого требуется меньший объем информации). Что в этом плохого, на мой взгляд - ничего, а хорошего есть - человеку проще работать с меньшим количеством сущностей, алгоритмы автоматической обработки текстов программ получаются проще.
Общепринятое мнение в части структур управления можно выразить так:
ОСНОВНЫМ ДОСТИЖЕНИЕМ В ТЕОРИИ ПРОГРАММИРОВАНИЯ 60-Х ГОДОВ ЯВИЛОСЬ ОСОЗНАНИЕ И ТЕОРЕТИЧЕСКОЕ ОСМЫСЛЕНИЕ ТОГО ФАКТА,
ЧТО СУЩЕСТВУЮТ НЕСКОЛЬКО ОСНОВНЫХ СТРУКТУР УПРАВЛЕНИЯ, ОПЕРИРОВАНИЕ КОТОРЫМИ ПРИВОДИТ К СОЗДАНИЮ СКОЛЬ УГОДНО СЛОЖНЫХ ПО УПРАВЛЕНИЮ ПРОГРАММ, ПРИЧЕМ ЭФФЕКТИВНОСТЬ ПРОГРАММ ПРИ ЭТОМ НЕ УХУДШАЕТСЯ, А ТАКИЕ СВОЙСТВА, КАК ЧИТАБЕЛЬНОСТЬ, НАДЕЖНОСТЬ СУЩЕСТВЕННО УЛУЧШАЮТСЯ.
А первоэлемент, как был первоэлементом, так и остался. Ну и что с того.

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


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
chess писал(а):
... ЧТО СУЩЕСТВУЮТ НЕСКОЛЬКО ОСНОВНЫХ СТРУКТУР УПРАВЛЕНИЯ, ОПЕРИРОВАНИЕ КОТОРЫМИ ПРИВОДИТ К СОЗДАНИЮ СКОЛЬ УГОДНО СЛОЖНЫХ ПО УПРАВЛЕНИЮ ПРОГРАММ, ПРИЧЕМ ЭФФЕКТИВНОСТЬ ПРОГРАММ ПРИ ЭТОМ НЕ УХУДШАЕТСЯ ...


А вот с этим можно не согласиться, т.к. всякая фиксированная структура изначально ограничена
ситуацией ее применимости:).


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Реализация GOTO в определениях с оптимизацией длин переходов по goto, операторов goto неограниченное число, могут прыгать с перехлестами(произвольно) - исх. текста в разы меньше. :o

Код:
REQUIRE CASE lib\ext\case.f
REQUIRE $! ~mak\place.f

: I: HEADER ] HIDE IMMEDIATE ;

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

CREATE X-L 96 ALLOT
: aL X-L  + ;
: aX X-L 32 + + ;
: aC X-L 64 + + ;
: l1 0 aL ; : l2 4 aL ; : l3 8 aL ; : l4 12 aL ; : l5 16 aL ;  : l6 20 aL ; : l7 24 aL ; : l8 28 aL ;
: x1 0 aX ; : x2 4 aX ; : x3 8 aX ; : x4 12 aX ; : x5 16 aX ;  : x6 20 aX ; : x7 24 aX ; : x8 28 aX ;
: c1 0 aC ; : c2 4 aC ; : c3 8 aC ; : c4 12 aC ; : c5 16 aC ;  : c6 20 aC ; : c7 24 aC ; : c8 28 aC ;
: c+ DUP 1+! ;
I: L1 l1 @ x1 c1 c+ ; I: L1: DP @ l1 ! ; I: L2 l2 @ x2 c2 c+ ; I: L2: DP @ l2 ! ;
I: L3 l3 @ x3 c3 c+ ; I: L3: DP @ l3 ! ; I: L4 l4 @ x4 c4 c+ ; I: L4: DP @ l4 ! ;
I: L5 l5 @ x5 c5 c+ ; I: L5: DP @ l5 ! ; I: L6 l6 @ x6 c6 c+ ; I: L6: DP @ l6 ! ;
I: L7 l7 @ x3 c7 c+ ; I: L7: DP @ l7 ! ; I: L8 l8 @ x8 c8 c+ ; I: L8: DP @ l8 ! ;
: CTL0 c1 0! c2 0! c3 0! c4 0! c5 0! c6 0! c7 0! c8 0! ;

: L: :
>IN @ TO X>IN
DP @ TO XDP 3 TO XN
SOURCE XSOURCE $!
SOURCE-ID FILE-POSITION DROP XFP 2!
;
I: L;
CTL0
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 ;
;

: D-C DROP ;
: D-L DROP 2DROP ; -
: INT-L!
  ROT DP @ 4 + - ABS 0x7F > IF 1 ELSE 0 THEN  SWAP @ ROT DUP @ 2SWAP LSHIFT OR SWAP !
;
: INT-L@
  -ROT @ SWAP @ SWAP RSHIFT 1 AND
;
: RAZ-J8/32  0 C, 0 , ;
: COD-J8/32  IF 0xE9 C, DP @ 4 + - , ELSE 0xEB C, DP @ 1+ - C, THEN ;
: RELJ0      D-L  RAZ-J8/32  ;
: RELJ1      RAZ-J8/32  INT-L!  ;
: RELJ2      0 INT-L@ SWAP DROP  COD-J8/32  ;
I: GOTO      XN CASE 3 OF RELJ0 ENDOF 2 OF RELJ1 ENDOF 1 OF RELJ2 ENDOF 0 OF RELJ2 ENDOF ENDCASE ;

Использование:
L: WORD
L1 GOTO
........
L1:
.....
L;
Слово WORD - точно такое же Форт-слово, как и определенное через :, можно ставить признак IMMEDIATE и т.д.

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Kopa писал(а):
А вот с этим можно не согласиться, т.к. всякая фиксированная структура изначально ограничена
ситуацией ее применимости.

ОСНОВНЫМ ДОСТИЖЕНИЕМ В ТЕОРИИ ПРОГРАММИРОВАНИЯ 60-Х ГОДОВ ЯВИЛОСЬ ОСОЗНАНИЕ И ТЕОРЕТИЧЕСКОЕ ОСМЫСЛЕНИЕ ТОГО ФАКТА,
ЧТО СУЩЕСТВУЮТ НЕСКОЛЬКО ОСНОВНЫХ СТРУКТУР УПРАВЛЕНИЯ, ОПЕРИРОВАНИЕ КОТОРЫМИ ПРИВОДИТ К СОЗДАНИЮ СКОЛЬ УГОДНО СЛОЖНЫХ ПО УПРАВЛЕНИЮ ПРОГРАММ, ПРИЧЕМ ЭФФЕКТИВНОСТЬ ПРОГРАММ ПРИ ЭТОМ НЕ УХУДШАЕТСЯ, А ТАКИЕ СВОЙСТВА, КАК ЧИТАБЕЛЬНОСТЬ, НАДЕЖНОСТЬ СУЩЕСТВЕННО УЛУЧШАЮТСЯ.
Под теоретическим осмыслением здесь понимается строгое научное доказательство. Сделано это было двумя итальянскими математиками - не помню их фамилий, и для любых ситуаций применения(без ограничений).

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


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

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


Ой!!! Ради одного GOTO столько кода ?


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

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


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

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


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

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