编译目标到底是什么?


17

我一直在听这个词,所有的google搜索都引导我找到有关编译器的文章。我只是想了解术语“编译目标”的含义:|

更新:提供一些背景信息:我听说它说Web程序集是其他语言(例如C,C ++,Rust等)的编译目标。


我建议您阅读有关编译器的文章。

4
有关编译器的文章假定您已经知道这一点。这是一个合理的问题。
卡尔·比勒费尔德

我在考虑更多关于维基百科风格的文章。我同意这个问题的合理性。这只是一个建议,而不是批评。

4
这个问题是合理的,但写得不好。术语“目标”可能具有不同的含义,因此,我建议您在听到或阅读它的地方提供参考或更多上下文。
Doc Brown

@DocBrown我在很多情况下都听说过,但最近在Web汇编的背景下成为了其他语言的编译目标。
ScionOfBytes

Answers:


17

本质上来说,编译器是指使用一种语言进行输入而使用另一种语言进行输出的翻译器。例如,Eiffel Software的编译器接受Eiffel语言输入并生成C。Intel的GCC读取C语言输入并生成x86汇编。面向英特尔的GAS汇编程序采用x86汇编并生成x86目标代码。从技术上讲,所有这三件事都是编译器。

不管格式如何,编译器读取的输入称为source,输出称为target。后一个术语取自其定义之一“预期结果”。

大多数编译器旨在产生用于特定处理器或体系结构的汇编或目标代码。因此, target通常用于指代体系结构本身,而不是输出格式。

编译器的目标不必与运行它的体系结构相同,在这种情况下,该程序称为 交叉编译器。(例如,可以将GCC构建为在x86系统上运行,以将C编译为ARM程序集。)

另外,有单个编译器能够根据输入(例如命令行上的开关)为不同的目标生成输出。这些被称为多目标编译器。


2
附带说明一下,也许值得一提的是,在构建系统的上下文中,该术语也以更通用的形式使用-目标是任何构建步骤的输出,不一定是编译操作(例如创建安装程序)。
BartoszKP

2
编译器是翻译器,而不是过滤器。

1
@Birfl。明显。“ tr”表示翻译,而不是过滤器。过滤器不是翻译器,这很明显。

2
@Birfl:我不喜欢维基百科。只从另一个ssys产生一个流就什么也没有。过滤器和翻译器之间的区别是众所周知的。过滤器基于谓词包含/排除。它不会变形。用偶数过滤整数列表?并且您得到未转换的偶数整数。使用inc翻译相同的列表,您将获得原始列表的转换版本。

1
除了术语“过滤器”外,您的编译帐户都不错。

4

在翻译中,无论语言是英语等自然语言,还是C语言等人工语言,我们都使用术语目标来讨论翻译系统的输入输出。在自然语言翻译中,该系统是能够在两种语言之间进行翻译的有能力的人脑。在编程语言中,它是一个编译器。

因此,编译器的是编程语言(C),而目标是字节码(机器级指令)。我们经常在编译中使用目标,因为不同的系统(CPU体系结构)具有不同的指令集,例如ARM,MIPS等。编译器需要知道哪个指令集是目标,以便它可以创建正确的输出(字节码)。


0

WebAssemby是最新的和最伟大的东西,它以二进制格式转换c / c ++代码。

  • WebAssembly旨在通过利用通用硬件以本机速度执行。它旨在与Web平台集成。

这是您可以看到其中一个应用程序的链接,该链接以多快的速度将简单的析因程序转换为机器代码。

检查这只野兽, https://godbolt.org/

您可以使用此示例程序在该站点中运行以查看程序集。

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • 定义一种可移植的,节省大小和加载时间的二进制格式作为编译目标,通过利用包括移动和物联网在内的各种平台上可用的通用硬件功能,可以将其编译为以本机速度执行。

有关主机和目标的一些基本信息,以及如何将编程语言转换为10101010。

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC将C / C ++代码转换为汇编代码。名为“汇编程序”的工具将汇编代码转换为机器代码,而名为“链接器”的工具将多个机器代码文件连接为一个可执行文件(在Windows下为.EXE)。这些编译器中的大多数都允许您将生成的汇编代码写入文件中,以便您可以查看或修改汇编代码。

  2. 汇编器和链接器是工具链的一部分,这意味着它们通常与编译器一起交付。

  3. 但是,某些编译器(例如Microsoft)直接将C / C ++代码转换为机器语言,因此不再需要汇编器。这些编译器中有许多无法创建汇编代码,因此您无法将汇编代码写入文件中。

顺便说一句:甚至有直接创建.EXE文件的编译器(不是C / C ++,而是其他编程语言),因此不需要链接器。

WebAssembly:https//github.com/WebAssembly/design

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.