the power of simplicityclasses prototypes can modify methods only by subclassing objects can have...

Post on 30-Sep-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

the power of simplicitySELF

Rolph Recto + Jonathan DiLorenzo

Great Works in PL

April 30, 2019

2

SELF: The Power of SimplicityDavid Ungar, StanfordRandall B. Smith, Xerox PARC

OOPSLA 87

3

Smalltalk-80

Simula67

Self

Javascript

Java

C++

Dahl and Nygaard

Kay, Ingalls, and Goldberg

Stroustrup

Ungar and Smith

Eich

Gosling, Sheridan, and Naughton

1995

1991

1987

1985

1980

1967

4

Is JavaScript popular? It’s hard to say. Some Ajax developers profess (and demonstrate) love for it. Yet many curse it, including me. I still think of it as a quickie love-child of C and Self.

Brendan Eichhttps://brendaneich.com/2008/04/popularity/

5

everything is an object

all interactions are message

passing

prototypes, not classes

principles of Self

6

Smalltalk

everything isan object

methods and closures

controlstructures

primitive values

classes

((4 fac) between: 10 And: 100) ifTrue: “Hi!” False: ”Bye!”

7

call “ifTrue:False:” on true with args “Hi!” and “Bye!”, return “Hi!”

call “fac” method on 4, return 24

call “between:And:” on 24 with args 10 and 100, return true

8

Smalltalk Self

objects are instances of classes

objects are clonesof prototypes

9

Smalltalk Self

objects are instances of classes

objects are clonesof prototypes

C++

Java Javascript

10

classes prototypes

can modify methods only by subclassing

objects can have unique methods and fields

create objects by calling class constructor

create objects by cloning prototype

classes need metaclasses, etc. (infinite regress!)

no classes,no infinite regress

11

classes p := (Point new) x: 7 y: 9p print

follow p’s class pointer, check if print is defined there

not defined there, so follow superclass pointer

found “print” in Object class! Invoke with receiver “p”

12

classes p := (Point new) x: 1 y: 10p print

follow p’s class pointer, check if print is defined there

not defined there, so follow superclass pointer

found “print” in Object class! Invoke with receiver “p”

to have different print method, need to create Point subclass

13

prototypes p:= (point clone) x: 7 y: 9p print

does p have print method? no, so follow parent pointer to delegate

does Point delegate have “print”? no, so follow parent pointer to delegate

does Object delegate have print? yes, invoke with “p” as receiver

14

prototypes p:= (point clone) x: 1 y: 10p print

does p have print method? no, so follow parent pointer to delegate

does Point delegate have “print”? no, so follow parent pointer to delegate

does Object delegate have print? yes, invoke with “p” as receiver

to have special print method for p, define new slot in p -- no subclass needed!

method invocation clones prototype activation record

15

activation as cloning

16

state as behavior

field access and assignment are

messages to current receiver (self)

17

state as behavior

p x // p.x

p x: 2 // p.x = 2

18

example: points

traits

prototypes

root

_AddSlotsIfAbsent: (| traits = (). prototypes = ().|)

19

example: points

traits

prototypes

root

cloneablecopy _Clone

traits _AddSlotsIfAbsent:(|cloneable=()|)traits cloneable _Define:(| copy = (_Clone).|)

20

example: points

traits

prototypes

root

cloneable

point

copy _Clone

parent*

printString [method]

+ [method]

- [method]

traits _AddSlotsIfAbsent: (|point=()|)traits point _Define:(| parent* = traits cloneable. printString = … + aPoint = … - aPoint = …|)

21

example: points

traits

prototypes

root

cloneable

pointpoint

copy _Clone

parent*

printString [method]

+ [method]

- [method]

parent*

x 0

x: ⇐

y 0

y: ⇐

prototypes _AddSlotsIfAbsent (|point=()|)prototypes point _Define:(| parent* = traits point. x <- 0. y <- 0.|)

22

example: points

traits

prototypes

root

cloneable

pointpoint

copy _Clone

parent*

printString [method]

+ [method]

- [method]

((prototypes point) copy) x: 3 y: 4

parent*

x 3

x: ⇐

y 4

y: ⇐

parent*

x 0

x: ⇐

y 0

y: ⇐

23

discussion

is Self a good influence on modern languages?

are there cases when simplicity should be

abandoned?

what are the tradeoffs of Self’s flexibility?

top related