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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 20:52 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Вот такой код генерируется для 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                 


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:30 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Я так и думал - LOOP у Хищника низкоуровневое слово


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:36 
Не в сети
Administrator
Administrator
Аватара пользователя

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:40 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
И можно ли это назвать классическим фортом?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:46 
вопрос писал(а):
И можно ли это назвать классическим фортом?

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


Последний раз редактировалось ArtemKAD Пн янв 24, 2011 23:49, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:47 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
В классическом форте это не вполне низкоуровневые слова
Код:
: 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 ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:48 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
И можно ли это назвать классическим фортом?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:54 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
НУ, на этом основании, я, пожалуй, отвергаю претензии, что rorelf - и его замысел - т.к. это ведь не только и не столько relf - другой языk


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Пн янв 24, 2011 23:59 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
: 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" автора можно выгонять с формулировкой о профнепригодности. То место в памяти (стек возвратов) нам не нравится, мы переложим в другое (стек данных), а потом обратно. И так <число итераций> раз.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 00:02 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Это кусок кода, который заимствован автором relf из более раннего форта -предшественника, видимо


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 00:04 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Четыре (!!!) примитива вместо одного чтения памяти.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 00:09 
В классическом Форте и DO и LOOP это IMMEDIATE-слова которые компилировать в код могут все что угодно (че в SPF и делают).


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 01:14 
Не в сети
Administrator
Administrator
Аватара пользователя

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 01:37 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Я за осмысленную оптимизацию, за классику - mOleg - он не очень любит, когда "из форта делают не форт"


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Quark: Пример кода - LOOP
СообщениеДобавлено: Вт янв 25, 2011 01:49 
Не в сети
Administrator
Administrator
Аватара пользователя

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

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


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

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


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

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


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

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