A domain-specific language (DSL) is superficially similar to a programming language in the following sense: it has a well defined set of language constructs, and each of those has a precisely defined semantic meaning, which makes programs written with the language analyzable and potentially executable.
However, instead of being optimized for general purpose programming tasks, a DSL is focused on a particular set of problems common in a particular domain. This means, that the language constructs typically resemble abstractions from that domain, and that the notation used is aligned with existing locations - graphical, tabular, symbolic or textual - in the domain as well.
Many DSLs are also not optimized for allowing users to define their own abstractions. However, because the existing abstractions are aligned with the particular kinds of programs the user wants to express, this is not a drawback. To the contrary: because of this close alignment with the domain, DSLs can be used by nonprogrammers, people who are experts in the respective domain but who are not trained software developers.
Extending programming-style activities to much earlier in the development process is the central value proposition of DSLs. This way, productivity and quality can be significantly enhanced.