所以我知道基础知识,编译器将源代码转换为汇编代码,汇编程序将汇编代码转换为机器代码。虽然我还没有能够正确地进行谷歌搜索,但它们实际上位于何处?
我假设编译器只是硬盘上的某个地方,因为你可以从网上下载编译器并将它们用于各种编程语言。
汇编程序是位于硬盘驱动器上,内置于操作系统中还是位于实际CPU中的某个位置?是否可以选择使用不同的汇编程序,还是预先安装到硬件中?也是一种特定于编译器的汇编语言,具体取决于汇编代码的起源方式,还是整个系统只有一个汇编程序?
答案 0 :(得分:5)
你这太复杂了。编译器以某种格式获取文本并将其转换为另一种格式的文本。比方说,C编译器将C转换为汇编。编译器只是一个程序,没有什么特别的,就像你的Web浏览器是程序一样,用于编写程序的文本编辑器只是一个程序,命令行/控制台如果你使用的只是一个程序。没有魔力。
汇编程序只是一个接收文本的程序,通常会输出某种形式的二进制文件。有许多格式,就像有很多图像和视频的二进制格式(bmp,jpg,png,gif,tiff,m4v,mpeg等)。没有什么魔力,只是一个像上面列出的那样工作的程序。
链接器也是如此,它接收二进制文件并通常输出二进制文件。
这些程序通常与硬盘驱动器上的所有其他程序一样,或者至少在已安装且可以访问的驱动器上。就像Web浏览器和文本编辑器一样。现在要运行它们,理想情况下需要它们“在路径中”,或者如果是某个IDE的一部分,那么IDE可能不需要它们相对于它们所在的路径。同样,经常为您调用汇编程序和链接程序的编译器可能不需要它可能知道/相对于它们所在位置的路径。但是它们像任何其他程序/文件一样存在于文件系统中,但是为了执行它们,它们需要能够被找到。根据操作系统和工具链的安装程序,通常有不同的选择,而不是一个全局规则。
你没有理由不能拥有尽可能多的编译器和汇编程序,因为它们只是你的文件系统,它们只是与其他程序一样的程序,所以你必须为它们找到一个地方并且必须有办法运行他们。没有理由假设任何两个编译器从相同的源代码生成相同的二进制文件,同样没有理由假设任何汇编程序能够汇编任何编译器的输出。这就是术语工具链的来源,一组链接在一起的工具,编译器输出工具链中的汇编器知道如何处理汇编器输出链接器知道如何处理的东西。你可能在不同的工具链/供应商之间有一些交叉兼容性,但这并不意味着它们可能是设计或运气不好。
答案 1 :(得分:0)
让我们避开细节并假设执行过程非常简单(compilation => assmbly => CPU) 回答你的主要问题: 编译器和汇编器都是程序(取决于您的CPU架构),因此您可以安装它们或选择系统中的buit
例如在Gnu / linux系统中: gcc是一个编译器 Nasm是汇编程序
它们位于您的硬盘驱动器上,例如:/ usr / bin /
汇编程序可以使用CPU中断和系统调用,因此他可以使用kernell与cpu通信以执行许多复杂的操作。
您可以使用此列表中的任何编译器或汇编程序(https://en.wikipedia.org/wiki/Comparison_of_assemblers),但请记住,您应该尊重使用ARM X86 X64 AMD的架构。