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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #180 : Май 04, 2012, 07:54:46 pm »
Ну так было и в оригинальном Обероне, т.е. это трактовка автора языка. Логика у WITH имхо заключается в том, чтобы не пропустить в рантайм некорректные обращения к полям записи.
Опять же имхо запрет присваиваний внутри WITH не от чего не защищает.

зы Я конечно говорю о Виртовском WITH

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #181 : Май 05, 2012, 08:57:21 am »
Почему вы так уверены? Уже проверили на компиляторе Оберона?
Вот например в ЧЯ это не так:
http://oberspace.dyndns.org/index.php/topic,229.msg5368.html#msg5368
Так Вирт ЧЯ не писал. У меня его нет, проверить не могу.
А если PROCEDURE f (VAR localPointer: R0); заменить на
PROCEDURE f (localPointer: R0);
проблема воспроизводится?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #182 : Май 05, 2012, 09:05:59 am »
А с чего бы ей так воспроизводиться?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #183 : Май 05, 2012, 09:14:06 am »
А с чего бы ей так воспроизводиться?
Хех, так ведь тогда проблема-то не в WITH

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #184 : Май 05, 2012, 09:24:24 am »
Все это уже обсуждалось
...Плюс везде запретить передавать глобальные переменные VAR параметром...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #185 : Май 05, 2012, 09:33:43 am »
Все это уже обсуждалось
...Плюс везде запретить передавать глобальные переменные VAR параметром...
Обсуждалось, но, видимо, выводы вы сделали неправильные, потому-что проблема не в WITH и не в передаче глобальных параметров, а в интерпретации указателей, передаваемых по ссылке.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #186 : Май 05, 2012, 09:37:04 am »
А интерпретация может быть иной?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #187 : Май 05, 2012, 11:57:28 am »
А интерпретация может быть иной?
В контексте WITH да.
Мы ведь должны получить ссылку на экземпляр, чтобы выполнить приведение динамического типа к статическому, а у них либо такая инфа теряется, что маловероятно, либо, получив ссылку на указатель они уже считают её ссылкой на экземпляр, тогда как для var-параметра необходимо проверить не указатель ли там, и разыменовать его.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #188 : Май 05, 2012, 01:03:47 pm »
Проверил ETH Oberon (эмулятор под винду)

Печатает в логе
R1
R2
R3
и.... падает!

вот код:
MODULE Test2;

   IMPORT Out;

   TYPE
      R0 = POINTER TO 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 Out.String("R1"); Out.Ln
      ELSIF x IS R2 THEN Out.String("R2"); Out.Ln
      ELSIF x IS R3 THEN Out.String("R3"); Out.Ln
      END
   END Print;

   PROCEDURE f (VAR localPointer: R0);
   VAR
a: INTEGER;
   BEGIN
      WITH localPointer: R1 DO
         Print(localPointer);
         globalPointer := NewR2();
         Print(localPointer); localPointer.a := "jsdfdfkjghdfkjgkjdfgjdkfhgkjdfhgkjdfghkjdfhgkjdfhgkjdfhgkjdhfgkjhdfkjghdfk";
         globalPointer := NewR3();
         Print(localPointer)
      END
   END f;

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

BEGIN
END Test2.

Compiler.Compile Test2

Test2.Do

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #189 : Май 05, 2012, 01:59:47 pm »
ilovb, я скачал сейчас bb1.6, после пятиминутного замешательства, связанного с разглядыванием сего чуда, мне удалось вставить, скомпилировать и 30 раз выполнить выше приведенный(на предыдущих страницах) исходный код. 30 раз он напечатал R1, R2, R3, но не упал, может надо запускать большее количество раз?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #190 : Май 05, 2012, 02:03:25 pm »
ilovb, я скачал сейчас bb1.6, после пятиминутного замешательства, связанного с разглядыванием сего чуда, мне удалось вставить, скомпилировать и 30 раз выполнить выше приведенный(на предыдущих страницах) исходный код. 30 раз он напечатал R1, R2, R3, но не упал, может надо запускать большее количество раз?
Порча памяти совсем не обязательно приводит к падению (в этом то и проблема :-) ). В ряде случаев программа будет тихо мирно но не корректно работать после этого. А может и корректно работать. А может и упасть через полгода после инцидента.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем Вирту WITH не угодил?
« Ответ #191 : Май 05, 2012, 02:10:35 pm »
он напечатал R1, R2, R3, но не упал
Для показательной неадекватности WITH применённого к ссылке на указатель достаточно того, что он напечатал R1, R2, R3 вместо R1, R1, R1. А уж когда он там упадёт или бросит исключение - вопрос второй.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #192 : Май 05, 2012, 02:13:31 pm »
На 37 разе он среагировал грозными сообщениями и в окне появилась сетка, и потом он упал. Надо будет исходники глянуть.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #193 : Май 05, 2012, 02:57:14 pm »
Kemet, если давить на коммандер удерживая "ctrl", то эффект быстрее достигается

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #194 : Май 05, 2012, 03:48:03 pm »
достаточно того, что он напечатал R1, R2, R3 вместо R1, R1, R1. А уж когда он там упадёт или бросит исключение - вопрос второй.
Это очевидно, я с этим никак не спорю, мне хотелось увидеть реакцию на порчу памяти.