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/ |