Forth http://fforum.winglion.ru/ |
|
Вопросы и ответы для занесения в FAQ прошу постить сюда. http://fforum.winglion.ru/viewtopic.php?f=2&t=703 |
Страница 1 из 5 |
Автор: | ЗверюгА [ Вт май 01, 2007 15:38 ] |
Заголовок сообщения: | Вопросы и ответы для занесения в FAQ прошу постить сюда. |
А то уже год форуму, а вместо FAQ одни обещания. чтобы не было флуда в теме с самим ForthFAQ, вопросы и ответы прошу постить сюда. Вопросы, приводящие к флуду, будут из этой темы выделяться в отдельные топики. Прошу за ними следить и не повторяться, чтобы не плодить одинаковые темы. |
Автор: | вопрос [ Ср май 02, 2007 10:13 ] |
Заголовок сообщения: | |
Я открывал несколько тем "Вопрос к FAQ по Форту" давненько уже, и тут по форуму есть |
Автор: | WingLion [ Пн июн 22, 2009 00:01 ] |
Заголовок сообщения: | |
Тема про отладку выделена сюда: http://fforum.winglion.ru/viewtopic.php?t=2150 |
Автор: | вопрос [ Ср окт 14, 2009 11:31 ] |
Заголовок сообщения: | |
Я решил проявить инициативу дополнения к ЧАВО по форту (заодно развлечение для фортеров) по циклам 1. почему цикл DO LOOP считается самым медленным до того, что некоторые фортеры выносят его из ядра (fork, relf)? Нельзя ли его ускорить? 2. почему в цикле DO LOOP возможно, чтобы при неисполнении условия таком Код: 0 9 DO LOOP цикл всё же выполнялся и притом значительное число раз? В чём смысл поддерживать такое свойство, не лучше ли обойтись тем, что фортеры называют ?DO LOOP 3. Обязательно ли располагать LEAVE непосредственно перед LOOP? 4. Обязательно ли располагать индексы при реализации на стеке возвратов? Ведь это мешает манипуляциям со стеком. 5. Почему обращение к счётчику происходит по буквам? их 2-3 , а что если мне вдруг нужен 4-уровневый цикл. Вот в некоторых языках компиляторы поддерживают размерность массивов минимум 7 (стандарт) - это нормально, есть такие алгоритмы, что же делать со счётчиком, если мои циклы работают с этими массивами ... 6. Знакомая программисту ситуация: чтобы цикл был быстрее, он организуется так, что ... после выхода из него, мы не знаем, по какой причине вышли например Код: BEGIN
condition counter @ AND WHILE REPEAT (продолжить, если истинно условиe и счётчик не равен 0 ) мы можем выйти из цикла, если неистинно условие или обнулился счётчик и нам может быть далее важно, а собственно отчего мы вышли , поскольку на выходе это не очевидно, приходися писать операцию сравнения, т.е. дополнительный код. В некоторых языках есть оператор GOTO и по счётчику мы выходим сразу за цикл, а по условию идём дальше, не дублируя сравнения. Есть ли такая стандартная возможность в форте? BEGIN condition ?GOTO туда counter @ \ \ \ \ AND уже не нужно WHILE REPEAT ... ... ... туда ... 7. такой же вопрос по оператору CONTINUE если нужно продолжить цикл с некоторого места, не заканчивая итерацию? 8. где LEAVE для циклов без счётчика? 9. поскольку в форте не оптимизируются обращения .... вообще нет как правило оптимизации, то почему отсутствуют слова для многократного выхода? Ведь получается, что в каждом из циклов нужно предусмотреть дополнительное ветвление - не привели ли вложенные циклы к необходимости прервать итерации на текущем уровне. Некоторые вопросы детские и ответы на них известны, но это FAQ |
Автор: | chess [ Ср окт 14, 2009 15:19 ] |
Заголовок сообщения: | |
вопрос писал(а): Я решил проявить инициативу
дополнения к ЧАВО по форту (заодно развлечение для фортеров) по циклам Понимаете, в Форте открытый транслятор, поэтому любые "хотелки" фортер может легко реализовать. Вот про GOTO, например: Код: VARIABLE CNT 10 CNT ! M: ?GO DROP L1 J< ; M: TO: L1: ; : 1-! @A-- DROP ; : S1 BEGIN CNT @ 4 < ?GO CNT 1-! CNT @ . AGAIN TO: CNT @ CR . ; S1 лог Код: 9 8 7 6 5 4 3
3 Ok такой FAQ подойдет для языков с закрытым транслятором, а для Форта нет. Устройство Форт-системы нужно(движок-интерпретатор, структуры - словари, стеки и т.п.) |
Автор: | вопрос [ Ср окт 14, 2009 20:29 ] |
Заголовок сообщения: | |
chess писал(а): Понимаете, в Форте открытый транслятор, Ну неужели же я не знал? И неужели даже такая простая вещь как FAQ неподъёмна. chess писал(а): Вот про GOTO, например: такой FAQ подойдет для языков с закрытым транслятором, а для Форта нет. Устройство Форт-системы нужно(движок-интерпретатор, структуры - словари, стеки и т.п.) Ну. вариантов GOTO с разным назначением только в devel СПФ можно найти 3 или больше, но 2 - в статьях и 1 не собственно фортовый (дальше не искал) - это не значит "любые хотелки" - вопрос касался замысла форта а не ... можно перезадать: почему некоторые части обычного алгоритма организации цикла реализованы сразу и прямо, а некоторые - нужно реализовывать отдельно Со сколькими системами совместим приведенный код? |
Автор: | Mihail [ Ср окт 14, 2009 21:45 ] |
Заголовок сообщения: | |
вопрос писал(а): почему цикл DO LOOP считается самым медленным В СПФ есть дизассемблер, все можно посмотреть Код: >: XX 8 0 DO LOOP ; Ok >SEE XX 58AE70 8945FC MOV FC [EBP] , EAX 58AE73 C745F808000000 MOV F8 [EBP] , # 8 58AE7A 33C0 XOR EAX , EAX 58AE7C BA00000080 MOV EDX , # 80000000 58AE81 2B55F8 SUB EDX , F8 [EBP] 58AE84 8D1C02 LEA EBX , [EDX] [EAX] 58AE87 8B45FC MOV EAX , FC [EBP] 58AE8A 689DAE5800 PUSH , # 58AE9D 58AE8F 52 PUSH EDX 58AE90 53 PUSH EBX 58AE91 90 XCHG EAX, EAX 58AE92 90 XCHG EAX, EAX 58AE93 90 XCHG EAX, EAX 58AE94 FF0424 INC [ESP] 58AE97 71FB JNO 58AE94 58AE99 8D64240C LEA ESP , C [ESP] 58AE9D C3 RET NEAR END-CODE Ok >: YY 8 BEGIN 1- DUP 0= UNTIL DROP ; Ok >SEE YY 58AEA0 8945FC MOV FC [EBP] , EAX 58AEA3 B808000000 MOV EAX , # 8 58AEA8 8D6DFC LEA EBP , FC [EBP] 58AEAB 90 XCHG EAX, EAX 58AEAC 83C0FF ADD EAX , # -1 58AEAF 75FB JNE 58AEAC 58AEB1 8B4500 MOV EAX , 0 [EBP] 58AEB4 8D6D04 LEA EBP , 4 [EBP] 58AEB7 C3 RET NEAR END-CODE Ok > На в самом цикле тат и тат 2 команды. вопрос писал(а): 0 9 DO LOOP цикл всё же выполнялся и притом значительное число раз? В чём смысл поддерживать такое свойство, не лучше ли обойтись тем, что фортеры называют ?DO LOOP 0 9 ?DO LOOP выполнит такое-же количество циклов что и 0 9 DO LOOP ?DO проверяет только на равенство. Можно сравнить на больше или равно. Но еще какое, знаковое или беззнаковое? вопрос писал(а): Обязательно ли располагать LEAVE непосредственно перед LOOP? не обязательно. вопрос писал(а): Почему обращение к счётчику происходит по буквам? их 2-3 , а что если мне вдруг нужен 4-уровневый цикл. Нужен счётчик n-ой вложенности, давай сделаем. вопрос писал(а): BEGIN condition ?GOTO туда counter @ \ \ \ \ AND уже не нужно WHILE REPEAT ... ... ... туда ... Код: REQUIRE A_AHEAD ~mak\lib\a_if.f \ некий эквивалент GOTO
condition A_IF counter @ \ \ \ \ AND уже не нужно WHILE REPEAT ... ... ... A_THEN ... |
Автор: | вопрос [ Ср окт 14, 2009 22:10 ] |
Заголовок сообщения: | |
Цитата: Нужен счётчик n-ой вложенности, давай сделаем. Ну вот, словно я это только для себя. Как раз сейчас сижу и делаю. Видимо, FAQ должен быть ... подробнее немного. 58AE8F 52 PUSH EDX 58AE90 53 PUSH EBX 58AE91 90 XCHG EAX, EAX 58AE92 90 XCHG EAX, EAX 58AE93 90 XCHG EAX, EAX 58AE94 FF0424 INC [ESP] 58AE97 71FB JNO 58AE94 Если бы перед выделенным был прыжок, то это было бы выравнивание, а так - что ? Цитата: 0 9 ?DO LOOP
выполнит такое-же количество циклов что и 0 9 DO LOOP ?DO проверяет только на равенство. Можно сравнить на больше или равно. Но еще какое, знаковое или беззнаковое? Да, точно, прозевал. Но вопрос остается - чтобы не было "безмерного удивления" - почему выбрана такая странная форма? (т.е. почему нет алгоритмически понятной ситуации) |
Автор: | Mihail [ Чт окт 15, 2009 11:03 ] |
Заголовок сообщения: | |
вопрос писал(а): Ну вот, словно я это только для себя. Как раз сейчас сижу и делаю. У меня как-то потребности не вызывало. Ну назовем его NI . Код: 3 CELLS CONSTANT LOOPSIZE : NI ( n -- i ) LOOPSIZE * CELL+ RP@ + 2@ - NEGATE ; : TST 4 0 DO CR 4 0 DO 0 NI . I . 1 NI . J . LOOP LOOP ; TST вопрос писал(а): Если бы перед выделенным был прыжок, то это было бы выравнивание
прыжок назад 58AE93 90 XCHG EAX, EAX 58AE94 FF0424 INC [ESP] 58AE97 71FB JNO 58AE94 |
Автор: | mOleg [ Пн ноя 09, 2009 14:04 ] |
Заголовок сообщения: | |
вопрос писал(а): 1. почему цикл DO LOOP считается самым медленным до того, что некоторые фортеры выносят его из ядра (fork, relf)? Нельзя ли его ускорить? 1) потому, что он делает больше проверок 2) потому, что при работе использует несколько параметров (а не один, как в других случаях) 3) потому, что из него наиболее неудобный выход (UNLOOP LEAVE) 4) потому, что в большинстве случаев можно обойтись другими циклами вопрос писал(а): 6. Знакомая программисту ситуация: чтобы цикл был быстрее, он организуется так, что ... после выхода из него, мы не знаем, по какой причине вышли например Код:BEGIN condition counter @ AND WHILE REPEAT (продолжить, если истинно условиe и счётчик не равен 0 ) мы можем выйти из цикла, если неистинно условие или обнулился счётчик и нам может быть далее важно, а собственно отчего мы вышли , поскольку на выходе это не очевидно, приходися писать операцию сравнения, т.е. дополнительный код. для этого существует замечательная возможность: Код: BEGIN condition WHILE counter @ WHILE loop body REPEAT \ тут если счетчик равен нулю EXIT THEN \ тут если condition = 0 ; То есть проблемы в действительности нет. тем более, что из таких циклов можно без проблем выходить по EXIT вопрос писал(а): 7. такой же вопрос по оператору CONTINUE если нужно продолжить цикл с некоторого места, не заканчивая итерацию? тут не совсем понятно, нужен пример, если не сложно. вопрос писал(а): 8. где LEAVE для циклов без счётчика?
а он просто не нужен, так как параметры (кроме FOR NEXT) лежат на стеке данных, а не возвратов, как в случае с DO LOOP |
Автор: | вопрос [ Пн ноя 09, 2009 14:47 ] |
Заголовок сообщения: | |
Администрации желательно бы обратить внимание, что ответы всё-таки как-то появляются, и, может быть, их стоит переносить в ответы Цитата: вопрос писал(а):
7. такой же вопрос по оператору CONTINUE если нужно продолжить цикл с некоторого места, не заканчивая итерацию? тут не совсем понятно, нужен пример, если не сложно. цикл чтения строк... в начале итерации читаем строку, потом разбираем если мы наткнулись на "комментарий до конца строки" , желательно не разбирать строку до конца, а начать новую итерацтю |
Автор: | mOleg [ Пн ноя 09, 2009 15:02 ] |
Заголовок сообщения: | |
вопрос писал(а): Цитата:вопрос писал(а):
7. такой же вопрос по оператору CONTINUE если нужно продолжить цикл с некоторого места, не заканчивая итерацию? тут не совсем понятно, нужен пример, если не сложно. цикл чтения строк... в начале итерации читаем строку, потом разбираем если мы наткнулись на "комментарий до конца строки" , желательно не разбирать строку до конца, а начать новую итерацтю ну, во-первых, речь идет о двух циклах: <pre> BEGIN readline WHILE \ цикл чтения строки до исчерпания источника данных BEGIN NextWord WHILE \ до исчерпания строки ?comment WHILE \ пока не коментарий до конца строки тело цикла REPEAT REPEAT </pre> причем, последнее обычно разбивается на несколько определений, так как вобщем-то вложенные циклы и не нужны. |
Автор: | вопрос [ Пн ноя 09, 2009 15:40 ] |
Заголовок сообщения: | |
Это всего-лишь пример (я так и знал, что придирка к примеру будет) Понятно, что речь может идти, скажем, о строке с ограниченным числом полей ... зараннее заданным Несовершенство примера не отменяет необходимости оператора, прерывающего очередную итерацию посредине и продолжающего следующую сначала скажем, жто может быть ini -файл со специальным форматом поле - значение алгоритм не будет включать никаких вложенных циклов Цитата: псевдокод
ПОКА не закончились строки НАЧАЛО распознать_поле Если_это_поле_комментария продолжить_цикл иначе распознать и присвоить значение ПОВТОРИТЬ |
Автор: | mOleg [ Пн ноя 09, 2009 15:47 ] |
Заголовок сообщения: | |
вопрос писал(а): Это всего-лишь пример (я так и знал, что придирка к примеру будет)
Понятно, что речь может идти, скажем, о строке с ограниченным числом полей ... зараннее заданным Несовершенство примера не отменяет необходимости оператора, прерывающего очередную итерацию посредине и продолжающего следующую сначала гм, с моей стороны придирок не было. Просто для каждого конкретного вопроса используются конкретные решения. в общем случае могу предложить следующее решение (собственно мой вариант CASE из форка) создается два определения (не обязательно оба должны иметь имя) но должен быть вызов вложенного. дальше ты выполняешь (в цикле ли, последовательно ли) необходимые действия, и выходишь из середины обработки (описано у Броуди). то есть просто используешь возможность вложенного выхода: : обработка первое ?EXIT второе ?EXIT третье ?EXIT ... : sample BEGIN .... WHILE обработка REPEAT ... |
Страница 1 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |