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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8  След.
Автор Сообщение
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Вт июл 12, 2016 19:27 
Замечание по предыдущим двум постам.
Видно, что предложенная схема перевода "итератора в структуру" обладает, по крайней мере тремя недостатками:
1. Добавление в структуру каждого нового факта требует полного просмотра структуры на предмет соответствующих якорей. Этот недостаток неустраним, т.к. постулируются независимость итератора от структуры и отсутствие дополнительных таблиц их соответствия.
2. Невзирая на то, что все логические переменные вычисляются ПЕРЕНОСЧИКОМ, сами логические выражения вычисляются при исполнении структуры.
3. Т.к. шитый код структуры не является перемещаемым (содержит абсолютные адреса переходов), то в случае использования нескольких итераторов с одной структурой следует сложный оверлейный балет.
Недостатки (2) и (3) можно победить одним и тем же способом: хранением в структуре не готового шитого кода, но кода (или текста), генерирующего целевой шитый код.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пн июл 25, 2016 19:49 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Если кому-нибудь нужен быстрый хеш, то смотрим сюда
Код:
: FAQ6A
  [
   
    0x8B C, 0xC8 C, \ MOV ECX, EAX
    0x33 C, 0xC0 C, \ XOR EAX, EAX
    HERE
    0x8B C, 0x5D C, 0x00 C, \ MOV EBX, 0 [EBP]
    0xFF C, 0xC9 C, \ DEC ECX
    0x03 C, 0xD9 C, \ ADD EBX, ECX
   
    0x0F C, 0xB6 C, 0x1B C, \ MOVZX EBX, BYTE [EBX]
    0x03 C, 0xC3 C, \ ADD EAX, EBX
    0x8B C, 0xD8 C, \ MOV EBX, EAX
    0xC1 C, 0xE3 C, 10 C, \ SHL EBX, 10
    0x03 C, 0xC3 C, \ ADD EAX,EBX
    0x8B C, 0xD8 C, \ MOV EBX, EAX
    0xC1 C, 0xEB C, 16 C, \ SHR EBX, 16
    0x33 C, 0xC3 C, \ XOR EAX, EBX
    0xE3 C, 2 C,    \ JECXZ
    0xEB C,  HERE - 1- C,  \ JMP SHORT
    0x8D C, 0x6D C, 0x04 C, \ NIP
    ]
  ;


Код писался для СПФ ( eax - вершина стека [ebp] - второй элемент ).
Данный faq6 усечённый и считает от конца к началу
Если кто-то подскажет как его ещё "убыстрить", буду рад :wink:
Хеш-функция не дописана, ибо практика показала, что и так нормально ( там после цикла два сдвига и xor )

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 20, 2016 09:33 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Код функции может быть расположен в стеке. Сам код, а не его адрес.
У кого-нибудь возникала необходимость делать так?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 20, 2016 11:25 
Victor__v писал(а):
Код функции может быть расположен в стеке. Сам код, а не его адрес.
У кого-нибудь возникала необходимость делать так?
Ну, как бы, словарь - это тоже стек (поэтому при некоторой доле экстремизма его весь, кроме списка имен, можно изначально хранить в стеке данных). Кроме того, Дейкстра изначально предлагал накапливать в стеке код, а не значения, вычисляя по потребности. Как в Trac. Просто, чем больше стек становится похожим на словарь, тем удобнее становится использовать для вычислений еще один отдельный стек.

Но, повторю, стековых свойств обычного словаря обычно для поддержания стека функций хватает.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб авг 20, 2016 23:50 
Не в сети
Administrator
Administrator
Аватара пользователя

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

В этом нет необходимости, поскольку любое число со стека можно переложить в память и передать указатель. В Форте используется EXECUTE, принимающее ссылку на код. Не знаю общепринятого слова, исполняющего число со стека как команду процессора или Форт-ВМ. Стек - это вообще-то не достоинство Форта, а вынужденная мера для организации простейшего механизма интерпретации. От перехода к стеку алгоритмы волшебным образом не улучшаются. Пока для меня написанное выглядит немного странно. Для чего такое может потребоваться?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Вс авг 21, 2016 10:22 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
Для чего такое может потребоваться?

Вот мне и самому интересно, где это можно применить.
Знаю, что сохранение функций в стеке используется для преднамеренного затруднения понимания кода. Чтоб взломать труднее было.
Можно, допустим, забыть часть слов где-то в форт-системе, а не только в её конце. Если call'ы можно предварительно найти, а потом модифицировать, то как быть с лямбдами? Тем более, если лямбда - несколько машинных инструкций. Сюда также можно отнести хранение строк внутри слов.
Вот и получается, что хранение в стеке лямд является относительным. И поэтому при забывании саму лямбду можно безболезненно переносить.

Цитата:
Не знаю общепринятого слова, исполняющего число со стека как команду процессора

Вряд ли такое слово существует. Логичнее использовать адрес этого "числа"

Цитата:
Стек - это вообще-то не достоинство Форта

Тогда уж не достоинство многих процессоров :wink:

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Препроцессор
СообщениеДобавлено: Пт сен 02, 2016 19:02 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Понимаю, препроцессор хитрость не маленькая 8) , но всё же...
Написан препроцессор для СПФ.
Не занимает места. Принцип "отработай и тебя тут вообще не было"
Позволяет писать простые макросы.
Препроцессор был написан без серьёзного форт-читерства.
Единственное, - псевдо-goto
Читаемость исходного кода препроцессора - " фортер знает толк в извращениях :( "
Портируемость на другие форт-системы потенциально высокая, надеюсь...
Ознакомиться можно по ссылке:
https://vk.com/doc189457568_437831253?hash=1815dabd49770f221c&dl=428586639e0a5557b1

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Препроцессор
СообщениеДобавлено: Пт сен 02, 2016 19:26 
Victor__v писал(а):
препроцессор хитрость не маленькая
Это, не хитрость, а антихитрость: "Как нам с наибольшим для себя ущербом отказаться от плюсов FORTH". И самый главный минус этой "антихитрости": Вам так и не удалось сформулировать смысл ее изобретения. Как можно говорить о том, что хорошо или плохо в программе, которая непонятно зачем нужна?

P.S. Фортер, пишущий определения длиннее трех строчек, сам себе злобный Буратино.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт сен 02, 2016 22:35 
Не в сети

Зарегистрирован: Ср фев 17, 2010 18:10
Сообщения: 323
Откуда: Тверь
Благодарил (а): 13 раз.
Поблагодарили: 11 раз.
А мне препроцессор понравился. Правда возможны трудноуловимые побочные эффекты, зато красиво.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт сен 02, 2016 22:47 
mgw писал(а):
А мне препроцессор понравился.
Да объясните же вы, наконец, зачем FORTH препроцессор? И какую выгоду можно получить, выгрузив его из памяти? И почему выгрузка из памяти необходима только препроцессору?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб сен 03, 2016 00:00 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
И почему выгрузка из памяти необходима только препроцессору?


Потому что в конечной программе, как и часть слов форт-системы, препроцессор не нужен Немедлятки тоже.
Часть из моих наработок это как раз слова немедленного исполнения.
Вот как быть?
Мне как-то жалко 3-4 килобайта. Препроцессор эту проблему частично снимает.
Цитата:
Вам так и не удалось сформулировать смысл ее изобретения

Смысл препроцессора? Препроцессора? Достаточно взглянуть на такие языки как Си и ЛИСП. Какой смысл препроцессора в этих языках? :lol:
Цитата:
Фортер, пишущий определения длиннее трех строчек

и далее по тексту...
Допустим, в программе нужно удалить 2-й верхний элемент со стека возвратов.
Можно:
А) прямо в слове:
1) написать в кодах [ 0x8F C, 0x44 C, 0x24 C, 0 C, ]
2) Написать на форте R> RDROP >R
Б) создать определение:
1) в кодах опять же
2) на форте опять же
В) создать определение немедленного исполнения:
1) аналогично
2) аналогично

Способ А не занимает места, но могут возникнуть проблемы с масштабированием ( если надо не в одном месте, а в двух, к примеру )
Способ Б хорошо "вклинивается" , но занимает место.
Способ В "вклинивается" так, что ссылки на определение нет ( immediate вся же ) , но опять же занимает место.
А если мы используем макросы?
Места не занимает и может встречаться в тексте повсеместно.
m#def RNIP ( [ 0x8F C, 0x44 C, 0x24 C, 0 C, ] )
Чем плохо?

Цитата:
Правда возможны трудноуловимые побочные эффекты, зато красиво.

Благодарю, в процессе работы буду доводить до совершенства.
В случае ошибки интерпретации полученного текста, этот текст выводится на экран.
Можно отследить что и где пошло не так.

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Сб сен 03, 2016 00:21 
Victor__v писал(а):
Потому что в конечной программе, как и часть слов форт-системы, препроцессор не нужен Немедлятки тоже.
Я спрашивал: "И почему выгрузка из памяти необходима только препроцессору?". А Вы ответили и "немедляткам - тоже". Т.е. выгрузка необходима не только препроцессору. Так почему эта выгрузка была сделана его неотъемлемой частью? Почему "хитрость" не разбита на две: "препроцессор" и "компиляция во временный словарь"?

Victor__v писал(а):
Смысл препроцессора? Препроцессора? Достаточно взглянуть на такие языки как Си и ЛИСП. Какой смысл препроцессора в этих языках?
В Си - #define применяется для внесения в текст избыточности, требуемой синтаксисом языка. В FORTH нет синтаксиса, требующего избыточности. В ЛИСП макросы - заглушка "немедленного исполнения". В FORTH все исполняется немедленно.

Victor__v писал(а):
Допустим, в программе нужно удалить 2-й верхний элемент со стека возвратов.
Для этого используется FORTH-ассемблер, со всеми его макросами.

Вернемся к
Victor__v писал(а):
Потому что в конечной программе, как и часть слов форт-системы, препроцессор не нужен Немедлятки тоже.
Во-первых, посчитаем: допустим, вы заменяете слово на его код. 1 машинное слово на L. Делаете это N раз. Программа вырастает на (L-1)*N слов. Сильна ли выгода от стирания одного L, того, что в препроцессоре? Повторю: препроцессор добавляет избыточность; его собственный вес, по сравнению с весом мусора, который он генерирует, ничтожен. Да и сам FORTH никоим образом не позиционируется, как система, экономящая память.

Во-вторых, методика удаления из FORTH-конечного-продукта ненужных определений и имен давно отработана. Удалять же их в процессе разработки - значит, не пользоваться плюсами интерпретатора.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пн сен 05, 2016 20:20 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:
Так почему эта выгрузка была сделана его неотъемлемой частью? Почему "хитрость" не разбита на две: "препроцессор" и "компиляция во временный словарь"?

Потому что Я ТАК ХОЧУ. Это соответствует моим нуждам и моим представлениям об "идеальной" форт-системе. считаете иначе, ссылка имеется, правьте сколько угодно

Цитата:
Во-первых, посчитаем: допустим, вы заменяете слово на его код. 1 машинное слово на L. Делаете это N раз. Программа вырастает на (L-1)*N слов

Сам исходный код? Правильно понял?
Если да, то это вполне естественно. Препроцессор в данном случае не множит файлы, а преобразует весь текст и раскручивает по evaluate
Цитата:
методика удаления из FORTH-конечного-продукта ненужных определений и имен давно отработана

Целевой компилятор?
Что ж, для СПФ нет целевого компилятора, а жаль. Лично мне пока влом копаться в PE-формате.
Но думаю, у такого знатока как вы, уже есть решение в виде целевого компилятора для СПФ. С 3-4 параметрами и векторами для более гибкой настройки поведения ( обнаружение и обработка лямбд, обработка хранения строк внутри слов, обработка цикла DO--LOOP)
В СПФ-рассылке все уже заждались вашего ЦК

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пн сен 05, 2016 20:37 
Victor__v писал(а):
Потому что Я ТАК ХОЧУ. Это соответствует моим нуждам и моим представлениям об "идеальной" форт-системе.
Но совершенно не соответствует теме "маленьких хитростей". Создайте тему "больших глупостей" и "ХОТИТЕ странного" там. Здесь попытка скрестить ужа с ежом расценивается, как плохое понимание цели работы. Например, как желание "сэкономить память" увязывается с "PE-форматом", который из принципа не имеет дела с "экономией"?
Victor__v писал(а):
Препроцессор в данном случае не множит файлы, а преобразует весь текст и раскручивает по evaluate
Т.е. плодит мусор, заведомо превышающий его собственные размеры. Экономить имеет смысл на самом мусоре, а не на средствах его производства.
Victor__v писал(а):
Что ж, для СПФ нет целевого компилятора, а жаль.
Скорее всего, есть, т.к. сами новые версии СПФ (в т.ч. форки) плодятся, видимо, способом целевой компиляции. Поищите на Форуме.
Victor__v писал(а):
Но думаю, у такого знатока как вы, уже есть решение
И я его не скрываю (в конце концов, его придумал сам Мур). Хотите что-то сэкономить - пишите свой FORTH под свою конкретную задачу.

P.S. Так что сильно рекомендую создать отдельную тему и начать ее с понятной постановки задачи. А не:
- Я тут сделал!
- А зачем?
- Хочу!

P.P.S. FORTH позволяет писать "как думаешь". Поэтому думать надо стараться изначально правильно.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Маленькие хитрости
СообщениеДобавлено: Пт сен 23, 2016 16:13 
Маленькое хулиганство. "Кусочек ЭЛТ" - перерасчет формул при изменении входящих в них переменных (Win32Forth).
Точнее, всех формул, в которые эта переменная потенциально могла бы входить.

\ НА КАЖДОМ ЭТАЖЕ ЖИВЕТ ОДНА ФОРМУЛА И НЕСКОЛЬКО ПЕРЕМЕННЫХ
VARIABLE ЭТАЖ

\ СВЯЗЫВАНИЕ ПЕРЕМЕННЫХ СО СЛЕДУЮЩИМ ЭТАЖОМ
: ГОРИЗОНТАЛЬНО ( A1,A2--)
?DUP IF 2DUP @ RECURSE ! ELSE DROP THEN ;
: ПОЛ ( A--) ЭТАЖ ГОРИЗОНТАЛЬНО ;
: КРЫША 0 ПОЛ ;

\ "ЯЧЕЙКИ"
: ПЕРЕМЕННАЯ ( W--)
CREATE HERE ЭТАЖ @ , ЭТАЖ ! , DOES> CELL+ @ ;
: ФОРМУЛА CREATE HERE ПОЛ 0 , 0 , ] DOES> CELL+ @ ;

\ ПЕРЕСЧЕТ
: ОРДЕР ( A--) >R ;
: КВАРТИРА ( A--) BEGIN ?DUP WHILE DUP>R
2 CELLS + ОРДЕР R@ CELL+ ! R> @ REPEAT ;
: => ( W--) ' >BODY DUP>R CELL+ ! R> @ КВАРТИРА ;

1 ПЕРЕМЕННАЯ A
2 ПЕРЕМЕННАЯ B
ФОРМУЛА C A B + ;
4 ПЕРЕМЕННАЯ D
ФОРМУЛА E C D * ;
3 => B
\ В ЭТОТ МОМЕНТ E УЖЕ ВЫЧИСЛЕНО
E .

Пример нестандартного словаря.


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 120 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8  След.

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


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

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


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

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