Forth http://fforum.winglion.ru/ |
|
Наработки от victor__v для СПФ http://fforum.winglion.ru/viewtopic.php?f=23&t=3105 |
Страница 6 из 6 |
Автор: | _KROL [ Сб ноя 18, 2017 16:35 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
gudliefr писал(а): 2. Невзирая на (1) система и сама по себе настолько сложна, что жрет любые ресурсы и безбожно тормозит на любой машине. Кое-что было сделано (и делается) специально, с взглядом на будующее. Я где-то "слышал", что XP могла запускаться и на 486.
|
Автор: | gudleifr [ Сб ноя 18, 2017 16:51 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
_KROL писал(а): Кое-что было сделано (и делается) специально, с взглядом на будующее. Наоборот. Первое, что делает каждое новое приложение и/или драйвер - требует обновить Windows...
|
Автор: | _KROL [ Сб ноя 18, 2017 16:57 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
gudleifr писал(а): _KROL писал(а): Кое-что было сделано (и делается) специально, с взглядом на будующее. Наоборот. Первое, что делает каждое новое приложение и/или драйвер - требует обновить Windows...У меня до сих пор XP стоит, и ничего. |
Автор: | gudleifr [ Сб ноя 18, 2017 17:21 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
_KROL писал(а): ... Давайте об этом в другом месте. Мы уже коллеге всю тему замусорили.
|
Автор: | Victor__v [ Пн ноя 20, 2017 17:44 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
пример использования итераторов для перебора всех слов во всех словарях: Код: : WORDS-ITER: \ LFA -- iter: LFA -- L>LLFA 0 2>R BEGIN 2R@ + @ >R BEGIN R@ WHILE R@ RP@ 3 CELLS + @ EXECUTE R> @ >R REPEAT RDROP CELL RP@ +! 4 CELLS R@ = UNTIL RDROP RDROP RDROP ; : VOCS-ITER: \ iter: LFA -- VOC0 @ CONTEXT 2>R BEGIN R@ @ RP@ 2 CELLS + @ EXECUTE 2R@ XOR WHILE R> CELL- >R REPEAT RDROP RDROP RDROP ; : ALL-VOC: R> GET-ORDER VOC0 FROM CONTEXT 2 N>KEEP 300 CELLS RALLOT RF >R SET-ORDER >R \ xt ['] VOCS-ITER: >R GET-ORDER VOCS-ITER: WORDS-ITER: BEGIN L>CFA @ DUP ['] VOC-CODE CALL-IN-ADDR? WHILE >param @ >R R@ SSET-IN DUP CONTEXT VOC0 @ - 4 / XOR 0= IF RDROP EXIT THEN SET-ORDER GET-ORDER R> REPEAT DROP ; : ALL-WORDS-TYPE ['] . >R 0 ALL-VOC: >R ." VOC: " R@ L>NFA @ R@ L>countFA W@ TYPE CR R> WORDS-ITER: >R R@ L>NFA @ R@ L>countFA W@ TYPE 9 ( TAB ) EMIT DUP 8 MOD 0= IF CR THEN 1+ ; ; Не отлаживал, прост полёт мысли |
Автор: | Victor__v [ Чт ноя 23, 2017 23:57 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Несколько слов по бектрекингу. Бектрекинг тут понимается как "идея реализованная в лоб в каждом конкретном случае". То есть без либ вообще. Взяли и вызвали остаток кода. Всё. Основные проблемы при использовании бектрекинговых итераторов: Как прервать итератор? Примечание от 13.12.2018 Можно в итератор передавать RP@ для сброса в случае необходимости. Код: ... RP@ TEST: DUP 10 = IF RP! EXIT THEN .... К примеру мы нашли нужное значение и наша задача выйти из итератора. Как это сделать не зная особенностей реализации отдельного итератора? Рассмотрим 3 варианта: 1) Создание конвенции о вызовах итераторов. В простейшем случае при вызове остатка кода второй элемент на стеке возвратов представляет собою указатель для сброса стека возвратов. Т.е. в остатке кода достаточно сделать так: Код: RDROP R> RP! EXIT Недостатки: усложнение написания итераторов, дополнительная нагрузка на программиста ( поддерживает ли итератор соглашение?) 2) Использование механизма перехвата исключений. Достаточно всего трёх слов: CATCH: \ --> / err|0 <-- \ вызвать остаток кода и перехватить исключение, если оно было. При откате положить на стек код исключения. TO-CATCH \ -- 0 \ Выйти из кода, который был вызван из CATCH или CATCH: без исключений с сохранением ТОЛЬКО стека данных THROW^ \ <-- err|0 \ На обратном ходу (при откате) снять число со стека данных и перейти на CATCH ( CATCH: ), если код отличен от 0 с очисткой стеков данных и возвратов. Недостатки: дополнительная нагрузка на стек исключений, запись THROW^ CATCH: ... может сбить с толку. 3) Дополнительный инструментарий. Тут останавливаться особо не над чем. Реализация доп.стека под бектрекинг и операции с ним описаны у Гасаненко, а также реализована в СПФ у ~profit'а. Кстати, Гасаненко говорил, что можно использовать не стек, а цепочку. См. "Одностековая реализация бэктрекинга для языка Форт". Кстати, единственная работа, которую легко найти в инете. Всё остальное пришлось пережёвывать из поставки СПФ. Недостатки: доп. сущность, за которой надо следить. Новый лексикон в который надо "въехать". Я, к примеру, 2 месяца пытался понять логику PRO И CONT , и меня внезапно осенило на прогулке На самом деле ничего сложного. Непривычно и всё. Проблема вторая. Локальные переменные совместно с итераторами. Условимся, что переменные должны поддерживать многопоточность. То есть хранение переменных в ШК не подходит. Хочется, чтобы можно было делать так: : TEST { a b } ITER: a ! ... ; Использование конвенций не выглядит тут оптимальным решением. А вот варианты 2 и 3 выглядят более менее отлично. Поскольку 3-й вариант описан, сосредоточимся на 2-ом. Ограничение: должно использоваться слово CATCH: Так гораздо проще организовать, однако ж не столь очевидно будет применение этого слова для лок.переменных. А это доп. нагрузка на программиста. Хм, будем думать дальше как сделать логичней и прозрачней. |
Автор: | gudleifr [ Пт ноя 24, 2017 00:03 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Victor__v писал(а): Бектрекинг тут понимается как "идея реализованная в лоб в каждом конкретном случае". ... 1) Создание конвенции о вызовах итераторов. 2) Использование механизма перехвата исключений. 3) Дополнительный инструментарий. Постановка проблемы в первой строке подразумевает негодность (1-3) супротив 4) "реализовать [выход] в лоб в каждом конкретном случае". Пример: http://gudleifr.forum2x2.ru/t31-topic#243. |
Автор: | Victor__v [ Пт ноя 24, 2017 15:51 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
gudleifr писал(а): Victor__v писал(а): Бектрекинг тут понимается как "идея реализованная в лоб в каждом конкретном случае". ... 1) Создание конвенции о вызовах итераторов. 2) Использование механизма перехвата исключений. 3) Дополнительный инструментарий. Постановка проблемы в первой строке подразумевает негодность (1-3) супротив 4) "реализовать [выход] в лоб в каждом конкретном случае". Пример: http://gudleifr.forum2x2.ru/t31-topic#243. Не, ну хочется как-то унифицировать без всяких дополнительных стеков и списков ( >L ). Меня на форуме вот что зацепило: Цитата: Одна моя знакомая компания "фортеров" озаботилась компактной записью стековых операций: например "3/12321" означает, если не ошибаюсь, то же, что и " >R 2DUP R> ROT ROT SWAP ", только путем неявных вызовов PICK . Нужен ли такой язык? (На настоящий момент он уже настолько развит, что в нем можно решать подобные задачи "не опускаясь" до использования обычных FORTH-слов). Совсем не нужен! Хотя бы потому, что использование подобных конструкций, свидетельствует о крайне низкой культуре фортописания. Как только у вас в программе начинают появляться такие монстры, значит, надо срочно пересмотреть структуру своей программы! неявные вызовы PICK использовал токмо Profit да и то в кач-ве теста. Цитата: свидетельствует о крайне низкой культуре фортописания Это вообще как? Причём тут использование DSL и культура фортописания? Цитата: Как только у вас в программе начинают появляться такие монстры, значит, надо срочно пересмотреть структуру своей программы! В принципе согласен. Но стековые манипуляторы позволяют написать низкоуровневые слова без использования ассемблера, при этом сущ-но сокращая скорость написания. Особенности реализации стек-манипуляторов обсуждать не стоит. Т.к. возможны варианты. |
Автор: | gudleifr [ Пт ноя 24, 2017 16:25 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Victor__v писал(а): Не, ну хочется как-то унифицировать без всяких дополнительных стеков и списков ( >L ). Опять же, зависит от задачи. В приведенном мной примере, например, стек (для бэктрекинга) использовался родной, а применение массива диктовалось решением задачи (для обрезания уже рассмотренных комбинаций).Victor__v писал(а): Причём тут использование DSL и культура фортописания? Я понимаю так: применение FORTH отрицает потребность в DSL. Новый язык пишется под конкретную проблему, а не под некую "предметную область", к которой потом придется сводить "похожие" проблемы.Victor__v писал(а): Но стековые манипуляторы позволяют написать низкоуровневые слова без использования ассемблера Последнее проще и удобнее. А еще проще и удобнее отказаться от сложных вычислений в стеке.
|
Автор: | Victor__v [ Пт ноя 24, 2017 17:48 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Цитата: Последнее проще и удобнее. А еще проще и удобнее отказаться от сложных вычислений в стеке Ну, я за 2 минуты написал на стек.манипуляторе COMPARE, а перетряхивание данных, для WINAPI вообще вырождается. Насчёт вычислений не понял. Имеется ввиду внутренняя реализация манипуляторов? |
Автор: | gudleifr [ Пт ноя 24, 2017 18:05 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Victor__v писал(а): Насчёт вычислений не понял. http://gudleifr.forum2x2.ru/t31-topic?p=241Victor__v писал(а): а перетряхивание данных, для WINAPI вообще вырождается. Это плохо - http://gudleifr.forum2x2.ru/t31-topic?p=247Victor__v писал(а): Ну, я за 2 минуты написал на стек.манипуляторе COMPARE А я обычно за 0 секунд обхожусь без COMPARE .
|
Автор: | Victor__v [ Пт ноя 24, 2017 21:33 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
gudleifr писал(а): Victor__v писал(а): Насчёт вычислений не понял. Причём здесь СТЕКОВЫЙ МАНИПУЛЯТОР? Какие там нафиг сложные вычисления? |
Автор: | gudleifr [ Пт ноя 24, 2017 21:39 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Victor__v писал(а): Какие там нафиг сложные вычисления? В самих манипуляторах - никаких. Но если нет сложных вычислений со многими переменными, хранимыми на стеке, зачем нужны манипуляторы?Victor__v писал(а): Причём здесь СТЕКОВЫЙ МАНИПУЛЯТОР? Ни при чем. Он не нужен. |
Автор: | Victor__v [ Пт ноя 24, 2017 22:41 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Зачем? в форте можно работать "без проблем" с 3 верхними элементами стека 3! = 6 вариантов действий моя реализация поддерживает 5 переменных-регистров 0 1 2 3 4 5! = 120 вариантов действий Плюс циклы и условия. Код очень короток в наборе и очень близок к ассемблерному варианту, а то и полностью идентичен. |
Автор: | gudleifr [ Пт ноя 24, 2017 22:49 ] |
Заголовок сообщения: | Re: Наработки от victor__v для СПФ |
Victor__v писал(а): 3! = 6 вариантов действий Ага, только, по сравнению с операциями с 1-2 параметрами, операции с 5 и 6 параметрами практически равновероятны. Я в своей практике встречал такие считанные разы и, обычно, по собственной дурости.
5! = 120 вариантов действий |
Страница 6 из 6 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |