Smalltalk Implementation

Similar documents
Optimization Techniques

Abstract Interpretation for Dummies

Working with Bytecodes: IRBuilder and InstructionStream. Marcus Denker. Reasons for working with Bytecode

Parsing Scheme (+ (* 2 3) 1) * 1

High-Level Language VMs

A Tour of the Squeak Object Engine Tim Rowledge,

Run-time Environments. Lecture 13. Prof. Alex Aiken Original Slides (Modified by Prof. Vijay Ganesh) Lecture 13

9. Bytecode and Virtual Machines! Original material prepared by Adrian Lienhard and Marcus Denker!

Call Stack Management

Run-time Environments

Object Oriented Paradigm Languages

Run-time Environments

CS201 - Introduction to Programming Glossary By

CSE 401/M501 Compilers

Sista: Improving Cog s JIT performance. Clément Béra

Short Notes of CS201

Compiling Techniques

code://rubinius/technical

G Programming Languages - Fall 2012

Code Generation. Dragon: Ch (Just part of it) Holub: Ch 6.

1 Reflection and Metaprogramming in Smalltalk

Agenda. CSE P 501 Compilers. Java Implementation Overview. JVM Architecture. JVM Runtime Data Areas (1) JVM Data Types. CSE P 501 Su04 T-1

CSE P 501 Compilers. Java Implementation JVMs, JITs &c Hal Perkins Winter /11/ Hal Perkins & UW CSE V-1

CS558 Programming Languages

Code Generation. Lecture 12

11. Working with Bytecode

CS 536 Introduction to Programming Languages and Compilers Charles N. Fischer Lecture 11

CS558 Programming Languages Winter 2018 Lecture 4a. Andrew Tolmach Portland State University

Scope, Functions, and Storage Management

CSC 8400: Computer Systems. Using the Stack for Function Calls

Run-time Environment

Lecture 3: C Programm

CSC 2400: Computer Systems. Using the Stack for Function Calls

Lecture Outline. Topic 1: Basic Code Generation. Code Generation. Lecture 12. Topic 2: Code Generation for Objects. Simulating a Stack Machine

Implementing Functions at the Machine Level

Lectures 3-4: MIPS instructions

The Smalltalk class hierarchy

Example. program sort; var a : array[0..10] of integer; procedure readarray; : function partition (y, z :integer) :integer; var i, j,x, v :integer; :

Chapter 11: Compiler II: Code Generation

StackVsHeap SPL/2010 SPL/20

Squeak Object Model. Technion - Israel Institute of Technology. Updated: Spring Object-Oriented Programming 1

Exupery A Native Code Compiler for Squeak

Heap, Variables, References, and Garbage. CS152. Chris Pollett. Oct. 13, 2008.

Code Generation Super Lectures

CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Code Generation. Lecture 19

Project. there are a couple of 3 person teams. a new drop with new type checking is coming. regroup or see me or forever hold your peace

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

Cog VM Evolution. Clément Béra. Thursday, August 25, 16

Some instance messages and methods

Page 1. Structure of von Nuemann machine. Instruction Set - the type of Instructions

Chapter 8: Virtual Machine II: Program Control

SABLEJIT: A Retargetable Just-In-Time Compiler for a Portable Virtual Machine p. 1

Java Internals. Frank Yellin Tim Lindholm JavaSoft

Subprograms, Subroutines, and Functions

Compiler II: Code Generation Human Thought

Virtual Machine Where we are at: Part I: Stack Arithmetic. Motivation. Compilation models. direct compilation:... 2-tier compilation:

Pharo Syntax in a Nutshell

Problem with Scanning an Infix Expression

Data Abstraction. Hwansoo Han

Code Generation. The Main Idea of Today s Lecture. We can emit stack-machine-style code for expressions via recursion. Lecture Outline.

We can emit stack-machine-style code for expressions via recursion

CS61C : Machine Structures

Compiler Construction

A Tour to Spur for Non-VM Experts. Guille Polito, Christophe Demarey ESUG 2016, 22/08, Praha

The SURE Architecture

Operating Systems CMPSCI 377, Lec 2 Intro to C/C++ Prashant Shenoy University of Massachusetts Amherst

Run-Time Data Structures

CSC 2400: Computer Systems. Using the Stack for Function Calls

Anne Bracy CS 3410 Computer Science Cornell University

Virtual Machine. Part I: Stack Arithmetic. Building a Modern Computer From First Principles.

Compiler Construction

Motivation. Compiler. Our ultimate goal: Hack code. Jack code (example) Translate high-level programs into executable code. return; } } return

Prof. Kavita Bala and Prof. Hakim Weatherspoon CS 3410, Spring 2014 Computer Science Cornell University. See P&H 2.8 and 2.12, and A.

Lecture Notes on Garbage Collection

Stream Computing using Brook+

CSE 504: Compiler Design. Runtime Environments

Problem with Scanning an Infix Expression

Smalltalk: A White Paper Overview

Lectures 5-6: Introduction to C

Binding and Storage. COMP 524: Programming Language Concepts Björn B. Brandenburg. The University of North Carolina at Chapel Hill

Procedure and Object- Oriented Abstraction

SOFTWARE ARCHITECTURE 7. JAVA VIRTUAL MACHINE

CSc 453 Interpreters & Interpretation

Advanced Programming & C++ Language

CIT Week13 Lecture

The remote testing experiment. It works! Code Generation. Lecture 12. Remote testing. From the cs164 newsgroup

Do-While Example. In C++ In assembly language. do { z--; while (a == b); z = b; loop: addi $s2, $s2, -1 beq $s0, $s1, loop or $s2, $s1, $zero

Inheritance, Polymorphism and the Object Memory Model

CMSC330 Fall 2013 Practice Problems 6 Solutions

CS356: Discussion #6 Assembly Procedures and Arrays. Marco Paolieri

Run-time Environments - 2

Intermediate Code Generation (ICG)

Introduction to Smalltalk

MPATE-GE 2618: C Programming for Music Technology. Unit 4.1

G Programming Languages - Fall 2012

Systems I. Machine-Level Programming V: Procedures

Contents. 8-1 Copyright (c) N. Afshartous

The Procedure Abstraction

Stacks and Frames Demystified. CSCI 3753 Operating Systems Spring 2005 Prof. Rick Han

Transcription:

Smalltalk Implementation Prof. Harry Porter Portland State University 1

The Image The object heap The Virtual Machine The underlying system (e.g., Mac OS X) The ST language interpreter The object-memory manager Outline: Describe a simple implementation Representation of objects in memory The bytecode representation of ST code The bytecode interpreter Memory management / garbage collection algorithms Optimization Techniques 2

References Smalltalk-80: The Language and its Implementation, by Goldberg and Robson (Part IV), Addison-Wesley, 1983. Smalltalk-80: The Language, by Goldberg and Robson (Chapter 21), Addison-Wesley, 1989. Smalltalk-80: Bits of History, Words of Advice, ed. Glen Krasner, Addison-Wesley, 1983. Generation Scavenging: A Non-Disruptive High Performance Storage Reclamation Algorithm, by David Ungar, ACM Software Engineering Notes/SIGPLAN Notices: Software Engineering Symposium on Practical Software Development Environments, Pittsburgh, PA, 1984. Efficient Implementation of the ST-80 System, by Peter L. Deutsch and Allan M. Schiffman, POPL-84, Salt Lake City, UT, 1984. Architecture of SOAR: Smalltalk on a RISC, by Ungar, Blau, Foley, Samples, Patterson, 11th Annual Symposium on Computer Architecture, Ann Arbor, MI, 1984. The Design and Evaluation of a High Performance Smalltalk System, by David M. Ungar, MIT Press, ACM Distinguished Dissertation (1986), 1987. 3

Representing Objects Object = Block of memory (i.e., struct, record ) Field = Offset into record ( instance variable ) name ssnumber addr Person 32-bits 4

Representing Objects Object = Block of memory (i.e., struct, record ) Field = Offset into record ( instance variable ) Header A hidden field, included in every object. Tells the class of the object (and other stuff). <header> name ssnumber addr Person 32-bits 5

Representing Objects Subclassing: Existing fields in the same locations New fields added to end of record Example: Student is a subclass of Person <header> name ssnumber addr Person 32-bits <header> name ssnumber addr major advisor gpa Student 32-bits 6

Tagged Values Object-Oriented Pointers (OOPs) 32 bits 0 SmallIntegers (-1,073,741,824.. 1,073,741,823) to an (even) address in memory 32 bits 564,321 1 Objects size class 0 0 1 0 0 0 1 0 1 header instance variables Each field is tagged 7

Other formats for objects (containing raw bits) ByteArray WordArray size class 0 0 1 0 01 23 A0 4F 23 CC D6 FF 45 4A F0 80 56 86 7F 7F 78 00 00 00 Header Normal Instance Variables size class 0123A04F 23CCD6FF 454AF080 56867F7F 78303132 0 0 1 0 Header Normal Instance Variables These fields are not tagged 8

Bytecodes The instructions of the virtual machine (VM) interpreter The VM executes one bytecode instruction after another. Note: execute = interpret = emulate A real machine executes instructions. The VM executes bytecodes. Like machine language instructions Comparable level of detail 1 to 4 bytes long Tight encoding into the available bits (CISC architecture) (Java used ST s approach VM, bytecodes, etc.) 9

The Compiler Translates methods (i.e., Strings) into instances of a class called CompiledMethod Contains a sequence of bytes (the bytecodes to execute) 10

The Compiler Translates methods (i.e., Strings) into instances of a class called CompiledMethod Contains a sequence of bytes (the bytecodes to execute) CompiledMethod is subclass of ByteArray. size class 0 0 1 0 01 23 A0 4F 23 CC D6 FF 45 4A F0 80 56 86 7F 7F 78 00 00 00 header literals, constants, etc. (optional) bytecodes to be executed 11

Class Symbol Symbols are used for method selectors. 'hello' 'at:put:' #hello #at:put: Like the class String. Symbol is a subclass of String. Consider a string 'hello' there may be many Strings with these chars. Consider the symbol #hello there is only one Symbol with these chars. There is a system-wide collection of all Symbol objects. All Symbol objects are kept in this symbol table. String 'hello' and 'hello' may be two different objects. = will compare characters, one-by-one. You should always use = to test Strings. Symbol You can always rely on ==, which is fast! 12

Representing Classes An object size/flags class 13

Representing Classes An object An object (representing a class) header size/flags class superclass methods inst size 14

Representing Classes An object An object (representing a class) a MethodDictionary header drawon: code size/flags class superclass methods inst size do:iferror: mymethod: code code etc. 15

Representing Classes header drawon: code size/flags class superclass methods inst size do:iferror: mymethod: code code etc. 16

header superclass methods inst size Representing Classes header drawon: code size/flags class superclass methods inst size do:iferror: mymethod: code code etc. 17

header superclass methods inst size Representing Classes drawon: code do:iferror: code mymethod: code etc. header drawon: code size/flags class superclass methods inst size do:iferror: mymethod: code code etc. 18

header superclass methods inst size Representing Classes drawon: code do:iferror: code mymethod: code etc. size/flags class header superclass methods inst size header N N header N #drawon: method 19

header superclass methods inst size Representing Classes header M header M M size/flags class header superclass methods inst size header N #drawon: N header method N #drawon: method 20

Typical instructions: push pop add call return jump Example Source: Compiler produces: Stack Machine Architectures 21

Typical instructions: push pop add call return jump Example Source: 4 + y Compiler produces: push 4 push y add Stack Machine Architectures 22

Typical instructions: push pop add call return jump Example Source: x := 4 + y; Compiler produces: push 4 push y add pop x Stack Machine Architectures 23

Typical instructions: push pop add call return jump Example Source: x := 4 + y; Compiler produces: push 4 push y add pop x Stack Machine Architectures 24

Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Stack Machine Architectures 25

Stack Machine Architectures Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + foo(a,b+c) * z; Compiler produces: 26

Stack Machine Architectures Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + foo(a,b+c) * z; Compiler produces: push 4 push z mult add pop x 27

Stack Machine Architectures Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + foo(a,b+c) * z; Compiler produces: push 4 push b push c add push z mult add pop x 28

Stack Machine Architectures Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + foo(a,b+c) * z; Compiler produces: push 4 push a push b push c add call foo push z mult add pop x 29

Stack Machine Architectures Typical instructions: push pop add call return jump Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + (a do: b+c) * z; Compiler produces: push 4 push a push b push c add call foo push z mult add pop x 30

Stack Machine Architectures Typical instructions: push pop add call return jump send Example Source: x := 4 + y * z; Compiler produces: push 4 push y push z mult add pop x Example Source: x := 4 + (a do: b+c) * z; Compiler produces: push 4 push a push b push c add call foo push z mult add pop x send #do: 31

Typical instructions: push x pop x sendmessage #xxx returntop jump x etc The Virtual Machine Each is encoded into 8-bit bytecode: 00 push receiver s 1st instance variable 01 push receiver s 2nd instance variable 60 pop into 1st instance variable 61 pop into 2nd instance variable 76 push constant 1 C0 send #at: B1 send #- 7C return top etc 32

Typical instructions: push x pop x sendmessage #xxx returntop jump x etc The Virtual Machine Each is encoded into 8-bit bytecode: 00 push receiver s 1st instance variable 01 push receiver s 2nd instance variable 60 pop into 1st instance variable 61 pop into 2nd instance variable 76 push constant 1 C0 send #at: B1 send #- size 7C return top class 0 0 etc 1 0 00 01 60 61 76 C0 B1 7C As Stored in the Object: header discussed later bytecodes 33

An Example Method Method: poplifo mytemp mytemp lifoarray at: lifotop. lifotop lifotop - 1. ^ mytemp Class: Lifo Instance Variables: lifoarray (1st inst var) lifotop (2nd inst var) Compiled Bytecodes: 34

An Example Method Method: poplifo mytemp mytemp lifoarray at: lifotop. lifotop lifotop - 1. ^ mytemp Class: Lifo Instance Variables: lifoarray (1st inst var) lifotop (2nd inst var) Compiled Bytecodes: 00 Push receiver s 1st instance variable (lifoarray) 01 Push receiver's 2nd instance variable (lifotop) C0 Send binary message #at: 68 Pop stack into 1st temp variable (mytemp) 01 Push receiver s 2nd instance variable (lifotop) 76 Push constant 1 B1 Send binary message #- 61 Pop stack into receiver s 2nd instance variable (lifotop) 10 Push 1st temp variable (mytemp) 7C Return stack top 35

Bytecodes Can Refer to Operands Directly: The receiver (self) The arguments to the method The receiver s instance variables The temporary variables (i.e., local variables) Some common constants: nil, true, false, -1, 0, 1, 2 32 common message selectors: + - < = at: at:put: @ x y Indirectly: Thru the literal frame : Constants occurring within the method (e.g., 57, $a, abc ) All other message selectors Global variables (e.g., class names) 36

The Format of CompiledMethod Objects OOPs Literal Frame Bytecodes Obj-header meth-header 00 01 C0 68 01 76 B1 61 10 7C CC D6 45 4A F0 80 5B 00 00 01 String abcde Symbol #drawon:with: Association #Person Person 37

The CompiledMethod Header The size of the activation record (i.e., the stack frame ) The number of temporary variables for this method Number of literals (i.e., where to find 1st bytecode) Additional flags: Just return self Just return instance variable k (where k = 0.. 31) Is this a normal method? Number of arguments? 0.. 4 An extension header word is used for all other cases Number of arguments? (0.. 31) Is this a primitive method? (0.. 255) 38

Message Selectors From the bytecode, the interpreter can get the message selector the number of arguments 32 commonly used selectors are handled specially + - < = @ do: at: at:put: class Two versions of the send-message bytecode Optimized encoding for the 32 common selectors 1 0 1 - - - - - The more general version Longer than 1 byte The number of arguments 32 common selectors Implicit general send-message bytecode Encoded into the instruction 39

All Other Selectors The remaining selectors are stored in the literal area The bytecode for a general send includes: Which literal field points to the selector Number of arguments Bytecode: B4 23 Send (literal: 2; numargs: 3) Literal Frame Obj-header meth-header 1: 2: 3: 00 01 C0 68 01 76 B1 61 10 7C CC D6 B4 23 F0 80 5B 00 00 01 Symbol #drawon:at:width: 40

Activation Records When a method is called, a MethodContext is created. Like an Activation Record or Frame in traditional language MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments CompiledMethod meth-header literals bytecodes temp variables execution stack the receiver 41

Activation Records When a method is called, a MethodContext is created. Like an Activation Record or Frame in traditional language MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments CompiledMethod meth-header literals bytecodes temp variables execution stack the receiver 42

What Happens When a Message is Sent? x at: y put: z 00 00 00 push x onto the stack push y onto the stack push z onto the stack 00 send #at:put: message (numargs: 2) (Pops recvr and args. Leave result on top of sender s stack.) Find the receiver buried underneath the args Do method lookup to obtain the CompiledMethod object Allocate a new MethodContext (The CompiledMethod tells how big the MethodContext should be) Initialize the MethodContext Pointer to receiver Instruction pointer Pointer to the CompiledMethod object Pointer to the top of the stack Pointer to the sending context Pop the message arguments and store into the new MethodContext Begin executing bytecodes in the new method, using the new MethodContext 43

MethodContexts are Objects! Advantages MethodContexts live in the object heap Running code can be saved in the image file Debugger can access them easily Debugging tools can be written in Smalltalk Blocks are represented as objects, too! A BlockContext object can be passed around, stored, etc. You can send messages to blocks (e.g., #value) Disadvantages 44

MethodContexts are Objects! Advantages MethodContexts live in the object heap Running code can be saved in the image file Debugger can access them easily Debugging tools can be written in Smalltalk Blocks are represented as objects, too! A BlockContext object can be passed around, stored, etc. You can send messages to blocks (e.g., #value) Disadvantages Creation overhead! Very short lifetimes! Big strain on the garbage collector 45

MethodContexts are Objects! Advantages MethodContexts live in the object heap Running code can be saved in the image file Debugger can access them easily Debugging tools can be written in Smalltalk Blocks are represented as objects, too! A BlockContext object can be passed around, stored, etc. You can send messages to blocks (e.g., #value) Disadvantages Creation overhead! Very short lifetimes! Big strain on the garbage collector Conclusion: A worthwhile abstraction but special optimizations are mandatory! (A stack is really used) 46

PrimitiveMethods Some methods are implemented directly in the VM. SmallInteger arithmetic, I/O, performance critical code, etc. The VM executes a native C function. Normal bytecode execution does not happen. Primitive operations may fail. e.g., the C code cannot handle some special cases. The native code terminates The method is executed, as normal. 47

PrimitiveMethods Some methods are implemented directly in the VM. SmallInteger arithmetic, I/O, performance critical code, etc. The VM executes a native C function. Normal bytecode execution does not happen. Primitive operations may fail. e.g., the C code cannot handle some special cases. The native code terminates The method is executed, as normal. Example from SmallInteger: / anumber <primitive: 10> The backup method anumber iszero iftrue: [^(ZeroDivide dividend: self) signal]. (anumber ismemberof: SmallInteger) iftrue: [^(Fraction numerator: self denominator: anumber) reduced] iffalse: [^super / anumber] 48

PrimitiveMethods Implementation A flag in the header of the CompiledMethod Does this method have a primitive implementation? Header includes the primitive number (0.. 255) The MethodContext is not created Instead, a native routine in the VM is called. The native routine manipulates values on the sender s stack Pop arguments off the stack Leave the result on the stack Problems while executing a primitive? Primitives execution fails Undo any partial execution Execute the backup method Create a MethodContext Execute the CompiledMethod s bytecodes 49

Every block is an object Blocks... b4 := [ :x :y stmt. stmt. stmt. x+y ]....... z := b4 value: a value: b.... 50

Every block is an object Blocks... b4 := [ :x :y stmt. stmt. stmt. x+y ]....... z := b4 value: a value: b.... BlockContext When encountered in execution, a BlockContext is created. When evaluated, it s like invoking a method. After execution, the block returns to the caller [ :x :y stmt. stmt. stmt. x+y ] from the method where it was created [ :x :y stmt. stmt. stmt. ^x+y ] The BlockContext object will be garbage collected when no longer needed (i.e., not reachable) 51

How are Blocks Represented? MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments CompiledMethod meth-header literals bytecodes temp variables execution stack the receiver 52

How are Blocks Represented? MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments temp variables execution stack CompiledMethod meth-header literals bytecodes the receiver BlockContext calling context instruction ptr stack ptr number of args initial inst. ptr home context execution stack When created, the BlockContext has a pointer back to its home context. 53

How are Blocks Represented? MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments temp variables execution stack CompiledMethod meth-header literals bytecodes the receiver BlockContext calling context instruction ptr stack ptr number of args initial inst. ptr home context execution stack The BlockContext has its own execution stack 54

How are Blocks Represented? MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments temp variables execution stack CompiledMethod meth-header literals bytecodes the receiver BlockContext calling context instruction ptr stack ptr number of args initial inst. ptr home context execution stack When evaluated (i.e., when invoked / called) the BlockContext is added to the calling stack of frames. 55

How are Blocks Represented? MethodContext sendingcontext instruction ptr stack ptr method (unused) receiver object arguments temp variables execution stack CompiledMethod meth-header literals bytecodes the receiver BlockContext calling context instruction ptr stack ptr number of args initial inst. ptr home context execution stack NOTE: The block keeps it temps and arguments in the home context. Only one invocation active at one time; NO RECURSION! 56

The blockcopy: primitive Will create a block object. Will push a ptr to it onto stack. 57

The blockcopy: primitive incrall ^ self do: [ :x x incr ] CompiledMethod: Header: Literals: Bytecodes: Will create a block object. Will push a ptr to it onto stack 58

The blockcopy: primitive incrall ^ self do: [ :x x incr ] CompiledMethod: Header: 1 temp variable needed (x) Literals: #incr Bytecodes: 70 Push receiver (self) onto stack Will create a block object. Will push a ptr to it onto stack ) CB Send #do: 7C Return stack top 59

The blockcopy: primitive incrall ^ self do: [ :x x incr ] CompiledMethod: Header: 1 temp variable needed (x) Literals: #incr Bytecodes: 70 Push receiver (self) onto stack 89 Push the active context onto the stack 76 Push 1 onto the stack (num args to block) C8 Send #blockcopy: A4 04 Jump around next 4 bytes 68 Pop stack into 1st temp variable (x) 10 Push 1st temp var (x) onto the stack D0 Send #incr 7D Block Return (return stack top as block s result) CB 7C Send #do: Return stack top Will create a block object. Will push a ptr to it onto stack 60

A primitive method Passed the number of arguments Sent to the current context (The home context ) blockcopy: Skip this slide Creates a new BlockContext object Initializes its HomeContext field Initializes its InitialInstructionPointer field Based on the current instruction pointer + 2 Pushes an OOP to the new BlockContext onto the current stack Storage for arguments to the block The block s arguments must be allocated space somewhere. They are allocated in the home context (as temp variables) A block begins by popping its arguments into the home context What if the method that created the block has already returned? No problem; the space still exists. Why will the home context not get garbage collected? 61

Blocks have two ways of returning (x < y) iftrue: [ stmt. stmt. stmt. 43 ] iffalse: [ stmt. stmt. stmt. ^43 ] How does a block return? Pop a value off of the current stack. Push it (the return value) onto the caller s stack. Resume executing caller s instructions. Normal return from a block: Push result onto Calling Context s stack. Resume execution using Calling Context s instruction pointer. Return from enclosing method: Look at the Home Context. Look at its Sending Context Push result onto that context s stack. Resume execution using that context. 62

Blocks in Smalltalk are not Closures fact fact [ :n (n < 1) iftrue: [1] iffalse: [ n * (fact value: (n - 1)) ] ]. fact value: 4??? The block invokes itself recursively. This code will not work correctly! In Smalltalk / Squeak: Blocks may not be entered recursively. Only one BlockContext is created. Storage for only one copy of n The interpreter will catch this. Attempt to evaluate a block that is already being evaluated 63

Pharo Implements Blocks Differently incrall ^ self do: [ :x x incr ] CompiledMethod: Header: numargs=0, numtemps=0, isprimitive=no, Literals: #incr Bytecodes: 70 Push receiver (self) onto stack 8F 01 closurenumcopied: 0, numargs=1, next 3 bytes 00 03 10 pushtemp: 0 D0 send: #incr 7D Block Return (return stack top as block s result) CB Send #do: 7C Return stack top 64

Message Sending in C++ Skip these slides 65

Source: p calcbenefits: x with: y Bytecodes: push p push x push y send 8, 2 <header> name ssnumber addr Message Sending in C++ classname size 8: 12: 16: 20: Person 16 calcbenefits: code return setname: code foo: code bar: code 66

Source: p calcbenefits: x with: y Bytecodes: push p push x push y send 8, 2 <header> name ssnumber addr Message Sending in C++ classname size 8: 12: 16: 20: Person 16 calcbenefits: code return setname: code foo: code bar: code Add a subclass... <header> name ssnumber addr major advisor gpa classname Student size 28 8: 12: 16: 20: 24: 28: 32: 67

Source: p calcbenefits: x with: y Bytecodes: push p push x push y send 8, 2 <header> name ssnumber addr <header> name ssnumber addr major advisor gpa Message Sending in C++ classname size 8: 12: 16: 20: Person 16 classname Student size 28 8: 12: 16: 20: 24: 28: 32: calcbenefits: code return setname: code foo: code bar: code Override some methods, and add new ones... calcbenefits: code method2: code method3: code method4: code 68

Source: p calcbenefits: x with: y Bytecodes: push p push x push y send 8, 2 <header> name ssnumber addr Message Sending in C++ classname size 8: 12: 16: 20: Person 16 calcbenefits: code return setname: code foo: code bar: code <header> name ssnumber addr major advisor gpa classname Student size 28 8: 12: 16: 20: 24: 28: 32: calcbenefits: code method2: code method3: code method4: code 69