Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Kemet

Страницы: [1] 2 3 ... 40
1
Тип не может быть "недоопределен" - я же написал, что при сборке тип должен быть полностью открыт и реализован, поэтому его размер компилятору известен. Но, так как состав сборки определяетяс сборочным скриптом, то содержимое типа, конечно, может быть различным для разных платформ или режимов компиляции(отладка/релиз), но, тем не менее, тип должен быть полностью определен до момента его использования.

2
Есть "непрозрачные" типы. Интерфей к типу определяется в интерфейсных модулях, в обще случае, тип может иметь несколько интерфнйсов, которые могут находится в различгых интерфейсных модулях. Таким образом, клиент видит только то, что ему позволено в импортированном интерфейсе.
В модулях реализации тип "открывается" (REVEAL ) и соответственно, реализуется. Реализация также может быть "размазана" по нескольким модулям(файлам).
То есть это то, что в Шарпе назвали partial types (из Модулы-3 идею и позаимствовали).
При сборке тип в итоге должен быть полностью "открыт" и реализован.

3
Общий раздел / Re: Странные битовые операции
« : Ноябрь 30, 2016, 06:12:05 pm »
Нет,  ORD( boolean ) появился только в последних ревизиях оберона.
Ну я смотрел древний оберон и там это было

4
Общий раздел / Re: Странные битовые операции
« : Ноябрь 29, 2016, 10:16:38 am »
да собственно, когда портируешь достаточно большой проект, отвлекаться на всякую херню, вроде выше предложенной, не айс. Если язык не позволяет адекватно это портировать, значит есть некий дефект в языке. Кстати, даже в Виртовском Обероне и КП это сделать просто - там есть ORD( boolean ), есть ORD( set ) и BITS( int ). Правда и там есть проблема в виде отсутствия сдвигов для SET, впрочем по понятным причинам - не вписываются эти операции в стройную теорию.
Но так-то сейчас эта тема не актуальна - я решил ее несколько иначе.

5
Кто-то считает это необходимым, кто-то - ненужным. Меня интересует техническая сторона, точней одна её деталь. Как эффективно совместить локальные записи и закрытые элементы. В идеале интерфейс не должен содержать информации о скрытых элементах записи, пусть и помеченных как скрытые. Это легко достигается в интерфейсе уведомительного характера, но составляет проблему в интерфейсе для компилятора, так так тогда полный размер записи становится неизвестным, что является препятствием для размещения на стеке.

Более или менее правильные намётки на решение я знаю, которое нужно даже не для этого, но оно довольно сложное. А какие костыли вам по душе?
Это сделано в Модуле-3

6
Общий раздел / Re: Странные битовые операции
« : Ноябрь 29, 2016, 04:11:46 am »
Цитировать
А почему не так?
RETURN ORD( x > clipBox.x2) + ORD( x < clipBox.x1 ) * 4
Потому что в Активном Обероне нет приведения булевого типа к целому, то есть ORD( TRUE ) не работает. Причем булево даже через SYSTEM.VAL не удастся ни к чему привести.



7
Есть ли повторяющиеся значения или все значения уникальны

8
можно ли перезаписывать исходный файл?

9
Видимо, так как у функции min отсутствет указание рекурсивности rec, то при вызове min внутри min приведет к вызову предопределенной функции min

10
      i, j, tmp: LONGINT;
      arr: ARRAY n OF LONGINT;
У тебя тут длинные целые (64 бита, видимо?), а у валексея и у меня просто целые (32 бита вроде). Это может влиять на скорость...
В Активном Обероне LONGINT = SIGNED32, HUGEINT=SIGNED64

11
Я тут немного пошаманил на предмет замера в А2.

MODULE BubbleTest;

IMPORT Kernel, Heaps, Objects, Commands, Machine;

CONST n = 40000;

   PROCEDURE{ALIGNED(16), ALIGNSTACK(16)} DoIt*( context: Commands.Context );
   BEGIN
      DoSafe(context);
      DoUnchecked(context);
   END DoIt;

   PROCEDURE{ALIGNED(16), ALIGNSTACK(16)} DoSafe*( context: Commands.Context );
   VAR
      i, j, tmp: LONGINT;
      mhz, time0, time: HUGEINT;
      arr: ARRAY n OF LONGINT;
   BEGIN
      mhz := EstimateCpuClockrate( );
      time0 := Objects.CurrentProcessTime( );
      FOR i := 0 TO n - 1 DO
         arr[ i ] := n - i;
      END;

      FOR i := 0 TO n - 1 DO
         FOR j := 0 TO n - 2 - i DO
            IF arr[ j ] > arr[ j + 1 ] THEN
               tmp := arr[ j ];
               arr[ j ] := arr[ j + 1 ];
               arr[ j + 1 ] := tmp;
            END;
         END;
      END;
      time := Objects.CurrentProcessTime( );
      
      context.out.String("Safe: ");
      context.out.Int( ( time - time0 ) DIV ( 1000 * mhz), 1 ); context.out.String(" ms");
      context.out.Ln;
   END DoSafe;

   PROCEDURE{ALIGNED(16), ALIGNSTACK(16)} DoUnchecked*( context: Commands.Context );
   VAR
      i, j, tmp: LONGINT;
      mhz, time0, time: HUGEINT;
      arr{ALIGNED(16)}: ARRAY n OF LONGINT;
   BEGIN{UNCHECKED}
      mhz := EstimateCpuClockrate( );
      time0 := Objects.CurrentProcessTime( );
      FOR i := 0 TO n - 1 DO
         arr[ i ] := n - i;
      END;

      FOR i := 0 TO n - 1 DO
         FOR j := 0 TO n - 2 - i DO
            IF arr[ j ] > arr[ j + 1 ] THEN
               tmp := arr[ j ];
               arr[ j ] := arr[ j + 1 ];
               arr[ j + 1 ] := tmp;
            END;
         END;
      END;
      time := Objects.CurrentProcessTime( );

      context.out.String("Unchecked: ");
      context.out.Int( ( time - time0 ) DIV ( 1000 * mhz), 1 ); context.out.String(" ms");
      context.out.Ln;
   END DoUnchecked;

   
   PROCEDURE EstimateCpuClockrate(): HUGEINT;
   VAR
      timer : Kernel.Timer; milliTimer : Kernel.MilliTimer;
      startTime, endTime, timeDiff : HUGEINT;
      nbrOfGcRuns : LONGINT;
   BEGIN
      NEW(timer); nbrOfGcRuns := Heaps.Ngc;
      Kernel.SetTimer(milliTimer, 1000);
      startTime := Machine.GetTimer();
      WHILE ~Kernel.Expired(milliTimer) DO
         timer.Sleep(1);
         IF nbrOfGcRuns # Heaps.Ngc THEN RETURN 0; END;
      END;
      endTime := Machine.GetTimer();
      IF nbrOfGcRuns # Heaps.Ngc THEN RETURN 0; END;
      timeDiff := endTime - startTime;
      RETURN SHORT (timeDiff DIV (1000*1000));
   END EstimateCpuClockrate;

END BubbleTest.

BubbleTest.DoIt ~

BubbleTest.DoSafe~
BubbleTest.DoUnchecked~

SystemTools.Free BubbleTest ~

12
...
Пример не об очереди, а о многопоточности и синхронизации

13
это же классическая задача поставщика-потребителя!
И вот как она решается на Активном Обероне:
MODULE BoundedBuffers;
TYPE
  Item* = OBJECT;
 
  Buffer* = OBJECT
    VAR
      h, n: INTEGER;
      B: ARRAY * OF Item;
 
    PROCEDURE Get*(): Item;
    VAR x: Item;
    BEGIN {EXCLUSIVE}
      AWAIT(n # 0); (* буфер не пуст *)
      x := B[h]; h := (h+1) MOD LEN(B); DEC(n);
      RETURN x
      END Get;
 
    PROCEDURE Put*(x: Item);
    BEGIN {EXCLUSIVE}
      AWAIT(n # LEN(B)); (* буфер не полон *)
      B[(h+n) MOD LEN(B)] := x; INC(n)
    END Put;
 
    PROCEDURE &Init(max: INTEGER);
    BEGIN (* инициализатор *)
      NEW(B, max); h := 0; n := 0
    END Init;
  END Buffer;
 
END BoundedBuffers.

14
Общий раздел / Re: Oberon rev. 2015 (февраль)
« : Март 18, 2015, 06:04:33 am »
Портабельность приложений написанных на Обероне становится довольно условной.
Это почему?

Потому, что ты не можешь сказать компилятору что ты хочешь, и при этом не можешь его спросить что он может.
Всё-же, у тебя несколько специфическое понятие о портабельности.
Ведь есть в плюсцах тип size_t, который не привязан к разрядности, а кпак и INTEGER в Обероне определяется конкретной аппаратной платформой, только никто из плюсовых поклонников, отчего-то, не считает, что это снижает портабельность C++, скорее наоборот.
В Обероне07 тип INTEGER несёт ту же нагрузку, что и size_t, и как-раз и обеспечивает портируемость.
INTEGER всегда соотвествует целому типу оптимального для данной платформы размером.
Если тебе нужна специфика в разрядах, значит тебе требуется реализовать поддержку нужной тебе разрядности отдельно, в виде библиотеки, пространства SYSTEM или даэе глобального пространства.
Но, как и в случае с C++ такой код и не будет портабелен.

15
Уже прошло более 2 лет. Публиковать Сириус больше не планируется? Какого его текущее состояние?
Судя по сообщениям в Сириусе применяются уникальные интересные механизмы вроде охраны экземпляром, которые больше нигде не встречаются. Интересно было бы изучить.
Проводилась глобальная реорганизация и реструктуризация как самой компании, так и бизнеса, ИТ ...
Все свободные проекты были временно заморожены

Страницы: [1] 2 3 ... 40