Conceptually, it&#x27;s easy. In practice, it&#x27;ll drown you in a thousand details, and a lot of those details turn out to be foundational. For example, a slight difference in atomicity guarantees that would be no problem at all to build around from scratch can end up becoming a nightmare to try to port an existing set of runtime expectations on to. Such things tend to subtly but firmly work their way all the way up the stack. JVM&#x27;s InvokeDynamic is a real-world example of how differences in performance guarantees can also cause surprisingly large differences.<p>There&#x27;s obviously nothing impossible about it, since it has been done, it&#x27;s just that it takes a lot more resources than you might have initially thought to do it well. And I think from an economic perspective, the vast bulk of open source projects and similarly-staffed projects are way better off putting that &quot;lot more resources&quot; into becoming better on their native platform than being not-quite-as-good on a lot more platforms. (I had a lengthy defensive discussion of the differences between commercial and open source resource allocation, which grew to be more than half this post, so let&#x27;s just pretend I proved that I understand the difference, and I still think this paragraph is true even given those differences.)