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

问题描述 投票:2回答:3

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

compiler-construction operating-system specifications
3个回答
2
投票

这取决于。

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

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


1
投票

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

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.