Hello, world!

What is a Compiler?

A function that maps an input string to an output string.

compiler :: String -> String

Typically, the input and output strings are “programs”

compiler :: SourceProgram -> TargetProgram

For example, here are some well-known compilers

gcc, clang :: C          -> Binary          -- a.out, .exe
ghc        :: Haskell    -> Binary                 
javac      :: Java       -> JvmByteCode     -- .class
scalac     :: Scala      -> JvmByteCode      
ocamlc     :: Ocaml      -> OcamlByteCode   -- .cmo
ocamlopt   :: Ocaml      -> Binary               
gwt        :: Java       -> JavaScript      -- .js
v8         :: JavaScript -> Binary
nasm       :: X86        -> Binary    
pdftex     :: LaTeX      -> PDF
pandoc     :: Markdown   -> PDF | Html | Doc  

Key Requirements on output program:

  1. Has the same meaning (“semantics”) as input,
  2. Is executable in relevant context (VM, microprocessor, web browser).

A Bit of History

Compilers were invented to avoid writing machine code by hand

From Binary to FORTRAN
From Binary to FORTRAN

Richard Hamming – The Art of Doing Science and Engineering, p25:

In the beginning we programmed in absolute binary… Finally, a Symbolic Assembly Program was devised – after more years than you are apt to believe during which most programmers continued their heroic absolute binary programming. At the time [the assembler] first appeared I would guess about 1% of the older programmers were interested in it – using [assembly] was “sissy stuff”, and a real programmer would not stoop to wasting machine capacity to do the assembly.

John A.N. Lee, Dept of Computer Science, Virginia Polytechnical Institute

One of von Neumann’s students at Princeton recalled that graduate students were being used to hand assemble programs into binary for their early machine. This student took time out to build an assembler, but when von Neumann found out about it he was very angry, saying that it was a waste of a valuable scientific computing instrument to use it to do clerical work.

What does a Compiler look like?

Compiler Pipeline
Compiler Pipeline

An input source program is converted to an executable binary in many stages:

What is CSE 131 ?

A sequel to both those classes.

How write a Compiler?

General recipe, applies to any large system

We will

(Yes, loops forever, but we will hit Ctrl-C in 10 weeks…)

Course Outline

What will we do ?

Write a compiler for NanoML -> X86

But Rome wasn’t built in a day … and neither is any serious software.

Rome wasn’t built in a day
Rome wasn’t built in a day

So we will write many compilers:

What will you learn ?

Core principles of compiler construction

Several new languages

More importantly how to write a large program

What do you need to know ?

This 131 depends very heavily on CSE 130

Also depends on CSE 30

A few words on the medium of instruction

We will use Haskell which, for our purposes is like Ocaml but with nicer syntax.

Haskell has many advanced features beyond what we saw in 130, but we won’t be using them; in the few cases we do, I’ll explain them as we go.

Here are some links to get you started:

Lets Go!