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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #165 : Май 04, 2012, 01:28:00 pm »
Что значит изменили? Расширили! Я не вижу в этом криминала....
Нет нет. Я ничего плохого не имел ввиду.  :)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #166 : Май 04, 2012, 01:29:44 pm »
...
Защищается объект (участок памяти с ним связанный). Не имеет значения, сколько на него указателей, ссылок, ссылок на указатели, потому что все операции по смене экземпляра блокированы, а значит и любой указатель на объект изменить невозможно по определению - Вы просто не сможете изменить globalPointer, потому что объект, на который он указывает в это время защищён.
Сами указатели не защищены - просто как только указатель оказывается lvalue происходит проверка guard=0 и если это не так значит мы пытаемся отстрелить себе помидоры.

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

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

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #168 : Май 04, 2012, 01:40:37 pm »
.... И случится это во время работы программы, а не во время её компиляции. Между тем в ветке WITH по её семантике тип фиксируется во время компиляции. То есть даже отсутсвие порчи памяти (замена её бросанием исключения) не добавляет адекватности WITH при работе с ссылкой на указатель.
Вот тут я не уверен (точнее, не уверен что изначально речь шла об ошибках времени компиляции) -только в Гардене это было обьявлено четко....
но и мы...  находясь под воздействием идей ученичков Вирта , доведенных но абсурда в коровнике- абсолютизируем эту тему... Может быть по проще - примем в качестве отправной точки зрения несостоятельность оных...
« Последнее редактирование: Май 04, 2012, 01:43:47 pm от DIzer »

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

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

Значит всё что вы написали не имеет совершенно никакого отношения к WITH и к Оберонам. В Оберонах присваивание указателей ptr1 := ptr2 можно делать когда угодно и сколько угодно.

Гы-гы-гы, а что там в Сириусе если объект защищён, то ни одному указателю на него нельзя даже NIL присвоить???

DIzer

  • Гость
Re: Чем Вирту WITH не угодил?
« Ответ #170 : Май 04, 2012, 01:46:39 pm »
Сергей - но сказали же вам что другой язык - и называется он Сириус...более того, если, например, реализовать в Обероне предложение Влада - он также перестанет быть им (Обероном)...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #171 : Май 04, 2012, 01:53:11 pm »
Короче ждем описания Сириуса! чтоб потроллить обсудить  :D

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #172 : Май 04, 2012, 02:02:01 pm »
И ещё. Ну допустим какими-то хитрокрючкотворными способами удаётся (с потерей производительности) избежать в данном примере порчи памяти.
Да ничего особохитрого нет - всё прозрачно. Производительность несколько потеряется только на операциях типа NEW, :=, т.к. требуется проверка не защищен ли объект.
Между тем в ветке WITH по её семантике тип фиксируется во время компиляции.
Так ведь это сугубо Ваше личное представление о семантике WITH, ничем не подкрепленное - ничего подобного в описании языка-то нет.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #173 : Май 04, 2012, 02:11:51 pm »
Так ведь это сугубо Ваше личное представление о семантике WITH, ничем не подкрепленное - ничего подобного в описании языка-то нет.

Так вот именно что нет. Семантика WITH в Обероне определяет только охрану типа, т.е. запрещено только тип менять, но присваивания не запрещены.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #174 : Май 04, 2012, 02:13:38 pm »
Значит всё что вы написали не имеет совершенно никакого отношения к WITH и к Оберонам. В Оберонах присваивание указателей ptr1 := ptr2 можно делать когда угодно и сколько угодно.
Можно, за исключением тех, которые охраняются в данный момент. Это никак не противоречит Оберону, как раз наоборот, полностью соответствует семантике WITH, в моём понимании, но никто пока это не опроверг.
Гы-гы-гы, а что там в Сириусе если объект защищён, то ни одному указателю на него нельзя даже NIL присвоить???
Пока он защищен - нет, иначе зачем его защищать.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #175 : Май 04, 2012, 02:20:53 pm »
Смотрите описание:
Цитировать
9.11 Операторы With

Операторы with выполняют последовательность операторов в зависимости от результата проверки типа и применяют охрану типа к каждому вхождению проверяемой переменной внутри этой последовательности операторов.

ОператорWith      =   WITH Охрана DO ПоследовательностьОператоров {"|" Охрана DO ПоследовательностьОператоров} [ELSE ПоследовательностьОператоров] END.
Охрана    =   УточнИдент ":" УточнИдент.
Если v - параметр-переменная типа запись или переменная-указатель, и если ее статический тип T0, оператор

WITH v: T1 DO S1 | v: T2 DO S2 ELSE S3 END

имеет следующий смысл: если динамический тип v - T1, то выполняется последовательность операторов S1 в которой v воспринимается так, будто она имеет статический тип T1; иначе, если динамический тип v - T2, выполняется S2, где v воспринимается как имеющая статический тип T2; иначе выполняется S3. T1 и T2 должны быть расширениями T0. Если ни одна проверка типа не удовлетворена, а ELSE отсутствует, программа прерывается.

Пример:

WITH t: CenterTree DO i := t.width; c := t.subnode END
http://www.uni-vologda.ac.ru/oberon/o2rus.htm

Ваша реализация ему противоречит. Тут нет ни слова про запрет присваивания. Следовательно в правильной Оберон программе при вашей реализации WITH может возникнуть исключение.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #176 : Май 04, 2012, 02:23:52 pm »
Так вот именно что нет. Семантика WITH в Обероне определяет только охрану типа, т.е. запрещено только тип менять, но присваивания не запрещены.
Может быть, я же не говорю, что я прав. В принципе, разрешить присваивание, но при этом контролировать тип не так уж и сложно, просто добавится проверка типа, это можно ключиком/модификатором WITH сделать - это 10 минут работы, но нужно ли?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #177 : Май 04, 2012, 02:32:21 pm »
Ваша реализация ему противоречит. Тут нет ни слова про запрет присваивания. Следовательно в правильной Оберон программе при вашей реализации WITH может возникнуть исключение.
Ну так что не запрещено - разрешено ) Всё, что выше описано наш WITH реализует.
В правильной Оберон программе не меняют охраняемую переменную через другой указатель - какой в этом смысл?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем Вирту WITH не угодил?
« Ответ #178 : Май 04, 2012, 07:19:19 pm »
Смотрите:

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

PROCEDURE Do*();
BEGIN
   NEW(V1);
   V1.a := "Ы";
   NEW(V2);
   V2.a := "Э";
   V0 := V1;   
   WITH V0: T1 DO
      Log.Char(V0.a);   
      V0 := V2; (* присваивание внутри WITH разрешено, т.к. тут тип не меняется*)
      Log.Char(V0.a)

   END;
END Do;

BEGIN 
END MyTest

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем Вирту WITH не угодил?
« Ответ #179 : Май 04, 2012, 07:37:22 pm »
Нельзя сказать, что оно разрешено - ведь явного разрешения в описании нет, я также могу сказать, что запрещено. Этот спор не имеет смысла, потому что основан на нашем индивидуальном восприятии. Здесь уместней было бы уточнение языка, а так зависит от реализации.