lecture 07 virtual machine I

advertisement
Virtual Machine I:
Stack Arithmetic
Building a Modern Computer From First Principles
www.nand2tetris.org
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 1
Usage and Copyright Notice:
Copyright © Noam Nisan and Shimon Schocken
This presentation contains lecture materials that accompany the textbook “The Elements of
Computing Systems” by Noam Nisan & Shimon Schocken, MIT Press, 2005.
We provide both PPT and PDF versions.
Our web site, www.nand2tetris.org ,features a set of presentations, one for each book chapter.
Each presentation is designed to support about 3 hours of classroom or self-study instruction.
You are welcome to use or edit this presentation as you see fit for instructional and noncommercial purposes.
If you use our materials, please include a reference to www.nand2tetris.org
If you have any questions or comments, please write us at nand2tetris@gmail.com
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 2
Where we are at:
Human
Thought
Abstract design
Software
hierarchy
abstract interface
Chapters 9, 12
H.L. Language
&
Operating Sys.
Compiler
abstract interface
Chapters 10 - 11
Virtual
Machine
VM Translator
abstract interface
Chapters 7 - 8
Assembly
Language
Assembler
Chapter 6
abstract interface
Machine
Language
Computer
Architecture
abstract interface
Chapters 4 - 5
Hardware
Platform
Hardware
hierarchy
Gate Logic
abstract interface
Chapters 1 - 3
Chips &
Logic Gates
Electrical
Engineering
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
Physics
slide 3
Motivation
class Main {
static int x;
function void main() {
// Input and multiply 2 numbers
var int a, b, x;
let a = Keyboard.readInt(“Enter a number”);
let b = Keyboard.readInt(“Enter a number”);
let x = mult(a,b);
return;
}
}
// Multiplies two numbers.
function int mult(int x, int y) {
var int result, j;
let result = 0; let j = y;
while not(j = 0) {
let result = result + x;
let j = j – 1;
}
return result;
}
Ultimate goal:
Translate highlevel programs
into executable
code.
Compiler
...
@a
M=D
@b
M=0
(LOOP)
@a
D=M
@b
D=D-A
@END
D;JGT
@j
D=M
@temp
M=D+M
@j
M=M+1
@LOOP
0;JMP
(END)
@END
0;JMP
...
}
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 4
Compilation models
direct compilation:
language 1
language 2
...
2-tier compilation:
language n
language 1
language 2
...
language n
intermediate language
hardware
platform 1
hardware
platform 2
.
...
requires n m translators
hardware
platform m
hardware
platform 1
hardware
platform 2
...
hardware
platform m
requires n + m translators
Two-tier compilation:
 1st compilation stage depends only on the details of the source language
 2nd compilation stage depends only on the details of the target platform.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 5
The big picture
Some
language
...
Some
compiler
...
Some Other
language
Jack
language
Jack
compiler
Some Other
compiler
CISC
machine
language
VM imp.
over RISC
platforms
RISC
machine
language
CISC
machine
RISC
machine
VM imp.
over the Hack
platform
VM
emulator
written in
a high-level
language
...
...
 The interface between
the 2 compilation stages
 Must be sufficiently
general to support many
<HLL , ML> pairs
 Can be modeled as the
language of an abstract
virtual machine (VM)
Intermediate code
VM
implementation
over CISC
platforms
The intermediate code:
 Can be implemented in
several different ways.
Hack
machine
language
...
other digital platforms, each equipped
with its own VM implementation
Any
computer
Hack
computer
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 6
Focus of this lecture:
Some
language
...
Some
compiler
...
Some Other
language
Jack
language
Chapters
9-13
Jack
compiler
Some Other
compiler
VM language
VM
implementation
over CISC
platforms
CISC
machine
language
VM imp.
over RISC
platforms
RISC
machine
language
RISC
machine
written in
a high-level
language
...
...
CISC
machine
VM imp.
over the Hack
platform
VM
emulator
Chapters
7-8
Hack
machine
language
Chapters
1-6
...
other digital platforms, each equipped
with its VM implementation
Any
computer
Hack
computer
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 7
Lecture plan
Goal: Specify and implement a VM model and language:
Arithmetic / Boolean commands
add
sub
neg
eq
gt
lt
Program flow commands
label
(declaration)
goto
(label)
if-goto
(label)
Next lecture
This lecture
Function calling commands
and
or
function
(declaration)
call
(a function)
return
(from a function)
not
Memory access commands
pop x (pop into x, which is a variable)
push y
(y being a variable or a constant)
Method: (a) specify the abstraction (model’s constructs and commands)
(b) propose how to implement it over the Hack platform.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 8
The VM model and language
Perspective:
From here till the end of this and the next lecture we describe the VM
model used in the Hack-Jack platform
Other VM models (like JVM/JRE and IL/CLR) are similar in spirit
but different in scope and details.
“programmers are creators of
universes for which they alone are
responsible. Universes of virtually
unlimited complexity can be
created in the form of computer
programs.”
(Joseph Weizenbaum)
The VM model + language are an
example of one such universe
View I: the VM is a machine
that makes sense in its own
right
View II: the VM is a convenient
“in-between” representation of
a computer program: an interim
“station” between the high-level
code and the machine level code.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 9
Our VM is a stack-oriented machine
17
4
5
17
9
add
SP
SP
Our VM features a single
16-bit data type that
can be used as:
 Integer
 Boolean
 Pointer
Typical operation:

Pops topmost values x,y from the stack

Computes the value of some function f(x,y)

Pushes the result onto the stack
(Unary operations are similar, using x and f(x) instead)
Impact: the operands are replaced with the operation’s result
In general: all arithmetic and Boolean operations are implemented similarly.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 10
Memory access (first approximation)
Stack
Memory
Stack
...
121
a
5
b
SP
6
push b
6
...
17
108
b
108
108
...
SP
(before)
(after)
Stack
Memory
Stack
...
121
a
b
6
108
...
Memory
...
121
...
17
SP
a
5
...
5
...
121
...
17
Memory
5
pop a
a
17
...
SP
b
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
108
...
slide 11
Memory access (first approximation)
Stack
Memory
Stack
...
121
a
5
...
b
SP
push b
6
...
17
108
b
108
108
...
SP
(before)
(after)
Stack
Memory
Stack
...
121
a
b
Memory
...
121
6
...
17
SP
a
5
...
5
...
121
6
17
Memory
5
pop a
108
...
a
17
...
SP
b
108
...
 Classical data structure
 Elegant and powerful
 Several hw/sw implementation options.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 12
Evaluation of arithmetic expressions
// d=(2-x)*(y+5)
push 2
push x
sub
push y
push 5
add
mult
pop d
Memory
...
5
y
9
2
push 2
SP
x
...
Stack
sub
2
push x
5
SP
SP
-3
-3
push y
SP
9
-3
push 5
add
9
SP
5
SP
Memory
Stack
-42
-3
14
SP
mult
SP
pop d
...
SP
5
x
9
y
...
d
-42
...
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 13
Evaluation of Boolean expressions
// if (x<7) or (y=8)
push x
push 7
lt
push y
push 8
eq
or
Memory
...
x
y
Stack
SP
...
12
push x
12
12
push 7
lt
7
SP
8
SP
false
false
push y
SP
8
false
push 8
8
SP
eq
8
SP
true
false
true
or
SP
SP
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 14
Arithmetic and Boolean commands (wrap-up)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 15
Memory segments
Modern programming languages normally feature the following variable kinds:
Class level

Static variables

Private variables (AKA “object variables” / “fields” / “properties”)
Method level:

Local variables

Argument variables
The VM abstraction must support (at least) these variable kinds.
In our VM model, these variables are stored in virtual memory segments
Specifically, our VM model consists of 8 memory segments:
static, this, local, argument
As well as:
that, constant, pointer, and temp.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 16
Memory segments and memory access commands
So we have 8 virtual memory segments:
static, this, local, argument, that, constant, pointer, temp
But, at the VM level, there is no need to differentiate among the different roles of these segments
As far as VM programming commands go, a segment is a segment is a segment;
to access a particular segment entry, use the syntax:
Memory access command format:
pop segment i
push segment i
 These commands are used instead of pop x and push y, as shown in previous slides,
which was a conceptual simplification
 The meaning of the different eight segments will become important when we’ll talk
about the compiler.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 17
VM programming
 VM programs are normally written by compilers, not by humans
 But, for a human to write or optimize a compiler, the human must first
understand the spirit of VM programming
 So, here is an example.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 18
Arithmetic example
High-level code
VM code (first approx.)
function mult (x,y) {
int result, j;
result = 0;
j = y;
while ~(j == 0) {
result = result + x;
j = j - 1;
}
return result;
}
Just after mult(7,3) is entered:
Stack
argument
SP
7
x
0
0
sum
1
3
y
1
0
j
...
Just after mult(7,3) returns:
Stack
21
SP
local
0
...
function mult(x,y)
push 0
pop result
push y
pop j
label loop
push j
push 0
eq
if-goto end
push result
push x
add
pop result
push j
push 1
sub
pop j
goto loop
label end
push result
return
VM code
function mult 2
push
constant
pop
local 0
push
argument
pop
local 1
label
loop
push
local 1
push
constant
eq
if-goto end
push
local 0
push
argument
add
pop
local 0
push
local 1
push
constant
sub
pop
local 1
goto
loop
label
end
push
local 0
return
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
0
1
0
0
1
slide 19
Lecture plan
Goal: Specify and implement a VM model and language
Arithmetic / Boolean commands
add
sub
neg
eq
gt
lt
Program flow commands
label
(declaration)
goto
(label)
if-goto
(label)
Next lecture
This lecture
and
or
Function calling commands
function
(declaration)
call
(a function)
return
(from a function)
not
Memory access commands
pop segment i
push segment i
Method: (a) specify the abstraction (model’s constructs and commands)
(b) propose how to implement it over the Hack platform.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 20
Implementation
VM implementation options:

Software-based (emulate the VM using, say, Java)

Translator-based (translate VM programs into, say, the Hack language)

Hardware-based (realize the VM using dedicated memory and
registers)
Well-known translator-based implementations:

JVM (runs bytecode programs in the Java platform)

CLR (runs IL programs in the .NET platform).
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 21
Our VM emulator (part of the course software suite)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 22
Standard VM implementation on the Hack platform
SP
0
LCL
1
ARG
2
THIS
3
THAT
4
5
TEMP
...
The challenge: (i) map the VM constructs on the
host RAM, and (ii) given this mapping, figure out
how to implement each VM command using
assembly commands that operate on the RAM
Host
RAM
12
13
General
purpose
 static: static variable number j in a VM file f is
implemented by the assembly language symbol
f.j (and recall that the assembler maps such
symbols to the RAM starting from address 16)
14
15
16
...
Statics
255
256
...
Stack
2047
2048
...
 local,argument,this,that: mapped on the
heap. The base addresses of these segments are
kept in LCL,ARG,THIS,THAT. Access to the i-th
entry of a segment is implemented by accessing
the segment’s (base + i) word in the RAM
Heap
 constant: truly a virtual segment:
Access to constant i is implemented by
supplying the constant i
 pointer: used to align this and that
with memory blocks on the heap
Exercise: given the above game rules, write the
Hack commands that implement, say,
push constant 5 and pop local 2.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 23
Proposed VM translator implementation: Parser module
Parser: Handles the parsing of a single .vm file, and encapsulates access to the input code. It reads VM commands, parses them, and
provides convenient access to their components. In addition, it removes all white space and comments.
Routine
Arguments
Returns
Function
Input file / stream
--
Opens the input file/stream and gets ready to parse it.
--
boolean
Are there more commands in the input?
--
--
Reads the next command from the input and makes it
the current command. Should be called only if
hasMoreCommands() is true. Initially there is no
current command.
--
C_ARITHMETIC,
C_PUSH, C_POP,
C_LABEL, C_GOTO,
C_IF, C_FUNCTION,
C_RETURN, C_CALL
Returns the type of the current VM command.
C_ARITHMETIC is returned for all the arithmetic
commands.
Constructor
hasMoreCommands
advance
commandType
arg1
--
string
Returns the first argument of the current command. In
the case of C_ARITHMETIC, the command itself
(add, sub, etc.) is returned. Should not be called if the
current command is C_RETURN.
arg2
--
int
Returns the second argument of the current command.
Should be called only if the current command is
C_PUSH, C_POP, C_FUNCTION, or C_CALL.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 24
Proposed VM translator implementation: CodeWriter module
CodeWriter: Translates VM commands into Hack assembly code.
Routine
Arguments
Returns
Function
Constructor
Output file / stream
--
Opens the output file/stream and gets ready to write
into it.
setFileName
fileName (string)
--
Informs the code writer that the translation of a new
VM file is started.
writeArithmetic
command (string)
--
Writes the assembly code that is the translation of the
given arithmetic command.
WritePushPop
Command (C_PUSH or
C_POP),
--
Writes the assembly code that is the translation of the
given command, where command is either C_PUSH
or C_POP.
--
Closes the output file.
segment (string),
index (int)
Close
--
Comment: More routines will be added to this module in chapter 8.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 25
Some
language
Perspective
...
Some
compiler
...
Some Other
language
Jack
compiler
Some Other
compiler
VM language
 In this lecture we began the process of
building a compiler
 Modern compiler architecture:


VM
implementation
over CISC
platforms
CISC
machine
language
VM imp.
over RISC
platforms
RISC
machine
language
VM
emulator
...
...
Translator
written in
a high-level
language
Hack
...
Front-end (translates from high level language to a VM language)
Back-end (translates from the VM language to the machine
language of some target hardware platform)
 Brief history of virtual machines:

1970’s: p-Code

1990’s: Java’s JVM

2000’s: Microsoft .NET
 A full blown VM implementation typically includes a common software library
(can be viewed as a mini, portable OS).
 We will build such a mini OS later in the course.
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 26
The road ahead
Conceptually
similar to:
And to:
 Complete the VM
specification and
implementation
(chapters 7,8)
 JVM
 CLR
 Introduce Jack, a
high-level programming
language (chapter 9)
 Java
 C#
 Build a compiler for it
(chapters 10,11)
 Java compiler
 C# compiler
 Finally, build a mini-OS,
i.e. a run-time library
(chapter 12).
 JRE
 .NET base class library
Tasks:
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 7: Virtual Machine I: Stack Arithmetic
slide 27
Download