Implementing a Programming Language
Jump to navigation
Jump to search
Implementing a programming language involves undoing the abstractions of modern, high-level constructs and converting them into machine-reabable code. This process commonly involves the following steps:
Lexical Analysis
if (a == b) return;
is turned into a stream of tokens.
keyword['if'] symbol[')'] identifier['a'] symbol['=='] identifier['b'] symbol[')'] keyword['return']
Parsing
The stream of tokens is turned into an abstract syntax tree
if-statement |-- statement | `-- equality operator | |-- identifier | | `-- a | `-- identifier | `-- b `-- expression `-- return statement
Type Checking
Make sure that parts of the syntax tree are being used correctly (from the bottom-up)
if-statement : OK |-- conditional statement | `-- equality operator : bool | |-- identifier : int | | `-- a | `-- identifier : int | `-- b `-- expression `-- return statement : void
Optimization
Suppose a = 10 and b = 20-a: a == b will always return true, so the tree can be simplified to
if-statement : OK |-- conditional statement | `-- true : bool `-- expression `-- return statement : void
or more simply
return statement : void
Code Generation
- abstract types are no more... everything is int, byte, float, etc.
- variables become memory locations and the variable names become addresses (offsets)
- statements become stack-based commands