Compiler construction 编程语言进化与底层架构

Compiler construction 编程语言进化与底层架构,compiler-construction,architecture,programming-languages,emulation,Compiler Construction,Architecture,Programming Languages,Emulation,假设我们有一种编程语言foofoo有一个针对系统a的编译器,但没有针对系统B的编译器。现在systemb开发人员可以为foo编写自己的编译器,也可以编写一个systema模拟器,在systemb上运行,并可以使用为systema编写的编译器。emulator的一个明显优点是,它不仅限于运行编译器,还向其他systema特定程序打开systemb。在大多数情况下,明显的缺点是性能和复杂性取决于系统 我感兴趣的是找出哪种方法更容易维护。例如,让php成为所讨论的语言,并假设phc是该语言唯一可用的编

假设我们有一种编程语言
foo
foo
有一个针对
系统a
的编译器,但没有针对
系统B
的编译器。现在
systemb
开发人员可以为
foo
编写自己的编译器,也可以编写一个
systema
模拟器,在
systemb
上运行,并可以使用为
systema
编写的编译器。emulator的一个明显优点是,它不仅限于运行编译器,还向其他
systema
特定程序打开
systemb
。在大多数情况下,明显的缺点是性能和复杂性取决于系统


我感兴趣的是找出哪种方法更容易维护。例如,让
php
成为所讨论的语言,并假设
phc
是该语言唯一可用的编译器。此编译器仅适用于类Unix环境。所以问题是,为Windows维护一个新的编译器(例如,
phc-win
)是否更容易?或者维护在Windows上工作的类Unix环境(例如,
Cygwin
)?

对于系统a指令集,仿真器更易于编写和维护。但是你总是要付出性能上的代价,所以你通过减少大量用户的工作效率,为少数人节省了工程上的工作量

然而,系统不仅仅是指令集。应用程序在虚拟机上运行,虚拟机由它直接使用的系统a机器指令和它进行的系统a操作系统调用组成。要在系统B上运行系统A应用程序,您不仅要模拟系统A指令,还要模拟系统A操作系统调用。考虑到现代操作系统的复杂性,这可能是一项非常艰巨的工作

Linux WINE(WINdows仿真器)正是这样做的;它在Linux下运行Windows二进制文件(以各种形式)。WINE通过在仅限x86的Linux系统上运行来模拟Windows x86指令,这意味着它可以让CPU执行指令模拟工作。然后它模拟了许多Windows操作系统调用。这是一个大程序,在不断开发中(我想已经有十多年了),必须不断地改变,以跟上微软在Windows上的变化。它仍然有一个愿望/错误清单,列出它做得不好的事情

虽然葡萄酒做得很好,但建造和维护它的努力是相当大的。你看不到太多的竞争,这表明努力是令人畏惧的


我会注意到构建编译器也不能解决操作系统仿真问题;应用程序的源代码现在可以编译为本机SystemB指令,但操作系统会调用它。。。。编译器无法处理。作为编译器工程师,您可以通过将操作系统仿真问题推给应用程序所有者来解决代码可移植性问题。这是一个更容易的问题:它们只需要模拟它们所依赖的系统操作系统调用的各个方面;他们不必模拟这些调用的每个方面。

回答得好,而且根据系统A的编译器,也可以使用其中间字节码输出作为系统B“代码生成器”的起点这意味着实现一个完整的SystemB编译器的成本更低,因为它利用了SystemA编译器的一部分。尝试这两种方法,长期维护这两种方法,仔细记录维护的困难程度,并公布您的发现。