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

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #150 : Май 04, 2012, 11:49:42 am »
ЗЫ: Почему-то не могу отредактировать свое сообщение, дополню - Под неизменностью экземпляра я имею ввиду неизменность самого экземпляра, но не его данных.

Сдается мне я поспешил с фразой "В общем примерно понятно"  :D
Это просто я мутно выразился.
Просто если у нас есть, к примеру, указатель P0 на объект, у которого guard#0, то операция P0.x :=123 корректна, а NEW (P0) вызовет исключение, потому что происходит попытка смены экземпляра.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #151 : Май 04, 2012, 11:53:45 am »
Не сработала в том плане, что ни разу не встретилась ситуация, когда нужно было срабатывать ) не пишем мы такой код и всё тут.
Безошибочные кодеры?  ;) Тогда можно и на Си писать...
Не понял, что подразумевается под контролем разыменования и причём здесь кастинг?
Возможно мы о разных вещах думаем, нужен пример кода.

MODULE MyTest;
IMPORT Log;
TYPE
   T0 = POINTER TO EXTENSIBLE RECORD END;
   T1 = POINTER TO RECORD(T0) a: CHAR END;
VAR
   V0: T0;
   V1: T1;
BEGIN

   NEW(V1);
   V1.a := "Ы";
   V0 := V1;
   Log.Char(V0.a); (*Разыменование без охраны. Так низя*)
   Log.Char(V0(T1).a); (*Разыменование с обычным кастингом. Так можно*)

END MyTest.
« Последнее редактирование: Май 04, 2012, 11:57:56 am от ilovb »

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #152 : Май 04, 2012, 11:57:55 am »
В 2005 г., в момент перевода данной статьи, не было известно о дефекте никому из сообщества, мне известного.

Кстати, идите покричите Sun-у (Ораклу), которая ПРОДАВАЛА "безопасную песочницу", в модели байт-кода которой потом университетские исследователи находили фатальные дыры.
 
1. Я говорю про то что было (и есть ) у ВАС  ПОСЛЕ 2005г.
2. Sun, в отличие от вас, свои ошибки признала и работает над ними.. вы, обнаглели, настолько, что паразитируете на них...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #153 : Май 04, 2012, 12:06:32 pm »
Это просто я мутно выразился.
Просто если у нас есть, к примеру, указатель P0 на объект, у которого guard#0, то операция P0.x :=123 корректна, а NEW (P0) вызовет исключение, потому что происходит попытка смены экземпляра.

Теперь понятно. Да, это тоже вариант. Правда хочу заметить, что это и есть уточнение семантики WITH, о котором уже говорилось в этой ветке.

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #154 : Май 04, 2012, 12:06:57 pm »
В данной конкретной реализации, потому что сама по себе конструкция WITH вполне адекватная, а реализовать полностью безопасный механизм не так уж и сложно и оверхед небольшой будет, вполне терпимый, проявляющийся только при lvalue.
М... на тему адекватности мы дискутировали много здесь, но что интересно - Вирт ответил на этот вопрос отрицательно.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #155 : Май 04, 2012, 12:13:27 pm »
Да, что-то мы от главной темы ушли  :)

У меня еще версия есть:
Это может быть связано с особенностями кодинга под ARM.

Может спросить у него письмом?

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #156 : Май 04, 2012, 12:20:10 pm »
Можно, но лично, склоняюсь к поддержке идеи Алексея - т.е. он посчитал нецелесообразным поддерживать глобальную защиту участков кода- зачем если можно сделать все локально...-(а может просто, чтобы коровята умылись.... гики они такие  :))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #157 : Май 04, 2012, 12:42:52 pm »
М... на тему адекватности мы дискутировали много здесь, но что интересно - Вирт ответил на этот вопрос отрицательно.
Так не ответил он ))
А вообще, в таком простом языке как Оберон07 (и, соответственно, в таком простом компиляторе) не нужна такая сложная в реализации вещь как правильный WITH, а вот для "простокастинга" была бы полезна имеющаяся у нас конструкция типа TYPECAST [SAFE] a:x, b:y, c:z ... END;

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #158 : Май 04, 2012, 12:46:24 pm »
 ;) Дословно , ДА (не говорил) - но удаление всей конструкции из языка, довольно красноречиво...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #159 : Май 04, 2012, 12:47:57 pm »
Kemet, а вы еще и язык изменили?!  :)
Можете подробно описать вашу версию Оберона/компилятора в отдельной ветке?

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем Вирту WITH не угодил?
« Ответ #160 : Май 04, 2012, 01:10:10 pm »
Просто если у нас есть, к примеру, указатель P0 на объект, у которого guard#0, то операция P0.x :=123 корректна, а NEW (P0) вызовет исключение, потому что происходит попытка смены экземпляра.
Не понятно. Защита у указателя или у объекта? Если у указателя, то чему равен размер указателя? Какое это имеет отношение к ссылке на указатель? У ссылки тоже есть защита? Какой размер у ссылки? В любом случае, по VAR-ссылке на указатель значение этого указателя в приведённом примере вообще не изменяется:

   VAR globalPointer: R0;

   ...

   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;

Ссылка на указатель localPointer в этой процедуре не трогается. Трогается внешний указатель globalPointer. Его-то трогать можно? Можно! Но тип localPointer при этом меняется. А раз тип localPointer может сколько угодно раз менятся уже после входа в ветку WITH, значит WITH неадекватен.
« Последнее редактирование: Май 04, 2012, 01:12:38 pm от Губанов Сергей Юрьевич »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #161 : Май 04, 2012, 01:14:28 pm »
Kemet, а вы еще и язык изменили?!  :)
Можете подробно описать вашу версию Оберона/компилятора в отдельной ветке?
Что значит изменили? Расширили! Я не вижу в этом криминала, во первых мы не ставили целью совместимость с оригиналом, нам нужен был удобный (для нас) инструмент.
Возьмите Оберон-2 и компиляторы POW!, XDS, OO2C - это Оберон-2, но скомпилировать код написанный под OO2C не удасться скомпилировать другими компиляторами, кто в этом видит криминал? В то же время, я так думаю, код написанный в соответствии со стандартом Оберон-2 они все скомпилируют.
Я не уверен, что все конструкции Оберона-2 наш компилятор обработает так, как ожидается от компилятора Оберон-2 (но тесты вроде проходят), но мы его никогда и не называли Обероном или Обероном-2 или активным Обероном, мы его называем оберонопободный язык ), а между собой кличем Сириусом )))
Описать, конечно, можно, но, плчему-то, у меня какие-то технические проблемы на этом форуме, то авторизация слетает, то странички не открываются, да и редактировать не могу свои сообщения. Не иначе КомКон бдит (((

ilovb

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

WITH localPointer: R1 DO (* Тут у глобального указателя скрытое поле guard станет равно guard + 1*)


globalPointer := NewR2(); (* Тут исключение *)
     

Т.е. у них немного другая семантика WITH
« Последнее редактирование: Май 04, 2012, 01:22:13 pm от ilovb »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #163 : Май 04, 2012, 01:20:31 pm »
Описать, конечно, можно, но, плчему-то, у меня какие-то технические проблемы на этом форуме, то авторизация слетает, то странички не открываются, да и редактировать не могу свои сообщения. Не иначе КомКон бдит (((
Сообщения можно редактировать втечение нескольких минут после отправки, затем они замораживаются.

А про авторизацию - ничего не скажу. Не знаю, у меня все нормально и в логах вроде бы ошибок по этому поводу нет.

PS. А тему про сириус можно завести - мне лично весьма любопытно.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

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

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем Вирту WITH не угодил?
« Ответ #164 : Май 04, 2012, 01:23:45 pm »
Кстати, особенно очевидна неадекватность WITH когда процедура Print в указанном выше примере принимает аргумент типа R1, а не R0.