Compiling and Programming Systems
Learning Objective:This course presents an overview of the principles and techniques in modern compilers, which gives students a deeper understanding of the syntactic rules and the functionality of modern programming languages, as well as the use of the compiler for enhancing program quality. The course also gives the students the opportunity to practice the implementation of certain key components in compilers of industrial strength and experimental interpreters for mobile scripting languages.
Description:The course introduces the theoretical foundation for both the front end and the back end of the compiler. For the front end, finite automata, regular expression, context free grammars and parsing state computation form the theoretical base. For the back end, the most important theories concern the analysis of program's control and data flow, control and data dependences, and the concept of parallelism and locality analysis. The course also has a heavy emphasis on experimentation, using a practical program translation environment to implement both front-end and back-end techniques.
Topics Covered:The first part of the course will be an overview of the front end of the compiler and the basic mechanism for code generation , including the following components: Lexical analysis, examples of context free grammars, top-down parsing, bottom-up parsing, abstract syntax tree, basic type checking, symbol tables,intermediate code format and generation, machine code generation, garbage collection, code generation for programs written in object-oriented languages. The second part of the course gives more in depth coverage of the fundamental program analysis techniques commonly used by compilers and software engineering tools, which include, but not limited to, the following: Control flow and control dependence, data flow and data dependence analysis, interprocedural analysis, pointer analysis, how such analyses are applied to program transformations for better performance and to enhancement of software reliability.
Prerequisites:A bachelor degree in computer science or an equivalent field. Students not in the Computer Science master's program should seek department permission to register.
Solid understanding of syntax and semantics of high level programming languages, computer organization, data structures and combinatorial algorithms. Strong skill in C programming, especially in dealing with dynamic data structures such as lists and graphs. Familiarity with instruction-level processor architecture.
Applied / Theory:50 / 50
Web Content:Blackboard will contain grades. Piazza will contain homework assignments, solutions, chat room, message board, links to additional readings and useful software/documents.
Homework:4-5 written assignments. 2-3 small programming assignments for lexical analysis and parsing. Submit written homework via Blackboard.
Projects:Required. 2 programming projects, one on front end (internal representation) and one on backend (control and data flow analysis). Programming assignments and projects submitted by using "turnin" command on Computer Science computers for which students will be given accounts automatically.
Exams:One midterm exam and one final exam
Textbooks:Official textbook information is now listed in the Schedule of Classes. NOTE: Textbook information is subject to be changed at any time at the discretion of the faculty member. If you have questions or concerns please contact the academic department.
Tentative--Highly Recommended - "Compilers: Principles, Techniques, and Tools (Second Edition)" by A Aho & M. Lam & Sethi & Ullman, Addison-Wesley, ISBN: 978-032-148681-3. Articles from literature may be assigned for additional reading to complement the textbook.