A Domain-Specific Language is a programming language that mimics the terms, idioms, and expressions used among experts in the targeted domain. Code written in a DSL reads like structured prose for the domain. Ideally, a domain expert with little experience in programming can read, understand, and validate this code. Sometimes, a domain expert might be able to write DSL code, even if he isn’t a professional programmer.
DSLs are a large topic. We’ll
only touch the surface of DSLs and Scala’s impressive support for them. For
more information on DSLs in general, see [Fowler2009], [Ford2009], and [Deursen]. The basic build tool we used for
the book’s examples,
sake, uses a DSL similar to the
make and its Ruby cousin
rake. (See the README in the code download
archive for details.) For other examples of Scala “internal” and
“external” DSLs, see [Ghosh2008a] and [Ghosh2008b]. For some advanced work on
DSLs using Scala, [Hofer2008] explores polymorphic
substitution of alternative implementations for DSL abstractions, which is
useful for analysis, optimization, composition, etc.
Well-crafted DSLs offer several benefits:
A DSL hides implementation details and exposes only those abstractions relevant to the domain.
Because implementation details are encapsulated, a DSL optimizes the effort required to write or modify code for application features.
A DSL helps developers understand the domain and domain experts ...