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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 159 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 11  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 04:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
forther писал(а):
т.е. вы просто все то, что я делал на стеке данных делаете на стеке адресов ...

нет, хитрее. Стек данных остается для данных, а на адресыный стек попадают только адреса.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 04:22 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
считаем количество элементов в связном списке обычно:
: nodes ( addr --> # ) 0 BEGIN OVER WHILE 1 + SWAP node> SWAP REPEAT NIP ;

и на трех стеках:
: nodes ( a: addr --> # )  0 BEGIN ?NIL WHILE 1 +  node> REPEAT ADROP ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 380
Благодарил (а): 1 раз.
Поблагодарили: 10 раз.
Код:
: nodes ( a -- n )
  -1 for
    ?nil if i invert leave then node>
  next ;


Внутри цикла у меня выполняется 4 слова ( ?nil if node> next ) против ваших 6 -и ( ?nil while 1 + node> repeat ).

Опять "классический" вариант быстрее новейшей технологии.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 10:21 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Хищник писал(а):
вопрос писал(а):
Нет, ну это возмутительно! Хищник тут недавно кодил на С++ - зачем там переопределяются операторы?

В С++ операторы обычно расширяются, а не переопределяются. Переопределение попахивает "хакерско-вредительскими" define-ами вида #define TRUE 0 #define FALSE -1, после чего перестают работать программы, рассчитывающие на обратное. А перегрузка (overloading) операторов обеспечивает их полиморфизм - корректность действий программы наблюдается при большем числе вариантов сочетаний операндов. А что с адресным стеком получается? Во-первых, дополнительный синтаксис, а никакой не полиморфизм, во-вторых, из-под уже освоенного стиля разработки выбивается фундамент.

Игра словами...
Хищнику отвечает Бьерн Страустрап. Он, кстати, подобрал и подходящий эпиграф
Цитата:
* ГЛАВА 7


Если я выбираю слово, оно значит только то,
что я решу, ни больше и ни меньше.
- Шалтай Болтай


Глава содержит описание механизма перегрузки операций в С++.
Программист может задать интерпретацию операций, когда они
применяются к объектам определенного класса. Помимо арифметических,
логических и операций отношения можно переопределить вызов
функций (), индексацию [], косвенное обращение ->, а также
присваивание и инициализацию. Можно определить явные и скрытые
преобразования между пользовательскими и основными типами. Показано,
как определить класс, объект которого можно копировать и
уничтожать только с помощью специальных, определенных пользователем
функций.


" Помимо арифметических,
логических и операций отношения
можно переопределить вызов
функций (), индексацию [], косвенное обращение ->,"
http://lib.ru/CPPHB/cpptut.txt


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
forther писал(а):
Внутри цикла у меня выполняется 4 слова ( ?nil if node> next ) против ваших 6 -и ( ?nil while 1 + node> repeat ).
Опять "классический" вариант быстрее новейшей технологии.

Все-таки надо сравнивать решения с одинаковыми конструкциями управления.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:00 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Проблема, скорее в пресловутом правиле "5 плюс-минус 2"
Удержать в голове состояние двух стеков - еще как-то можно, если там по 2-3 элемента.
Если стеков будет 3 - возникнут проблемы, и тогда начнется "боольшая головная боль"
с пониманием того, а что же делает слово с кучей разных DUP SWAP ADUP ASWAP и т.д. и т.п.

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

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:22 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
WingLion писал(а):
Проблема, скорее в пресловутом правиле "5 плюс-минус 2"

оно тут не причем.

WingLion писал(а):
Удержать в голове состояние двух стеков - еще как-то можно, если там по 2-3 элемента.
Если стеков будет 3 - возникнут проблемы, и тогда начнется "боольшая головная боль"
с пониманием того, а что же делает слово с кучей разных DUP SWAP ADUP ASWAP и т.д. и т.п.

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

WingLion писал(а):
И с ходу умозрительно "определить эффективность" подобного нововведения попросту нереально.

вот для этого и поднята эта тема. Чтобы все могли высказать скопившиеся умные мысли в одной теме :))

WingLion писал(а):
манипулировать надо и адресами, и данными - лежат они в одной куче или в двух кучах -
особой разницы как-то не видится.

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

WingLion писал(а):
Операции с ними все равно вперемешку, и для головы будет только больше поводов для путаницы.

да данные лежат отдельно. И главное, код не будет меняться в случае изменения формата адресной ссылки!

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:37 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
Но кроме ВМ есть еще и куча другого кода, который сильно изменится. Написание новой системы с такими серьезными изменениями не так тривиальны и легки. Это не то же самое, что просто добавить еще один стек в Форт.

Нет, это именно то же самое. Слова Форта не слишком сильно связаны друг с другом, и именно менять в системе практически ничего и не придется.
mOleg писал(а):
причем появится две конструкции DO и ADO которые будут пробегать в одном случае по диапазону чисел, а в другом по диапазону адресов...

А если мне надо заполнить массив числами по нарастанию, то использовать DO или ADO? В любом случае придется использовать "чужой" тип данных. У меня код вида
Код:
10 0 DO I X[] I CELLS + ! LOOP.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:39 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
вопрос писал(а):
Помимо арифметических,
логических и операций отношения можно переопределить вызов
функций (), индексацию [], косвенное обращение ->,"
http://lib.ru/CPPHB/cpptut.txt

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:46 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
mOleg писал(а):причем появится две конструкции DO и ADO которые будут пробегать в одном случае по диапазону чисел, а в другом по диапазону адресов...

А если мне надо заполнить массив числами по нарастанию, то использовать DO или ADO? В любом случае придется использовать "чужой" тип данных. У меня код вида

Код:10 0 DO I X[] I CELLS + ! LOOP.


кстати да, вопрос интересный. впрочем:
: sample ( a: addr --> ) 
10 0 DO I ADUP ! \ сохранить значение счетчика цикла в ячейку
CELL A+ \ увеличить указатель на вершине стека адресов
LOOP ADROP ;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:53 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
кстати да, вопрос интересный. впрочем:

Если ADUP копирует число со стека данных на стек адресов, первый же ! даст GPF - по нулевому адресу писать нельзя.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 14:59 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
Если ADUP копирует число со стека данных на стек адресов

нет, дублирует число на стеке адресов

а слово ! берет адрес со стека адресов а данные со стека данных

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 15:03 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Ну тогда, если брать адрес, лежащий на стеке

Код:
10 0 DO I OVER ! CELL+ LOOP DROP


То есть все равно все пишется, но лишних телодвижений нет.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Хищник писал(а):
Ну тогда, если брать адрес, лежащий на стеке
Код:10 0 DO I OVER ! CELL+ LOOP DROP

да, так, только вместо OVER идет ADUP и даже если адрес будет представлен двойным числом код не изменится, в то время как в "классическом" варианте придется переписывать код.

Хищник писал(а):
То есть все равно все пишется, но лишних телодвижений нет.

а их, лишних, в любом случае нет, хотя, если ! не будет удалять значение с вершины стека, то операция ADUP может уйти, а если будет еще и автоинкремент, то уйдет и CELL A+ . Причем на классическом Форте так не получится, всеравно будут OVER-ы и SWAP-ы

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 07, 2010 15:23 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
mOleg писал(а):
и даже если адрес будет представлен двойным числом код не изменится

А если тройным, с инвертированным вторым байтом... :)) Зачем придумывать сложности какому-то абстрактному "классическому" Форту, если есть масса возможностей этих сложностей избежать? Кому от этого будет лучше, и станут ли Форты без адресного стека (относимые в контексте обсуждения к классическим) в чем-то ущербными?
mOleg писал(а):
а если будет еще и автоинкремент, то уйдет и CELL A+

Код:
addr count LINSPACE

Если уж на то пошло (это из Matlab). Но на все случаи жизни не напастись "абсолютно правильных" решений, поэтому и существуют минимальные наборы в языках программирования, с помощью которых и выражается то, что нужно в данный момент. Причем я видел достаточно много программирующих людей, которые стремились непременно использовать побольше возможностей языка, и еще искали, куда бы в их программу приткнуть то, что они прочитали, и практически никто не то что хорошего кода не писал, а и просто не доводил программы до приемлемого уровня.


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

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


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

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


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

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