Functionality of software systems has exploded
in part because of advances in programming-
language support for packaging reusable
functionality as libraries. Developers benefit
from the uniformity that comes of exposing many
interfaces in the same language, as opposed to
stringing together hodgepodges of command-line
tools. Domain-specific languages may be viewed
as an evolution of the power of reusable
interfaces, when those interfaces become so
flexible as to deserve to be called programming
languages. However, common approaches to
domain-specific languages give up many of the
hard-won advantages of library-building in a
rich common language, and even the traditional
approach poses significant challenges in
learning new APIs. We suggest that instead of
continuing to develop new domain-specific
languages, our community should embrace
library-based ecosystems within very expressive
languages that mix programming and theorem
proving. Our prototype framework Fiat, a library
for the Coq proof assistant, turns languages
into easily comprehensible libraries via the key
idea of modularizing functionality and
performance away from each other, the former via
macros that desugar into higher-order logic and
the latter via optimization scripts that derive
efficient code from logical programs.