Andrey Slepuhin (pooh@msu.ru)
Thu, 09 Dec 1999 16:21:20 +0300
Arkady Klimov wrote:
[snip]
> > > > а) Новые команды LEIS/LVIS/LES,REIS/RVIS/RES - семантика
> > > > следующая (на примере LEIS/LVIS/LES):
> > > > < LEIS m : LES : C, S, D, E > =>
> > > > { S/m = Oe и Oe : S =S' } < C, S', (LES : C, S') : D, E>
> > > > < LVIS m : LES : C, S, D, E > =>
> > > > { S/m = Oe } < LES : C, Oe : S, D, E>
> > > > < LES : C, OtOe' : S, D, E > => { Oe' : S = S' } < C, S', (LES
> :
> > > > C : S') D, E>
> > > > < LES : C, p : S, D, E > => < FAIL : [], S, D, E>
> > > - это оптимизированные команды удлинения. Используются в случае, когда
> > > просмотренная часть (e1 в образце e1 sA e2) далее в теле функции не
> > > используется.
> > > (Если конечно, я это правильно понял. Андрей, поправь меня, если это не
> > > так).
> >
> > Абсолютно точно. На самом деле я бы кое-что поменял в командах
> > отщепления - уж больно они запутанные, и мне совсем не нравится
> > требование, чтобы LEI/LE всегда были рядом. На самом деле все
> > можно сделать более прозрачно с явными ALT'ами, и обойтись вообще
> > без команд типа LEI. Если что - я могу подробно описать то, как я
> > все это вижу.
> Да, это интересно. Если получается, это будет, наверно, лучше. Напиши,
> пожалуйста.
LE предлагается изменить следующим образом (я обзову эту команду LX,
чтобы
не было путаницы):
< LX : C, OtOe" : Oe' : S, D, E > => < C, Oe" : Oe'Ot : S, D, E >
< LX : C, p : Oe : S, D, E > => < FAIL : [], S, D, E >
Тогда пара команд LEI m : LE заменяется на
PUSHEMP
PUSH m+1
JUMP L2
LABEL L1
LX
LABEL L2
ALT L1
...
A LVI m : LE заменяется на
PUSHEMP
PUSH m+1
LABEL L1
LX
ALT L1
...
Аналогично поступаем с LEIS/LES и с отщеплениями справа.
Кстати сказать, в реальной жизни так отщепления в ассемблер и
компилируются.
[snip]
> > > > в) Директивы:
> > > > IMPORT/EXPORT/LOCAL FUNC/BOX/TABLE/VECTOR/STRING/CHANNEL -
> > > > семантика очевидна.
> > > А какой синтаксис? (Речь идет ведь не о рефале, а о виртуальном коде,
> да?)
> > > Какая семантика LOCAL FUNC (в отличие от FUNC)? Это два слова?
> >
> > Просто FUNC нету. Т.е. синтаксис директивы _всегда_ содержит два
> > слова - linkage class (не знаю, как это сказать по русски) и тип
> > объекта.
> > Это как раз спорное место, которое я хотел обсудить. Не стоит ли разбить
> > каждую директиву на две?
> Ох, я совсем ничего не понял, можно поподробнее?
Я сделал так - возьмем для примера функцию, для нее возможны
три директивы:
IMPORT FUNC <fname> - функция определена где-то в другом модуле
EXPORT FUNC <fname> - функция определена в нашем модуле и является
глобальной
LOCAL FUNC <fname> - функция определена в нашем модуле и является
локальной
То же самое для других объектов, для них, кроме того, объявления EXPORT
и
LOCAL являются сразу и определениями.
Другой возможный вариант - разнести это по разным директивам. Тогда
мы будем писать, скажем
BOX <name>
EXPORT <name>
Почему я объединил определение объекта и его linkage вместе?
Потому что тогда очень легко по одной директиве сразу построить
необходимое объявление при компиляции, скажем в С, да и виртуальный код
меньше загромождается. Например:
IMPORT BOX Box =>
extern rf_box_t Box;
EXPORT BOX Box =>
rf_box_t Box;
LOCAL BOX Box =>
static rf_box_t Box;
Однако, здесь могут быть другие мнения, и я с радостью их
выслушаю.
Всего доброго,
Андрей.
This archive was generated by hypermail 2.0b3 on Thu Dec 09 1999 - 16:22:12 MSK