编译器是否特定于操作系统?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器是否特定于操作系统?相关的知识,希望对你有一定的参考价值。

我理解编译器的作用,因为它需要源代码并将其编译为计算机可以理解的机器代码。但是,我想知道一件事,那就是针对每个不同操作系统的机器代码?是否有必要在Mac,Windows和Linux操作系统上为同一种语言编写不同的编译器?请详细说明答案是肯定的,否定的或中间的。

答案

这取决于。

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

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

另一答案

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

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

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

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

另一答案

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

因此,如果我为OS A编写一个编译器,并且它可以为OS B生成内核,那么我可以编译为A编写的编译器,但输出为B.然后我有一个编译器用于B.技术上有些可能不会称之为相同编译器。

以上是关于编译器是否特定于操作系统?的主要内容,如果未能解决你的问题,请参考以下文章

#pragma 警告 - 特定于文件?

是否有任何控制循环展开的预处理器指令?

什么是“加载模块”?

像Windows或Linux这样的现代操作系统如何知道特定于芯片组的内存映射?

许多 UIButtons 的共享操作,获取特定于按钮的字符串

Xcode:构建特定于每个文件编译器构建设置的体系结构