Advanced Reflection
in Pharo
Marcus Denker

http://rmod.lille.inria.fr
What you know…
•

Smalltalk is reflective

•

e.g. Classes and Methods are Objects

•

Reflective API on all Objects
Instance Variables
2 instance variables

Object subclass: #Point!
! instanceVariableNames: 'x y'!
! classVariableNames: ''!
! poolDictionarie...
•

Ask the class:
Point instVarNames

•

read:
3@4 instVarNamed: #x

•

write:
3@4 instVarNamed: #x put: 5
Great!
But…
This is just a String!

Object subclass: #Point!
! instanceVariableNames: 'x y'!
! classVariableNames: ''!
! poolDictionar...
returns an Array of Strings:

•

!

Point instVarNames
Why not Objects?
We can do better!
•

All classes have a Layout
!

•

Describes the memory layout defined by a
class
!

•

Layout and all the description are ...
•

Point layout
•

•

Array layout
•

•

a Normal Object

an Array of Pointers

ByteArray layout
•

an Array of Bytes
Point layout allSlots
!

==> an OrderedCollection(x => Slot y => Slot)
•

Slots know how to read values from Objects

!

mySlot := Point layout resolveSlot: #x.
mySlot read: 3@4.
Why?
Typed Slots
Slot subclass: #TypedSlot
layout: PointerLayout
slots: {#x => TypedSlot type: Integer}.
!
!

TypedSlot >> writ...
Property Slots
Object
subclass: #PropertyObject
layout: PointerLayout
slots: {
field => Slot
property1 => PropertySlot.
pro...
Others
•

BitSlot

•

BooleanSlot

•

Alias

•

Relationships (e.g. one-one, one-many)

•

…. Your Domain level Slot!
More in Paper from OOPSLA
Status
•

Slots are in Pharo3, but hidden
!

•

In Pharo4: un-hide and introduce some Special
Slots (e.g. Boolean, Propert...
Help Wanted!!!
So this worked well…
Lets do it again!
Turn another String
into
Objects
:-)
Methods
Lets have a look
•

Method are Objects, but…
!

•

No high-level model for sub-method elements
•

Message sends

•

Assignments

•

Variabl...
Can we do better?
Compilers have ASTs
Abstract Syntax Trees
•

Lets have a look at an example

(Object>>#halt) ast
•

Encodes the method as
a tree of node-objects

•

Visitor Pattern

•

Transformations
•

Refactoring tool
uses this!

RB...
In Pharo3
•

AST based Navigation in the Editor

•

“Suggestions”

•

Debugger uses AST for pc->code mapping

•

AST Inter...
Future
•

AST everywhere!

•

Do we need to store strings?

•

Can we have an AST based editor?

•

Sub-Method Reflection: ...
Can we modify the behaviour of code?
>

Annotate the AST with meta-links
Method
Meta
Link
Why?
•

Change behaviour for selected AST Nodes

•

“All assignments”

•

“this message send”
But without changing the pro...
Breakpoints
DEMO: Atoms
Behavioral Reflection

meta-object
links

activation
condition
source code
(AST)

© Marcus Denker
Uses…
•

Debugger
•

BreakPoints, WatchPoints

•

Profilers

•

Coverage Analysis

•

AOP
Will be in Pharo4
Will be in Pharo4
!!help wanted!!
What did we see?
•

Slots!
•
•

•

Instance variables are just described with strings
We can do better! Layout, Slots

AST...
Questions???
Upcoming SlideShare
Loading in …5
×

Advanced Reflection in Pharo

1,871
-1

Published on

A Lecture held at Universitat Politècnica de Catalunya on Oct 29, 2013

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,871
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Advanced Reflection in Pharo

  1. 1. Advanced Reflection in Pharo Marcus Denker http://rmod.lille.inria.fr
  2. 2. What you know… • Smalltalk is reflective • e.g. Classes and Methods are Objects • Reflective API on all Objects
  3. 3. Instance Variables
  4. 4. 2 instance variables Object subclass: #Point! ! instanceVariableNames: 'x y'! ! classVariableNames: ''! ! poolDictionaries: ''! ! category: 'Kernel-BasicObjects'
  5. 5. • Ask the class: Point instVarNames • read: 3@4 instVarNamed: #x • write: 3@4 instVarNamed: #x put: 5
  6. 6. Great!
  7. 7. But…
  8. 8. This is just a String! Object subclass: #Point! ! instanceVariableNames: 'x y'! ! classVariableNames: ''! ! poolDictionaries: ''! ! category: 'Kernel-BasicObjects'
  9. 9. returns an Array of Strings: • ! Point instVarNames
  10. 10. Why not Objects?
  11. 11. We can do better!
  12. 12. • All classes have a Layout ! • Describes the memory layout defined by a class ! • Layout and all the description are Objects
  13. 13. • Point layout • • Array layout • • a Normal Object an Array of Pointers ByteArray layout • an Array of Bytes
  14. 14. Point layout allSlots ! ==> an OrderedCollection(x => Slot y => Slot)
  15. 15. • Slots know how to read values from Objects ! mySlot := Point layout resolveSlot: #x. mySlot read: 3@4.
  16. 16. Why?
  17. 17. Typed Slots Slot subclass: #TypedSlot layout: PointerLayout slots: {#x => TypedSlot type: Integer}. ! ! TypedSlot >> write: aValue to: anInstance (aValue isNil or: [aValue isKindOf: type]) ifFalse: [ InvalidTypeError signal ]. super write: aValue to: anInstance.
  18. 18. Property Slots Object subclass: #PropertyObject layout: PointerLayout slots: { field => Slot property1 => PropertySlot. property2 => PropertySlot. ... propertyN => PropertySlot. }
  19. 19. Others • BitSlot • BooleanSlot • Alias • Relationships (e.g. one-one, one-many) • …. Your Domain level Slot!
  20. 20. More in Paper from OOPSLA
  21. 21. Status • Slots are in Pharo3, but hidden ! • In Pharo4: un-hide and introduce some Special Slots (e.g. Boolean, Property) • e.g. for Morphic (user interface objects)
  22. 22. Help Wanted!!!
  23. 23. So this worked well…
  24. 24. Lets do it again!
  25. 25. Turn another String into Objects
  26. 26. :-)
  27. 27. Methods
  28. 28. Lets have a look
  29. 29. • Method are Objects, but… ! • No high-level model for sub-method elements • Message sends • Assignments • Variable access ! • Structural reflection stops at the granularity of methods!
  30. 30. Can we do better?
  31. 31. Compilers have ASTs
  32. 32. Abstract Syntax Trees
  33. 33. • Lets have a look at an example (Object>>#halt) ast
  34. 34. • Encodes the method as a tree of node-objects • Visitor Pattern • Transformations • Refactoring tool uses this! RBProgramNode RBDoItNode RBMethodNode RBReturnNode RBSequenceNode RBValueNode RBArrayNode RBAssignmentNode RBBlockNode RBCascadeNode RBLiteralNode RBMessageNode RBVariableNode
  35. 35. In Pharo3 • AST based Navigation in the Editor • “Suggestions” • Debugger uses AST for pc->code mapping • AST Interpreter for experiments
  36. 36. Future • AST everywhere! • Do we need to store strings? • Can we have an AST based editor? • Sub-Method Reflection: The MetaLink
  37. 37. Can we modify the behaviour of code? > Annotate the AST with meta-links Method Meta Link
  38. 38. Why? • Change behaviour for selected AST Nodes • “All assignments” • “this message send” But without changing the program code!
  39. 39. Breakpoints
  40. 40. DEMO: Atoms
  41. 41. Behavioral Reflection meta-object links activation condition source code (AST) © Marcus Denker
  42. 42. Uses… • Debugger • BreakPoints, WatchPoints • Profilers • Coverage Analysis • AOP
  43. 43. Will be in Pharo4
  44. 44. Will be in Pharo4 !!help wanted!!
  45. 45. What did we see? • Slots! • • • Instance variables are just described with strings We can do better! Layout, Slots ASTs Everywhere! • Methods are objects, but internal structure not modelled • We can do better! AST, Sub-Method Reflection, MetaLinks
  46. 46. Questions???
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×