1 Languages and Compilers (SProg og Oversættere) Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm Hutchinson.

Slides:



Advertisements
Similar presentations
CS1Q Computer Systems Lecture 14
Advertisements

GCSE Computing Lesson 5.
1 Languages and Compilers (SProg og Oversættere) Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm Hutchinson.
Java.  Java is an object-oriented programming language.  Java is important to us because Android programming uses Java.  However, Java is much more.
The Binary Machine Modern high-level programming languages are designed to make programming easier. On the other end, the low level, all modern digital.
1 Languages and Compilers (SProg og Oversættere) Lecture 2 Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm.
UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering CSCE 531 Compiler Construction Ch.2: Language Processors Spring 2010 Marco.
1 Lecture 1  Getting ready to program  Hardware Model  Software Model  Programming Languages  The C Language  Software Engineering  Programming.
T-diagrams “Mommy, where do compilers come from?” Adapted from:
Introduction to Computers and Programming. Some definitions Algorithm: –A procedure for solving a problem –A sequence of discrete steps that defines such.
Chapter 2: Impact of Machine Architectures What is the Relationship Between Programs, Programming Languages, and Computers.
1 Programming Languages Translation  Lecture Objectives:  Be able to list and explain five features of the Java programming language.  Be able to explain.
UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering CSCE 531 Compiler Construction Ch.2 Spring 2007 Marco Valtorta
Introduction to Computers and Programming. Some definitions Algorithm: Algorithm: A procedure for solving a problem A procedure for solving a problem.
Introduction to Java.
3/24/2004COSC4301 assignment 31 Compiler, Interpreter, and Bootstrapping Motivation: When we are asked to write a  Compiler for a complex source language.
3-1 3 Compilers and interpreters  Compilers and other translators  Interpreters  Tombstone diagrams  Real vs virtual machines  Interpretive compilers.
Source Code Basics. Code For a computer to execute instructions, it needs to be in binary Each instruction is given a number Known as “operation code”
1 Chapter-01 Introduction to Computers and C++ Programming.
P51UST: Unix and Software Tools Unix and Software Tools (P51UST) Compilers, Interpreters and Debuggers Ruibin Bai (Room AB326) Division of Computer Science.
Computer Programming I Hour 1-Getting Started. Word of Day —Chinese proverb A journey of a thousand miles is started by taking the first step. —Aristophanes.
1 Languages and Compilers (SProg og Oversættere) Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm Hutchinson.
High-level Languages.
High level & Low level language High level programming languages are more structured, are closer to spoken language and are more intuitive than low level.
An intro to programming. The purpose of writing a program is to solve a problem or take advantage of an opportunity Consists of multiple steps:  Understanding.
Introduction to Programming Languages. Problem Solving in Programming.
Algorithms and Programming
CS1Q Computer Systems Lecture 14 Simon Gay. Lecture 14CS1Q Computer Systems - Simon Gay2 Where we are Global computing: the Internet Networks and distributed.
Language processors (Chapter 2) 1 Course Overview PART I: overview material 1Introduction 2Language processors (tombstone diagrams, bootstrapping) 3Architecture.
1 CSC204 – Programming I Lecture 2 Intro to OOP with Java.
Fundamental Programming: Fundamental Programming K.Chinnasarn, Ph.D.
Getting started with Programming using IDE. JAVA JAVA IS A PROGRAMMING LANGUAGE AND A PLATFORM. IT CAN BE USED TO DELIVER AND RUN HIGHLY INTERACTIVE DYNAMIC.
CS 614: Theory and Construction of Compilers Lecture 7 Fall 2002 Department of Computer Science University of Alabama Joel Jones.
CS 614: Theory and Construction of Compilers Lecture 8 Fall 2003 Department of Computer Science University of Alabama Joel Jones.
Introduction to Compilers. Related Area Programming languages Machine architecture Language theory Algorithms Data structures Operating systems Software.
Ted Pedersen – CS 3011 – Chapter 10 1 A brief history of computer architectures CISC – complex instruction set computing –Intel x86, VAX –Evolved from.
Chapter 1 Introduction. Chapter 1 -- Introduction2  Def: Compiler --  a program that translates a program written in a language like Pascal, C, PL/I,
A compiler is a computer program that translate written code (source code) into another computer language Associated with high level languages A well.
 Chapter 2 Language Processors Fall Chart 2  Translators and Compilers  Interpreters  Real and Abstract Machines  Interpretive Compilers 
Georgia Institute of Technology Speed part 4 Barb Ericson Georgia Institute of Technology May 2006.
Language Implementation Methods David Woolbright.
 Computer Languages Computer Languages  Machine Language Machine Language  Assembly Language Assembly Language  High Level Language High Level Language.
By: Cheryl Mok & Sarah Tan. Java is partially interpreted. 1. Programmer writes a program in textual form 2. Runs the compiler, which converts the textual.
Introduction to OOP CPS235: Introduction.
JavaScript 101 Introduction to Programming. Topics What is programming? The common elements found in most programming languages Introduction to JavaScript.
The single most important skill for a computer programmer is problem solving Problem solving means the ability to formulate problems, think creatively.
Lesson 1 1 LESSON 1 l Background information l Introduction to Java Introduction and a Taste of Java.
1 Languages and Compilers (SProg og Oversættere) Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm Hutchinson.
ITP 109 Week 2 Trina Gregory Introduction to Java.
Lecture #1: Introduction to Algorithms and Problem Solving Dr. Hmood Al-Dossari King Saud University Department of Computer Science 6 February 2012.
Introduction to Computer Programming Concepts M. Uyguroğlu R. Uyguroğlu.
Introduction To Software Development Environment.
INTRODUCTION TO COMPUTER PROGRAMMING ITC-314. Computer Programming  Computer Programming means creating a sequence of instructions to enable a computer.
Evolution and History of Programming Languages
Computer Systems Nat 5 Computing Science
Overview of Compilers and Language Translation
High or Low Level Programming Language? Justify your decision.
Compiler, Interpreter, and Bootstrapping
Programming Language Hierarchy, Phases of a Java Program
CSCI-235 Micro-Computer Applications
Lecture 1: Introduction to JAVA
Computer Systems Nat 5 Computing Science
Topic: Difference b/w JDK, JRE, JIT, JVM
Want to Write a Compiler?
CSCE 531 Compiler Construction Ch.2
Programming Languages
Languages and Compilers (SProg og Oversættere)
Programming language translators
Languages and Compilers (SProg og Oversættere)
Presentation transcript:

1 Languages and Compilers (SProg og Oversættere) Bent Thomsen Department of Computer Science Aalborg University With acknowledgement to Norm Hutchinson who’s slides this lecture is based on.

2 Terminology Translatorinputoutput source program object program is expressed in the source language is expressed in the implementation language is expressed in the target language Q: Which programming languages play a role in this picture? A: All of them!

3 Tombstone Diagrams What are they? –diagrams consisting out of a set of “puzzle pieces” we can use to reason about language processors and programs –different kinds of pieces –combination rules (not all diagrams are “well formed”) M Machine implemented in hardware S -> T L Translator implemented in L MLML Language interpreter in L Program P implemented in L L P

4 Tombstone diagrams: Combination rules S PP T S -> T M M L P M WRONG!OK! M M P M L P WRONG!

5 Tetris x86C Tetris Compilation x86 Example: Compilation of C programs on an x86 machine C -> x86 x86 Tetris x86

6 Tetris PPCC Tetris Cross compilation x86 Example: A C “cross compiler” from x86 to PPC C -> PPC x86 A cross compiler is a compiler which runs on one machine (the host machine) but emits code for another machine (the target machine). Host ≠ Target Q: Are cross compilers useful? Why would/could we use them? PPC Tetris PPC download

7 Tetris x86 Tetris JVMJava Tetris Two Stage Compilation x86 Java->JVM x86 A two-stage translator is a composition of two translators. The output of the first translator is provided as input to the second translator. x86 JVM->x86 x86

8 Java->x86 Compiling a Compiler Observation: A compiler is a program! Therefore it can be provided as input to a language processor. Example: compiling a compiler. Java->x86 C x86 C -> x86 x86

9 Interpreters An interpreter is a language processor implemented in software, i.e. as a program. Terminology: abstract (or virtual) machine versus real machine Example: The Java Virtual Machine JVM x86 JVM Tetris Q: Why are abstract machines useful?

10 Interpreters Q: Why are abstract machines useful? 1) Abstract machines provide better platform independence JVM x86 PPC JVM Tetris JVM PPC JVM Tetris

11 Interpreters Q: Why are abstract machines useful? 2) Abstract machines are useful for testing and debugging. Example: Testing the “Ultima” processor using hardware emulation Ultima x86 Ultima  P P Functional equivalence Note: we don’t have to implement Ultima emulator in x86 we can use a high-level language and compile it.

12 Interpreters versus Compilers Q: What are the tradeoffs between compilation and interpretation? Compilers typically offer more advantages when –programs are deployed in a production setting –programs are “repetitive” –the instructions of the programming language are complex Interpreters typically are a better choice when –we are in a development/testing/debugging stage –programs are run once and then discarded –the instructions of the language are simple –the execution speed is overshadowed by other factors e.g. on a web server where communications costs are much higher than execution speed

13 Interpretive Compilers Why? A tradeoff between fast(er) compilation and a reasonable runtime performance. How? Use an “intermediate language” more high-level than machine code => easier to compile to more low-level than source language => easy to implement as an interpreter Example: A “Java Development Kit” for machine M Java->JVM M JVM M

14 P JVMJava P Interpretive Compilers Example: Here is how we use our “Java Development Kit” to run a Java program P Java->JVM M JVM M M JVM P M

15 Portable Compilers Example: Two different “Java Development Kits” Java->JVM JVM M Kit 2: Java->JVM M JVM M Kit 1: Q: Which one is “more portable”?

16 Portable Compilers In the previous example we have seen that portability is not an “all or nothing” kind of deal. It is useful to talk about a “degree of portability” as the percentage of code that needs to be re-written when moving to a dissimilar machine. In practice 100% portability is as good as impossible.

17 Example: a “portable” compiler kit Java->JVM Java JVM Java Java->JVM JVM Q: Suppose we want to run this kit on some machine M. How could we go about realizing that goal? (with the least amount of effort) Portable Compiler Kit:

18 Example: a “portable” compiler kit Java->JVM Java JVM Java Java->JVM JVM Q: Suppose we want to run this kit on some machine M. How could we go about realizing that goal? (with the least amount of effort) JVM Java JVM C reimplement C->M M JVM M M

19 Example: a “portable” compiler kit Java->JVM Java JVM Java Java->JVM JVM M This is what we have now: Now, how do we run our Tetris program? Tetris JVMJava Tetris M Java->JVM JVM M JVM Tetris JVM M M

20 Bootstrapping Java->JVM Java JVM Java Java->JVM JVM Remember our “portable compiler kit”: We haven’t used this yet! Java->JVM Java Same language! Q: What can we do with a compiler written in itself? Is that useful at all? JVM M

21 Bootstrapping Java->JVM Java Same language! Q: What can we do with a compiler written in itself? Is that useful at all? By implementing the compiler in (a subset of) its own language, we become less dependent on the target platform => more portable implementation. But… “chicken and egg problem”? How do to get around that? => BOOTSTRAPPING: requires some work to make the first “egg”. There are many possible variations on how to bootstrap a compiler written in its own language.

22 Bootstrapping an Interpretive Compiler to Generate M code Java->JVM Java JVM Java Java->JVM JVM Our “portable compiler kit”: P M Java P Goal we want to get a “completely native” Java compiler on machine M Java->M M JVM M M

23 P M P MJava P Bootstrapping an Interpretive Compiler to Generate M code Idea: we will build a two-stage Java -> M compiler. P JVM M Java->JVM M M JVM->M M We will make this by compiling To get this we implement JVM->M Java Java->JVM JVM and compile it

24 Bootstrapping an Interpretive Compiler to Generate M code Step 1: implement JVM->M JavaJVM JVM->M Java->JVM JVM M M JVM->M Java Step 2: compile it Step 3: compile this

25 Bootstrapping an Interpretive Compiler to Generate M code Step 3: “Self compile” the JVM (in JVM) compiler M JVM->M JVM M M JVM->M JVM JVM->M JVMThis is the second stage of our compiler! Step 4: use this to compile the Java compiler

26 Bootstrapping an Interpretive Compiler to Generate M code Step 4: Compile the Java->JVM compiler into machine code M Java->JVM M JVM JVM->M MThe first stage of our compiler! We are DONE!

27 Full Bootstrap A full bootstrap is necessary when we are building a new compiler from scratch. Example: We want to implement an Ada compiler for machine M. We don’t currently have access to any Ada compiler (not on M, nor on any other machine). Idea: Ada is very large, we will implement the compiler in a subset of Ada and bootstrap it from a subset of Ada compiler in another language. (e.g. C) Ada-S ->M C v1 Step 1: build a compiler for Ada-S in another language

28 Full Bootstrap Ada-S ->M C v1 Step 1a: build a compiler (v1) for Ada-S in another language. Ada-S ->M C v1 M Ada-S->M v1 Step 1b: Compile v1 compiler on M M C->M M This compiler can be used for bootstrapping on machine M but we do not want to rely on it permanently!

29 Full Bootstrap Ada-S ->M Ada-S v2 Step 2a: Implement v2 of Ada-S compiler in Ada-S Ada-S ->M Ada-S v2 M M Ada-S->M v2 Step 2b: Compile v2 compiler with v1 compiler Ada-S ->M M v1 Q: Is it hard to rewrite the compiler in Ada-S? We are now no longer dependent on the availability of a C compiler!

30 Full Bootstrap Step 3a: Build a full Ada compiler in Ada-S Ada->M Ada-S v3 M M Ada->M v3 Ada-S ->M M v2 Step 3b: Compile with v2 compiler Ada->M Ada-S v3 From this point on we can maintain the compiler in Ada. Subsequent versions v4,v5,... of the compiler in Ada and compile each with the the previous version.

31 Half Bootstrap We discussed full bootstrap which is required when we have no access to a compiler for our language at all. Q: What if we have access to an compiler for our language on a different machine HM but want to develop one for TM ? Ada->HM HM We have: Ada->TM TM We want: Idea: We can use cross compilation from HM to TM to bootstrap the TM compiler. Ada->HM Ada

32 HM Ada->TM Half Bootstrap Idea: We can use cross compilation from HM to M to bootstrap the M compiler. Step 1: Implement Ada->TM compiler in Ada Ada->TM Ada Step 2: Compile on HM Ada->TM Ada Ada->HM HM Cross compiler: running on HM but emits TM code

33 TM Ada->TM Half Bootstrap Step 3: Cross compile our TM compiler. Ada->TM Ada Ada->TM HM DONE! From now on we can develop subsequent versions of the compiler completely on TM

34 Bootstrapping to Improve Efficiency The efficiency of programs and compilers: Efficiency of programs: - memory usage - runtime Efficiency of compilers: - Efficiency of the compiler itself - Efficiency of the emitted code Idea: We start from a simple compiler (generating inefficient code) and develop more sophisticated version of it. We can then use bootstrapping to improve performance of the compiler.

35 Bootstrapping to Improve Efficiency We have: Ada->M slow Ada Ada-> M slow M slow We implement: Ada->M fast Ada Ada->M fast Ada M Ada->M fast M slow Step 1 Ada-> M slow M slow Step 2 Ada->M fast Ada M Ada->M fast M fast Ada-> M fast M slow Fast compiler that emits fast code!

36 Conclusion To write a good compiler you may be writing several simpler ones first You have to think about the source language, the target language and the implementation language. The work of a compiler writer is never finished, there is always version 1.x and version 2.0 and …