A DSL is just an internal or external language used to express and solve a problem. Metaprogramming is a programming tool. DSLs do not rely on metaprogramming (but metaprogramming may be used to implement a DSL).