Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Genosse
Приветствую!

Вот это написано в комментарии к ProtoObject
"ProtoObject has no instance variables, nor should any be added."


При желании ничего не мешает мне создать в каком нибудь подклассе протообъекта переменные.
однако предупреждение настораживает...

Может быть это будет чревато какими то неприятными последствиями на длительной дистанции использования?
Есть у кого-нибудь мысли по данному поводу?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Denis Kudriashov
Привет.

Только Object и ProtoObject не должны иметь instance variables. С подклассами можно делать, что угодно (хотя есть и другие классы с ограничением).
Причина довольно интересная:

Проблема в том, что есть классы, к которым VM предъявляет определенные требования на набор и порядок переменных. Например, VM ожидает, что CompiledMethod это bytearray с переменным количеством слотов, где хранятся литералы. Но в то же время CompiledMethod - это еще и подвид Object и ProtoObject. И если добавить переменную в Object, то будет изменен формат всех методов в системе, что нарушит контракт с виртуалкой, и имидж сломается.

Другой пример, это класс любого объекта. Виртуалка ожидает, что поля любого класса начинаются с superclass, methodDict и format. И поскольку классы это тоже объекты, то добавление переменой в Object так же нарушит контракт, и все сломается.

Интересно было бы решить данную проблему. В Pharo сейчас добавлены first class layout для описания структуры экземпляров. И определенный тип layout-а вполне мог бы переопределять структуру экземпляров в обход наследования. 
 

14 декабря 2017 г., 8:29 пользователь Александр <[hidden email]> написал:
Приветствую!

Вот это написано в комментарии к ProtoObject
"ProtoObject has no instance variables, nor should any be added."


При желании ничего не мешает мне создать в каком нибудь подклассе протообъекта переменные.
однако предупреждение настораживает...

Может быть это будет чревато какими то неприятными последствиями на длительной дистанции использования?
Есть у кого-нибудь мысли по данному поводу?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Genosse
Ага, ясно. Спасибо

четверг, 14 декабря 2017 г., 12:15:42 UTC+3 пользователь Denis Kudriashov написал:
Привет.

Только Object и ProtoObject не должны иметь instance variables. С подклассами можно делать, что угодно (хотя есть и другие классы с ограничением).
Причина довольно интересная:

Проблема в том, что есть классы, к которым VM предъявляет определенные требования на набор и порядок переменных. Например, VM ожидает, что CompiledMethod это bytearray с переменным количеством слотов, где хранятся литералы. Но в то же время CompiledMethod - это еще и подвид Object и ProtoObject. И если добавить переменную в Object, то будет изменен формат всех методов в системе, что нарушит контракт с виртуалкой, и имидж сломается.

Другой пример, это класс любого объекта. Виртуалка ожидает, что поля любого класса начинаются с superclass, methodDict и format. И поскольку классы это тоже объекты, то добавление переменой в Object так же нарушит контракт, и все сломается.

Интересно было бы решить данную проблему. В Pharo сейчас добавлены first class layout для описания структуры экземпляров. И определенный тип layout-а вполне мог бы переопределять структуру экземпляров в обход наследования. 
 

14 декабря 2017 г., 8:29 пользователь Александр <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="mSako53OAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">gen...@...> написал:
Приветствую!

Вот это написано в комментарии к ProtoObject
"ProtoObject has no instance variables, nor should any be added."


При желании ничего не мешает мне создать в каком нибудь подклассе протообъекта переменные.
однако предупреждение настораживает...

Может быть это будет чревато какими то неприятными последствиями на длительной дистанции использования?
Есть у кого-нибудь мысли по данному поводу?

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="mSako53OAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Vladimir Los
In reply to this post by Denis Kudriashov
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в Object так же нарушит контракт, и все сломается."?

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Denis Kudriashov
1 января 2018 г., 23:06 пользователь Vladimir Los <[hidden email]> написал:
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в Object так же нарушит контракт, и все сломается."?

Если сделать так:

ProtoObject subclass: #Object
instanceVariableNames: 'newVar'
classVariableNames: 'DependentsFields'
package: 'Kernel-Objects'
 
Тогде у всех экземпляров CompiledMethod и Metaclass изменится порядок полей в памяти. Первым будет идти newVar (поля суперклассов идут первыми) вместо того, что ожидает виртуалка . В итоге все упадет. 
Например, чтобы искать метод для сообщения, виртуалка ожидает что получатель будет иметь экземпляр MethodDictionary в поле номер 2 в структуре объекта. 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Не могу разрешить терзающих сомнений... "ProtoObject has no instance variables, nor should any be added."

Genosse
Это интересно, чёрт возьми...
Жалко что документация сильно запаздывает, от чего некоторые вещи похожи на магию... )

ЗЫ.
Завидую Вам белой завистью за Ваше понимание устройства ST и Фаро в частности...

ЗЗЫ
Задачи то я давно решил...
Как всегда "костылями" (в этом я мастер ;) ), но всё-равно это далеко от полноценного владения ситуацией )


пятница, 5 января 2018 г., 18:20:30 UTC+3 пользователь Denis Kudriashov написал:
1 января 2018 г., 23:06 пользователь Vladimir Los <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="YMAnlmPjAAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">wlad...@...> написал:
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в Object так же нарушит контракт, и все сломается."?

Если сделать так:

ProtoObject subclass: #Object
instanceVariableNames: 'newVar'
classVariableNames: 'DependentsFields'
package: 'Kernel-Objects'
 
Тогде у всех экземпляров CompiledMethod и Metaclass изменится порядок полей в памяти. Первым будет идти newVar (поля суперклассов идут первыми) вместо того, что ожидает виртуалка . В итоге все упадет. 
Например, чтобы искать метод для сообщения, виртуалка ожидает что получатель будет иметь экземпляр MethodDictionary в поле номер 2 в структуре объекта. 

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="YMAnlmPjAAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.