Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Stoop 304-metaclasses
1. S.Ducasse 1
QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture.
Stéphane Ducasse
Stephane.Ducasse@univ-savoie.fr
http://www.listic.univ-savoie.fr/~ducasse/
Classes and Metaclasses
- an Analysis
3. S.Ducasse 3
Goals
“Some books are to be tasted,
others to be swallowed,
and some few to be chewed and
digested”
— Francis Bacon, Of Studies
•Recap on Instantiation
•Recap on Inheritance
4. S.Ducasse 4
At first sight, a difficult topic!
You can live without really understanding them, but
metaclasses provide a uniform model, and you will make
less errors if you learn how they work, and you will
really understand the object model
Warning
5. S.Ducasse 5
• Every object is an instance of a class.
• Every class (except Object) is ultimately a subclass of
Object.
• When anObject receives a message, the method is
looked up in its class and/or its superclasses.
• A class defines the structure and the behavior of all its
instances.
• Each instance possesses its own set of values.
• Each instance shares its behavior with other instances.
This behavior is defined in its class, and is accessed via
the instance of link.
The Meaning of “Instance of”
6. S.Ducasse 6
• Everything is an object
• Every object is instance of exactly one class
• A class is also an object, and is an instance of its
metaclass
• An object is a class if and only if it can create instances
of itself.
Metaclass
9. S.Ducasse 9
The Meaning of Is-a
• Every object is an instance of a class.
• When anObject receives a message,
• the method is looked up in its class
• And it continues possibly in
• its superclasses
• Every class is ultimately
• a subclass of Object (except Object).
10. S.Ducasse 10
A Class is an Object too…
So messages sent to a class are looked up into the class
of the class
Node withName: #node1
Node is an instance of
“Node class”
withName: is looked up
in the class “Node class”
withName: defined in
“Node class”
lookup stops +
method executed
13. S.Ducasse 13
Class Parallel inheritance
• Workstation withName: #mac
• Workstation is an instance of Workstation class
• => withName: is looked up in the class Workstation
class
• withName: is not defined in Workstation class
• => lookup continues in the superclass of Workstation
class = Node class
• withName: is defined in Node class
• => lookup stops + method executed
14. S.Ducasse 14
Object
represents the common behavior (like error, halting...)
shared by all the instances (final instances and classes)
all the classes should inherit ultimately from Object
-> Workstation inherits from Node
-> Node inherits from Object
Class
represents the common behavior of all the classes
(compilation, method storing, instance variable storing)
Class inherits from Object because Class is an Object,
although a special one -> Class knows how to create
instances
So all the classes should inherit ultimately from Class
Responsibilities of Object & Class
15. S.Ducasse 15
The kernel of CLOS and ObjVlisp but not the kernel of
Smalltalk
A Fragile Reflective Kernel
18. S.Ducasse 18
No explicit metaclasses, only implicit non-sharable
metaclasses.
(1) Every class is ultimately a subclass of Object (except
Object itself)
Object
Behavior
ClassDescription
Class
Metaclass
(II) Every object is an instance of a class = every class is
an instance of a class which is its metaclass.
Smalltalk Metaclasses in 7 points
19. S.Ducasse 19
(3) Every class is an instance of a metaclass.
Every user defined class is the sole instance of another
class (a metaclass).
Metaclasses are system generated and they are unnamed.
You can access them by sending the message class to a
class.
Point class name -> ‘Point class’
Smalltalk Metaclasses in 7 points
20. S.Ducasse 20
If X is a subclass ofY then X class is a subclass ofY class.
But what is the superclass of the metaclass of Object?
The superclass of Object class is Class
All metaclasses are (ultimately) subclasses of Class.
But metaclasses are also objects so they should be
instances of a Metaclass
Smalltalk Metaclasses in 7 points
21. S.Ducasse 21
(5) Every metaclass is an instance of Metaclass. So
Metaclass is an instance of itself
Object : common object behavior
Class: common class behavior (name, multiple instances)
Metaclass: common metaclass behavior (no name, unique
instance)
Smalltalk Metaclasses in 7 points
22. S.Ducasse 22
(6) The methods of Class and its superclasses support
the behavior common to those objects that are classes.
(7) The methods of instances of Metaclass add the
behavior specific to particular classes.
Methods of instance of Metaclass = methods of “Packet
class” = class methods (for example withName:
An instance method defined in Behavior or
ClassDescription, is available as a class method. Example:
new, new:
Smalltalk Metaclasses in 7 points
24. S.Ducasse 24
Final Thoughts
Finally it is not sure that the Smalltalk model is more
complex than the one of ObjVlisp.
If we consider the programmer view of a class, Smalltalk
is simpler
If we consider the meta-programmer, ObjVlisp is simpler
26. S.Ducasse 26
Minimum state necessary for objects that have instances.
Basic interface to the compiler.
State: class hierarchy link, method dictionary, description of
instances (representation and number)
Methods:
creating a method dictionary, compiling method
instance creation (new, basicNew, new:, basicNew:)
class into hierarchy ( superclass:, addSubclass:
accessing (selectors, allSelectors, compiledMethodAt: )
accessing instances and variables (allInstances,
instVarNames)
accessing class hierarchy (superclass, subclasses)
testing (hasMethods, includesSelector, canUnderstand:,
inheritsFrom:, isVariable)
Behavior Responsibilities
27. S.Ducasse 27
ClassDescription adds a number of facilities to basic
Behavior:
named instance variables
category organization for methods
the notion of a name (abstract)
the maintenance of the Changes set, and logging changes
most of the mechanisms needed for fileOut
ClassDescription is an abstract class: its facilities are
intended for inheritance by the two subclasses, Class and
Metaclass.
ClassDescription Responsibilities
28. S.Ducasse 28
Metaclass
initialization of class variables
creating initialized instances of the metaclass’s sole instance
instance creation (subclassOf:)
metaclass instance protocol
(name:inEnvironment:subclassOf:....)
Class
Class adds naming for class
Class adds the representation for classVariable names and
shared pool variables (addClassVaraNames, addSharedPool:,
initialize)
Metaclass and Class Responsibilities