Автор Тема: Сириус - обероноподобный язык и компилятор  (Прочитано 75169 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
А какая логика у TYPECAST UNSAFE если приведение невозможно? Как в додиезовском "as" NIL возвращается?
Какая может быть логика у тупого SYSTEM.VAL?
А вот SAFE режим формирует исключение, которое или стандартно трапает или, если в блоке есть секция exception, обрабатывается ручками.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Вижу.. SYSTEM.VAL
Т.е. реально UNSAFE....
А модули содержащие unsafe код помечаются как-то?
Помечаются, причем не только весь модуль, но и экспортируемые процедуры, имеющие такой код, а также помечаются как unsafe объекты у которых  есть ансейфный код.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
...динамический тип оным и останется.
Остается каким? Каким был до TYPECAST SAFE?
Если так то DIzer правильно заметил, что это в точности WITH получается
Динамическим.
Это просто трактовка типа и ничего более, никаких физических процессов, кроме пробы типа не выполняется. Ещё раз - это растянутая в пространстве трактовка типа, либо с контролем допустимости такой трактовки (по умолчанию), либо без оной, а WITH позволяет работать с динамикой как сос статикой, имея на этом профит по причине отсутствия лишних разыменований.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Так в WITH тоже никаких физических процессов не выполняется. Это тоже просто трактовка, и ничего более.

Vartovyj

  • Full Member
  • ***
  • Сообщений: 197
    • Просмотр профиля
Это окончательная версия языка или допускаются внесения изменений?
Х86-64 будет в открытом доступе?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Так в WITH тоже никаких физических процессов не выполняется. Это тоже просто трактовка, и ничего более.
если у нас есть
R1 = POINTER TO RECORD(R1Desc) END;
R1Desc= RECORD
  a:INTEGER
END;

VAR
 v: R1Desc;
 p: R1;
Здесь v - Статика, а p - динамика, при КАЖДОМ обращении к p происходят некоторые телодвижения, связанные с получением адреса R1, на которую он указывает, а блок WITH позволяет сделать это один раз, а далее работать с ним как со статикой (v), используя полученный адрес. я об этом на 1-й странице написал. В этом и есть профит.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Это окончательная версия языка или допускаются внесения изменений?
Х86-64 будет в открытом доступе?
Для конторы окончательная - там много кода, завязанного на имеющуюся реализацию, в паблике будет открытая. x86-64 на данный момент нет.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
если у нас есть
R1 = POINTER TO RECORD(R1Desc) END;
R1Desc= RECORD
  a:INTEGER
END;

VAR
 v: R1Desc;
 p: R1;
Здесь v - Статика, а p - динамика, при КАЖДОМ обращении к p происходят некоторые телодвижения, связанные с получением адреса R1, на которую он указывает, а блок WITH позволяет сделать это один раз, а далее работать с ним как со статикой (v), используя полученный адрес. я об этом на 1-й странице написал. В этом и есть профит.

Так вы про свою реализацию?
Я говорил про Оберон, а в нем это так сделано:
...
ELSIF sym = with THEN
    OCS.Get(sym); x.obj := NIL; xtyp := NIL;
    IF sym = ident THEN
     qualident(x); CheckSym(colon);
     IF sym = ident THEN qualident(y);
            IF y.mode = Typ THEN
              IF x.obj # NIL THEN
                xtyp := x.typ; OCE.TypTest(x, y, FALSE); x.obj.typ := x.typ
              ELSE OCS.Mark(130)
              END
            ELSE OCS.Mark(52)
            END
     ELSE OCS.Mark(10)
     END
    ELSE OCS.Mark(10)
    END ;
    CheckSym(do); OCC.FreeRegs({}); StatSeq; CheckSym(end);
    IF xtyp# NIL THEN x.obj.typ := xtyp END
...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
А какой у вас набор управляющих операторов?
Есть foreach?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Так вы про свою реализацию?
Я говорил про Оберон, а в нем это так сделано:
...
]
[/quote]
Ну да о Сириусе.
А в Обероне нужно смотреть генератор, в парсере откуда возьмется

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Так вот же единственный вызов
xtyp := x.typ; OCE.TypTest(x, y, FALSE); x.obj.typ := x.typ

Т.е. генерится проверка типа с вызовом исключения (параметр FALSE), а дальше рекурсивный вызов StatSeq; и обычная генерация кода. Разница лишь в том что теперь все последующие проверки типа (времени компиляции) будут осуществляться с временным типом т.к. "x.obj.typ := x.typ", а исходный тип хранится в xtyp.
Ну и в конце блока компилятор возвращает тип на место:
IF xtyp# NIL THEN x.obj.typ := xtyp END

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
А какой у вас набор управляющих операторов?
Есть foreach?
Да стандартные, IF с ELSIF, WITH - многоветочный, WITH/CASE с веткой ELSE.
все циклы, кроме foreach
RETURN

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Так вот же единственный вызов
xtyp := x.typ; OCE.TypTest(x, y, FALSE); x.obj.typ := x.typ
это парсинг и проверка времени компиляции, надо генерируемый код смотреть

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
OCE.TypTest генерит код.
В Обероне парсинг и генерация кода происходят одновременно, т.к. компилятор однопроходный

PROCEDURE TypTest*(VAR x, y: OCT.Item; test: BOOLEAN);
      PROCEDURE GTT(t0, t1: OCT.Struct; varpar: BOOLEAN);
      VAR t: OCT.Struct; xt, tdes, p: OCT.Item;
      BEGIN
         IF t0 # t1 THEN t := t1;
            REPEAT t := t.BaseTyp UNTIL (t = NIL) OR (t = t0);
            IF t # NIL THEN x.typ := y.typ;
               IF OCC.typchk OR test THEN xt := x;
                  IF varpar THEN xt.mode := Ind; xt.a0 := x.a0+4
                  ELSIF (x.mode = Var) & (x.lev >= 0) THEN
                     xt.mode := Ind; xt.a1 := -4; load(xt); xt.mode := RegI
                  ELSE load(xt); p := xt; p.mode := RegI; p.a1 := -4;
                     OCC.PutF4(17H, xt, p); (*MOVD -4(xt), xt *) xt.mode := RegI
                  END ;
                  xt.a1 := t1.n * 4; tdes.mode := Var; tdes.lev := -t1.mno; tdes.a0 := t1.adr;
                  OCC.PutF4(7, tdes, xt);  (*CMPD*)
                  IF ~test THEN
                     OCC.PutF0(0); OCC.PutDisp(4); OCC.PutF1(0F2H); OCC.PutByte(18) 
                  ELSE setCC(x, 0)
                  END
               END
            ELSE OCS.Mark(85);
               IF test THEN x.typ := OCT.booltyp END
            END
         ELSIF test THEN setCC(x, 14)
         END
      END GTT;
« Последнее редактирование: Май 04, 2012, 09:30:43 pm от ilovb »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Цитировать
The  final  production of  code  is  performed  by  procedures in  module  OCC.  They  are  typically  called
from  OCE  and  OCH.  In  analogy  with  the  scanner  transforming  character  sequences  into  symbols,
OCC-procedures transform (abstract) instructions into sequences of bits. Hence, this module reflects
the binary encoding of instructions, i.e. the target computer's instruction formats.
http://www.inf.ethz.ch/personal/wirth/books/ProjectOberon.pdf