Каждый Smalltalk имеет класс ClassBuilder
, экземпляры которого предназначены для создания новых классов. A ClassBuilder
делает это, сначала создав Metaclass
для класса, который собирается построить, отправив сообщение класса #new
на Metaclass
. Затем Metaclass
только что создал тот, который создает свой единственный экземпляр, используя примитив 'New'
.
. Причина наличия ClassBuilder
состоит в том, что классы не только создаются, но и могут быть изменены. Например, класс может изменить свой суперкласс на другой или оставить его, но изменить форму своих экземпляров или свою собственную форму.
ClassBuilder
заботится обо всех деталях, а также отвечает за перекомпиляцию методы экземпляра или класса, когда форма изменяется. Обратите внимание, что изменение в одном классе повлияет на все его подклассы, если таковые имеются. Таким образом, все задачи, необходимые для класса, также должны выполняться в подклассах.
Кроме того, новые классы должны быть установлены , в том смысле, что они должны быть включены в словарь Smalltalk, так что чтобы они оставались доступными и работоспособными.
Наконец, обратите внимание, что в случае изменения формы (которое может быть явным или последствием смены суперкласса на другой), существующие экземпляры класса должны быть перенесены так, соответствовать новой форме. Все эти задачи делают процесс, который проходит за кулисами, нетривиальным. Однако вы можете следовать ему с момента отправки сообщения определения класса до примитива 'New
'и до миграции существующих экземпляров.
Относительно того, как классы собирают мусор, хорошо, здесь нет ничего особенного. У Smalltalk нет сообщений для уничтожения. Объекты, на которые больше нет ссылок, становятся готовыми для сбора. Даже объекты, на которые все еще можно ссылаться, могут быть собраны, как это имеет место с двумя объектами, которые ссылаются друг на друга, но не ссылаются "извне", то есть (возможно, косвенно) из любого root.
Причина, по которой классы не являются (легко) GCed, заключается в том, что на них ссылаются из словаря Smalltalk
, который является одним из корней системы. Конечно, вы можете вручную удалить класс, что означает, что он будет удален из словаря Smalltalk
. В этих случаях среда поможет программисту выяснить, есть ли ссылки на Association
, связывающие имя класса с объектом класса из других классов. Среда также поможет программисту проверить, есть ли в классе, который должен быть удален, экземпляры или подклассы. Кроме того, поскольку каждый класс знает свои подклассы, оттуда ссылаются на классы, поэтому суперкласс должен удалить класс из списка подклассов в рамках процесса удаления класса.
Приложение (из комментариев ниже)
Q. Кто создает класс ClassBuilder
?
A. Это один из многих ) проблемы самозагрузки, которые решает каждый диалект Smalltalk. Любой Smalltalk рожден из ядра, то есть минимального набора классов и экземпляров с достаточной поддержкой для создания новых классов. В зависимости от диалекта, ClassBuilder
может принадлежать или не принадлежать ядру. Если это не так, то вы все равно можете создавать классы вручную, так как единственное, что нужно, - это возможность отправить сообщение #new
на Metaclass
. Однако обратите внимание, что Metaclass
(класс) должен быть в ядре, чтобы все это работало. Кроме того, когда вы сохраняете изображение, все объекты (включая классы и методы, которые тоже являются объектами) сохраняются на диск. После этого, когда вы загружаете изображение в память, там присутствуют те же самые объекты, и любые запущенные процессы (которые также являются объектами Smalltalk), которые выполнялись во время сохранения, возобновят работу с того места, где они были прерваны, когда произошла операция сохранения. Также обратите внимание на то, что ни один объект не «создается», он просто загружается с диска в память примитивной операцией копирования (+ возможного перемещения). Таким образом, #new
не задействуется, когда вы загружаете изображение, поскольку объекты уже есть.
Q. Как создается экземпляр ClassBuilder
?
A. Вы можете подумать, что он создан вручную, а затем сохранен в изображении. Итак, в следующий раз вы загрузите изображение ClassBuilder
(класс) будет доступно. На самом деле, сложность ClassBuilder
может потребовать нескольких итераций. Программист системы / среды выполнения может начать с создания очень простой версии, которую нужно обрабатывать с осторожностью, а затем использовать этот начальный класс для уточнения себя в дальнейших итерациях.
Q. Есть ли Metaclass
для каждого класса?
A. Да.
Q. Есть ли книга для узнать о внутреннем устройстве и реализации Smalltalk?
A. Smalltalk-80 Язык и его реализация (вы можете найти его в Интернете)