Автор Тема: Чем Вирту WITH не угодил?  (Прочитано 87224 раз)

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #45 : Апрель 27, 2012, 03:55:20 am »
А вот аналог этого модуля не компилируется в XDS с ошибкой: control variable "p" is threatened here- что весьма логично. Нда- вспоминаются Инфо21 с компашкой  и их восторги -воистину блаженны несведущие  ;D

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #46 : Апрель 27, 2012, 06:53:10 am »
Нужно наверно просто запретить внутри WITH передавать охраняемый указатель VAR и OUT параметром. И ловить это на этапе компиляции.

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #47 : Апрель 27, 2012, 07:32:32 am »
Мне вот интересно другое.. является ли Вирт источником этой болячки (наличествует она в  Виртовстких версиях Оберонов, или  косолапость учеников).

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем Вирту WITH не угодил?
« Ответ #48 : Апрель 27, 2012, 09:58:10 am »
Для тех кто не понял, что я написал вчера, вот код:

MODULE TestWith;

   IMPORT Log;

   TYPE
      R0 = POINTER TO EXTENSIBLE RECORD END;
      R1 = POINTER TO RECORD (R0) END;
      R2 = POINTER TO RECORD (R0) END;
      R3 = POINTER TO RECORD (R0) END;

   VAR
      globalPointer: R0;

   PROCEDURE NewR1 (): R1;
      VAR x: R1;
   BEGIN NEW(x); RETURN x
   END NewR1;

   PROCEDURE NewR2 (): R2;
      VAR x: R2;
   BEGIN NEW(x); RETURN x
   END NewR2;
   
   PROCEDURE NewR3 (): R3;
      VAR x: R3;
   BEGIN NEW(x); RETURN x
   END NewR3;

   PROCEDURE Print (x: R0);
   BEGIN
      IF x IS R1 THEN Log.String("R1"); Log.Ln
      ELSIF x IS R2 THEN Log.String("R2"); Log.Ln
      ELSIF x IS R3 THEN Log.String("R3"); Log.Ln
      END
   END Print;

   PROCEDURE f (VAR localPointer: R0);
   BEGIN
      WITH localPointer: R1 DO (* убедились, что localPointer стопудово указывает на R1 *)
         Print(localPointer);
         globalPointer := NewR2(); (* начиная с этого места localPointer тоже указывает на R2 *)
         Print(localPointer);
         globalPointer := NewR3(); (* начиная с этого места localPointer тоже указывает на R3 *)
         Print(localPointer)
      ELSE
      END
   END f;

   PROCEDURE Do*;
   BEGIN
      globalPointer := NewR1();
      f(globalPointer)
   END Do;

END TestWith.
« Последнее редактирование: Апрель 27, 2012, 09:59:43 am от Губанов Сергей Юрьевич »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #49 : Апрель 27, 2012, 10:13:08 am »
Охренеть. А ведь это никакой компилятор не отследит.

Мне начинает казаться, что Вирт прав...
« Последнее редактирование: Апрель 27, 2012, 10:14:39 am от ilovb »

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #50 : Апрель 27, 2012, 10:47:19 am »
То ли я  сегодня торможу - но криминала  в  этом куске кода , Сергей, не вижу( не вижу изменения localPointer о котором вы говорите) - вы три раза печатаете один и тот же localPointer .
« Последнее редактирование: Апрель 27, 2012, 10:48:55 am от DIzer »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #51 : Апрель 27, 2012, 11:02:18 am »
А вы попробуйте так:
...
TYPE
R1 = POINTER TO RECORD (R0) [b]a: INTEGER[/b] END;
R2 = POINTER TO RECORD (R0) [b]b: INTEGER[/b] END;
R3 = POINTER TO RECORD (R0) [b]c: INTEGER[/b] END;
...

ну и:
PROCEDURE f (VAR localPointer: R0);
   BEGIN
      WITH localPointer: R1 DO (* убедились, что localPointer стопудово указывает на R1 *)
         Print(localPointer);
         globalPointer := NewR2(); (* начиная с этого места localPointer тоже указывает на R2 *)
         Print(localPointer); [b]Log.Int(localPointer.a);[/b]
         globalPointer := NewR3(); (* начиная с этого места localPointer тоже указывает на R3 *)
         Print(localPointer)
      ELSE
   END
END f;

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #52 : Апрель 27, 2012, 11:06:00 am »
И даже так не вижу этого изменения...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #53 : Апрель 27, 2012, 11:07:38 am »
Глобал и локал поинтеры - это один и тот же поинтер.

Меняем глобал, следовательно меняется локал.

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #54 : Апрель 27, 2012, 11:22:30 am »
Теперь понял (не обратил внимание на способ передачи указателя в F)-спасибо, голова по пятницам вообще не работает   :(

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #55 : Апрель 27, 2012, 11:41:52 am »
а если так , то ответ на вопрос "является ли Вирт источником этой болячки (наличествует она в  Виртовстких версиях Оберонов, или  косолапость учеников)." вполне очевиден.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #56 : Апрель 27, 2012, 11:43:50 am »
Попробовал вот такой код:

MODULE TestWith;

   IMPORT Log;

   TYPE
      R0 = POINTER TO EXTENSIBLE RECORD END;
      R1 = POINTER TO RECORD (R0) a: ARRAY 100 OF CHAR END;
      R2 = POINTER TO RECORD (R0) END;
      R3 = POINTER TO RECORD (R0) END;

   VAR
      globalPointer: R0;

   PROCEDURE NewR1 (): R1;
      VAR x: R1;
   BEGIN NEW(x); RETURN x
   END NewR1;

   PROCEDURE NewR2 (): R2;
      VAR x: R2;
   BEGIN NEW(x); RETURN x
   END NewR2;
   
   PROCEDURE NewR3 (): R3;
      VAR x: R3;
   BEGIN NEW(x); RETURN x
   END NewR3;

   PROCEDURE Print (x: R0);
   BEGIN
      IF x IS R1 THEN Log.String("R1"); Log.Ln
      ELSIF x IS R2 THEN Log.String("R2"); Log.Ln
      ELSIF x IS R3 THEN Log.String("R3"); Log.Ln
      END
   END Print;

   PROCEDURE f (VAR localPointer: R0);
   VAR
a: INTEGER;
BEGIN
      WITH localPointer: R1 DO (* убедились, что localPointer стопудово указывает на R1 *)
         Print(localPointer);
         globalPointer := NewR2(); (* начиная с этого места localPointer тоже указывает на R2 *)
         Print(localPointer); localPointer.a := "jsdfdfkjghdfkjgkjdfgjdkfhgkjdfhgkjdfghkjdfhgkjdfhgkjdfhgkjdhfgkjhdfkjghdfk";
         globalPointer := NewR3(); (* начиная с этого места localPointer тоже указывает на R3 *)
         Print(localPointer)
      ELSE
      END
   END f;

   PROCEDURE Do*;
   BEGIN
      globalPointer := NewR1();
      f(globalPointer)
   END Do;

END (^Q)TestWith.Do

ЧЯ то никак не реагирует, то падает без трапа, а иногда выдает бесконечную гирлянду траповых окошек, пока виндозным диспетчером не срубишь....

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #57 : Апрель 27, 2012, 11:46:23 am »
Охренеть. А ведь это никакой компилятор не отследит.

Мне начинает казаться, что Вирт прав...
;) не так все грустно
"In gpcp the selected
variable is treated as a constant, and neither the type nor the value can be modified
either directly or indirectly. Any attempt to do so attracts a compile-time error message." - правда как они умудряются сделать это  -compile -time, мне лично не ясно.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #58 : Апрель 27, 2012, 11:57:26 am »
А ведь это очень серьезная дырка в BB (да и в оригинальном Обероне наверно тоже). В безопасном языке, вполне законно можно засрать память!

Я кажется понял почему Вирт не комментирует причины удаления WITH. Вы представляете какой это позор?

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #59 : Апрель 27, 2012, 12:07:58 pm »
А ведь это очень серьезная дырка в BB (да и в оригинальном Обероне наверно тоже). В безопасном языке, вполне законно можно засрать память!

Я кажется понял почему Вирт не комментирует причины удаления WITH. Вы представляете какой это позор?
Позор не Вирту - он гик и этим все сказано - глупо с него что либо трясти, позор коровцам - которые сделали из него идолище... сомневаюсь что Вирт просил их об этом.. нда а сколько "пафосных" речей о герметичности типов...  о превосходстве Оберонов, о легкости создания компилятора.... по иронии судьбы единственная рабочая (надо проверить) реализация основана на "враждебной" платформе .net... как усерался Инфо21 охаивая ее... :(