【问题标题】:Where do the compiler and assembler reside on a computer?编译器和汇编器驻留在计算机的什么位置?
【发布时间】:2016-06-16 20:27:34
【问题描述】:

所以我知道最基本的知识,编译器将源代码转换为汇编代码,汇编器将汇编代码转换为机器代码。但是我无法正确使用谷歌搜索,它们实际位于何处?

我假设编译器只是在硬盘上的某个位置,因为您可以从网上下载编译器并将它们用于各种编程语言。

汇编程序是位于硬盘驱动器上、内置在操作系统中还是在实际 CPU 中的某个位置?是否可以选择不同的汇编程序来使用,或者它们是否预装到硬件中?还有一种汇编语言是特定于编译器的,具体取决于汇编代码的来源,还是整个系统只有一个汇编器?

【问题讨论】:

  • 编译器/汇编器本身就是软件,并且驻留在计算机上安装的任何位置。这也意味着您可以随心所欲地拥有每个人的数量。
  • 不,它没有。例如您可以轻松地为运行 Android 的 ARM cpu 编译/汇编代码,同时在运行 Windows 的 Intel x86 cpu 上工作。编译器/汇编器实际上只是翻译程序。他们采用 X 语言(有时是 Y、Z、P、Q 等)编写代码,并以不同语言输出代码。例如gnu GCC 可以编译大量语言的代码,而不仅仅是 C 和 C++。
  • 错误的看待它的方式 - 每个编译器都可以有一个汇编器。例如如果你使用微软的visual c++,你会得到一个MS编译器和汇编器,英特尔编译器同上,gcc同上等等。只要编译器和汇编器在文件格式上达成一致,你甚至不需要每个供应商都有一个,它们可以来自完全不同的供应商。
  • 阅读assembly tag wiki,以及stackoverflow.com/questions/6463938/…。例如,所有 x86 CPU 都理解相同的机器语言;这就是使它们成为 x86 的原因。
  • 感谢您的回复,有点开始明白了。因此,汇编器不是比编译器更特定于特定系统吗?因此,您可以为 x86 系统下载编译器/汇编程序包,汇编程序将能够将汇编程序转换为所有 x86 处理器的机器代码?

标签: assembly compilation


【解决方案1】:

你把这件事复杂化了。编译器采用某种格式的文本并将其转换为另一种格式的文本。例如,C 编译器将 C 转换为汇编。编译器只是一个程序,没有什么特别的,就像您的网络浏览器是一个程序一样,您用于编写程序的文本编辑器只是一个程序,命令行/控制台(如果您使用的话)只是一个程序。没有魔法。

汇编程序只是一个接收文本并通常输出某种形式的二进制文件的程序。有许多格式,就像图像和视频有许多二进制格式(bmp、jpg、png、gif、tiff、m4v、mpeg 等)。没有魔法,只是一个可以完成上述任何工作的程序。

链接器也是如此,它接收二进制文件并通常输出一个二进制文件。

这些程序通常与您硬盘上的所有其他程序一样,或者至少在您已安装并可访问的驱动器上。就像 Web 浏览器和文本编辑器等。现在要运行它们,理想情况下您需要“在路径中”,或者如果是某些 IDE 的一部分,那么 IDE 可能不需要它们在相对于自身所在位置的路径中。同样,经常为您调用汇编器和链接器的编译器可能不需要它可能知道/假设的相对于它们所在位置的路径。但是它们像任何其他程序/文件一样存在于文件系统上,但要执行它们,它们需要能够被找到。并且根据操作系统和工具链的安装程序,通常会有不同的选择,而不是一个全局规则。

你没有理由不能在你的文件系统上安装尽可能多的不同编译器和汇编器,它们和其他程序一样只是程序,所以你必须为它们找到一个地方并且必须有一种运行方式他们。没有理由假设任何两个编译器从相同的源代码生成相同的二进制文件,同样没有理由假设任何汇编器都能够汇编任何编译器的输出。这就是工具链一词的由来,一组链接在一起的工具链,编译器输出工具链中的汇编器知道如何处理的东西,汇编器输出链接器知道如何处理的东西。您可能在不同的工具链/供应商之间有一些交叉兼容性,但这并不意味着他们必须这样做,这可能是设计使然,也可能是运气不好。

【讨论】:

    【解决方案2】:

    让我们避免细节并假设执行过程如此简单(编译=>assmbly=>CPU) 回答您的主要问题: 编译器和汇编器都是程序(取决于您的 CPU 架构),因此您可以安装它们或选择系统内置

    例如在 Gnu/linux 系统中: gcc 是一个编译器 Nasm 是一个汇编器

    它们位于您的硬盘驱动器上,例如:/usr/bin/

    汇编器可以使用 CPU 中断和系统调用,因此他可以使用 kernell 与 cpu 对话以执行更复杂的操作。

    您可以使用此列表 (https://en.wikipedia.org/wiki/Comparison_of_assemblers) 中的任何编译器或汇编器,但请记住,您应该注意您使用的是哪种架构 ARM X86 X64 AMD..

    【讨论】:

    • 所有程序都需要使用系统调用来产生任何可观察到的效果(除非它们可以直接访问硬件)。在这方面,汇编器没有什么特别之处。我可以在我的 x86 桌面上运行 ARM 汇编程序,将 ARM 源代码汇编成 ARM 机器代码。非交叉编译情况并没有什么特别之处,尽管这是最常见的情况。 (稍微简化一下:NASM 仅支持 x87​​ 80 位浮点常量,在具有本机 80 位浮点的硬件上运行时,因为它没有软件浮点仿真)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2011-10-06
    • 2023-03-08
    • 2012-10-22
    相关资源
    最近更新 更多