Forth http://fforum.winglion.ru/ |
|
Quark: стековые фреймы http://fforum.winglion.ru/viewtopic.php?f=23&t=1832 |
Страница 1 из 2 |
Автор: | Hishnik [ Сб янв 03, 2009 02:30 ] |
Заголовок сообщения: | Quark: стековые фреймы |
После раздумий на тему "минимум усилий - максимум эффекта" появилась вот такая альтернатива локальным переменным. Код: 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 ] |
Заголовок сообщения: | |
это уже формат вызова функции в С++ и т.п. вопрос только в одном - если мы модифицировали эти "переменные" - которые лежели на стеке до вызова функции - что с ними Цитата: ARG0 @ дальше происходит?
ARG1 @ ARG2 @ Ну скажем 0 VALUE V1 : WORD_A V1 ARG0 < ... и.т.д. - понятно ... ; а вот если : WORD_A DROP DROP ARG1 < ... ; вот тут что получится? т.е. если глубина стека уменьшена - что выдаст ARG1, особенно если реальное его место уже ниже (выше) вершины стека? |
Автор: | Hishnik [ Сб янв 03, 2009 03:04 ] |
Заголовок сообщения: | |
А вот ничего "гарантированно надежного" с ними не происходит! ARG0 просто-напросто кладет на стек адрес верхнего из чисел, которые были на стеке в момент вызова FRAME{. Все! Дальше идет только наша интерпретация поведения этих слов, и утверждение, что в определенных условиях оно будет похоже на использование формальных параметров внутри функций. Если записать что-то на место ARG0 (хоть бы и штатно - ARG0 !), то там окажется новое значение. Если уменьшить глубину стека - аналогично, будут "контролируемые неприятности", параметры поплывут. ARG0.. ARGn это просто набор фиксированных адресов, относящихся к стековому кадру. |
Автор: | вопрос [ Сб янв 03, 2009 04:55 ] |
Заголовок сообщения: | |
В этом случае принцип действия отличается от "локальных переменных" - обеспечить доступ по имени к определённому "нечто" - значение которого может меняться - это пожалуйста, в пределах функции (локуса - места), однако это отличие проявлояется только в случае перехода значения стека ... Однако, эту проблему можно обойти, опираясь на то, что л. перем. применяются только для компиляции одного слова, что значит, что в процессе компиляции можно отслеживать, не "уходит" ли переменная из зоны допустимых адресов. В форте - до предела просто - если вершина стека "съедает" адрес переменной, компилятор копирует её в запасное место и далее по слову обеспечивает - компилирует - доступ до неё как до этого запасного места, которое очищается при выходе из слова. ИМХО |
Автор: | Hishnik [ Сб янв 03, 2009 14:14 ] |
Заголовок сообщения: | |
вопрос писал(а): В форте - до предела просто - если вершина стека "съедает" адрес переменной, компилятор копирует её в запасное место и далее по слову обеспечивает - компилирует - доступ до неё как до этого запасного места, которое очищается при выходе из слова.
ИМХО Ну вот и появляется спотолочная величина "размер запасного места". Еще раз обращаю внимание, что тема началась с фразы "минимум усилий - максимум эффекта". С компиляцией кучи всяких вспомогательных слов усилий становится много больше этого минимума. И зачем? Чтобы было удобнее с сишниками спорить, доказывая, что "в Форте тоже можно"? |
Автор: | mOleg [ Сб янв 03, 2009 18:56 ] |
Заголовок сообщения: | |
мнда, от сделанного до локалсов уже не далеко. А локалсы еще и удобнее в использовании... так что стоит, мне кажется, думать о написании локалсов |
Автор: | Hishnik [ Сб янв 03, 2009 19:03 ] |
Заголовок сообщения: | |
10% усилий, 90% результата. Стоит ли тратить остальные 90% усилий, чтобы получить остальные 10% результата? Локалсы в их ANS-изложении слишком похожи на реверанс в сторону Си, чтобы не Сильно ругали Заиметь в Форте обязательную работу со стековыми кадрами? Получить лихорадочное жонглирование ошметками памяти? Нет уж, спасибо. |
Автор: | вопрос [ Сб янв 03, 2009 20:58 ] |
Заголовок сообщения: | |
лихорадочное? а как же в других компиляторах |
Автор: | Hishnik [ Сб янв 03, 2009 21:39 ] |
Заголовок сообщения: | |
Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp. Кроме того, нет проблем с именованием - имена локальных переменных точно так же помещаются в таблицу символов. А в Форте как? Помещать имена в общий словарь? Помещать в какую-то отдельную область памяти (какую? сколько ей места дать? что делать, если оно кончилось? как модифицировать поиск, чтобы сначала посмотреть локальные параметры?)? Или все-таки адресовать переданные параметры относительно вершины стека, пусть и с потенциальными проблемами устойчивости против целенаправленного слома? |
Автор: | вопрос [ Сб янв 03, 2009 22:11 ] |
Заголовок сообщения: | |
Цитата: Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp. именно, но там нет опасности запортить этот кадр. И нет дополнительных усилий для сохранения кадра.
Как работают параметры? В смысле, что происходит, когда вызывается ARG0 ? По крайней мере можно включить в вызов параметров предупреждение, что вершина стека сместилась дальше, чем вызываемый адрес. |
Автор: | Hishnik [ Сб янв 03, 2009 23:27 ] |
Заголовок сообщения: | |
вопрос писал(а): именно, но там нет опасности запортить этот кадр. И нет дополнительных усилий для сохранения кадра. Поскольку есть ограничения на использование кадра, нет и опасности. О чем речь-то? Я не делаю "как в Си", я делаю "минимально по сложности, максимально по эффекту". вопрос писал(а): Как работают параметры? В смысле, что происходит, когда вызывается ARG0 ? Смотрится верхнее число со стека FrameStack, это Depth на момент вызова FRAME{ (т.е. обычно вход в слово, хотя можно изменить баланс стека, но запомнено будет все равно то, что есть). ARG0 положит на стек адрес вершины стека на момент вызова FRAME{, ARG1 = ARG0 - 4, ARG2 = ARG0 - 8 и т.д. вопрос писал(а): По крайней мере можно включить в вызов параметров предупреждение, что вершина стека сместилась дальше, чем вызываемый адрес.
Можно включить, а можно и отнестись как к данности. Я ориентировался в большой степени на слова для работы с графическими примитивами, когда в качестве параметров передается приличный список координат, размеров, цветов, стилей и тому подобного. Там все эти параметры остаются на стеке длительное время, практически на протяжении всего слова, удаляясь серией DROP в конце. |
Автор: | mOleg [ Вс янв 04, 2009 18:40 ] |
Заголовок сообщения: | |
Хищник писал(а): Я не знаю насчет всех других, но как вариант используется адресация параметров относительно стекового кадра, передаваемого, например, в ebp. Кроме того, нет проблем с именованием - имена локальных переменных точно так же помещаются в таблицу символов. А в Форте как? Помещать имена в общий словарь? Помещать в какую-то отдельную область памяти (какую? сколько ей места дать? что делать, если оно кончилось? как модифицировать поиск, чтобы сначала посмотреть локальные параметры?)? Или все-таки адресовать переданные параметры относительно вершины стека, пусть и с потенциальными проблемами устойчивости против целенаправленного слома?
а так. Не изобретать самому, а посмотреть как уже сделано в различных форт-системах. В том же СПФ, к примеру, В форке тоже оригинальный вариант, SwiftForth и друге буржуйские форты поддерживают локалсы. Более того, есть даже некий стандарт на них. |
Автор: | Hishnik [ Вс янв 04, 2009 18:53 ] |
Заголовок сообщения: | |
mOleg писал(а): а так. Не изобретать самому, а посмотреть как уже сделано в различных форт-системах. На форт-системах свет клином не сошелся. mOleg писал(а): В том же СПФ, к примеру, В форке тоже оригинальный вариант, SwiftForth и друге буржуйские форты поддерживают локалсы. А то я всего этого не видел mOleg писал(а): Более того, есть даже некий стандарт на них.
Идущий лесом. |
Автор: | вопрос [ Вс янв 04, 2009 19:43 ] |
Заголовок сообщения: | |
У Хищника плохое настроение. Фрейм - тоже неплохое решение. А локальные переменные - как раз компромисс между стеком и более высокоуровневыми языками. |
Автор: | Hishnik [ Вс янв 04, 2009 19:55 ] |
Заголовок сообщения: | |
вопрос писал(а): У Хищника плохое настроение. Фрейм - тоже неплохое решение. А локальные переменные - как раз компромисс между стеком и более высокоуровневыми языками.
Ну так и получается "зачем бузина в огороде, есть стандартом давно определен дядька в Киеве?". Зачем искать компромисс в отсутствие конфликта? Локальные переменные относятся к другому классу механизмов, и не скажу, что они кардинально улучшают ситуацию. Да, оно "можно" (волшебное слово) и в Форте, только по шкале трудоемкость/эффект занимает далеко не лидирующие позиции. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |