Forth http://fforum.winglion.ru/ |
|
Как бы фортеры восприняли такой синтаксис? http://fforum.winglion.ru/viewtopic.php?f=4&t=776 |
Страница 1 из 6 |
Автор: | вопрос [ Ср май 30, 2007 21:51 ] |
Заголовок сообщения: | Как бы фортеры восприняли такой синтаксис? |
Поскольку в ВМ реального стека всё равно нет (иммитация) то как фортеры посмотрели бы на ... ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке (и запись логики в духе С без стековых операций) скажем, задаём слово : подставить-две-переменные_на_стеке_в_уравнение_так_и_наоборот тут не обойтись без стековых операций сначала в dup - обе переменные нужно продублировать, потом подставить их в уравнение, сравнить ... потом поменять их местами, сравнить ... Предположим у нас есть виртуальный стек, который на самом деле не стек, а массив, тогда мы могли бы переменные назвать типа : подставить-две-переменные(х,у) С-style(a*x+ b*y == z || a*y+b*x == z ) IF ... и т д где скобки после названия слова - начало ИМЕНОВАНИЯ переменных и значит это ( как, кстати и в С ) " первый на стеке сейчас х, второй - у " скобки после С-style означают, что дальнейшее выражение будет рассмотрено как если бы это был С. Т.е. "а умноженное на х плюс b умноженное на у равно z ИЛИ а умноженное на у плюс b умноженное на х равно z" ведь стековые операции в таком случае явно не нужны. |
Автор: | вопрос [ Ср май 30, 2007 22:26 ] |
Заголовок сообщения: | |
Если непонятно, произвольный доступ к стеку как к массиву (в сложных случаях), причём переменные (элементы стека) поименованы нами непосредственно перед доступом в целях наглядности, и больше нигде эти имена не используются. похоже на функции в СИ, при этом скобки не играют роли комментария, а роль элемента декларации функций |
Автор: | white_TigR [ Ср май 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 ] |
Заголовок сообщения: | |
Вообще, поскольку речь шла о виртуальной машине, то компилятор преобразовал бы всё это в последовательность ассемблерных комманд: на стеке возвратов лежала бы просто последовательность команд, которые напрямую адресовали бы переменные без стека данных. в идеале. Кроме того, речь об удобстве записи, а не о производительности. Легко ли понять из Код: over over
a * y * + z = swap nip a * b * + z = temp> OR IF что за птица у нас тут. Кстати я не понял, что даёт этот код - х (икс) вообще отсутствует. А у лежит на стеке, непонятно, зачем его упоминать в декларации слова. Вот, кстати и пример того, насколько сложнее записать то же на форте. Форт позволяет реализовать синтаксис любого языка, отчего не пользоваться? НАГЛЯДНОСТЬ обеспечивается именованостью переменных. |
Автор: | in4 [ Чт май 31, 2007 02:07 ] |
Заголовок сообщения: | |
вопрос писал(а): ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке
Сложно реализовывать. Надо постоянно отслеживать текущую глубину стека. Лучше или локальные переменные SPF\lib\ext\locals.f и выражения Форта или SPF\devel\~mak\infix.f для целых переменных или SPF\devel\~ygrek\lib\neilbawd\opg.f для плавающих, синтаксис Бейсика у меня есть аналог этого ^ для синтаксиса Паскаля, но комментарии пока не соотвествуют... или именованные переменные в отдельной области - кто-то недавно показывал... Хочу скрестить infix.f и opg.f или еще варианты - но это если будет время... |
Автор: | mrack [ Чт май 31, 2007 06:22 ] |
Заголовок сообщения: | |
имхо отрицательно |
Автор: | вопрос [ Чт май 31, 2007 08:35 ] |
Заголовок сообщения: | |
in4 писал(а): вопрос писал(а): ИМЕНОВАННЫЕ ПЕРЕМЕННЫЕ на стеке Сложно реализовывать. Надо постоянно отслеживать текущую глубину стека. Цитата: имхо отрицательно Причина?
|
Автор: | mrack [ Чт май 31, 2007 08:45 ] |
Заголовок сообщения: | |
ну как отрицательно, я не собираюсь кричать "не делайте этого не когда" просто на сегодняшний день я не стану пользоваться таким инструментом предпочитая самолично смотреть на стек 1. и без этого скрытого в себе инструмента периодически попадаю в тупики 2. задачь в которых этот инструмент давал бы принципиальный выигрыш у меня нет наверно правильнее использовать вместо "отрицательно" - "не положительно" подразумевая смысл нейтрального отношения |
Автор: | chess [ Чт май 31, 2007 09:13 ] |
Заголовок сообщения: | |
вопрос писал(а): Кроме того, речь об удобстве записи, а не о производительности.
Насчет удобства записи. Обратная польская запись удобнее инфиксной, так как не требует скобок и введения приоритетов операций. Скажу больше - ряд выражений в обратной польской записи нельзя перевести в инфиксную запись(наоборот - всегда можно), то есть это более развитый способ записи выражений, чем инфиксная форма. К ней только надо привыкнуть. Стек идеально подходит для вычисления функций в обратной польской записи. Неудобно использовать примитивы манипуляции параметрами на стеке DUP, DROP, SWAP, 2SWAP, ROT и т.п. Я уже писал об определениях с фреймами в теме Компилирующий ассемблер. В ячейках памяти, выделяемых для таких определений можно заводить как локальные, так и глобальные переменные, с которыми можно работать на стеке впрямую используя их имена. В этом случае отпадает необходимость в стековых манипуляциях, а обратная польская запись выражений сохраняется. |
Автор: | in4 [ Чт май 31, 2007 10:19 ] |
Заголовок сообщения: | |
in4 писал(а): Сложно реализовывать. Надо постоянно отслеживать текущую глубину стека. вопрос писал(а): почему? нужен указатель на вршину стека, а потом небольшая арифметика указателей. Раз было сказано просто "стек" - согласно ANS94 - используем стек данных. Допустим, есть 2 параметра, a(подвершина) и b(вершина). какой код положит а на стек после:
chess писал(а): Скажу больше - ряд выражений в обратной польской записи нельзя перевести в инфиксную запись(наоборот - всегда можно), Можно пару-тройку примеров? А то они мне кажутся эквивалентными...
|
Автор: | Mihail [ Чт май 31, 2007 10:28 ] |
Заголовок сообщения: | |
вопрос писал(а): Вообще, поскольку речь шла о виртуальной машине, то компилятор преобразовал бы всё это в последовательность ассемблерных комманд Без промежуточного представления в польской записи все-равно не обойтись. chess писал(а): Обратная польская запись удобнее инфиксной, так как не требует скобок и введения приоритетов операций.
Т.к. при польской записи операции не являются разделителями, в длинных выражениях, нам приходится мыслинно искать границы между операндами. Потробуй упростить выражение в польской записи. |
Автор: | вопрос [ Чт май 31, 2007 10:55 ] |
Заголовок сообщения: | |
mrack писал(а): ну как отрицательно, я не собираюсь кричать "не делайте этого не когда" просто на сегодняшний день я не стану пользоваться таким инструментом предпочитая самолично смотреть на стек 1. и без этого скрытого в себе инструмента периодически попадаю в тупики Хм, инструмент как-раз предназначен для избежания тупиков в некоторых случаях, видимо, я плохо изложил мысль. Уравнение (которое "недопонял" или недосмотрел Белый_Тигр) не самое сложное, но как его изложить - в виде уравнения (в строку) или в виде стековых действий - видимо большая разница. Если знать синтаксис С, уравнение, даже довольно большое, читается враз, а то же на форте читается с трудом, даже если знать синтаксис Форта. Предлагаю всё-таки попытаться записать это на форте, сколько уйдёт времени? на С-синтаксис у меня ушло меньше 30 секунд. mrack писал(а): 2. задач в которых этот инструмент давал бы принципиальный выигрыш у меня нет
Ну, задачи - чуть позже, ухожу до вечера ... Но понятно, что отсутствие стековых операций должно сокращать время |
Автор: | вопрос [ Чт май 31, 2007 11:01 ] |
Заголовок сообщения: | |
Mihail писал(а): вопрос писал(а): Вообще, поскольку речь шла о виртуальной машине, то компилятор преобразовал бы всё это в последовательность ассемблерных комманд Без промежуточного представления в польской записи все-равно не обойтись. есть разница между парой суммирований переменных по вычисленному указателю с умножением их же на константу и теми же действиями, перемежаемыми стековыми операциями вместо вычисления указателей? |
Автор: | Гость [ Чт май 31, 2007 11:22 ] |
Заголовок сообщения: | |
вопрос писал(а): НУ, так никто не спорит, но делать это станет компилятор и во время компиляции, причём это будет промежуточное представление, код результативный не будет похож на это.
Для использования Си синтаксиса в Форте, при понимании различий нет преград. если ограничить количество передаваемых параметров из процедуры 1-им. ( может быть и указатель), то задача, в целом решается. Но т.к. в Форте допустимо на выходе произвольное число параметров, и не известно кто убирает параметры со стека ( вызывающая или вызываемая процедура) то это приводит к невозможности провести формальное преобразовани Forth->C P.S. Не говоря уж о внутренностях виртуальной Форт машины. |
Автор: | white_TigR [ Чт май 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 |
Страница 1 из 6 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |