【问题标题】:gcc assembly vs direct to machine code [closed]gcc 汇编与直接到机器代码 [关闭]
【发布时间】:2014-04-21 23:08:19
【问题描述】:

我最近开始学习如何编程,我发现这件事很奇怪: 为什么 gcc 会加倍努力将 c 代码编译为汇编代码,然后再编译为机器代码? 直接编译成机器码不是同样合理吗?我知道,例如MS c 编译器会这样做,那么 gcc 的行为是什么原因呢?

【问题讨论】:

  • "I know that e.g. the MS c Compiler does this" - 你确定吗?
  • 正如 Jonathon 暗示的那样,您对 Microsoft 编译器的假设是无效的。如果您有兴趣了解编译和链接的过程,我建议this series of blog posts。具体来说,this post 解释了前端编译器如何将 C++ 源代码解析为中间汇编语言,然后由后端编译为机器语言。
  • 我真的不明白这个问题是如何“主要基于意见”的。这是一个技术问题。

标签: gcc assembly compiler-construction


【解决方案1】:

因为一方面,已经有汇编程序在将汇编代码转换为机器代码方面做得相当好——gcc 重新实现该功能没有任何意义。 (还请记住,汇编仍然是/有点/符号)
第二点,可能不/总是/想要直接编译为机器代码——在嵌入式系统上,很有可能生成程序集经过最终的手动优化。
最后但并非最不重要的一点是,它对调试编译器本身非常有帮助,以防万一它行为不端。没有人喜欢阅读原始机器代码。

【讨论】:

  • 我在一个编译器上工作过,它可以在不经过汇编程序的情况下生成机器代码。您可以获得组装清单,但它是单独生成的。有一个错误,汇编列表是正确的,但机器代码是错误的。 (这并不是特别支持或反对这两种方法的论据。)
【解决方案2】:

GCC 与 unix 非常相似,这是 unix 制作独立工具的方式,这些工具相互构建而不是集成。您需要有一个汇编器和链接器,汇编器的工作是为目标生成机器代码,重复这一点是没有意义的。编译器的工作是将高级语言归结为低级语言。生成汇编语言可以更轻松地调试编译器输出,并且它可以让汇编器完成其工作,而不是在两个地方重复任务。

当然,这样做的不仅是 unix 编译器,在所有平台上都这样做是很有意义的,而且一直都是这样做的。直接使用机器代码是例外而不是规则,通常是在有特定原因时这样做。

我不明白这个问题的魅力,以及为什么它会被一遍又一遍地问到。提问前请搜索以前的答案...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2014-02-03
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多