Compiler construction 编译器是特定于操作系统的吗?

Compiler construction 编译器是特定于操作系统的吗?,compiler-construction,operating-system,specifications,Compiler Construction,Operating System,Specifications,我理解编译器的功能,因为它接受源代码并将其编译成计算机可以理解的机器代码。然而,我想知道一件事,那就是,机器代码是每个不同的操作系统特有的吗?是否有必要在Mac、Windows和Linux操作系统上为同一种语言编写不同的编译器?请详细说明答案是“是”、“否”还是介于两者之间。编译的输出包含两个方面 1.对操作系统库例程的调用 2.执行“业务逻辑”的本机代码 第二部分很可能是针对特定处理器体系结构的每个编译的相同部分(如果使用的是同一版本的GCC,为什么不应该如此) 对库例程的调用是失败的地方。这

我理解编译器的功能,因为它接受源代码并将其编译成计算机可以理解的机器代码。然而,我想知道一件事,那就是,机器代码是每个不同的操作系统特有的吗?是否有必要在Mac、Windows和Linux操作系统上为同一种语言编写不同的编译器?请详细说明答案是“是”、“否”还是介于两者之间。

编译的输出包含两个方面 1.对操作系统库例程的调用 2.执行“业务逻辑”的本机代码

第二部分很可能是针对特定处理器体系结构的每个编译的相同部分(如果使用的是同一版本的GCC,为什么不应该如此)

对库例程的调用是失败的地方。这就是WINE在Linux上存在的原因——它为您提供了一些在Linux上运行的“模拟”/“翻译”例程,为您提供了在外来操作系统上运行Windows程序的方法

所以答案是真的,不完全是。而不是绝对的是或否。

这取决于

生成机器指令的编译器是特定于机器(或体系结构)的:ARM和x86具有不同的指令集,因此每种编译器的机器代码都会非常不同,但并不一定依赖于操作系统(尽管通常是这样,因为不同的操作系统具有不同的调用约定等)链接器组件几乎总是特定于操作系统的,因为这是为该操作系统创建可执行文件的原因。并非所有的编译器系统都将编译器与链接器分开——如果它是一个程序,那么它将是特定于操作系统的


但是,也有独立于操作系统/机器的编译器:最著名的是Java(以及其他基于JVM的语言,如Scala或Groovy)。这是因为Java编译器为JVM生成字节码,并由Java运行时(特定于操作系统和处理器)执行。但是Java编译器(用Java编写)可以在任何机器上运行,并生成将在任何机器上运行的代码。

请记住,在一个操作系统上运行的编译器可以为不同的操作系统生成代码


因此,如果我为OS a编写一个编译器,它可以为OS B生成内核,那么我可以编译为a编写的编译器,但为B输出。然后我为B编写了一个编译器。从技术上讲,有些人可能不会称它为同一个编译器。

谢谢你的回答。这给我带来了另一个困惑,那就是JVM。所谓操作系统独立(在第二部分中),您是指针对不同操作系统的不同编译器吗?我很困惑,因为你说Java编译器是独立于操作系统的,但是你说Java编译器可以在任何机器上运行。一般来说,我对JVM很困惑——这个过程中的哪些步骤是特定于操作系统的,哪一个可以在任何机器上运行?@user8768055。没有函数或过程的简单程序,如果是用高级语言编写的,不需要任何输入或输出,则可能会被编译器翻译为给定计算机体系结构(无论操作系统如何)的特定机器代码。现在,用高级语言编写的程序使用任何I/O或具有函数或过程,它们还将被转换为给定计算机体系结构和I/O操作的特定机器代码,调用例程将被转换为提供支持+功能的给定操作系统。注意,上面描述的东西称为“交叉编译器”