Forth
http://fforum.winglion.ru/

3-х стековая виртуальная машина. размышления.
http://fforum.winglion.ru/viewtopic.php?f=2&t=2375
Страница 1 из 11

Автор:  mOleg [ Ср янв 06, 2010 23:06 ]
Заголовок сообщения:  3-х стековая виртуальная машина. размышления.

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

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

ну, и для затравки команды ВМ

DUP ( d: x --> d: x x )
DROP ( d: a b --> d: b )
OVER ( d: a b --> d: a b a )
SWAP ( d: a b --> d: b a )
NIP ( d: a b --> d: b )
+ ( d: a b --> d: a+b )
- ( d: a b --> d: a-b )
* ( d: a b --> d: a*b )
/ ( d: a b --> d: a/b )

ADROP ( a: a --> )
ASWAP ( a: a1 a2 --> a: a2 a1 )
ADUP ( a: a --> a a )
AOVER ( a: a1 a2 --> a: a1 a2 a1 )
ANIP ( a: a1 a2 --> a: a2 )
A@ ( a: a1 --> a: a2 )
A! ( a: a1 a2 --> )

A+ ( a: addr d: u --> a: addr+u )
@ ( a: addr --> d: n )
! ( a: addr d: n --> )

A>R ( a: a --> r: a )
R>A ( r: a --> a: a )

>A ( d: n --> a: n )
>R ( d: n --> r: n )

EXECUTE ( a: xt --> )

и т.д.

где,
a: - стек адресов
d: - стек данных
r: - стек возвратов

такие вот мысли

Автор:  WingLion [ Ср янв 06, 2010 23:40 ]
Заголовок сообщения: 

mOleg писал(а):
>A ( d: n --> a: n )
>R ( d: n --> r: n )


явно не хватает
A> (a: n --> d: n)
R> (r: n --> d: n)


mOleg писал(а):
A+ ( a: addr d: u --> a: addr+u )
@ ( a: addr --> d: n )
! ( a: addr d: n --> )


полагаю, сильно потребуется еще и
A++ ( a: addr --> a: addr+1 )
A-- ( a: addr --> a: addr-1 )

Автор:  вопрос [ Ср янв 06, 2010 23:47 ]
Заголовок сообщения: 

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

Автор:  Hishnik [ Ср янв 06, 2010 23:47 ]
Заголовок сообщения: 

Только если будет A> (или A>R R>, что то же самое), тогда появится и : '! A> ! ; И тогда какой смысл в стеке, который, вроде бы, призван обеспечивать контроль типов?

Автор:  mOleg [ Ср янв 06, 2010 23:49 ]
Заголовок сообщения: 

Хищник писал(а):
И тогда какой смысл в стеке, который, вроде бы, призван обеспечивать контроль типов?

нет, цель не контроль типов.

Автор:  mOleg [ Ср янв 06, 2010 23:51 ]
Заголовок сообщения: 

WingLion писал(а):
явно не хватает
A> (a: n --> d: n)
R> (r: n --> d: n)

да, действительно забыл.

WingLion писал(а):
полагаю, сильно потребуется еще и
A++ ( a: addr --> a: addr+1 )
A-- ( a: addr --> a: addr-1 )

а это сомнительно, скорее надо что-то с такой стековой картинкой ( a: addr --> d: n a: addr+cell ) то есть чтение с автоинкрементом\декрементом и запись.

Автор:  вопрос [ Ср янв 06, 2010 23:52 ]
Заголовок сообщения: 

Хищник писал(а):
Только если будет A> (или A>R R>, что то же самое), тогда появится и : '! A> ! ; И тогда какой смысл в стеке, который, вроде бы, призван обеспечивать контроль типов?


Контроль типов - не единственная цель, если адрес лежит рядом с данными, он элементарно "путается под ногами" ИМХО

Автор:  Hishnik [ Ср янв 06, 2010 23:52 ]
Заголовок сообщения: 

mOleg писал(а):
нет, цель не контроль типов.

А тогда зачем заставлять программиста думать, на тот ли стек он кладет?

Автор:  mOleg [ Ср янв 06, 2010 23:52 ]
Заголовок сообщения: 

WingLion писал(а):
явно не хватает
A> (a: n --> d: n)
R> (r: n --> d: n)

да, действительно забыл.

WingLion писал(а):
полагаю, сильно потребуется еще и
A++ ( a: addr --> a: addr+1 )
A-- ( a: addr --> a: addr-1 )

а это сомнительно, скорее надо что-то с такой стековой картинкой ( a: addr --> d: n a: addr+cell ) то есть чтение с автоинкрементом\декрементом и запись.

Автор:  mOleg [ Ср янв 06, 2010 23:56 ]
Заголовок сообщения: 

Хищник писал(а):
mOleg писал(а):нет, цель не контроль типов.
А тогда зачем заставлять программиста думать, на тот ли стек он кладет?

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

Автор:  вопрос [ Ср янв 06, 2010 23:56 ]
Заголовок сообщения: 

Хищник писал(а):
mOleg писал(а):
нет, цель не контроль типов.

А тогда зачем заставлять программиста думать, на тот ли стек он кладет?

Это точно экономнее, чем просчитывать, что и где вперемешку лежит на одном стеке

Автор:  mOleg [ Чт янв 07, 2010 00:03 ]
Заголовок сообщения: 

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

Автор:  Hishnik [ Чт янв 07, 2010 00:55 ]
Заголовок сообщения: 

вопрос писал(а):
Это точно экономнее, чем просчитывать, что и где вперемешку лежит на одном стеке

А что, уже есть примеры такого кода? Потому что как писать на Форте, прекрасно понятно, а вот как писать на таком диалекте, где ! @ делают не то, к чему привык программист? И вместо перемешивания чисел на одном стеке будет перемешивание стеков - куда как проще :))

Автор:  Hishnik [ Чт янв 07, 2010 00:58 ]
Заголовок сообщения: 

mOleg писал(а):
трюки, подобные открытому адресному интерпретатору, окажутся более переносимыми, будут меньше зависеть от типа ШК, методики организации памяти

Вот не надо трюков. Когда появляются "трюки" это означает только то, что простыми и понятными средствами решение не выражается. А если оно уже на этапе создания обложено трюками, то что же будет, когда возникнут сложности в реализации прикладной программы? Это еще и про нетривиальную основу языка помнить?

Автор:  вопрос [ Чт янв 07, 2010 01:28 ]
Заголовок сообщения: 

Хищник писал(а):
вопрос писал(а):
Это точно экономнее, чем просчитывать, что и где вперемешку лежит на одном стеке

А что, уже есть примеры такого кода? Потому что как писать на Форте, прекрасно понятно, а вот как писать на таком диалекте, где ! @ делают не то, к чему привык программист? И вместо перемешивания чисел на одном стеке будет перемешивание стеков - куда как проще :))

Странная эмоциональность :)) - ведь идея не нова и не раз обсуждалась.
Вообще - программист ни к чему не привык - он сидит и считает, туда ли легло "а в с" и помнит ли он о необходимости их разыменовать.
Примеры кода надеюсь получить...

Чем отличается ситуация, когда программист создал дополнительный стек с некоторым форматом и переопределил
@ ! от ситуации, когда это сделано с самого начала? "Гибкость форта разбилась о шаблонность программиста"

Страница 1 из 11 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/