lec13 jack [相容模式] · 2018-09-03 · elements of computing systems, nisan & schocken,...
TRANSCRIPT
![Page 1: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/1.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 1
www.nand2tetris.org
Building a Modern Computer From First Principles
High-Level Language
![Page 2: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/2.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 2
Where we are at:
Assembler
Chapter 6
H.L. Language&
Operating Sys.
abstract interface
Compiler
Chapters 10 - 11
VM Translator
Chapters 7 - 8
ComputerArchitecture
Chapters 4 - 5Gate Logic
Chapters 1 - 3 ElectricalEngineering
Physics
VirtualMachine
abstract interface
Softwarehierarchy
AssemblyLanguage
abstract interface
Hardwarehierarchy
MachineLanguage
abstract interface
HardwarePlatform
abstract interface
Chips &Logic Gates
abstract interface
HumanThought
Abstract design
Chapters 9, 12
![Page 3: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/3.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 3
Some milestones in the evolution of programming languages
Machine language (binary code)
Assembly language (low-level symbolic programming)
Simple procedural languages, e.g. Fortran, Basic, Pascal, C
Simple object-based languages (without inheritance),e.g. early versions of Visual Basic, JavaScript
Fancy object-oriented languages (with inheritance):C++, Java, C#
Jack
![Page 4: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/4.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 4
Programming languages
Procedural programming (e.g. C, Fortran, Pascal)
Object-oriented programming (e.g. C++, Java, Python)
Functional programming (e.g. Lisp, ML, Haskell)
Logic programming (e.g. Prolog)
![Page 5: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/5.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 5
ML
fun fac(x) = if x=0 then 1
else x*fac(x-1);
fun length(L) =
if (L=nil) then 0
else 1+length(tl(L));
![Page 6: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/6.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 6
Prolog
Facts
human(kate).
human(bill).
likes(bill,kate).
likes(kate,john).
likes(john,kate).
Rules
friend(X,Y) :- likes(X,Y),likes(Y,X).
![Page 7: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/7.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 7
Prolog Absolute value
abs(X, X) :- X>=0, !.abs(X, Y) :- Y is –X.
?- abs(-9,R).R=9?- abs(-9,8).No
Length of a listmy_length([], 0).my_length([_|T],R) :- my_length(T, R1), R is R1+1.
?- my_length([a, b, [c, d], e], R).R = 4
![Page 8: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/8.jpg)
![Page 9: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/9.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 9
Procedure oriented programming
![Page 10: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/10.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 10
Object oriented programming
message
![Page 11: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/11.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 11
The Jack programming languageJack: a simple, object-based, high-level language with a Java-like syntax
Some sample applications written in Jack:
proceduralprogramming
Pong game
Space Invaders
Tetris
![Page 12: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/12.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 12
DisclaimerAlthough Jack is a real programming language, we don’t
view it as an end.
Rather, we use Jack as a means for teaching: How to build a compiler How the compiler and the language interface with
the operating system How the topmost piece in the software hierarchy
fits into the big picture
Jack can be learned (and un-learned) in one hour.
![Page 13: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/13.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 13
Roadmap for learning Jack Start with examples
Hello World
Procedure and array
Abstract data types
Linked list
...
Formal Jack Spec.
More complex examples
![Page 14: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/14.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 14
Hello world/** Hello World program. */class Main {
function void main () {// Prints some text using the standard librarydo Output.printString("Hello World");do Output.println(); // New linereturn;
}}
Some observations: Java-like syntax Classes Entry point: Main.main Typical comments format do for function calls
Class_name.method_name Standard library a set of OS
services (methods and functions)organized in 8 supplied classes: Math, String. Array, Output, Keyboard, Screen, Memory, Sys
![Page 15: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/15.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 15
Jack standard library aka language extensions aka Jack OS
class Math {
function void init()
function int abs(int x)
function int multiply(int x, int y)
function int divide(int x, int y)
function int min(int x, int y)
function int max(int x, int y)
function int sqrt(int x)
}
![Page 16: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/16.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 16
Jack standard library aka language extensions aka Jack OS
Class String {
constructor String new(int maxLength)
method void dispose()
method int length()
method char charAt(int j)
method void setCharAt(int j, char c)
method String appendChar(char c)
method void eraseLastChar()
method int intValue()
method void setInt(int j)
function char backSpace()
function char doubleQuote()
function char newLine()
}
![Page 17: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/17.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 17
Jack standard library aka language extensions aka Jack OS
Class Array {
function Array new(int size)
method void dispose()
}
class Memory {
function int peek(int address)
function void poke(int address, int value)
function Array alloc(int size)
function void deAlloc(Array o)
}
![Page 18: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/18.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 18
class Output {
function void moveCursor(int i, int j)
function void printChar(char c)
function void printString(String s)
function void printInt(int i)
function void println()
function void backSpace()
}
Jack standard library aka language extensions aka Jack OS
Class Screen {
function void clearScreen()
function void setColor(boolean b)
function void drawPixel(int x, int y)
function void drawLine(int x1, int y1, int x2, int y2)
function void drawRectangle(int x1, int y1, int x2, int y2)
function void drawCircle(int x, int y, int r)
}
![Page 19: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/19.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 19
Jack standard library aka language extensions aka Jack OS
Class Keyboard {
function char keyPressed()
function char readChar()
function String readLine(String message)
function int readInt(String message)
}
Class Sys {
function void halt():
function void error(int errorCode)
function void wait(int duration)
}
![Page 20: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/20.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 20
Typical programming tasks in JackJack can be used to develop any app that comes to my mind, for example:
Array processing reading/storing numbers in an array
Procedural programming: a program that computes 1 + 2 + ... + n
Object-oriented programming: a class representing bank accounts
Abstract data type representation: a class representing fractions (like 2/5)
Data structure representation: a class representing linked lists
We will now discuss the above examples
As we do so, we’ll begin to unravel how the magic of a high-level object-based language is delivered by the compiler and by the VM
These insights will serve us in the next lectures, when we build the Jack compiler.
![Page 21: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/21.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 21
Array exampleclass Main {function void main () {var Array a;var int length;var int i, sum;
let length = Keyboard.readInt(“#number:”)let a = Array.new(length);let i = 0;
while (i < length) {let a[i] = Keyboard.readInt("next: ");let sum = sum + a[i];let i = i+1;
}
do Output.printString("The average: ");do Output.printInt(sum / length);do Output.println();return;
}}
var: variable declaration type: int, Array let: assignment Array: provided by OS.
No type for an array. Actually, it can contain any type and even different types in an array.
Primitive types: int, boolean, char.
All types in Jack occupy one word. When declaring a variable of primitive types, the space is reserved. For other types, a reference is reserved.
![Page 22: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/22.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 22
Procedural programming exampleJack program = a collection of one or more classes
Jack class = a collection of one or more subroutines
Execution order: when we execute a Jack program, Main.main() starts running.
Jack subroutine:
method
constructor
function (static method) (the example on the left
has functions only, as it is “object-less”)
class Main {
/** Sums up 1 + 2 + 3 + ... + n */function int sum (int n) {var int sum, i;let sum = 0;let i = 1;while (~(i > n)) {let sum = sum + i;let i = i + 1;
}return sum;
}
function void main () {var int n;let n = Keyboard.readInt("Enter n: ");do Output.printString("The result is: ");do Output.printInt(sum(n));return;
}}
![Page 23: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/23.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 23
Object-oriented programming example
/** Represents a bank account.A bank account has an owner, an id, and a balance.The id values start at 0 and increment by 1 eachtime a new account is created. */
class BankAccount {
/** Constructs a new bank account with a 0 balance. */constructor BankAccount new(String owner)
/** Deposits the given amount in this account. */method void deposit(int amount)
/** Withdraws the given amount from this account. */method void withdraw(int amount)
/** Prints the data of this account. */method void printInfo()
/** Disposes this account. */method void dispose()
}
The BankAccount class (skeletal)
![Page 24: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/24.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 24
Object-oriented programming example (continues)
/** Represents a bank account. */class BankAccount {// class‐level variable static int newAcctId;
// Private variables(fields/properties)field int id;field String owner;field int balance;
/** Constructs a new bank account */constructor BankAccount new (String owner) {
let id = newAcctId;let newAcctId = newAcctId + 1;let this.owner = owner;let balance = 0;return this;
}// More BankAccount methods.
}
// Code in any other class:var int x;var BankAccount b;let b = BankAccount.new("joe");
Explain b = BankAccount.new("joe")Calls the constructor (which creates a new BankAccount object)Explain return thisThe constructor returns the RAM base address of the memory block that stores the data of the newly created BankAccount object
Explain b = BankAccount.new("joe")stores in variable b a pointer to the object’s base memory address
2
3
1
![Page 25: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/25.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 25
Object-oriented programming example (continues)
/** Represents a bank account. */class BankAccount {// class‐level variable static int newAcctId;
// Private variables(fields/properties)field int id;field String owner;field int balance;
/** Constructs a new bank account */constructor BankAccount new (String owner) {
let id = newAcctId;let newAcctId = newAcctId + 1;let this.owner = owner;let balance = 0;return this;
}// More BankAccount methods.
}
// Code in any other class:var int x;var BankAccount b;let b = BankAccount.new("joe");
Behind the scene (following compilation):
// b = BankAccount.new("joe")push "joe" call BankAccount.newpop b
Explanation: the calling code pushes an argument and calls the constructor; the constructor’s code (not shown above; the compiler generates Memory.alloc(n) for constructors) creates a new object, pushes its base address onto the stack, and returns;The calling code then pops the base address into a variable that will now point to the new object.
2
3
1
![Page 26: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/26.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 26
class BankAccount { static int nAccounts;
field int id;field String owner;field int balance;
// Constructor ... (omitted)
/** Handles deposits */method void deposit (int amount) {
let balance = balance+amount;return;
}
/** Handles withdrawls */method void withdraw (int amount){
if (~(amount > balance)) {let balance = balance‐amount;
}return;
}// More BankAccount methods.
}
...var BankAccount b1, b2;...let b1 = BankAccount.new("joe");let b2 = BankAccount.new("jane");do b1.deposit(5000);do b1.withdraw(1000);...
Object-oriented programming example (continues)
Explain do b1.deposit(5000)
In Jack, void methods are invokedusing the keyword do
(a compilation artifact) The object-oriented method invocation
style b1.deposit(5000) is a fancy way to express the procedural semantics deposit(b1,5000)
Behind the scene (following compilation):// do b1.deposit(5000)push b1push 5000call BankAccount.deposit
![Page 27: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/27.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 27
Object-oriented programming example (continues)
class BankAccount { static int nAccounts;
field int id;field String owner;field int balance;
// Constructor ... (omitted)
/** Prints information about this account. */method void printInfo () {
do Output.printInt(id);do Output.printString(owner);do Output.printInt(balance);return;
}
/** Disposes this account. */method void dispose () {
do Memory.deAlloc(this);return;
}// More BankAccount methods.
}
// Code in any other class:...var int x;var BankAccount b;
let b = BankAccount.new("joe");// Manipulates b...do b.printInfo();do b.dispose();
Explain
do Memory.deAlloc(this)
This is a call to an OS function that knows how to recycle the memory block whose base-address is this. We will write this function when we develop the OS (project 12).
![Page 28: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/28.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 28
Object-oriented programming example (continues)
class BankAccount { static int nAccounts;
field int id;field String owner;field int balance;
// Constructor ... (omitted)
/** Prints information about this account. */method void printInfo () {
do Output.printInt(id);do Output.printString(owner);do Output.printInt(balance);return;
}
/** Disposes this account. */method void dispose () {
do Memory.deAlloc(this);return;
}// More BankAccount methods.
}
// Code in any other class:...var int x;var BankAccount b;
let b = BankAccount.new("joe");// Manipulates b...do b.printInfo();do b.dispose();
Explain
do b.dispose()
Jack has no garbage collection; The programmer is responsible for explicitly recycling memory resources of objects that are no longer needed. If you don’t do so, you may run out of memory.
![Page 29: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/29.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 29
Abstract data type example
}
/** A fraction consists of a numerator and a denominator, both int values */
class Fraction { /** Constructs a fraction from the given data */constructor Fraction new(int numerator, int denominator)
/** Reduces this fraction, e.g. changes 20/100 to 1/5. */method void reduce()
/** Accessorsmethod int getNumerator() method int getDenominator()
/** Returns the sum of this fraction and the other one */method Fraction plus(Fraction other)
/** Returns the product of this fraction and the other one */method Fraction product(Fraction other)
/** Prints this fraction */method void print()
/** Disposes this fraction */method void dispose()
}
The Fraction class API (method signatures)
![Page 30: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/30.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 30
Abstract data type example (continues)
class Fraction { field int numerator, denominator;
constructor Fraction new (int numerator, int denominator) {let this.numerator = numerator;let this.denominator = denominator;do reduce() // Reduces the new fractionreturn this
}
/** Reduces this fraction */method void reduce () { // Code omitted }
// A static method computing the greatest common denominator of a and b.function int gcd (int a, int b) { // Code omitted }
method int getNumerator () {return numerator;
}
method int getDenominator () {return denominator;
}
// More Fraction methods follow.
// Code in any other class:...var Fraction a, b;let a = Fraction.new(2,5);let b = Fraction.new(70,210);do b.print() // prints "1/3"...// (print method in next slide)
![Page 31: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/31.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 31
Abstract data type example (continues)
...
// Constructor and previously defined methods omitted
/** Returns the sum of this fraction the other one */method Fraction plus (Fraction other) {
var int sum;let sum = (numerator * other.getDenominator()) +
(other.getNumerator() * denominator()); return Fraction.new(sum , denominator * other.getDenominator());
}
// Similar fraction arithmetic methods follow, code omitted.
/** Prints this fraction */method void print () {
do Output.printInt(numerator);do Output.printString("/");do Output.printInt(denominator);return
}
}
// Code in any other class:var Fraction a, b, c;let a = Fraction.new(2,3);let b = Fraction.new(1,5); // computes c = a + blet c = a.plus(b);do c.print(); // prints "13/15"
![Page 32: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/32.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 32
Data structure example/** Represents a sequence of int values, implemented as a linked list.
The list consists of an atom, which is an int value, and a tail, which is either a list or a null value. */
class List {field int data;field List next;
/* Creates a new list */constructor List new (int car, List cdr) {
let data = car;let next = cdr;return this;
}/* Disposes this list by recursively disposing its tail. */method void dispose() {
if (~(next = null)) {do next.dispose();
}do Memory.deAlloc(this);return;
}
...
} // class List.
// Code in any other class:...// Creates a list holding 2,3, and 5:var List v;let v = List.new(5 , null);let v = List.new(2 , List.new(3,v));...
5v
3 52v
![Page 33: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/33.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 33
Jack language specification Syntax
Program structure
Data types
Variable kinds
Expressions
Statements
Subroutine calling
(for complete language specification, see the book).
![Page 34: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/34.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 34
Jack syntactic elements A jack program is a sequence of tokens separated by an
arbitrary amount of white space and comments.
Tokens can be symbols, reserved words, constants and identifiers.
/** Hello World program. */class Main {
function void main () {// Prints some text using the standard librarydo Output.printString("Hello World");do Output.println(); // New linereturn;
}}
![Page 35: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/35.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 35
Jack syntactic elements
![Page 36: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/36.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 36
Jack syntactic elements
![Page 37: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/37.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 37
Jack program structure
A Jack program:
Each class is written in a separate file (compilation unit)
Jack program = collection of one or more classes, one of which must be named Main
The Main class must contain at least one method, named main()
class ClassName {
field variable declarations;static variable declarations;constructor type { parameterList ) {
local variable declarations;statements
}
method type { parameterList ) {local variable declarations;statements
}
function type { parameterList ) {local variable declarations;statements
}}
About this spec:
Every part in this spec can appear 0 or more times
The order of the field / staticdeclarations is arbitrary
The order of the subroutine declarations is arbitrary
Each type is either int, boolean, char, or a class name.
![Page 38: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/38.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 38
Jack data typesPrimitive types (Part of the language; Realized by the compiler):
int 16-bit 2’s complement (from ‐32768 to 32767) boolean 0 and –1, standing for true and false char unicode character (‘a’, ‘x’, ‘+’, ‘%’, ...)
Abstract data types (Standard language extensions; Realized by the OS / standard library): String Array... (extensible)
Application-specific types (User-defined; Realized by user applications): BankAccount Fraction List Bat / Ball . . . (as needed)
![Page 39: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/39.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 39
Jack data typesJack is weakly typed. The language does not define the results of attempted assignment or conversion from one type to another, and different compilers may allow or forbid it.
var char c; var String s;Let c = 33; // ‘A’// EquivalentlyLet s = “A”; let c=s.charAt(0);
var Array a;Let a = 5000;Let a[100] = 77; // RAM[5100]=77
var Complex c; var Array a;let a = Array.new(2);Let a[0] = 7; let a[1] = 8;Let c = a; // c==Complex(7, 8)
![Page 40: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/40.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 40
Jack variable kinds and scope
![Page 41: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/41.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 41
Jack Statements (five types)
let varName = expression;orlet varName[expression] = expression;
if (expression) {statements
}else {
statements}
while (expression) {statements
}
do function-or-method-call;
return expression;orreturn;
![Page 42: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/42.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 42
Jack expressionsA Jack expression is any one of the following: A constant A variable name in scope (the variable may be static, field, local, or a
parameter) The keyword this, denoting the current object An array element using the syntax arrayName[expression],
where arrayNname is a variable name of type Array in scope A subroutine call that returns a non-void type An expression prefixed by one of the unary operators – or ~ :
‐expression (arithmetic negation) ~expression (logical negation)
An expression of the form expression op expression where op is one of the following: + ‐ * / (integer arithmetic operators) & | (boolean and and or operators, bit-wise) < > = (comparison operators)
( expression ) (an expression within parentheses)
![Page 43: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/43.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 43
Jack subroutine callsGeneral syntax: subroutineName(arg0, arg1, …)
where each argument is a valid Jack expressionParameter passing is by-value (primitive types) or by-reference (object
types)Example 1:Consider the function (static method): function int sqrt(int n)This function can be invoked as follows:
sqrt(17)sqrt(x)sqrt((b * b) – (4 * a * c))sqrt(a * sqrt(c ‐ 17) + 3)
etc. In all these examples the argument value is computed and passed by-value
Example 2:Consider the method: method Matrix plus (Matrix other);If u and v were variables of type Matrix, this method can be invoked
using: u.plus(v)The v variable is passed by-reference, since it refers to an object.
![Page 44: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/44.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 44
Noteworthy features of the Jack language The (cumbersome) let keyword, as in let x = 0; The (cumbersome) do keyword, as in do reduce(); No operator priority: (language does not define, compiler-dependent)
1 + 2 * 3 yields 9, since expressions are evaluated left-to-right;To effect the commonly expected result, use 1 + (2 * 3)
Only three primitive data types: int, boolean, char;In fact, each one of them is treated as a 16-bit value
No casting; a value of any type can be assigned to a variable of any type Array declaration: Array x; followed by x = Array.new(); Static methods are called function Constructor methods are called constructor;
Invoking a constructor is done using the syntax ClassName.new(argsList)
Q: Why did we introduce these features into the Jack language?A: To make the writing of the Jack compiler easy!Any of these language features can be modified, with a reasonable amount
of work, to make them conform to a more typical Java-like syntax.
![Page 45: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/45.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 45
A simple game: square (Demo)
Use Square as an example.
Design a class: think of its
States: data members
Behaviors: function members
Square
x, y, size
MoveUp, MoveDown, IncSize, …
![Page 46: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/46.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 46
Perspective Jack is an object-based language: no inheritance
Primitive type system (3 types)
Standard library
Our hidden agenda: gearing up to learn how to develop the ...
Compiler (projects 10 and 11)
OS (project 12).
![Page 47: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/47.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 47
Principles of object-oriented programming
encapsulation (information hiding) polymorphism
inheritance
![Page 48: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/48.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 48
Which language should you learn?
![Page 49: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/49.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 49
![Page 50: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/50.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 50
![Page 51: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/51.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 51
Programming languages
![Page 52: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/52.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 52
Most popular PLs (2014/4)
![Page 53: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/53.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 53
Most popular PL trends
![Page 54: lec13 Jack [相容模式] · 2018-09-03 · Elements of Computing Systems, Nisan & Schocken, MIT Press, , Chapter 9: High-Level Language slide 11 The Jack programming language Jack:](https://reader033.vdocuments.net/reader033/viewer/2022042314/5f01bd217e708231d400cd16/html5/thumbnails/54.jpg)
Elements of Computing Systems, Nisan & Schocken, MIT Press, www.nand2tetris.org , Chapter 9: High-Level Language slide 54
Final project
Assembler for Hack/Toy
VM translator
Compiler for Jack
Finish OS implementation
Develop applications with Jack
Design your own computers
<Fill your ideas here>