Lesson 32 of 40 intermediate 6 min read

Matching language to domain

Key takeaways Domains converge on a few languages — because libraries, tooling and hiring cluster there. The convention is gravity, not law — you can break it, at a cost. Many systems mix languages — a fast core with a productive shell, especially in DSP and RF.

Languages don’t get chosen in a vacuum — they get chosen inside a field, and each field has gravitated toward a handful of go-to languages. That convergence isn’t arbitrary: it’s where the best libraries, the most examples and the deepest hiring pool already are. This lesson maps the major domains to the languages they reach for and, more usefully, why. It’s honest about the overlaps too — most of these boundaries are fuzzy, and many real systems blend several languages.

Why domains cluster

Before the map, the mechanism. A domain converges on a language for compounding, self-reinforcing reasons:

  • Libraries solve the domain’s hard problems there first.
  • Tooling (debuggers, profilers, frameworks) matures around it.
  • Examples and answers accumulate, so newcomers learn faster.
  • Hiring gets easier, so teams keep picking it.

Each reason makes the next stronger. That’s why “use what the domain uses” is a sensible default — and why going against it should be a deliberate choice, not a reflex.

The domain map

Domain Usual languages Why
Web front-end JavaScript / TypeScript the only language browsers run natively; TS adds safety
Web back-end Go, Python, Node, Java, Ruby, C# broad field — almost any language works; pick by team/ecosystem
Mobile Swift (iOS), Kotlin (Android) each is the platform-native, first-class language
Systems / OS C, C++, Rust direct hardware/memory control; Rust adds safety
Data science / ML Python, R, Julia unmatched numeric ecosystem (NumPy, pandas, PyTorch); R for stats
Embedded C, C++, Rust, MicroPython tiny footprint, hardware control; MicroPython for prototyping
Scripting / automation Python, shell (Bash) quick to write, glue tools together
DSP / RF / SDR C / C++ (heavy DSP), Python (prototyping), Go (stream engines) per-sample deadlines need speed; Python for fast iteration

Web

The front-end is the one place with no real choice: browsers run JavaScript (and its typed superset TypeScript), so that’s that. The back-end is the opposite — wide open. Go, Python, Node, Java, Ruby and C# all serve web back-ends well, and here the decision really is mostly team familiarity, ecosystem and the deployment story rather than language merit.

Mobile and systems

Mobile rewards the platform-native language: Swift for Apple, Kotlin for Android, because the tooling, APIs and performance are first-class there. Systems and OS work — kernels, drivers, runtimes — demands low-level control, so it’s C and C++, with Rust increasingly chosen for new components that want that control plus memory safety.

Data, embedded and scripting

Data science and ML belong to Python, almost entirely because of its ecosystem — NumPy, pandas, scikit-learn, PyTorch — with R strong for statistics and Julia an up-and-comer for high-performance numerics. Embedded work runs close to the metal in C, C++ and increasingly Rust, with MicroPython handy for prototyping on capable microcontrollers. Scripting and automation — gluing tools together, one-off tasks — is Python and shell territory, chosen for sheer speed of writing.

DSP, RF and SDR: a mixed-language world

Signal processing and software-defined radio are where this path’s examples live, and they’re a textbook case of mixing languages by role rather than picking one. The defining constraint is a per-sample deadline: a radio produces a relentless I/Q stream, and each buffer must be filtered and demodulated before the next arrives or samples drop. That single fact splits the work:

  • C / C++ for the heavy DSP. The filters, FFTs and demodulators in the hot inner loop run where every cycle counts. Decades of optimised DSP code, and the rawest throughput, live here. Much of GNU Radio’s signal-processing blocks are C++.
  • Python for prototyping and orchestration. You explore an algorithm interactively with NumPy/SciPy, or wire up a GNU Radio flowgraph, getting ideas working fast — then push the proven hot path down into native code. MATLAB plays a similar prototyping role in industry.
  • Go for concurrent stream-handling engines. The plumbing around the DSP — capturing samples from a device, fanning them out to decoders, juggling many channels and network clients at once — is concurrency-heavy coordination, and Go’s goroutines and channels fit it cleanly. It compiles to one static binary, which matters for shipping to users.
  • Rust is a growing option where you want the inner-loop speed of C/C++ and memory safety, at the cost of a steeper ramp.

The honest takeaway: the heavy math and the glue don’t have to be the same language, and in practice they usually aren’t. GopherTrunk sits here — see the RF & SDR path for the signal side and GopherTrunk’s architecture for how the pieces fit. We work a full SDR example in the decision framework.

Quick check: in a typical SDR system, which split is most common?

The overlaps are real

Don’t read the map as a set of walls. The boundaries leak constantly:

  • Web back-ends can be written in nearly anything — the table lists six options and there are more.
  • Go does data work, Python runs production web back-ends, Rust writes web services and C++ does machine learning under the hood of the Python libraries.
  • The right question isn’t “what is the language for X?” but “what does X usually use, what are the reasons, and do my requirements match those reasons?” Sometimes they don’t, and a non-conventional choice is correct — just made with eyes open.

The convention tells you where the support is. Your requirements tell you whether to follow it. Reconciling those two is exactly what a decision framework is for.

Recap

  • Domains cluster on a few languages because libraries, tooling, examples and hiring compound there.
  • The map — web front-end is JS/TS; back-end is wide open; mobile is Swift/Kotlin; systems is C/C++/Rust; data science is Python/R/Julia; embedded is C/C++/Rust; scripting is Python/shell.
  • DSP/RF/SDR mixes languages by role — C/C++ for heavy DSP, Python for prototyping, Go for concurrent stream engines, Rust where safety plus speed matter.
  • Overlaps are everywhere — most boundaries leak, and many systems blend several languages.
  • Convention is a default, not a law — follow it unless your requirements give you a deliberate reason not to.

Next up: turning all of this into a repeatable method you can actually run — a practical decision framework.

Frequently asked questions

Why does each domain tend to converge on a few languages?

Mostly gravity, not law. Once a field’s best libraries, tooling, tutorials and hiring pool cluster around a language, new projects pick it because everything they need is already there. Python won data science this way; JavaScript owns the browser because it’s the only language that runs there natively.

Can I use my favourite language outside its usual domain?

Often yes, with caveats. You can write a web backend in almost anything and DSP in many languages. But you’ll fight a thinner ecosystem, fewer examples and a smaller hiring pool. The convention exists because the support is there — going against it is a cost you should choose deliberately, not by accident.

What languages are used for software-defined radio?

A common split: C and C++ for the performance-critical DSP, Python for prototyping and orchestration (often via NumPy or GNU Radio), and Go for concurrent stream-handling engines that capture and route samples. Rust is a growing option where memory safety plus speed both matter. The heavy inner loop and the glue code don’t have to be the same language.