In order to solve a long-standing problem with list fusion, a new compiler transformation, "Call Arity" is developed and implemented in the Haskell compiler GHC. It is formally proven to not degrade program performance; the proof is machine-checked using the interactive theorem prover Isabelle. To that end, a formalization of Launchbury's Natural Semantics for Lazy Evaluation is modelled in Isabelle, including a correctness and adequacy proof.
I report on applications of slicing and program dependence graphs (PDGs) to software security. Moreover, I propose a framework that generalizes both data-flow analysis on control-flow graphs and slicing on PDGs. This framework can be used to systematically derive data-flow-like analyses on PDGs that go beyond slicing. I demonstrate that data-flow analysis can be systematically applied to PDGs and show the practicability of my approach.
This book constitutes the thoroughly refereed post-proceedings of the 12th International Workshop on Logic Based Program Synthesis and Transformation, LOPSTR 2002, held in Madrid, Spain in September 2002. The 15 revised full papers presented together with 7 abstracts were carefully selected during two rounds of reviewing and revision from 40 submissions. The papers are organized in topical sections on debugging and types, tabling and constraints, abstract interpretation, program refinement, verification, partial evaluation, and rewriting and object-oriented development.
The Formal Semantics of Programming Languages provides the basic mathematical techniques necessary for those who are beginning a study of the semantics and logics of programming languages. These techniques will allow students to invent, formalize, and justify rules with which to reason about a variety of programming languages. Although the treatment is elementary, several of the topics covered are drawn from recent research, including the vital area of concurency. The book contains many exercises ranging from simple to miniprojects.Starting with basic set theory, structural operational semantics is introduced as a way to define the meaning of programming languages along with associated proof techniques. Denotational and axiomatic semantics are illustrated on a simple language of while-programs, and fall proofs are given of the equivalence of the operational and denotational semantics and soundness and relative completeness of the axiomatic semantics. A proof of Godel's incompleteness theorem, which emphasizes the impossibility of achieving a fully complete axiomatic semantics, is included. It is supported by an appendix providing an introduction to the theory of computability based on while-programs. Following a presentation of domain theory, the semantics and methods of proof for several functional languages are treated. The simplest language is that of recursion equations with both call-by-value and call-by-name evaluation. This work is extended to lan guages with higher and recursive types, including a treatment of the eager and lazy lambda-calculi. Throughout, the relationship between denotational and operational semantics is stressed, and the proofs of the correspondence between the operation and denotational semantics are provided. The treatment of recursive types - one of the more advanced parts of the book - relies on the use of information systems to represent domains. The book concludes with a chapter on parallel programming languages, accompanied by a discussion of methods for specifying and verifying nondeterministic and parallel programs.
This book constitutes the refereed proceedings of the 15th International Conference on Model Driven Engineering Languages and Systems, MODELS 2012, held in Innsbruck, Austria, in September/October 2012. The 50 papers presented in this volume were carefully reviewed and selected from a total of 181 submissions. They are organized in topical sections named: metamodels and domain specific modeling; models at runtime; model management; modeling methods and tools, consistency analysis, software product lines; foundations of modeling; static analysis techniques; model testing and simulation; model transformation; model matching, tracing and synchronization; modeling practices and experience; and model analysis.
Compilers and operating systems constitute the basic interfaces between a programmer and the machine for which he is developing software. In this book we are concerned with the construction of the former. Our intent is to provide the reader with a firm theoretical basis for compiler construction and sound engineering principles for selecting alternate methods, imple menting them, and integrating them into a reliable, economically viable product. The emphasis is upon a clean decomposition employing modules that can be re-used for many compilers, separation of concerns to facilitate team programming, and flexibility to accommodate hardware and system constraints. A reader should be able to understand the questions he must ask when designing a compiler for language X on machine Y, what tradeoffs are possible, and what performance might be obtained. He should not feel that any part of the design rests on whim; each decision must be based upon specific, identifiable characteristics of the source and target languages or upon design goals of the compiler. The vast majority of computer professionals will never write a compiler. Nevertheless, study of compiler technology provides important benefits for almost everyone in the field . • It focuses attention on the basic relationships between languages and machines. Understanding of these relationships eases the inevitable tran sitions to new hardware and programming languages and improves a person's ability to make appropriate tradeoft's in design and implementa tion .
Well-respected text for computer science students provides an accessible introduction to functional programming. Cogent examples illuminate the central ideas, and numerous exercises offer reinforcement. Includes solutions. 1989 edition.
This new, expanded textbook describes all phases of a modern compiler: lexical analysis, parsing, abstract syntax, semantic actions, intermediate representations, instruction selection via tree matching, dataflow analysis, graph-coloring register allocation, and runtime systems. It includes good coverage of current techniques in code generation and register allocation, as well as functional and object-oriented languages, that are missing from most books. In addition, more advanced chapters are now included so that it can be used as the basis for a two-semester or graduate course. The most accepted and successful techniques are described in a concise way, rather than as an exhaustive catalog of every possible variant. Detailed descriptions of the interfaces between modules of a compiler are illustrated with actual C header files. The first part of the book, Fundamentals of Compilation, is suitable for a one-semester first course in compiler design. The second part, Advanced Topics, which includes the advanced chapters, covers the compilation of object-oriented and functional languages, garbage collection, loop optimizations, SSA form, loop scheduling, and optimization for cache-memory hierarchies.
Partial evaluation reconciles generality with efficiency by providing automatic specialization and optimization of programs. This book covers the entire field of partial evaluation; provides simple and complete algorithms; and demonstrates that specialization can increase efficiency.