COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent...

49
COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020

Transcript of COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent...

Page 1: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

COMP-520 – GoLite project

Vincent Foley-Bourgon

Sable LabMcGill University

Winter 2020

Page 2: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Agenda

I Overview of Go

I Why Go for a compiler class?

I GoLite

Feel free to ask questions at any time.

2 / 44

Page 3: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why
Page 4: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Renee French, licensed under CC 3.0 Attributions

Page 5: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Go

I Created by Rob Pike, Ken Thompson and RobertGriesemer

I Google employees

I Not a Google project like Gmail; open source

I Initial release in 2009

I 1.0 release in 2012

5 / 44

Page 6: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

MotivationI Simplify development

class AbstractSingletonProxyFactoryBean { ... }

I Built-in concurrency support

I Faster compilation

6 / 44

Page 7: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

MotivationI Simplify development

class AbstractSingletonProxyFactoryBean { ... }

I Built-in concurrency support

I Faster compilation

6 / 44

Page 8: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

MotivationI Simplify development

class AbstractSingletonProxyFactoryBean { ... }

I Built-in concurrency support

I Faster compilation

6 / 44

Page 9: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

MotivationI Simplify development

class AbstractSingletonProxyFactoryBean { ... }

I Built-in concurrency support

I Faster compilation

6 / 44

Page 10: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Features

I Imperative

I Goroutines and channels

I Interfaces and methods

I Closures

I defer

I Maps and slices

I Multiple return values

I Module system

I Garbage collection

I Optional semi-colons (tricky scanner!)

7 / 44

Page 11: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Notable missing features

I User-defined parametrized types (source of 95% of all Goarguments online)

I Exceptions

I Classes and inheritance

I Operator overloading

8 / 44

Page 12: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Example Go program

package main

import "fmt"

func fib(n int) int {

a, b := 0, 1

for i := 0; i < n; i++ {

a, b = b, a+b

}

return a

}

func main() {

var f int = fib (42)

fmt.Println(f)

}

9 / 44

Page 13: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Who uses Go?

I Google

I GitHub

I PayPal

I Twitch

I Dropbox

I Netflix

I New York Times

I Many others 1

Extremely quick adoption!

1https://github.com/golang/go/wiki/GoUsers10 / 44

Page 14: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Who uses Go?

The authors expected Java and C++ programmers to be theprimary Go audience.

In actual fact, Go is more popular with Python, Ruby andother dynamically typed languages programmers.

Why?

I Better performance

I Static typing

I Good concurrency support

I Good libraries and tools

I Can deploy a single binary file

11 / 44

Page 15: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Who uses Go?

The authors expected Java and C++ programmers to be theprimary Go audience.

In actual fact, Go is more popular with Python, Ruby andother dynamically typed languages programmers.

Why?

I Better performance

I Static typing

I Good concurrency support

I Good libraries and tools

I Can deploy a single binary file

11 / 44

Page 16: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Useful addresses

I http://golang.org

I http://play.golang.org

I http://golang.org/ref/spec

12 / 44

Page 17: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why Go for a compilerclass?

Page 18: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Useful and popular

It is more fun to write a compiler for a language that is aliveand kicking than for a made-up language (minilang) or for adead language (Pascal).

Writing a compiler forces you to really learn the language, anice addition on your C.V.!

14 / 44

Page 19: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Simple language

Go is simpler than a lot of other popular languages such asJava or C++.

Go is surprisingly quick to learn.

Not nearly as tricky as MATLAB, JavaScript or PHP.

15 / 44

Page 20: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Detailed online specification

You can find pretty much everything you need to know aboutGo on a single page: http://golang.org/ref/spec

The syntax is described in EBNF notation.(Warning! Ambiguous!)

Less specification work for the T.A. ;-)

16 / 44

Page 21: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Encompasses all the classical compiler phases

The things you learn in class and from reading the textbookapply to writing a Go compiler. It doesn’t have specializedphases like pre-processing or macro expansion.

17 / 44

Page 22: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Go is open source

Parser used to be written with bison (now hand-written)

The old sources of the parser can be found on Github (e.g. 1.2release tag)

You can look, do not copy/paste!

18 / 44

Page 23: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?Your work is publishable!

Not only will you learn some Go for this class, but you canpublish the complete compiler on GitHub after the class andinclude it on your C.V.!

19 / 44

Page 24: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Why use Go for a compiler class?External resources

We know that previous year’s submissions are availableonline. We have 3 requirements for this class:

1. You must come up with your own solutions; anyinspiration that comes from other sources must bereported and may not replace your own work.

2. No copying from previous years, even with citation; nocode/tests may be copied even in part (1 line is too many).

3. No grading material may be used at any point, under anycircumstance, nor may it be published.

You are responsible for ensuring all material you use ispermitted. If in doubt, please ask!

20 / 44

Page 25: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why
Page 26: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Features

I Imperative

I Goroutines and channels

I Interfaces and methods

I Closures

I defer

I Maps and slices

I Multiple return values

I Module system

I Garbage collection

I Optional semi-colons

22 / 44

Page 27: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Features

I Imperative

I Goroutines and channels

I Interfaces and methods

I Closures

I defer

I Maps and slices

I Multiple return values

I Module system

I Garbage collection

I Optional semi-colons

23 / 44

Page 28: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Is this still Go?

I You have a few weeks to build the compiler (took 2 yearsbefore first Go release)

I It still is a lot of work (likely more than you ever put in aclass)

I You can add more features when the course is finished :)

24 / 44

Page 29: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Lexical syntax

Go GoLiteEncoding UTF-8 ASCIINumber precision Arbitrary FixedIntegers 255, 0377, 0xff 255, 0377, 0xffFloats 0.12, .12, 12. 0.12, .12, 12.Imaginary 3i No thanksStrings “Chrono\n” “Marle\n”Raw strings ‘Lucca\n‘ ‘Ayla\n‘Keywords Bunch of ’em Slighlty moreLine comments // Sabin // EdgarBlock comments /* Celes */ /* Locke */Semicolons Optional Optional

25 / 44

Page 30: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Basic typesintfloat64boolrune (char)stringuint8uint16uint32uint64int8int16int32int64float32complex64complex128byte

26 / 44

Page 31: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

General structure

// Go structure

// package declaration

// import statements

// vars , consts , types , functions

27 / 44

Page 32: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

General structure

// GoLite structure

// package declaration

// vars , types , functions

28 / 44

Page 33: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Declarations

In Go, top-level declarations can be in any order

In GoLite, declarations must come before their first use// Valid in Go; invalid in GoLite

var x int = max(y, 32)

var y = 42

func max(a, b int) int {

if a > b {

return a

} else {

return b

}

}

29 / 44

Page 34: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Variable declarations

var x1, x2 int // implicitly initialized to 0

var y int = 12

var z = 24

var (

x1, x2 int

y int = 12

z = 24

)

GoLite should support all of these.

30 / 44

Page 35: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Variable declarations

var x1, x2 int // implicitly initialized to 0

var y int = 12

var z = 24

var (

x1, x2 int

y int = 12

z = 24

)

GoLite should support all of these.

30 / 44

Page 36: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Constant declarations

GoLite won’t support constant declarations.

31 / 44

Page 37: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Type declarations

type natural int

type real float64

type (

point struct {

x, y, z real

}

)

32 / 44

Page 38: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Function declarations

// Allowed in GoLite

func f(a int , b int) int {

...

}

// Allowed in GoLite

func f(a, b int) int {

...

}

// Not allowed in GoLite

func f(int , int) int {

...

}

I GoLite functions should always have a body.

I We’ll allow zero or one return value.

33 / 44

Page 39: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

StatementsDeclarations

I Variables and types can be declared within functions.

I Short variable declaration allowed within functions.func demo() {

type number int

var x int = 12

best_ff := 6

}

34 / 44

Page 40: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

StatementsLoops

I All loops use the for keyword

I No parentheses, mandatory braces

I GoLite should not support for/range loops// Infinite loop

for {

...

}

// ‘‘While ’’ loop

for x < 10 {

...

}

// ‘‘For ’’ loop

for i := 0; i < 10; i++ {

...

}

35 / 44

Page 41: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

StatementsLoops

We’ll support unlabelled break and continue in loops

36 / 44

Page 42: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

StatementsIf

I No parentheses, mandatory bracesif x == 0 {

...

}

if x < 0 {

...

} else {

...

}

if x < 0 {

...

} else if x > 0 {

...

} else {

...

}

37 / 44

Page 43: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

StatementsSwitch

I Allows expressions in cases

I No explicit break (although it may be used)switch x {

case 0, 1, 2: println("Small")

default: println("Other")

}

switch { // Same as switch true

case x < 0: println("Negative")

case x > 0: println("Positive")

default: println("Zero")

}

38 / 44

Page 44: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Expressions

Literals 42, 3.14, "Go", ‘H’

Identifiers x, my dog, Alakazou

Unary expressions !x, +y, -(a*b), ^0

Binary expressions a || b, 3 + x, 1 << 12

Function calls fib(42), max(0, 1)

Casts int(3.4), mytype(x)

Indexing slice[0]

Selection point.x

39 / 44

Page 45: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Built-ins

In Go:

I Look like function calls

I Not reserved keywords

I Can accept a type as a first parameter (make([]int, 4))

I Can be polymorphic (append())

Real tricky to parse function calls, casts and builtins nicely

40 / 44

Page 46: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Built-ins

In GoLite:

I Reserved keywords to make parsing easier

I Only a subset (print, println, append, len, cap)

I Limited functionality

41 / 44

Page 47: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

References

I Go presentation:http://www.youtube.com/watch?v=rKnDgT73v8s

I Gopher: http://golang.org/doc/gopher/frontpage.png

I Gopher + helmet: http://golang.org/doc/gopher/pencil/gopherhelmet.jpg

I Xkcd, compiling: http://xkcd.com/303/

42 / 44

Page 48: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Advice

I This is a project that takes a lot of time: start milestonesearly!

I Pick an implementation language that you know wellenough to not get painted into a corner.

I Be careful with your AST design, it’s extremely important.

I Don’t be afraid of asking questions and using theFacebook group.

43 / 44

Page 49: COMP-520 GoLite projectcs520/2020/slides/10-golite.pdf · COMP-520 – GoLite project Vincent Foley-Bourgon Sable Lab McGill University Winter 2020. Agenda I Overview of Go I Why

Gophers!Thanks Google :)

44 / 44