Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 01:37

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб май 05, 2007 17:37 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
yz писал(а):
В Форте не связаны, а в голове человека связаны. Попробуйте определить пару десятков таких слов, особенно, если в одних случаях они берут аргументы, а в других нет. Ну и потом попытайтесь все это запомнить и написать.

В форте такие ситуации c определением, запоминанием и с последующим написанием на каждом шагу:
1. слова немедленного исполнения ничем не отличается в тексте от слов без этого признака - это надо просто помнить.
2. нужно помнить стековый эффект каждого слова(и стандартных и только что созданных).
3. нужно помнить про контекст поиска(слова с одинаковым именем ведут себя по разному)
4. нужно держать в памяти несколько параметров на стеке в ходе программирования.
5. нужно помнить, что структуры управления и некоторые конструкции оставляют на стеке во время компиляции свои параметры.
На этом общем фоне еще одна "нагрузка" на фортера что слону дробина. :)
А если серьезно - использование стека параметров в форте не доведено до приемлемого уровня. Наличие обратной польской записи согласовано со стеком только при определенных условиях, а именно в случае работы на стеке с именованными параметрами:
a^2+a*b+b^2
a a * a b * + b b * +
в противном случае
( a b -- a^2+a*b+b^2) 2DUP * -ROT OVER TUCK * -ROT * + +
и из таких записей еще делают вывод, что на форте можно программировать как на функциональном языке.
in4 писал(а):
Классики говорят, и я с ними согласен, что таких слов надо поменьше, а лучше, чтоб вообще не было!

Век классиков в программировании самый короткий, поэтому к их рекомендациям нужно относиться с осторожностью, и кроме того, классики дальше, чем здравый смысл. :o

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб май 05, 2007 21:08 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
chess писал(а):
( a b -- a^2+a*b+b^2) 2DUP * -ROT OVER TUCK * -ROT * + +

Код:
2DUP DUP * >R + * R> +

chess писал(а):
и из таких записей еще делают вывод, что на форте можно программировать как на функциональном языке.

Но ты прав, с выражениями в "привычном виде" у нас не очень...
разве что локальные переменные чуть скрасят
Код:
{ b }  \ с одной
DUP b + * b DUP * +  \ так
DUP b + * b b * +  \ или так
{ a b }  \ с двумя
a a b + * b b * +
но все равно некрасиво... :(
Вывод: надо встроенный компилятор обычного языка (а-ля Паскаль)! ;) и его уже приводили... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 10:33 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
yz писал(а):
По-моему, проще подключить локальные переменные и писать
с b a b напрямую.

Механизм, подобный, но не полностью идентичный существующему механизму локальных переменных можно реализовать следующим образом - выделить память в кодофайле и сбросить туда параметры со стека(стек при этом освободить от сброшенных параметров). К параметрам в памяти обращаться единообразно например с помощью слов типа $1 $2 ... $8(стандартное именование параметров), тогда, например вычисление функций типа a^2+a*b+b^2 будет выглядеть как
Код:
: func \ a b -- a^2+a*b+b^2
2$  $1 $1 * $1 $2 * + $2 $2 * + ;
При этом нужно посмотреть, в каком случае код будет короче - при сбрасывании на стек возвратов или при сбрасывании в кодофайл. Сброс в кодофайл можно оформить как нибудь так: 2$ - это будет означать, что сброшено два параметра со стека параметров в кодофайл. Эти параметры в отличие от стандартных локальных переменных долгоживущие(это некоторый +) и поэтому могут быть использованы в следующих словах в отличие от стандартных локальных переменных. Сброс параметров стека в кодофайл нужно оформить конечно как примитив на ассме и доступ к ним (слова $1 $2...) тоже также. Короче с этим надо поэкспериментировать.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 13:28 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Сделать еще один стек + доп. словарь (или только доп. словарь) с удалениями слов - и пожалуйста - "глобальные" переменные с ограниченной областью видимости. :)
Конечно, зависит от задач. Но, может, просто перепроектировать программу? Добавить туда таблиц, а оптимизатор поможет сделать поэффективнее код... ;)
IMHO, надо стараться использовать стандартные (или уже имеющиеся средства) для решения задач. И введение новых надо серьезно обосновывать, а не добавлять механизмы "на будущее". И для начала просто сформулировать задачу. А это - половина решения!! :) Функция определяет структуру (с)... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 16:02 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
in4 писал(а):
IMHO, надо стараться использовать стандартные (или уже имеющиеся средства) для решения задач.

Я думаю - сначала нужно сравнить.

Прежде чем писать реализацию нового механизма локальных переменных сравнил травопольным
способом со старым методом:

Код:
REQUIRE {         ~mak\locals1.f

CREATE PM 32 ALLOT
: 2SM PM 2 CELLS + ! PM CELL + ! ;
: CICL-NEW
  2SM 100000000 0
  DO
    PM 4 + @ PM 4 + @ *
    PM 4 + @ PM 8 + @ * +
    PM 8 + @ PM 8 + @ * +
    DROP
  LOOP
;
: CICL-OLD
  { A B } 100000000 0
  DO
    A A *
    A B * +
    B B * +
    DROP
  LOOP
;

REQUIRE .elapsed  ~af\lib\elapse.f

STARTLOG
time-reset 5 6 CICL-NEW  CR .elapsed CR
time-reset 5 6 CICL-OLD  CR .elapsed CR
ENDLOG
лог
Код:
Elapsed time: 00:00:00:563 \ новый метод

Elapsed time: 00:00:00:921 \ старый метод

Результат говорит сам за себя - по новому почти в 2 раза быстрее. Вывод - нужно писать новую реализацию.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 17:13 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Самое интересное, что при написании стандартным способом - без локальных переменных, результат с новыми локальными переменными получается быстрее. Код в этот раз переписан оптимально - с учетом условия задачи(здесь сказывается принятый по стандарту способ работы с параметрами на стеке - слова всегда забирают со стека параметры, с локальными переменными это можно делать только один раз).

Код:
: CICL 100000000 0 DO 5 6  2DUP + * SWAP DUP * + DROP LOOP ;

REQUIRE {         ~mak\locals1.f
CREATE PM 32 ALLOT
: 2SM PM 2 CELLS + ! PM CELL + ! ;
: CICL-NEW
  2SM 100000000 0
  DO

    PM 4 + @ PM 8 + @ +
    PM 4 + @ * PM 8 + @
    PM 8 + @ * +
    DROP
  LOOP
;
: CICL-OLD
  { A B } 100000000 0
  DO
    A B +
    A *
    B B * +
    DROP
  LOOP
;

REQUIRE .elapsed  ~af\lib\elapse.f

STARTLOG
time-reset     CICL      CR .elapsed CR
time-reset 5 6 CICL-NEW  CR .elapsed CR
time-reset 5 6 CICL-OLD  CR .elapsed CR
ENDLOG

лог
Код:
Elapsed time: 00:00:00:609  \ без локальных переменных

Elapsed time: 00:00:00:391   \ с новыми локальными переменными

Elapsed time: 00:00:00:703   \ со старыми локальными переменными

Напрашивается вывод - от операций манипулирования параметрами на стеке(DUP, DROP, SWAP и т.д.)
можно отказаться и перейти к локальным переменным с сохранением обратной польской записи для записи выражений - быстродействие от этого только увеличится(трудоемкость естественно уменьшится).

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 18:51 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
chess писал(а):
Результат говорит сам за себя - по новому почти в 2 раза быстрее. Вывод - нужно писать новую реализацию.
Или добавлять правил в оптимизацию...
Надо будет посмотреть, что там такое..., откуда скорость набирается...
Синтаксис хотелось бы облагородить. Я все-таки за доп. словарь и осмысленные имена... ;) Но рассмотрю и варианты... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 20:44 
Не в сети

Зарегистрирован: Сб янв 27, 2007 22:00
Сообщения: 106
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
выделить память в кодофайле и сбросить туда параметры со стека(стек при этом освободить от сброшенных параметров). К параметрам в памяти обращаться единообразно например с помощью слов типа $1 $2 ... $8


Если вы собираетесь вызывать другие слова и в них тоже использовать $1 $2, то статического куска не хватит. Нужен дополнительный стек.

Если писать код для дополнительного стека, то непонятно, зачем это надо. Дополнительный стек уже есть - стек возвратов. И слова, с ним работающие, тоже уже написаны. Все это используется в существующих локальных переменных.

За счет чего вы хотите выиграть в скорости - непонятно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн май 07, 2007 21:09 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
yz писал(а):
Если вы собираетесь вызывать другие слова и в них тоже использовать $1 $2, то статического куска не хватит. Нужен дополнительный стек.

Все слова(внутри определения) используют только исходные параметры для определения, как подготовить стек параметров для работы этих внутренних слов я думаю понятно.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 09:15 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
При изучении машинных команд наткнулся на команды условных пересылок MOVcc, которые выполняют или не выполняют пересылку взависимости от выполнения условия. Чем хуже форт, это же "ассемблер" виртульной машины(форт-машины), поэтому в набор примитивов можно включить такого рода условные примитивы. Следствием этого явится избавление от слов типа IF и иже с ними.
Например:
Код:
VAL2  VAL1 IF  1+! THEN

можно заменить на
Код:
VAL2 VAL1 0>1+!
где 0>1+! - примитив берущий со стека значение и прибавляющий 1-цу к следующему значению на стеке, если первое значение больше 0.
Короче - анализ упрятывается в сами слова-команды форта.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 16:03 
Цитата:
При этом нужно посмотреть, в каком случае код будет короче - при сбрасывании на стек возвратов или при сбрасывании в кодофайл.

При сбрасывании в кодофайл соответствующий код будет нереентерабельным. Актуально, если существует возможность рекурсивного или многопоточного исполнения данного кода.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 16:58 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
rvm писал(а):
При сбрасывании в кодофайл соответствующий код будет нереентерабельным. Актуально, если существует возможность рекурсивного или многопоточного исполнения данного кода.

Все верно. Я пока так далеко не заглядывал. :) Но, думаю, и в этом направлении выход есть.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 17:02 
/me чего-то опять в флуд унесло (видимо, от погоды зависит)..

chess писал(а):
Код:
( a b -- a^2+a*b+b^2) 2DUP * -ROT OVER TUCK * -ROT * + +

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

Из таких записей можно делать только вывод о желании видеть только то что согласуется со своими личными устоявшимися мнениям о чём-либо (без всякого желания [или уже возможности?] их пересматривать):

Код:
: ^2 ( a -- a^2 ) DUP * ;
: r ( a b -- a^2+a*b+b^2 ) 2DUP ^2 SWAP ^2 + -ROT * + ;


Немножко надо понимать что когда открытым текстом, часто, немножко намекают: "в общем случае можно/нужно обойтись без ROT" это немножко означает что:
Винни писал(а):
Это "ж-ж-ж" -- неспроста


chess писал(а):
1. слова немедленного исполнения ничем не отличается в тексте от слов без этого признака - это надо просто помнить.

Они и не должны отличаться. Их сознательно для того и замаскировали. Если это нужно -- значит тут играют либо побочные эффекты либо сознательный уход программиста в них (ПЭ).

chess писал(а):
2. нужно помнить стековый эффект каждого слова(и стандартных и только что созданных).

Именно поэтому в словах нужно делать её как можно эффективной, краткой и простой. Хотя я разницы в упор не вижу с другими языками. Там тоже функции есть. И тоже параметры в них надо подставлять в определённом порядке (который надо тоже помнить, так ведь?..).

chess писал(а):
3. нужно помнить про контекст поиска(слова с одинаковым именем ведут себя по разному)

Опять же, контекст поиска тоже придуман не для того чтобы помнить когда какое одинаковое слово что делает. А чтобы забывать какое слово в каком месте что делает. Чтобы например в MODULE: ;MODULE изолировать переменную с редким именем tmp и не просыпаться по ночам что кто-то тоже так назовёт свою переменную.

chess писал(а):
4. нужно держать в памяти несколько параметров на стеке в ходе программирования.

Обычно два-три (при этом надо прибегать к абстракции, то есть правильно размечать некоторые числа как двойные для упрощения). Если получается больше -- тут либо явный повод для рефакторизации, либо действительно уместны становятся (локальные) переменные (я не связанный своей религией по рукам и ногам зилот, мне Тора не запрещает).

chess писал(а):
5. нужно помнить, что структуры управления и некоторые конструкции оставляют на стеке во время компиляции свои параметры.

Опять-таки помнить этого не надо если это сейчас к делу не относится. Если же это помнить нужно всегда и везде -- значит структуры управления как абстракции никуда не годятся -- ибо не выполняют своей функции -- упрощение жизни программиста (хотя конечно есть и личности всячески этому противищиеся, вопреки своей же пользе).

А вообще всё проверяется практикой... В программе пригодилось, сберегло время/код -- это хорошо.

[Остапа понесло]
/me немножко намекает что для того и нужны абстракции и модели -- чтобы помнить меньше, а работать больше. Применяйте их. А если (стремиться) проницать мысленным взором всю материю вплоть до составляющих аромат кварка мезо-атомов и до прото-шкварок -- так не только залюбовавшись, работать перестанешь, но и немножко с глузда можно съехать. Вариант со "стремлюсь проницать" -- даже во много раз хуже, так как человек ни там, ни там не преуспеет.

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

/me вообще обладает благословенной способностью -- забывать. Я например, не помню в каком порядке ROT крутит числа -- каждый раз проверяю в консоли. Точно так же и про TUCK с ходу не могу сказать что он делает.

chess писал(а):
Век классиков в программировании самый короткий, поэтому к их рекомендациям нужно относиться с осторожностью, и кроме того, классики дальше, чем здравый смысл.


"Устав пишется кровью тех, которые считали себя умнее Устава" (с)

Здравый смысл, конечно, превыше всего. Но большинство рекомендаций классиков как раз и есть квинтэссенция здравого смысла и их опыта. Согласен, опыт устаревает, но всё же заранее понижать планку только потому что это "старо" -- при таких симптомах прописано ежечасное чтение вышестоящей фразы про Устав.
[/Остапа понесло]

PS. Сделал там себе ошибку в коде, и испортил флудориторику про ROT.. Хых..


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 17:57 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
profiT писал(а):
Из таких записей можно делать только вывод о желании видеть только то что согласуется со своими личными устоявшимися мнениям о чём-либо (без всякого желания [или уже возможности?] их пересматривать):

: r \ a b -- a^2+ab+b^2
DUP + * SWAP DUP * + ;
Это мы тоже можем(я это приводил как привязку к условию), суть не в этом.
Ну приведу другой случай, чуть сложнее: a^3+b*a^2+a*b^2+b^3.
В общем случае все равно с локальными переменными удобнее и быстрее напишешь, а главное без ошибок(так ведь). И это не мое личное мнение - это объективная реальность.
profiT писал(а):
Они и не должны отличаться. Их сознательно для того и замаскировали. Если это нужно -- значит тут играют либо побочные эффекты либо сознательный уход программиста в них (ПЭ).

Жизнь реальной программы долгая - через год возвратясь к исходным текстам, чтобы их изменить, скрытые слова немедленного исполнения могут дать дополнительное затруднение в воспроизведении нюансов работы программы.
profiT писал(а):
Именно поэтому в словах нужно делать её как можно эффективной, краткой и простой. Хотя я разницы в упор не вижу с другими языками. Там тоже функции есть. И тоже параметры в них надо подставлять в определённом порядке (который надо тоже помнить, так ведь?..).

Не совсем так. Параметры там как правило явно указаны рядом с функциями.
profiT писал(а):
Обычно два-три (при этом надо прибегать к абстракции, то есть правильно размечать некоторые числа как двойные для упрощения). Если получается больше -- тут либо явный повод для рефакторизации, либо действительно уместны становятся (локальные) переменные (я не связанный своей религией по рукам и ногам зилот, мне Тора не запрещает).

Даже два-три параметра не просто держатся в памяти, держится динамика перемещения их на стеке - это требует гораздо большего объема внимания в отличие от простого их удержания
profiT писал(а):
А вообще всё проверяется практикой... В программе пригодилось, сберегло время/код -- это хорошо.
.
Мысль здравая, но проверки на практике часто сильно режут время. Поэтому определяться надо по-возможности пораньше. Как говорится - лучше долго запрягать, но потом быстро ехать, а не наоборот.
profiT писал(а):
Здравый смысл, конечно, превыше всего. Но большинство рекомендаций классиков как раз и есть квинтэссенция здравого смысла и их опыта.

Я не про большинство, а про для меня сомнительное меньшинство.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 08, 2007 18:29 
chess писал(а):
Ну приведу другой случай, чуть сложнее: a^3+b*a^2+a*b^2+b^3.

А так не получится разве?..
Код:
: ^2 ( a -- a^3 ) DUP * ;
: s ( a b -- a^3+b*a^2 ) OVER ^2 -ROT + * ;
: r ( a b -- a^3+b*a^2+a*b^2+b^3 ) 2DUP s -ROT s + ;


chess писал(а):
Параметры там как правило явно указаны рядом с функциями.

Хм. Мне почему-то казалось что в Форте тоже параметры указаны рядом с функциями..

Я не говорю что локальные переменные -- это всегда плохо (читайте выше). Я про то что есть же давным-давно предложенные приёмы, как-то рефакторизация кода.


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

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


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

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


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

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