“Kleppe provides a rewarding reading experience. She masterfully blends the valuable insights of both academics and practitioners, and her holistic approach to the subject will benefit software engineers with helpful insights into their craft and tools.”
–Patrick Bailey, Computer Science Department, Calvin College
“With the advent of domain-specific languages in modern software development, an understanding of software language engineering becomes essential for developers. Kleppe offers an erudite and easy-going introduction to the key concepts of the subject.”
–Anders Hessellund, IT University of Copenhagen, Denmark
“Ms. Kleppe has risen to the challenge by successfully combining the traditional theory of text-based programming languages with the brave new world of computer modeling languages into a single comprehensive and consistent conceptual framework. Furthermore, she has done so with wit and style. The text is eminently readable without being condescending, and should please both pragmatically inclined software developers as well as theoreticians who seek abstractions. This is a rare example of a technical book that fully realizes the adage that ‘things should be made as simple as possible, but no simpler.’”
–Bran Selic, Malina Software Corp.
“By finally gathering under one roof the philosophy, concepts, and terminology of language design–and by breaking down many of the needless barriers between graphical and textual languages–this book provides a good introduction for the novice and is a useful refresher for the expert.”
–Dr. Laurence Tratt, Bournemouth University, UK
“Software Language Engineering is an excellent resource for teaching you how to create software languages that are specific to your domain by utilizing a domain modeling approach.”
–Dave Hendricksen, Software Architect
“Languages to define procedures, objects, and intent have proliferated unchecked since Ada Byron. Lady Lovelace first realized in 1830 that some day machines would be programmed. The vast majority of these languages have failed to feature much in the way of design, despite pioneering work by computer scientists such as Niklaus Wirth. But if, as Wirth says, “... precision and perfection are not a dispensable luxury, but a simple necessity,” then language design, in fact precise language design, becomes a critical skill. The advent of general language-modeling languages (like Meta Object Facility) and languages designed to be made domain-specific (like Unified Modeling Language) make this skill even more pressing. No one better understands these issues, or better presents a unified path to precise language design, than Anneke Kleppe. Using clear and concise examples and detailed explanations, this book gives the language designer (and in fact any architect or developer) the background, tools, and skills necessary to design general and domain-specific languages right, the first time. It belongs on the bookshelf of every systems architect and software developer.”
–Richard Mark Soley, Ph.D., Chairman and CEO, Object Management Group, Inc.
“In this book Anneke brings together the “old” knowledge of programming languages with the “new” field of modeling languages. She makes it crystal clear how they complement each other instead of how they compete with each other. I especially like the new term “mogram,” which is the generic term for both model and program. Anyone who is designing or implementing programming languages, modeling languages, or domain specific languages should read this book. It provides the reader with the fundamental background on software language engineering.”
–Jos Warmer, Partner at Odina
Background Information xvii
Preface xix
Foreword xxvii
Chapter 1: Why Software Language Engineering? 1
1.1 An Increasing Number of Languages 1
1.2 Software Languages 3
1.3 The Changing Nature of Software Languages 4
1.3.1 Graphical versus Textual Languages 5
1.3.2 Multiple Syntaxes 6
1.4 The Complexity Crisis 7
1.5 What We Can Learn From ... 8
1.5.1 Natural-Language Studies 9
1.5.2 Traditional Language Theory 10
1.5.3 Graph Theory 10
1.6 Summary 12
Chapter 2: Roles in Language Engineering 15
2.1 Different Processes, Different Actors 15
2.2 The Language User 16
2.2.1 Tool Set of the Language User 17
2.3 The Language Engineer 19
2.3.1 Tool Set for the Language Engineer 19
2.3.2 Tool Generators 20
2.4 Summary 21
Chapter 3: Languages and Mograms 23
3.1 What Is a Language? 23
3.1.1 Mogram, or Linguistic Utterance 24
3.1.2 Primitive Language Elements and Libraries 26
3.2 Abstraction Levels and Expressiveness 27
3.2.1 Abstract versus Incomplete 29
3.2.2 Raising the Level of Abstraction 29
3.2.3 Growing Business Expectations 31
3.2.4 Languages and Abstraction Levels 32
3.3 Domain-Specific Languages 33
3.3.1 Domain-Specific versus General Languages 33
3.3.2 Domain Experts versus Computer Experts 33
3.3.3 Large User Group versus Small User Group 34
3.3.4 Horizontal DSLs versus Vertical DSLs 35
3.3.5 DSLs versus Frameworks and APIs 37
3.3.6 DSLs as Software Languages 37
3.4 Summary 38
Chapter 4: Elements of a Language Specification 39
4.1 Language Specification 39
4.1.1 Forms of a Mogram 40
4.1.2 Parts 41
4.1.3 Creation Process 42
4.1.4 An Example 43
4.2 Formalisms to Specify Languages 47
4.2.1 Context-Free Grammars 47
4.2.2 Attributed Grammars 49
4.2.3 Graph Grammars 51
4.2.4 UML Profiling 52
4.2.5 Metamodeling 53
4.2.6 Formalism of Choice 53
4.3 Summary 54
Chapter 5: Metamodeling 57
5.1 Foundations of Metamodeling 57
5.1.1 Graphs 58
5.1.2 Models and Instances 61
5.1.3 Constraint Types 62
5.1.4 UML Diagrams as Notation 66
5.1.5 Metamodels 68
5.2 Relation with Model-Driven Approaches 69
5.2.1 How to Understand the Term Platform 69
5.2.1 Transformations and Language Specifications 70
5.3 Summary 73
Chapter 6: Abstract Syntax 75
6.1 The Pivotal Role of Abstract Syntax 75
6.1.1 The Hidden, Underlying, Unifying Structure 75
6.1.2 The Gateway to Semantics 76
6.2 Mogram/Language Relationship 77
6.2.1 Abstract Form of a Mogram 78
6.2.2 Concrete form of a Mogram 78
6.2.3 Syntactically, Not Semantically, Correct 79
6.2.4 Syntactically Incorrect Mograms 80
6.3 How to Create an Abstract Syntax Model 80
6.3.1 Domain Modeling for Vertical DSLs 81
6.3.2 Pattern Finding for Horizontal DSLs 82
6.4 Alan: An Example Language 83
6.4.1 Introducing Alan 83
6.4.2 The Observer Pattern in Alan 84
6.4.3 Generic Types in Alan 85
6.4.4 Alan’s Standard Library 86
6.5 Alan’s Abstract Syntax Model 86
6.5.1 Types 86
6.5.2 Expressions 87
6.5.3 The Observer Pattern 89
6.5.4 The Library 90
6.6 Summary 90
Chapter 7: Concrete Syntax 93
7.1 Concrete Syntax and Tool Support 93
7.1.1 Phases in the Recognition Process 94
7.1.2 Two Types of Editors 100
7.1.3 The Textual-Graphical Mismatch, or Blind Spots 101
7.2 Concrete Syntax Model 104
7.2.1 Guidelines for Creating a Concrete Syntax Model 105
7.2.2 Alan’s Graphical Syntax Model 106
7.3 Summary 110
Chapter 8: Generating Textual Concrete Syntax 113
8.1 The Grasland Generator 113
8.2 The Abstract-to-Concrete Transformation 117
8.2.1 Handling References 117
8.2.2 Alan’s Textual Concrete Syntax Model 118
8.2.3 Designer Input to the asm2tcsm Transformation 120
8.3 The Model-to-BNF Grammar Algorithm 121
8.3.1 Generation of the BNFset 121
8.3.2 Designer Input to the tcsm2bnf Transformation 122
8.4 The Static Semantic Analyzer 126
8.4.1 Binding 126
8.4.2 Checking 128
8.5 Summary 129
Chapter 9: Semantics: The Meaning of Language 131
9.1 Semantics Defined 131
9.1.1 Understanding Is Personal 131
9.1.2 The Nature of a Semantics Description 133
9.2 Semantics of Software Languages 134
9.2.1 Ways to Describe Semantics 135
9.2.2 The “Best” Semantics 138
9.3 Operational Semantics Using Graphs 138
9.3.1 Modeling Semantics 139
9.3.2 Consequences of the Von Neumann Architecture 140
9.3.3 States in the Abstract Machine 142
9.3.4 The Rules of Execution: Transitions 143
9.3.5 Example: Simple Semantics 144
9.4 Summary 148
Chapter 10: Translational Semantics: Code Generation 149
10.1 Code Generation and Language Design 149
10.1.1 Abstraction Levels 150
10.1.2 Multiple Semantics 150
10.2 Building a Code Generator 151
10.2.1 Hard-Coded or Model-Transformation Rules 151
10.2.2 Source-Driven or Target-Driven Translation 153
10.2.3 Concrete or Abstract Form Target 154
10.2.4 A Template Language Targeting Abstract Form 157
10.3 Code-Generation Patterns 158
10.3.1 Treewalkers, or the Visitor Pattern 158
10.3.2 CreateOrFind 159
10.3.3 Mappers 160
10.4 Extension Points in the Generated Code 161
10.5 Other Issues in Code Generation 163
10.5.1 Bidirectionality 163
10.5.2 Target Platform with or without Framework 164
10.5.3 Modularization of the Generation 167
10.5.4 Built-in Flexibility 167
10.6 Summary 169
Chapter 11: Combining Multiple Languages 171
11.1 Multiple Mograms for One Application 171
11.1.1 Advantages of Multiple Mograms 172
11.1.2 Multiple Mograms: One or More Languages 172
11.2 Intermogram References 173
11.2.1 Hard and Soft References 173
11.2.2 Passive and Active Languages 174
11.2.3 Information Hiding 175
11.3 Language Interfaces 176
11.3/1 Offered or Required Language Interface 177
11.4 Consequences for Language User Tool Set 179
11.4.1 Resolving and Checking References 179
11.4.2 Handling Changes 180
11.4.3 Code Generation 181
11.5 Support for Language Evolution 182
11.6 Conclusion 183
11.7 Summary 183
Appendix A Glossary 185
Appendix B References 189
Index 197