【问题标题】:Why are programming languages compiled to assembler instead of binary? [duplicate]为什么编程语言被编译为汇编程序而不是二进制文件? [复制]
【发布时间】:2020-01-13 23:27:48
【问题描述】:

像 C、C++ 和类似语言这样的语言将其代码编译为汇编代码,而不是直接生成二进制文件的原因是什么?从抽象语言中推断出“正确”的编程是否太难了?在我看来,转换为将再次转换的东西并不是一种最佳的做事方式,但我不知道这可能有很好的理由。这是否连接到具有不同实现的每个 CPU 架构?

【问题讨论】:

  • 有很多编译器可以直接编译成机器码,现在可能大部分都是这样。
  • 像 C、C++ 和类似语言这样的语言将其代码编译成汇编的原因是什么 他们不这样做。
  • 你在说什么编译器?为什么你认为它生成汇编而不是二进制?
  • gcc 生成程序集。 clang 可以与集成或外部汇编器一起使用。
  • @C.K.这不是它的工作原理。如果您或其他任何人认为他们有更好更“正确”的答案,他们可以将其发布到链接的问题中。我们不需要在此处发布多余(或完全错误)的答案。无论如何,链接的问题确实对 Peter Cordes 的问题有正确的答案。

标签: c++ c assembly compilation cpu


【解决方案1】:

汇编代码和二进制在逻辑上是等价的,汇编代码只是使用所谓的助记符来表示,这是一种更易于人类阅读的机器指令形式。

所有编译器直接生成二进制文件。

【讨论】:

  • “所有编译器都会直接生成二进制文件。” 我的理解是,这(不一定)是正确的。在我大学的低级编程课程中,我们被告知我们的代码是从 C 语言编译到汇编程序,然后再链接所有内容并生成可执行的二进制文件。
  • 你的大学课程错了。从历史上看,是的,第一个 C 编译器生成程序集,然后组装。然而,现在,它们产生的机器代码是二进制的。
  • @ChrisMM gcc、clang 和许多其他人首先生成汇编代码。汇编器是自动调用的,你甚至看不到它。只需告诉编译器保留临时文件即可。
  • @MarcoBonelli 您可能会使用单个 invocation 但例如 gcc(现在是编译器驱动程序)将为您调用汇编器和链接器。您可以使用gcc -v 来查看它在做什么。
  • @MarcoBonelli:我认为你仍然没有抓住重点。 GCC 总是 产生.s(或管道)。它没有内置汇编器作为编译器二进制文件cc1 的一部分。 -S 选项只是决定是否保留该文件而不是组装它+删除它。当然它最终会生成一个目标文件或链接的二进制文件,但这不是这个问题的意义所在。
猜你喜欢
  • 2019-12-12
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多