Compilers : principles and practice

Compilers: Principles and Practice explains the phases and implementation of compilers and interpreters, using a large number of real-life examples. It includes examples from modern software practices such as Linux, GNU Compiler Collection (GCC) and Perl. This book has been class-tested and tuned to...

Full description

Bibliographic Details
Other Authors: Dave, Parag H. Author (author), Dave, Himanshu B. Contributor (contributor)
Format: eBook
Language:Inglés
Published: [Place of publication not identified] Pearson 2012
Edition:1st edition
Series:Always learning.
Subjects:
See on Biblioteca Universitat Ramon Llull:https://discovery.url.edu/permalink/34CSUC_URL/1im36ta/alma991009629373806719
Table of Contents:
  • Cover
  • Contents
  • List of Figures
  • List of Tables
  • List of Algorithms
  • Preface
  • Acknowledgements
  • Chapter 1: Introduction
  • 1.1 Languages
  • 1.1.1 Machine Language
  • 1.1.2 Hex AbsoluteLoaderLanguage
  • 1.1.3 Assembly Language
  • 1.1.4 Macro Assembly Language
  • 1.1.5 Intermediate or ByteCode
  • 1.1.6 High Level Language
  • 1.1.7 Very High Level Language
  • 1.1.8 Why High Level Language?
  • 1.2 Translation Process
  • 1.3 Translation Schemes
  • 1.3.1 T-diagram
  • 1.3.2 Assembler
  • 1.3.3 Macro Assembler
  • 1.3.4 Interpreter
  • 1.3.5 Load-and-Go Scheme
  • 1.3.6 Compiler
  • 1.3.7 What Does a Compiler Do?
  • 1.4 Theoretical Viewpoint
  • 1.4.1 Acceptor and Compiler
  • 1.5 Phases of a Compiler
  • 1.6 A More Detailed Look at Phases of a Compiler
  • 1.6.1 Lexical Analyzer - Scanner
  • 1.6.2 SyntaxAnalyzer - Parser
  • 1.6.3 Semantic Analyzer - Mapper
  • 1.6.4 Code Generation and Machine-dependent Optimization
  • 1.6.5 Optimization
  • 1.6.6 How to Develop Optimized Code?
  • 1.7 A Real-life Compiler-gcc
  • 1.8 What Do We Mean by "Meaning"?
  • Looking Forward
  • Historical Notes
  • Exercises
  • Web Resources
  • Glossary
  • Chapter 2: A Simple Translator
  • 2.1 A Simple Language
  • 2.1.1 Grammar of simple
  • 2.1.2 Target Language
  • 2.1.3 Example Program in Machine Code
  • 2.2 Compiler for Simple
  • 2.2.1 Scanner
  • 2.2.2 Parser
  • 2.2.3 Intermediate Form and Semantic Phase
  • 2.2.4 Code Generation
  • 2.2.5 Comments on the Compiled Code
  • 2.3 A Virtual Machine for Simple
  • Looking Forward
  • Exercises
  • Web Resources
  • Glossary
  • Chapter 3: Lexical Analyzer
  • 3.1 Scanner
  • 3.1.1 Examples: RE, FSM and Implementation
  • 3.2 Symbol Tables and a Scanner
  • 3.3 Compiler Writing Tools
  • 3.3.1 Lex - A Scanner Generator
  • 3.3.2 Flex
  • 3.3.3 Debugging lex and flex
  • 3.4 Error Handling in a Scanner
  • Exercises
  • Web Resources
  • Glossary.
  • Chapter 4: Syntax Analyzer
  • 4.1 Top-down and Bottom-up Parsing
  • 4.2 Top-down Parsing
  • 4.2.1 Recursive-descent Parser (RDP)
  • 4.2.2 Exercises
  • 4.2.3 Parser for Simple LL(1) Grammars
  • 4.2.4 LL(1) Grammar Without ε-rules
  • 4.2.5 LL(1) Grammars with ε-rules
  • 4.3 Bottom-up Parsing
  • 4.3.1 Shift/Reduce Parsing
  • 4.3.2 Operator Precedence Parsing
  • 4.3.3 LR Grammars
  • 4.3.4 FSM for an LR(0) Parser
  • 4.3.5 Design of the FSM for an LR(0) Parser
  • 4.3.6 Table-driven LR(0) Parser
  • 4.3.7 Parsing Decision Conflicts
  • 4.3.8 Canonical LR(1) Parser
  • 4.3.9 SLR(1) Parser
  • 4.3.10 Conflict Situations
  • 4.3.11 Look-ahead (LA) Sets
  • 4.3.12 LALR(1) Parser
  • 4.4 Yacc - A Parser Generator
  • 4.4.1 YACC - A Compiler Writing Tool
  • 4.4.2 Working of the Parser Generated by YACC
  • 4.4.3 Input Specification
  • 4.4.4 Recursion in Grammar Specification
  • 4.4.5 Actions
  • 4.4.6 Ambiguity and Conflict Resolution
  • 4.4.7 Error Handling
  • 4.4.8 Arbitrary Value Types
  • 4.4.9 Debugging yacc
  • 4.4.10 Working Examples
  • 4.5 Other Parser Generators
  • 4.5.1 Bison
  • 4.5.2 Parse::Yapp
  • 4.5.3 ANTLR
  • 4.6 Grammar for miniC
  • 4.7 Symbol Table and Parser
  • 4.7.1 Pre-defined Entities
  • 4.8 Real-life - GCC: GNU Compiler Collection
  • Exercises
  • Web Resources
  • Further Reading
  • Glossary
  • Chapter 5: Syntax-directed Translation
  • 5.1 Implicit Stacking in RDP
  • 5.2 Synchronized Semantic Stacks
  • 5.2.1 Semantic Stack in yacc
  • 5.3 Action Symbols
  • 5.3.1 Action Symbols in yacc
  • 5.4 Attribute Grammars
  • 5.4.1 Syntax-directed Techniques
  • 5.4.2 Definition of Attribute Grammar
  • 5.4.3 Dependency Graphs
  • 5.4.4 Definitions: Inherited and Synthesized Attributes
  • 5.4.5 S-Type Definitions and Grammars
  • 5.4.6 L-Type Definitions and Grammars
  • 5.4.7 Synthesized and Inherited Attributes in yacc
  • 5.4.8 More on Inherited Attributes in yacc.
  • 5.5 Symbol Table Handling
  • 5.5.1 Symbol Table in miniC
  • 5.6 Intermediate Representation Output for miniC
  • Exercises
  • Web Resources
  • Further Reading
  • Glossary
  • Chapter 6: Type Checking
  • 6.1 Data Types and Type Checking
  • 6.2 Type Expressions and Type Constructors
  • 6.3 Type Equivalence
  • 6.4 Type Names, Declarations and Recursive Types
  • 6.4.1 Recursive Types
  • 6.5 Type Inference
  • 6.5.1 Formal Semantics
  • 6.6 Type Conversion and Coercion
  • 6.7 Overloading of Operators and Functions
  • 6.8 Example: Type Checking in an Interpreter
  • Exercises
  • Web Resources
  • Further Reading
  • Glossary
  • Chapter 7: Run-Time Environment
  • 7.1 Run-Time Storage Allocation
  • 7.1.1 Static Allocation
  • 7.1.2 Typical Function Calls Interface for C
  • 7.1.3 Dynamic Allocation
  • 7.1.4 Nested Functions in GCC Extension
  • 7.1.5 On-demand or Heap Allocation
  • 7.1.6 Parameter Passing and Calling Conventions
  • 7.1.7 C Variables
  • 7.1.8 Block-structured Languages
  • 7.2 Operating System
  • 7.2.1 A Running Program - A Process
  • 7.2.2 Linux System Calls
  • 7.3 Libraries
  • 7.3.1 Language Library
  • 7.3.2 Special Purpose Libraries
  • 7.4 System Environmental Variables
  • 7.5 Invocation Command-line Parameters
  • Exercises
  • Web Resources
  • Further Reading
  • Glossary
  • Chapter 8: Intermediate Code
  • 8.1 Building a Parse Tree
  • 8.1.1 Generating Parse Tree in Memory
  • 8.2 Polish Notation
  • 8.2.1 Generating RPN
  • 8.3 N-tuple Notation
  • 8.3.1 Triple notation
  • 8.3.2 Quadruple Notation
  • 8.3.3 Generation of N-tuple Code
  • 8.4 Abstract Syntax Tree
  • 8.4.1 Generating Abstract Syntax Tree
  • 8.5 Abstract or Virtual Machine Code
  • 8.5.1 P-code for a PASCAL Machine
  • 8.5.2 Java Bytecode
  • 8.6 Threaded Code
  • 8.6.1 Subroutine Threaded Code
  • 8.6.2 Direct Threaded Code
  • 8.6.3 Indirect Threaded Code
  • 8.6.4 Token Threaded Code.
  • 8.6.5 Implementation of Threaded Code on Motorola 68000
  • 8.6.6 Implementation of Threaded Code on Intel x86 Machines
  • 8.7 SECD and WAM
  • 8.8 Grammar and IR Generation for miniC
  • 8.8.1 Expressions
  • 8.8.2 Assignments
  • 8.8.3 Statements
  • 8.8.4 IF-THEN and IF-THEN-ELSE
  • 8.8.5 WHILE-DO
  • 8.8.6 Variable Declarations
  • 8.8.7 Function Definitions
  • 8.8.8 Function Calls
  • 8.8.9 Utility Functions Used
  • 8.9 Real-life: Intermediate Codes of GNU gcc
  • 8.9.1 Example GCC Intermediate Code
  • Exercises
  • Further Reading
  • Glossary
  • Chapter 9: Code Generation and Machine-dependent Optimization
  • 9.1 Our Concerns in Code Generation
  • 9.1.1 Input Intermediate Representation (IR)
  • 9.1.2 Nature of Target Language
  • 9.1.3 Selection of Alternatives from Instruction Set
  • 9.1.4 Allocation of CPU Registers
  • 9.1.5 Order of Evaluation Sequence
  • 9.2 The Target Language
  • 9.2.1 x86 Assembly Language in GAS Syntax
  • 9.3 Data Structures
  • 9.3.1 Vectors and Arrays
  • 9.3.2 Vectors
  • 9.3.3 Arrays
  • 9.4 Control Constructs
  • 9.5 Procedures and Function Calls
  • 9.5.1 Function Prologue and Epilogue
  • 9.5.2 Saving Registers
  • 9.5.3 A Test for C Linkage
  • 9.6 The Target Operating Environment
  • 9.6.1 Memory Management
  • 9.6.2 CPU Register Usage
  • 9.6.3 Activation Record (AR)
  • 9.7 Code Optimization
  • 9.8 Machine-dependent Optimization
  • 9.8.1 Register Allocation
  • 9.8.2 Instruction Rescheduling: Use of Parallelism in Instruction Execution
  • 9.9 Converting the 4-Tuple and RPN into Assembly Code
  • 9.9.1 Conversion of 4-Tuple to Assembly Code
  • 9.9.2 Conversion of RPN to Assembly Code
  • Exercises
  • Further Reading
  • Glossary
  • Chapter 10: Code Optimization
  • 10.1 Basic Blocks
  • 10.1.1 Formal Algorithm to Delineate BBs
  • 10.1.2 Reference and Define Information
  • 10.1.3 Loops in Flow-graphs
  • 10.1.4 Example Implementation - miniC.
  • 10.2 Value Numbering Scheme
  • 10.3 Peep-hole Optimization
  • 10.3.1 Strength Reduction
  • 10.3.2 Constant Folding
  • 10.3.3 Constant Propagation
  • 10.3.4 Dead Variable and Dead Code Elimination
  • 10.4 Structural Optimization
  • 10.4.1 Redundant Sub-expressions
  • 10.4.2 Loop Unwinding
  • 10.4.3 Replace Index by Pointers
  • 10.4.4 Code Motion
  • 10.4.5 Variable Folding
  • 10.4.6 In-line Function
  • 10.4.7 Register Allocation
  • 10.5 Global Data-flow Analysis
  • 10.6 Super-optimizers
  • 10.6.1 Massalin's Super-optimizer
  • 10.6.2 GNU GCC Super-optimizer - GSO
  • 10.7 Epilogue
  • Exercises
  • Further Reading
  • Glossary
  • Chapter 11: Overview of Processing of Some Languages
  • 11.1 Java
  • 11.1.1 Brief History
  • 11.1.2 Overview
  • 11.1.3 Characteristics of Java
  • 11.1.4 Development with Java
  • 11.1.5 The First Java Program
  • 11.1.6 Type Conversion
  • 11.2 Perl
  • 11.2.1 Perl Internals
  • 11.3 PROLOG
  • 11.3.1 A Short Introduction to PROLOG
  • 11.4 FORTH
  • 11.4.1 Hello World in Forth
  • 11.4.2 A Quick Introduction to FORTH
  • 11.4.3 Summary
  • 11.4.4 Vmgen
  • Exercises
  • Web Resources
  • Chapter 12: Project: Compiler for a MiniC
  • 12.1 MiniC Language
  • 12.1.1 What is HOC6?
  • 12.1.2 Objectives of miniC
  • 12.2 Architecture of miniC Compiler
  • 12.3 MiniC Grammar for yacc
  • 12.4 Target Language
  • 12.4.1 x86 Instructions
  • 12.4.2 Assembler Directives
  • 12.4.3 Floating-point Instructions
  • 12.5 Symbol Table
  • 12.6 Scanner
  • 12.7 Parser
  • 12.8 Code Generation
  • 12.8.1 Arithmetic Expression
  • 12.8.2 Assignment
  • 12.8.3 Comparison with Logical Result
  • 12.8.4 Integer Increment and Decrement
  • 12.8.5 IF-THEN-ELSE Construct
  • 12.8.6 Function Definition and Call
  • 12.8.7 Assembly Language Macros
  • 12.8.8 Built-in Functions Library
  • 12.8.9 A Few Example miniC Programs
  • 12.8.10 Assembly Language Idioms
  • 12.8.11 Linux System Calls.
  • 12.9 Testing.