我一直在听这个词,所有的google搜索都引导我找到有关编译器的文章。我只是想了解术语“编译目标”的含义:|
更新:提供一些背景信息:我听说它说Web程序集是其他语言(例如C,C ++,Rust等)的编译目标。
我一直在听这个词,所有的google搜索都引导我找到有关编译器的文章。我只是想了解术语“编译目标”的含义:|
更新:提供一些背景信息:我听说它说Web程序集是其他语言(例如C,C ++,Rust等)的编译目标。
Answers:
本质上来说,编译器是指使用一种语言进行输入而使用另一种语言进行输出的翻译器。例如,Eiffel Software的编译器接受Eiffel语言输入并生成C。Intel的GCC读取C语言输入并生成x86汇编。面向英特尔的GAS汇编程序采用x86汇编并生成x86目标代码。从技术上讲,所有这三件事都是编译器。
不管格式如何,编译器读取的输入称为source,输出称为target。后一个术语取自其定义之一“预期结果”。
大多数编译器旨在产生用于特定处理器或体系结构的汇编或目标代码。因此, target通常用于指代体系结构本身,而不是输出格式。
编译器的目标不必与运行它的体系结构相同,在这种情况下,该程序称为 交叉编译器。(例如,可以将GCC构建为在x86系统上运行,以将C编译为ARM程序集。)
另外,有单个编译器能够根据输入(例如命令行上的开关)为不同的目标生成输出。这些被称为多目标编译器。
在翻译中,无论语言是英语等自然语言,还是C语言等人工语言,我们都使用术语源和目标来讨论翻译系统的输入和输出。在自然语言翻译中,该系统是能够在两种语言之间进行翻译的有能力的人脑。在编程语言中,它是一个编译器。
因此,编译器的源是编程语言(C),而目标是字节码(机器级指令)。我们经常在编译中使用目标,因为不同的系统(CPU体系结构)具有不同的指令集,例如ARM,MIPS等。编译器需要知道哪个指令集是目标,以便它可以创建正确的输出(字节码)。
WebAssemby是最新的和最伟大的东西,它以二进制格式转换c / c ++代码。
这是您可以看到其中一个应用程序的链接,该链接以多快的速度将简单的析因程序转换为机器代码。
检查这只野兽, 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)
GCC将C / C ++代码转换为汇编代码。名为“汇编程序”的工具将汇编代码转换为机器代码,而名为“链接器”的工具将多个机器代码文件连接为一个可执行文件(在Windows下为.EXE)。这些编译器中的大多数都允许您将生成的汇编代码写入文件中,以便您可以查看或修改汇编代码。
汇编器和链接器是工具链的一部分,这意味着它们通常与编译器一起交付。
但是,某些编译器(例如Microsoft)直接将C / C ++代码转换为机器语言,因此不再需要汇编器。这些编译器中有许多无法创建汇编代码,因此您无法将汇编代码写入文件中。
顺便说一句:甚至有直接创建.EXE文件的编译器(不是C / C ++,而是其他编程语言),因此不需要链接器。
WebAssembly:https://github.com/WebAssembly/design