Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт сен 20, 2018 19:04

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Quark: стековые фреймы
СообщениеДобавлено: Сб янв 03, 2009 02:30 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
После раздумий на тему "минимум усилий - максимум эффекта" появилась вот такая альтернатива локальным переменным.

Код:
FRAME{   }FRAME
- "фреймовые скобки". FRAME{ запоминает на специальном стеке фреймов текущий DEPTH. }FRAME убирает число со стека фреймов. Внутри таких скобок будут правильно работать слова
Код:
ARG0 ARG1 ARG2 ARG3 ARG4
Каждое из них кладет на стек абсолютный адрес ячейки стека с соответствующим смещением от вершины, каким оно было на момент вызова FRAME{. Таким образом, появляется некая дешевая альтернатива локальным переменным, поскольку появляется возможность обращаться внутри слова к переданным ему параметрам одинаковым образом.

Код:
: TEST
FRAME{
  ARG0 @
  ARG1 @
  ARG2 @
}FRAME
;


1 2 3 TEST позволит постоянно обращаться к параметру "3" через ARG0 @, к параметру "2" через ARG1 @, и к параметру "1" через ARG2 @


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
это уже формат вызова функции в С++ и т.п.
вопрос только в одном - если мы модифицировали эти "переменные" - которые лежели на стеке до вызова функции - что с ними
Цитата:
ARG0 @
ARG1 @
ARG2 @
дальше происходит?

Ну скажем

0 VALUE V1

: WORD_A
V1
ARG0 < ... и.т.д. - понятно ... ;

а вот если
: WORD_A
DROP DROP
ARG1 < ... ;
вот тут что получится?

т.е. если глубина стека уменьшена - что выдаст ARG1, особенно если реальное его место уже ниже (выше) вершины стека?

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
А вот ничего "гарантированно надежного" с ними не происходит! ARG0 просто-напросто кладет на стек адрес верхнего из чисел, которые были на стеке в момент вызова FRAME{. Все! Дальше идет только наша интерпретация поведения этих слов, и утверждение, что в определенных условиях оно будет похоже на использование формальных параметров внутри функций. Если записать что-то на место ARG0 (хоть бы и штатно - ARG0 !), то там окажется новое значение. Если уменьшить глубину стека - аналогично, будут "контролируемые неприятности", параметры поплывут. ARG0.. ARGn это просто набор фиксированных адресов, относящихся к стековому кадру.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
В этом случае принцип действия отличается от "локальных переменных" - обеспечить доступ по имени к определённому "нечто" - значение которого может меняться - это пожалуйста, в пределах функции (локуса - места),

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

В форте - до предела просто - если вершина стека "съедает" адрес переменной, компилятор копирует её в запасное место и далее по слову обеспечивает - компилирует - доступ до неё как до этого запасного места, которое очищается при выходе из слова.
ИМХО

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
вопрос писал(а):
В форте - до предела просто - если вершина стека "съедает" адрес переменной, компилятор копирует её в запасное место и далее по слову обеспечивает - компилирует - доступ до неё как до этого запасного места, которое очищается при выходе из слова.
ИМХО

Ну вот и появляется спотолочная величина "размер запасного места". Еще раз обращаю внимание, что тема началась с фразы "минимум усилий - максимум эффекта". С компиляцией кучи всяких вспомогательных слов усилий становится много больше этого минимума. И зачем? Чтобы было удобнее с сишниками спорить, доказывая, что "в Форте тоже можно"?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 03, 2009 18:56 
Не в сети
Moderator
Moderator
Аватара пользователя

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

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
10% усилий, 90% результата. Стоит ли тратить остальные 90% усилий, чтобы получить остальные 10% результата? Локалсы в их ANS-изложении слишком похожи на реверанс в сторону Си, чтобы не Сильно ругали :) Заиметь в Форте обязательную работу со стековыми кадрами? Получить лихорадочное жонглирование ошметками памяти? Нет уж, спасибо.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
лихорадочное? а как же в других компиляторах :o

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp. Кроме того, нет проблем с именованием - имена локальных переменных точно так же помещаются в таблицу символов. А в Форте как? Помещать имена в общий словарь? Помещать в какую-то отдельную область памяти (какую? сколько ей места дать? что делать, если оно кончилось? как модифицировать поиск, чтобы сначала посмотреть локальные параметры?)? Или все-таки адресовать переданные параметры относительно вершины стека, пусть и с потенциальными проблемами устойчивости против целенаправленного слома?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 03, 2009 22:11 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp.
именно, но там нет опасности запортить этот кадр. И нет дополнительных усилий для сохранения кадра.
Как работают параметры? В смысле, что происходит, когда вызывается ARG0 ? По крайней мере можно включить в вызов параметров предупреждение, что вершина стека сместилась дальше, чем вызываемый адрес.

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
вопрос писал(а):
именно, но там нет опасности запортить этот кадр. И нет дополнительных усилий для сохранения кадра.

Поскольку есть ограничения на использование кадра, нет и опасности. О чем речь-то? Я не делаю "как в Си", я делаю "минимально по сложности, максимально по эффекту".
вопрос писал(а):
Как работают параметры? В смысле, что происходит, когда вызывается ARG0 ?

Смотрится верхнее число со стека FrameStack, это Depth на момент вызова FRAME{ (т.е. обычно вход в слово, хотя можно изменить баланс стека, но запомнено будет все равно то, что есть). ARG0 положит на стек адрес вершины стека на момент вызова FRAME{, ARG1 = ARG0 - 4, ARG2 = ARG0 - 8 и т.д.


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

Можно включить, а можно и отнестись как к данности. Я ориентировался в большой степени на слова для работы с графическими примитивами, когда в качестве параметров передается приличный список координат, размеров, цветов, стилей и тому подобного. Там все эти параметры остаются на стеке длительное время, практически на протяжении всего слова, удаляясь серией DROP в конце.


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4945
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
Хищник писал(а):
Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp. Кроме того, нет проблем с именованием - имена локальных переменных точно так же помещаются в таблицу символов. А в Форте как? Помещать имена в общий словарь? Помещать в какую-то отдельную область памяти (какую? сколько ей места дать? что делать, если оно кончилось? как модифицировать поиск, чтобы сначала посмотреть локальные параметры?)? Или все-таки адресовать переданные параметры относительно вершины стека, пусть и с потенциальными проблемами устойчивости против целенаправленного слома?

а так. Не изобретать самому, а посмотреть как уже сделано в различных форт-системах.
В том же СПФ, к примеру,
В форке тоже оригинальный вариант,
SwiftForth и друге буржуйские форты поддерживают локалсы.
Более того, есть даже некий стандарт на них.

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


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
mOleg писал(а):
а так. Не изобретать самому, а посмотреть как уже сделано в различных форт-системах.

На форт-системах свет клином не сошелся.
mOleg писал(а):
В том же СПФ, к примеру,
В форке тоже оригинальный вариант,
SwiftForth и друге буржуйские форты поддерживают локалсы.

А то я всего этого не видел :))
mOleg писал(а):
Более того, есть даже некий стандарт на них.

Идущий лесом.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
У Хищника плохое настроение. Фрейм - тоже неплохое решение. А локальные переменные - как раз компромисс между стеком и более высокоуровневыми языками.

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 04, 2009 19:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6403
Благодарил (а): 14 раз.
Поблагодарили: 100 раз.
вопрос писал(а):
У Хищника плохое настроение. Фрейм - тоже неплохое решение. А локальные переменные - как раз компромисс между стеком и более высокоуровневыми языками.

Ну так и получается "зачем бузина в огороде, есть стандартом давно определен дядька в Киеве?". :D Зачем искать компромисс в отсутствие конфликта? Локальные переменные относятся к другому классу механизмов, и не скажу, что они кардинально улучшают ситуацию. Да, оно "можно" (волшебное слово) и в Форте, только по шкале трудоемкость/эффект занимает далеко не лидирующие позиции.


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

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


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

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


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

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