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

17 views
Skip to first unread message

Александр

unread,
Dec 14, 2017, 2:29:34 AM12/14/17
to Russian Smalltalk User Group
Приветствую!

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


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

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

Denis Kudriashov

unread,
Dec 14, 2017, 4:15:42 AM12/14/17
to sugr
Привет.

Только 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 пользователь Александр <gen...@live.ru> написал:

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

Александр

unread,
Dec 14, 2017, 5:00:45 AM12/14/17
to Russian Smalltalk User Group
Ага, ясно. Спасибо

четверг, 14 декабря 2017 г., 12:15:42 UTC+3 пользователь Denis Kudriashov написал:
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.

Vladimir Los

unread,
Jan 5, 2018, 9:23:09 AM1/5/18
to Russian Smalltalk User Group
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в Object так же нарушит контракт, и все сломается."?

Denis Kudriashov

unread,
Jan 5, 2018, 10:20:30 AM1/5/18
to sugr
1 января 2018 г., 23:06 пользователь Vladimir Los <wlad...@gmail.com> написал:
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в Object так же нарушит контракт, и все сломается."?

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

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

Александр

unread,
Jan 5, 2018, 6:18:11 PM1/5/18
to Russian Smalltalk User Group
Это интересно, чёрт возьми...
Жалко что документация сильно запаздывает, от чего некоторые вещи похожи на магию... )

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

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


пятница, 5 января 2018 г., 18:20:30 UTC+3 пользователь Denis Kudriashov написал:
1 января 2018 г., 23:06 пользователь Vladimir Los <wlad...@gmail.com> написал:
Добрый день.
А что такое и можно ли подробнее разъяснить, что стоит за выражением "добавление переменой в 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".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес sugr+uns...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages