Chapter 1. Introduction
Outline Language Processors The Structure of a Compiler The Evolution of Programming Languages Why study principle of programming languages
Language Processors A compiler source program Compiler target program
Running the target program input output
An interpreter Much slower program execution Better error diagnostics source program output input
A hybrid compiler, e.g. Java source program Translator intermediate program Virtual Machine output input
Outline Language Processors The Structure of a Compiler The Evolution of Programming Languages Why study principle of programming languages
A Language Processing System source program Preprocessor modified source program Compiler target assembly program Assembler relocatable machine code Linker/Loader library files relocatable object files target machine code
The Structure of a Compiler Analysis Front end Using a grammatical structure to create an intermediate representation Collecting information about the source program in a symbol table Synthesis Back end Constructing the target program from the intermediate representation and the symbol table
Phases of a Compiler character stream Lexical Analyzer token stream Symbol Table Syntax Analyzer syntax tree (optional) Semantic Analyzer syntax tree Machine-Independent Code Optimization Intermediate Code Generator intermediate representation Code Generator Machine-Dependent Code Optimization (optional) target machine code
Lexical Analysis (Scanning) Grouping characters into lexemes E.g. position = initial + rate * 60 <id,1> <=> <id,2> <+> <id,3> <*> <60>
Syntax Analysis (Parsing) Creating a tree-like (e.g. syntax tree) intermediate representation that depicts the grammatical structure of the token streams E.g. <id,1> <=> <id,2> <+> <id,3> <*> <60> = + <id, 1> * <id, 2> 60 <id, 3>
Semantic Analysis Type checking Type conversions or coercions E.g. = + <id, 1> * <id, 2> <id, 3> int2float 60
Intermediate Code Generation Generating a low-level intermediate representation It should be easy to produce It should be easy to translate into the target machine E.g. three-address code t1 = int2float(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3
Code Optimization Attempts to improve the intermediate code Better: faster, shorter code, or code that consumes less power (Chap. 8 -) E.g. t1 = id3 * 60.0 id1 = id2 + t1
Code Generation Mapping intermediate representation of the source program into the target language (Chap. 8) Machine code: register/memory location assignments E.g. LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1
Symbol Table Management To record the variable names and collect information about various attributes of each name Storage, type, scope Number and types of arguments, method of argument passing, and the type returned
Grouping of Phases into Passes Front-end pass Lexical analysis, syntax analysis, semantic analysis, intermediate code generation (Optional) Code optimization pass Back-end pass Code generation
Outline Language Processors The Structure of a Compiler The Evolution of Programming Languages Why study principle of programming languages
The Evolution of Programming Languages Machine language: 1940’s Assembly language: early 1950’s Higher-level languages: late 1950’s Fortran: scientific computation Cobol: business data processing Lisp: symbolic computation Today: thousands of programming languages
Classification of Programming Languages – by Generation First generation: machine languages Second generation: assembly languages Third generation: high-level languages Fortran, Cobol, Lisp, C, C++, C#, Java Fourth generation: specific application NOMAD, SQL, Postscript Fifth generation: logic- and constraint-based Prolog, OPS5
Classification of Programming Languages - by Functions Imperative: how C, C++, C#, Java Declarative: what ML, Haskell, Prolog von Neumann language Fortran, C Object-oriented language Simula 67, Smalltalk, C++, C#, Java, Ruby Scripting languages Awk, JavaScript, Perl, PHP, Python, Ruby, Tcl
Impacts on Compilers To translate and support new language features To take advantage of new hardware capabilities To promote the use of high-level languages by minimizing the execution overhead To make high-performance computer architectures effective on users’ applications To evaluate architectural concepts
Outline Language Processors The Structure of a Compiler The Evolution of Programming Languages Why study principle of programming languages
Why study principle of programming languages? Become a better software engineer Understand how to use language features Appreciate implementation issues Better background for language selection Familiar with range of languages Understand issues / advantages / disadvantages Better able to learn languages You might need to know a lot
Why study programming languages? Better understanding of implementation issues How is “this feature” implemented? Why does “this part” run so slowly? Better able to design languages Those who ignore history are bound to repeat it…
End of Chapter 1