Migrating From DSL Languages to Erlang-Like Parallelism
April 26, 2022

A language stops being only notation when it must carry timing, communication, supervision, and failure.

The useful comparison is not language fashion. It is the boundary between expressing a domain and operating a concurrent system that must keep working while messages, processes, upgrades, and failures are moving.

Language/runtime noteOriginally posted 2022-04-26; expanded into a concise article on 2026-07-09.

Included: domain-specific expression, concurrent execution, messaging, supervision, hot reload, and failure boundaries.

Article focus: what a language must carry once timing, communication, supervision, and failure become part of the system.

The Language Boundary

DSL-friendly languages are good at compressing a domain. They let the program name the business objects, transformations, rules, or workflows without drowning the reader in low-level plumbing.

That strength does not automatically solve runtime behavior. Once the program needs independent processes, message passing, supervision, hot reload, fault isolation, and long-running service behavior, the language has crossed into a different problem.

Why Erlang-Like Systems Matter

Erlang and Elixir are useful references because they treat concurrency, messaging, supervision, and upgrade behavior as part of the runtime shape, not as an afterthought around the application.

The original post used Ruby/Rails and DSL-heavy work as the contrast. The point is not that one language family should replace every other one. The point is that domain expression and concurrent operation are different responsibilities.

What A Migration Has To Preserve

The Useful Question

The useful question is not whether a familiar DSL language is good or bad. The question is what happens when the same program must also carry timing, communication, supervision, failure, and upgrade behavior.

At that point, notation has to become runtime structure.