Forth
http://www.fforum.winglion.ru/

Quark: Пример кода - LOOP
http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2702
Страница 1 из 2

Автор:  Hishnik [ Пн янв 24, 2011 20:52 ]
Заголовок сообщения:  Quark: Пример кода - LOOP

Вот такой код генерируется для LOOP. Участвует стек циклов, на котором хранятся I, Imax, Addr (адрес начала тела цикла).

Код:
proc    CodeLoop

CodeLoopStart:

        mov     edx, [lDepth]
        inc     dword [LStackI+edx*4-4]
        mov     eax, [LStackI+edx*4-4]
        cmp     eax, [LStackImax+edx*4-4]
        mov     eax, [LStackAddr+edx*4-4]

        je      LoopForward
        jmp     eax

LoopForward:

        dec     dword [lDepth]

LOOPSIZE        = $ - CodeLoopStart

        ret
endp                 

Автор:  вопрос [ Пн янв 24, 2011 23:30 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

Я так и думал - LOOP у Хищника низкоуровневое слово

Автор:  Hishnik [ Пн янв 24, 2011 23:36 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

Все структуры управления в кварке низкоуровневые. Но это же пишется один раз.

Автор:  вопрос [ Пн янв 24, 2011 23:40 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

И можно ли это назвать классическим фортом?

Автор:  ArtemKAD [ Пн янв 24, 2011 23:46 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

вопрос писал(а):
И можно ли это назвать классическим фортом?

А что мешает? Наличие отдельного стека допустимо даже с точки зрения стандарта. Собственно потому там и есть слова получения индекса цикла т.к. исходно не стандартизировано где индексы валяются.

Автор:  вопрос [ Пн янв 24, 2011 23:47 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

В классическом форте это не вполне низкоуровневые слова
Код:
: I ( --- n )
\ Return the counter (index) of the innermost DO LOOP
     R> R@ SWAP >R ;

: J  ( --- n)
\ Return the counter (index) of the next loop outer to the innermost DO LOOP
  RP@ 12 +!! @ ;

: (LEAVE)   ( --- )
\ Runtime part of LEAVE
  R> @ R> DROP R> DROP >R ; \ Remove loop parameters and replace top of ret
                            \ stack by leave address.

: UNLOOP ( --- )
\ Remove one set of loop parameters from the return stack.
   R> R> R> 2DROP >R ;

: (LOOP) ( ---)
\ Runtime part of LOOP
  R> R> 1 +!! DUP R@ =   \ Add 1 to count and compare to limit.
  IF
   R> 2DROP CELL+ >R \ Discard parameters and skip leave address.
  ELSE
   >R DUP @ +!! >R  \ Repush counter and jump to loop start address.
  THEN ;

: (+LOOP) ( n ---)
\ Runtime part of +LOOP
\ Very similar to (LOOP), but the compare condition is different.
\  exit if ( oldcount - lim < 0) xor ( newcount - lim < 0).
     R> SWAP R> DUP R@ -!! ROT ROT +!! DUP R@ -!! ROT XOR 0 <
     IF R> 2DROP CELL+ >R
     ELSE >R DUP @ +!! >R THEN ;

Автор:  Hishnik [ Пн янв 24, 2011 23:48 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

вопрос писал(а):
И можно ли это назвать классическим фортом?

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

Автор:  вопрос [ Пн янв 24, 2011 23:54 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

НУ, на этом основании, я, пожалуй, отвергаю претензии, что rorelf - и его замысел - т.к. это ведь не только и не столько relf - другой языk

Автор:  Hishnik [ Пн янв 24, 2011 23:59 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

вопрос писал(а):
: I ( --- n )
\ Return the counter (index) of the innermost DO LOOP
R> R@ SWAP >R ;

Разве это от хорошей жизни? Во-первых, не писать ассемблерные вставки только потому, что это "классика" - это "элитаризмъ" :) Можно этого классика сюда, для обоснования единственности предложенного варианта? Во-вторых, а что делать, если стек циклов - это отдельный стек? Причем в паре форт-процессоров он даже аппаратной отдельный. В третьих, продолжаем во-первых. Счетчик цикла достаточно часто требуется в теле цикла. Четыре (!!!) примитива вместо одного чтения памяти.
вопрос писал(а):
: (LOOP) ( ---)
\ Runtime part of LOOP
R> R> 1 +!! DUP R@ = \ Add 1 to count and compare to limit.
IF
R> 2DROP CELL+ >R \ Discard parameters and skip leave address.
ELSE
>R DUP @ +!! >R \ Repush counter and jump to loop start address.
THEN ;

Вообще блеск. За одно слово "Repush" автора можно выгонять с формулировкой о профнепригодности. То место в памяти (стек возвратов) нам не нравится, мы переложим в другое (стек данных), а потом обратно. И так <число итераций> раз.

Автор:  вопрос [ Вт янв 25, 2011 00:02 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

Это кусок кода, который заимствован автором relf из более раннего форта -предшественника, видимо

Автор:  вопрос [ Вт янв 25, 2011 00:04 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

Цитата:
Четыре (!!!) примитива вместо одного чтения памяти.

Ну так же в классических реализациях форта очень многое так

Автор:  ArtemKAD [ Вт янв 25, 2011 00:09 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

В классическом Форте и DO и LOOP это IMMEDIATE-слова которые компилировать в код могут все что угодно (че в SPF и делают).

Автор:  Hishnik [ Вт янв 25, 2011 01:14 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

вопрос писал(а):
Ну так же в классических реализациях форта очень многое так

Тогда с какой стороны это классика? Форт на Форте? Ну разве что так. Но классики литературы - это Пушкин, Толстой, Достоевский... а не все, кто жил достаточно давно.

Автор:  вопрос [ Вт янв 25, 2011 01:37 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

Я за осмысленную оптимизацию, за классику - mOleg - он не очень любит, когда "из форта делают не форт"

Автор:  Hishnik [ Вт янв 25, 2011 01:49 ]
Заголовок сообщения:  Re: Quark: Пример кода - LOOP

вопрос писал(а):
Я за осмысленную оптимизацию, за классику - mOleg - он не очень любит, когда "из форта делают не форт"

Я не вполне понимаю, при чем тут реализация. Форт не возьмется из ниоткуда, он все равно на чем-то написан. Что такое классика применительно к редчайшему языку? Если единтсвенно правильный вариант - это дописывать транслятор Форта на нем же самом, как только это станет возможно, то я категорически не согласен с такой точкой зрения. Есть цель исполнения проекта. Под эту цель выбираются способы ее реализации.

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