遍地都是,没用所以几乎没人知道而已。
比如如果你玩游戏,PC、手机上都有pce任天堂或者街机、PS模拟器。这种东西其实就是把一种硬件上的机器语言实时翻译到另一种硬件上执行--两者结构可以截然不同。
类似的,Windows的hyper-v、著名的xen、Linux下的KVM还有独立的VMware以及各种Android模拟器,其实都是一样的东西。
更狠一些,Java把自己的代码编译成一种中间语言,也就是JVM字节码;然后各平台移植JVM,跑这种中间码。
然后,JVM成功之后,微软也搞了个类似的c#…
再后来,各种语言都可以先编译到JVM字节码,然后跑在JVM上…
然后,中间语言跑JVM还是慢,于是边跑边编译,这叫即地编译,JIT,just in time…
然后,为了抄袭…哦不,为了研究,老早就有机器码到c的反编译器,Java字节码的反编译更完善一些,我甚至见过国内市场上有把Google play上面的免费应用反编译然后添加个收费项目再发布的--我甚至不小心在上面花了6块钱。
总之,任何语言到任何语言的编译都能做,包括图灵机语言和函数式语言之间都能随便互译。只看有没有需求了。
另外,如果没有性能之类需求的话,这种翻译工作也非常简单。编译原理学个入门就足够了--这也是乱七八糟各种模拟器反编译器泛滥的原因。
事实上,设计一门新语言,其实很多也就是简单的翻译到另一种高级语言而已。比如早期的c++就是直接翻译到c的,它的翻译器叫cfront。
尤其Linux下,很多新语言都是翻译到c完事,接下来有强大的GCC帮忙优化,比你自己写好得多。
首先,所有功能完备的编程语言,在实现功能的角度来说,都是等价的。也就是说,只要功能相同,基本上都是可以无阻碍的相互翻译的。
似乎通常这种翻译都是单向进行的,比如c到汇编,python到c,这种高级语言到低级语言的翻译,那么其他类型,比如同级别的语言之间的翻译,低级语言到高级语言的翻译,难点在哪里呢?
并没有任何难点。而且因为低级语言往往语言特性少,所以实际翻译起来甚至可能会更简单(只考虑功能实现,不考虑性能)。
你之所以看不到实际项目,仅仅是因为没有实际需求,所以没人做。
毕竟由高级语言翻译到低级语言,往往有性能优势(解释执行->本地执行),以及一些特殊场景下的可移植性优势(例如说到嵌入式平台,且不想完整移植整个vm)。
但是反过来,或者说相似类型的语言,为什么要翻译一道呢?
如果你听说过cfront,就会明白把一种高级语言翻译成另一种高级语言是完全可行的,但是,即使(早期的)c++到c,两种这么相近的语言,翻译结果也不是适宜人类阅读的,并不是在保留c++源码大致结构的前提下只修改一些c语言不存在的特性,而是经过词法分析语法分析,把程序都拆散了,再输出功能等效而基本看不懂的c语言源码,跟直接输出汇编语言或者中间语言区别不大。