The Promise of Write Once, Run Anywhere
The promise of a runtime that lets programmers Write once, run anywhere has been a recurring one for decades. While many of the technologies that tried to fulfill the promise went on to be successful (Java), the goalposts continued to move, and there was not one runtime to rule them all.
Portability is often the goal.
The idea can be traced all the way back to the 1960s with the start of virtualization (the IBM M44/44X that emulated multiple IBM 7044 mainframes).
The catchy slogan wouldn't come around until 1995 when Sun Microsystem was marketing Java and the JVM. While Java had many advantages, its portability was instrumental to its success.
It continued in the mobile era with React Native and Flutter: the promise of creating an application that targets both iOS and Android. While it works in many cases, targeting the native platform is the optimal choice for teams with enough resources (see Facebook Messenger).
The write once, run anywhere story continued at the infrastructure level with Docker and containers – providing portability of applications (on any system that had an up-to-date Linux kernel). Of course, the JVM and container layers sometimes clash – portability that exists at one layer but not another – JVM-supported architectures that require different Docker images or questions like who gets to manage resource limits?
Electron applications let developers write cross-platform desktop applications.
The newest entry is WebAssembly. Many LLVM-based languages can target WebAssembly bytecode targets. That means you can run it on a variety of platforms – in the browser, on the server, or at the edge.
Even if it doesn't become a universal runtime, a new technology that creates greater portability for developers creates new opportunities.