OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 14:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 28 Май, 2016 23:19 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Info21 писал(а):
Илья Ермаков писал(а):
Так расширенную запись Вы не уложите в качестве значения!
Расширенные могут адресоваться только по указателю либо по ссылке.
Запросто уложу -- в параметр.


Ну так я и указал - адресоваться по ссылке.
Но не укладываться в переменную.
Value-параметр разве по ссылке передаётся, а не копированием всей записи на стек?
Ситуация вроде открытых массивов, нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 28 Май, 2016 23:25 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Баги исправлять нужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 00:29 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
Суть задачи, которую теперь запрещено решать.


Пётр, а зачем First сделан с VAR, а не с IN?
И зачем тогда экспортировать только для чтения, если ты всё равно хочешь дать все права внешнему миру?

Что твоё "для чтения" выражает? Всего лишь запрет на присваивание?
И сам пример какой-то вымороченный (там же, где и объявляется тип, делается и переменная - ну тогда зачем вообще методы, если можно процедуры...).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 00:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Info21 писал(а):
Value-параметр разве по ссылке передаётся, а не копированием всей записи на стек?
Ситуация вроде открытых массивов, нет?


Оп, а действительно, я упустил случай этот, когда полиморфный RECORD-параметр по значению...
Никогда в моей практике не применял... А для чего Вам это пригождалось?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 01:42 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Илья Ермаков писал(а):
Что твоё "для чтения" выражает? Всего лишь запрет на присваивание?
И сам пример какой-то вымороченный (там же, где и объявляется тип, делается и переменная - ну тогда зачем вообще методы, если можно процедуры...).

Это мне повезло и таких списков один на модуль. А если будет два - два набора процедур с разными префиксами? А зачем вообще методы?
Или вот, реальный пример, данные внутри типа ANYPTR, но клиенты получают Obj, им уже думать не надо.
Ну и да, суть именно в том, чтобы вместо затирания моего рекорда и ковыряния в моих указателях при полном доступе люди работали через официальный набор методов при ограниченном доступе.

Ну и конечно, если я сделаю тип POINTER TO RECORD я обойду это новоявленное ограничение легко и просто, но тогда я не понимаю, зачем нам статические рекорды...
Короче, очень спорное нововведение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 07:40 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
Ну и конечно, если я сделаю тип POINTER TO RECORD я обойду это новоявленное ограничение легко и просто, но тогда я не понимаю, зачем нам статические рекорды...

В Обероне-07 вообще нет методов, но статические записи есть. Записи как бы более фундаментальная вещь чем методы.
Зачем объявлять глобальную переменную типа записи без указателя? Вот это второй вопрос. Мне такая штука часто пригождается для хранения полей диалоговых окон, удобно разом обновлять их потом одним вызовом Dialog.Update.

Пётр Кушнир писал(а):
Это мне повезло и таких списков один на модуль. А если будет два - два набора процедур с разными префиксами? А зачем вообще методы?
Или вот, реальный пример, данные внутри типа ANYPTR, но клиенты получают Obj, им уже думать не надо.
Ну и да, суть именно в том, чтобы вместо затирания моего рекорда и ковыряния в моих указателях при полном доступе люди работали через официальный набор методов при ограниченном доступе.

Ограничить доступ возможно, спрятав процедуру в что-то типа фабрики. Для пользователя ничего не поменяется при этом.
Код:
MODULE PrivTest0;

   TYPE
      MyGlobalList = RECORD
         root, last: MyItem
      END;
     
      MyItem* = POINTER TO ABSTRACT RECORD
         next-: MyItem;
      END;

      Directory* = POINTER TO RECORD
         list: MyGlobalList
      END;
     
   VAR
      list-: Directory;
         
   PROCEDURE (l: Directory) Add*(i: MyItem), NEW;
   BEGIN
      ASSERT(i # NIL, 20);
      IF l.list.last = NIL THEN
         l.list.root := i;
         l.list.last := i
      ELSE
         l.list.last.next := i;
         l.list.last := i
      END;
   END Add;
   
   PROCEDURE (l: Directory) First*(): MyItem, NEW;
   BEGIN
      RETURN l.list.root
   END First;

BEGIN
   NEW(list)
   
END PrivTest0.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 07:50 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
А зачем вообще методы?
Может быть для контроля реализаций абстрактных записей?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 10:05 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Info21 писал(а):
Value-параметр разве по ссылке передаётся, а не копированием всей записи на стек?
Ситуация вроде открытых массивов, нет?
Оп, а действительно, я упустил случай этот, когда полиморфный RECORD-параметр по значению...
Никогда в моей практике не применял... А для чего Вам это пригождалось7
Пригождалось ли -- не припомню,
но разжевывать всю хиромантию с размещением параметров приходилось не раз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 10:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван Денисов писал(а):
Пётр Кушнир писал(а):
А зачем вообще методы?
Может быть для контроля реализаций абстрактных записей?
Типы ходят со своими процедурами.

Сейчас в работе задачка, где шесть (на вскидку; может, и больше) наследников одного базового типа.
И с пяток процедурок для каждого.
Если не привязывать соответствующие процедуры к типам автоматически, то возникает геморрой,
во-первых, с передачей этих процедур (что-ли, руками лепить дескриптор с полями-процедурными переменными и передавать его целиком),
во-вторых, с динамическими проверками и приведением типов.

В общем, в коде лезет какая-то пена, и как-то слишком её много.

Про Николая нашего Вальтеровича люди шутили именно в контексте подобных диспутов, что его представления о программировании ограничиваются написанием компилятора.
Это некое преувеличение,
но методы в Обероне-2 действительно открыли некий ящичек пандорры,
и в том, чтобы держаться классического Оберона, немало смысла.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 11:22 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
Ну и конечно, если я сделаю тип POINTER TO RECORD я обойду это новоявленное ограничение легко и просто, но тогда я не понимаю, зачем нам статические рекорды...
Короче, очень спорное нововведение.


Ну вот, кстати, в твоем примере реально нет разницы между RECORD и POINTER TO RECORD. У тебя это синглтон, существует совместно с модулем. Делай POINTER и не заморачивайся.

Статические рекорды - для снижения нагрузки на сборщик, которая становится дикой, если язык все держит на куче.
Вот недавно опять рассказали "ужастик", как при росте нагрузки серверная система на Node.js, интенсивно обрабатывающая большие структуры данных, стала жрать подавляющее время (больше 50%) на сборку мусора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 11:33 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Info21 писал(а):
Про Николая нашего Вальтеровича люди шутили именно в контексте подобных диспутов, что его представления о программировании ограничиваются написанием компилятора.
Это некое преувеличение,
но методы в Обероне-2 действительно открыли некий ящичек пандорры,
и в том, чтобы держаться классического Оберона, немало смысла.


Имхо, Вирт железно держится принципа - "никого не слушай и обобщай в своих системах только тот опыт, который сам пощупал". И правильно.
Что делает им заложенное в язык ценнейшим экстрактом (потому что он только качественного "отжима"), но не исключает того, что сильно отличающаяся от сферы его опыта предметка может запросить каких-то дополнений.
Как и происходит с тем же КП в ряде задач. Который, кстати, тоже расширяли от реального опыта, а не просто в диссертации, поглядывая на Яву, как с Active Oberon (при всём уважении).

Короче, если я не ошибаюсь, то посыл Вирта: "Оберон - это то, в чём я уверен железобетонно. Берите. А в остальном, что туда не вошло, я не уверен, делайте, как знаете".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 20:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Пётр Кушнир писал(а):
если я сделаю тип POINTER TO RECORD я обойду это новоявленное ограничение легко и просто
Может, я что-то недопрочитал, но обойти самому -- и закрыть путь пользователю -- это две разницы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Май, 2016 21:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Статические рекорды - для снижения нагрузки на сборщик, которая становится дикой, если язык все держит на куче.

Вот недавно опять рассказали "ужастик", как при росте нагрузки серверная система на Node.js, интенсивно обрабатывающая большие структуры данных, стала жрать подавляющее время (больше 50%) на сборку мусора.
Вспоминается Reduce-2, основанный на лиспе, который в неких задачках месил сбор мусора по 90% времени.
Лисп вообще генерит мусор мощным фонтаном.

Уже не раз приходилось высказывать наблюдение, что Оберон -- в отличие и от лиспа, и от фортрана (как типических представителей) -- позволяет разделить проблему прояснения прикладной логики и проблему управления памятью:

начать с прописывания логики, полагаясь на сборщик мусора,
а потом -- уже имея перед глазами все циклы и проч. -- "статизировать" условные 80% динамической памяти, оставив трудный, но маленький остаток сборщику мусора (или кому-то в будущем как упражнение).

"Разделяй и властвуй." (с)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 00:51 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Согласен с Петром. Ресивер метода и параметр процедуры модуля не одно и то же.
А самое главное: VAR - это все же техническое решение изначально, а не концептуальное. Для указателей и записей интерпретация должна быть разной. Иначе будет каша как ни крути. Вообще все эти readonly, IN, OUT и соответствующая непростая семантика в CP, смахивают на попытки натянуть сову на глобус. Ну нету в оберонах концепции неизменяемых объектов! В оригинальном обероне VAR - это тупой модификатор для решения двух совершенно конкретных задач:
1) Изменение значения переданного в параметр внутри процедуры (иначе придется возвращать с копированием, плюс ко всему более одного значения вообще нельзя вернуть)
2) Избежание копирования больших значений при передаче параметром (ровно то, что в go решается указателем)
Насколько я понимаю Вирта, тут нет никакой идеи изменяемость/неизменяемость. Т.е. VAR - это не архитектурная плюшка, а что-то вроде директивы компиляции. Решение инженерное и вынужденное, но простое в реализации и использовании. И, кстати, это решение совершенно очевидное и неизбежное. Попробуйте ка придумать иначе! Вот, например, в go сделано иначе. Там на любое значение в любом месте можно получить указатель и делать с ним что хочешь. Вплоть до возврата из функции указателя на локальный рекорд. Где будет размещен при этом рекорд, решает компилятор. Сделано это ценой усложнения компилятора.

В CP внезапно VAR обретает новые смыслы и домыслы. Тут и там попытки решать сомнительные задачи в сомнительной модели архитектуры. Никакой сильной концепции все эти свистоперделки не несут, и конкретных проблем не решают (если не насасывать палец до посинения). Если хочется настоящих концепций про контроль доступа, то это в Rust. Или там в уровни изоляции транзакций в СУБД.

Вообще, имхо, методы нужно воспринимать как сообщения. Мы посылаем объекту сообщения, а как на них реагировать, решает сам объект. В идеале к кишкам объекта доступа быть вообще не должно, а все свои инварианты объект сохранит сам. И где тут приткнуть это самое readonly? Что оно дает?
На мой взгляд доступ для чтения может понадобиться только в одном случае: если нам лень писать методы для проверки состояния объекта, и мы хотим дать возможность читать это самое состояние напрямую. И тут вдруг нельзя вызывать методы... С какого перепугу?

Вы посмотрите на это с другой стороны. Модификатором "-" мы не запрещаем изменение, а разрешаем просмотр!

Разрешаем, а не запрещаем! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 01:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
VAR -- это как раз концептуальное решение.

И вообще, в чём разница между концептуальным и техническим, если речь о технике?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 09:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
ilovb писал(а):
Вообще все эти readonly, IN, OUT и соответствующая непростая семантика в CP, смахивают на попытки натянуть сову на глобус. Ну нету в оберонах концепции неизменяемых объектов! В оригинальном обероне VAR - это тупой модификатор для решения двух совершенно конкретных задач:
1) Изменение значения переданного в параметр внутри процедуры (иначе придется возвращать с копированием, плюс ко всему более одного значения вообще нельзя вернуть)
2) Избежание копирования больших значений при передаче параметром (ровно то, что в go решается указателем)
Насколько я понимаю Вирта, тут нет никакой идеи изменяемость/неизменяемость. Т.е. VAR - это не архитектурная плюшка, а что-то вроде директивы компиляции.


CP-New.odc писал(а):
These parameter modes are like the VAR mode, except that some restrictions apply. IN parameters cannot directly be modified inside a procedure, OUT parameters are considered undefined upon procedure entry (except for pointers and procedure variables, which are set to NIL upon procedure entry). OUT record parameters must have identical actual and formal parameter types.
These parameter modes are important for procedure signatures of distributed objects, and they can increase convenience and efficiency. Most importantly, they allow to make interface declarations more precise and more self-documenting. In particular, where formerly VAR parameters have been used for efficiency reasons only, it is now possible to use IN parameters. IN parameters are only allowed for record and array types.

Главным образом IN и OUT вводятся для уточнения интерфейсов. А нарушения интерфейсов, раз мы признаем их существование, надо проверять. В этом важная фишка Оберона, что его простота позволяет это делать. А раз нам надо проверять, то надо, чтобы все правила работали четко. Возможности передать read-only объект как аргумент типа VAR не должно быть, иначе невозможно провести проверку нарушения интерфейсов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 09:09 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1134
Откуда: СССР v2.0 rc 1
Скорей всего, я как дилетант от программирования -- ошибаюсь.
VAR выражает идею, прежде всего -- изменяемости объекта, а не способ его передачу в процедуру.
То, что VAR при этом передаёт по ссылке объект в процедуру -- это уже техническая реализация идеи. Могло бы быть и по другому, если бы ЦП позволял.
Т. е. тут есть разделение на идею, и техническую реализацию, причём идея, как и положено -- выше реализации.
Именно поэтому, раз введён VAR, то логично ввести IN и OUT (что, имхо, разумно и достаточно). И все три уточнения реализованы как ссылки на объект!!
Но у каждого своя семантика. Что уже идея.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 09:13 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Разделяю точку зрения Йозефа Темпла по данному вопросу: http://forum.blackboxframework.org/view ... =205#p2039
Josef Templ писал(а):
As far as I see the language report does not make a distinction between
compatibility rules for the receiver and other parameters.

It would also not give much sense to support both IN and VAR for the receiver
without making any difference between them in the compatibility checking.

Разницы в проверке совместимости не должно быть. Иначе получается, что IN и VAR будут иметь одинаковый смысл при аргументе метода, тогда получается синтаксическая избыточность, что было бы явным косяком в дизайне языка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 09:20 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Info21 писал(а):
VAR -- это как раз концептуальное решение.

И вообще, в чём разница между концептуальным и техническим, если речь о технике?


Речь не только о технике, а еще и о языке. Какую концепцию несет VAR в языке?
Никакой ведь не несет. Программировать можно вообще без VAR и ничего при этом не изменится в смысле вычислений.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Май, 2016 09:40 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Иван Денисов писал(а):
Главным образом IN и OUT вводятся для уточнения интерфейсов. А нарушения интерфейсов, раз мы признаем их существование, надо проверять. В этом важная фишка Оберона, что его простота позволяет это делать. А раз нам надо проверять, то надо, чтобы все правила работали четко. Возможности передать read-only объект как аргумент типа VAR не должно быть, иначе невозможно провести проверку нарушения интерфейсов.


Зачем усложнять понятие "интерфейс"?

Интерфейс - способ взаимодействия между двумя системами.
Процедура не объект и не система. Называть ее сигнатуру интерфейсом несколько натянуто.
И от изменения сигнатур интерфейс, думается, не должен становиться более сильным/слабым.
Более того интерфейс - это абстракция, которая как раз скрывает за собой настоящее устройство объекта/системы.
Интерфейс - это приборная панель с лампочками и кнопочками. Эту идею прекрасно воплощает набор методов объекта.
Параметры у методов тут особого значения не имеют. Это лишь удобство типа сделать r.inc(10) вместо r.inc() 10 раз.
Ну а доступ регулируется простой видимостью методов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB