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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 84 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Как бы фортеры восприняли такой синтаксис?
СообщениеДобавлено: Ср май 30, 2007 21:51 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
:shuffle; Поскольку в ВМ реального стека всё равно нет (иммитация) то как фортеры посмотрели бы на ...
ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке (и запись логики в духе С без стековых операций)

скажем, задаём слово

: подставить-две-переменные_на_стеке_в_уравнение_так_и_наоборот

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

Предположим у нас есть виртуальный стек, который на самом деле не стек, а массив, тогда мы могли бы переменные назвать типа

: подставить-две-переменные(х,у) С-style(a*x+ b*y == z || a*y+b*x == z ) IF ... и т д

где скобки после названия слова - начало ИМЕНОВАНИЯ переменных и значит это ( как, кстати и в С )
" первый на стеке сейчас х, второй - у " скобки после С-style означают, что дальнейшее выражение будет рассмотрено как если бы это был С. Т.е. "а умноженное на х плюс b умноженное на у равно z ИЛИ а умноженное на у плюс b умноженное на х равно z"
ведь стековые операции в таком случае явно не нужны.


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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср май 30, 2007 23:34 
А память данных тогда на что?
Все переменные в памяти, параметры передаваемые процедурам - на стеке.

вопрос писал(а):
a*x+ b*y == z || a*y+b*x == z


Компилятор его случайно к такому виду не преобразует?
Код:
over over
a * y * + z =
swap nip
a * b * + z =
temp> OR IF


Ну или что-то подобное. Все равно же со стеком получается...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 31, 2007 00:30 
Не в сети

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

Кроме того, речь об удобстве записи, а не о производительности. Легко ли понять из
Код:
over over
a * y * + z =
swap nip
a * b * + z =
temp> OR IF

что за птица у нас тут.
Кстати я не понял, что даёт этот код - х (икс) вообще отсутствует. А у лежит на стеке, непонятно, зачем его упоминать в декларации слова. Вот, кстати и пример того, насколько сложнее записать то же на форте. Форт позволяет реализовать синтаксис любого языка, отчего не пользоваться? НАГЛЯДНОСТЬ обеспечивается именованостью переменных.
:?

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


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

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
вопрос писал(а):
ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке

Сложно реализовывать. ;) Надо постоянно отслеживать текущую глубину стека. :(
Лучше или локальные переменные SPF\lib\ext\locals.f и выражения Форта
или SPF\devel\~mak\infix.f для целых переменных
или SPF\devel\~ygrek\lib\neilbawd\opg.f для плавающих, синтаксис Бейсика
у меня есть аналог этого ^ для синтаксиса Паскаля, но комментарии пока не соотвествуют... :(
или именованные переменные в отдельной области - кто-то недавно показывал... ;)
Хочу скрестить infix.f и opg.f или еще варианты - но это если будет время... ;)

_________________
With best wishes, in4.


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

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
имхо отрицательно

_________________
SPF


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
in4 писал(а):
вопрос писал(а):
ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке

Сложно реализовывать. ;) Надо постоянно отслеживать текущую глубину стека. :(
почему? нужен указатель на вршину стека, а потом небольшая арифметика указателей.


Цитата:
имхо отрицательно
Причина?


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

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ну как отрицательно, я не собираюсь кричать "не делайте этого не когда"
просто на сегодняшний день я не стану пользоваться таким инструментом
предпочитая самолично смотреть на стек
1. и без этого скрытого в себе инструмента периодически попадаю в тупики
2. задачь в которых этот инструмент давал бы принципиальный выигрыш у меня нет

наверно правильнее использовать вместо "отрицательно" - "не положительно" подразумевая смысл нейтрального отношения :)

_________________
SPF


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

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

Насчет удобства записи. Обратная польская запись удобнее инфиксной, так как не требует скобок и введения приоритетов операций. Скажу больше - ряд выражений в обратной польской записи нельзя перевести в инфиксную запись(наоборот - всегда можно), то есть это более развитый способ записи выражений, чем инфиксная форма. К ней только надо привыкнуть. Стек идеально подходит для вычисления функций в обратной польской записи. Неудобно использовать примитивы манипуляции параметрами на стеке DUP, DROP, SWAP, 2SWAP, ROT и т.п. Я уже писал об определениях с фреймами в теме Компилирующий ассемблер. В ячейках памяти, выделяемых для таких определений можно заводить как локальные, так и глобальные переменные, с которыми можно работать на стеке впрямую используя их имена. В этом случае отпадает необходимость в стековых манипуляциях, а обратная польская запись выражений сохраняется.

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


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

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

вопрос писал(а):
почему? нужен указатель на вршину стека, а потом небольшая арифметика указателей.

Раз было сказано просто "стек" - согласно ANS94 - используем стек данных.
Допустим, есть 2 параметра, a(подвершина) и b(вершина).
какой код положит а на стек после:
  • DUP
  • a
  • b
  • SWAP
  • DROP
    ...
Поскольку при обычной работе вершина стека (ее адрес или эквивалент, если вершина в регистре) постоянно меняется, для отслеживания положения определенной ячейки (a) прийдется ввести изменения во все слова, работающие со стеком, чтобы они учитывали эти изменения. Поэтому относительный адрес не подходит. А про несколько вариантов абсолютного я писал. Есть и другие... ;)

chess писал(а):
Скажу больше - ряд выражений в обратной польской записи нельзя перевести в инфиксную запись(наоборот - всегда можно),
Можно пару-тройку примеров? А то они мне кажутся эквивалентными... ;)

_________________
With best wishes, in4.


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
вопрос писал(а):
Вообще, поскольку речь шла о виртуальной машине, то компилятор преобразовал бы всё это в последовательность ассемблерных комманд


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

chess писал(а):
Обратная польская запись удобнее инфиксной, так как не требует скобок и введения приоритетов операций.


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


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

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

Хм, инструмент как-раз предназначен для избежания тупиков в некоторых случаях, видимо, я плохо изложил мысль. Уравнение (которое "недопонял" или недосмотрел Белый_Тигр) не самое сложное, но как его изложить - в виде уравнения (в строку) или в виде стековых действий - видимо большая разница. Если знать синтаксис С, уравнение, даже довольно большое, читается враз, а то же на форте читается с трудом, даже если знать синтаксис Форта.
Предлагаю всё-таки попытаться записать это на форте, сколько уйдёт времени? на С-синтаксис у меня ушло меньше 30 секунд.
mrack писал(а):
2. задач в которых этот инструмент давал бы принципиальный выигрыш у меня нет

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


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

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


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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 31, 2007 11:22 
вопрос писал(а):
НУ, так никто не спорит, но делать это станет компилятор и во время компиляции, причём это будет промежуточное представление, код результативный не будет похож на это.

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

Но т.к. в Форте допустимо на выходе произвольное число параметров, и не
известно кто убирает параметры со стека ( вызывающая или вызываемая процедура)
то это приводит к невозможности провести формальное преобразовани Forth->C

P.S. Не говоря уж о внутренностях виртуальной Форт машины.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 31, 2007 18:06 
Гость писал(а):
это приводит к невозможности провести формальное преобразовани Forth->C

Здесь ведь речь об обратном преобразовании (C->Forth).

вопрос писал(а):
Уравнение (которое "недопонял" или недосмотрел Белый_Тигр)

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

Код:
quan y to y \ Забираем число Y со стека
quan x to x \ Забираем число X со стека
quan a
quan b
quan z
a x * b y * + z =
a y * b x * + z =
OR
IF
\ ...
THEN


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

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


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

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


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

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