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

时间:2018-12-09 23:54:31

标签: compiler-construction operating-system specifications

我了解编译器的作用,因为编译器将获取源代码并将其编译为计算机可以理解的机器代码。但是,我想知道的一件事是,该机器代码是否特定于每个不同的操作系统?在Mac,Windows和Linux操作系统上是否需要针对同一语言编写其他编译器?请详细说明答案是“是”,“否”或介于两者之间。

3 个答案:

答案 0 :(得分:2)

要视情况而定。

生成机器指令的编译器是特定于 machine (或 architecture )的:ARM和x86具有不同的指令集,因此对于每个,但不是不必要依赖于操作系统(尽管通常是这样,因为不同的操作系统具有不同的调用约定等)。 linker 组件几乎始终是特定于操作系统的,因为这是为该OS创建可执行文件的原因。并非所有的编译器系统都将编译器与链接器分开-如果它是一个程序,则它是特定于OS的。

但是,存在与OS /计算机无关的编译器:最著名的是Java(以及其他基于JVM的语言,例如Scala或Groovy)。这是因为Java编译器会为JVM生成 bytecode ,并由Java运行时(特定于操作系统和处理器的 )执行。但是Java编译器(用Java编写)可以在任何计算机上运行,​​并生成可以在任何计算机上运行的代码。

答案 1 :(得分:1)

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

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

对库例程的调用可以解决问题。这就是WINE在Linux上存在的原因-它为您提供了一些在Linux上运行的“模拟” /“翻译”例程,从而为您提供了一种在异类操作系统上运行Windows程序的方法。

所以答案确实是,不是很确切。而不是绝对的是或否。

答案 2 :(得分:0)

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

因此,如果我为OS A编写了一个编译器,并且它可以为OS B生成内核,那么我可以为A编写该编译器,但为B输出。那么我有一个B编译器。从技术上讲,有些人可能不会调用相同的编译器。