【问题标题】:Compiler and datatypes => c as reference [closed]编译器和数据类型 => c 作为参考 [关闭]
【发布时间】:2012-09-26 09:53:31
【问题描述】:

我在这篇文章中积累了三个不同但背景相似的问题。以下相同。

  1. 来自源的步骤序列->可执行文件
  2. 32/64 位版本的编译器
  3. c 数据类型大小对编译器的依赖性

Q1:来自源代码的步骤序列->可执行文件

我认为以下是从源文件生成可执行文件的步骤

  • 编写的源文件是用任何一种高级/中级语言编写的,并由编译器进行预处理。
  • 当我们使用 GCC/G++ 然后 gcc -save-temps -c 同时生成一个 .S 和一个 .O 文件,它们是分别是程序集(可读)和目标代码(非人类可读)。
  • 最后阶段是链接此目标代码以解析未知符号以创建机器(或)可执行代码。

所以这里的问题是这些假设对吗?我经常看到术语对象和机器代码可以互换使用。两者的具体区别是什么?

Q2:32/64 位版本的编译器

在 Q1 的上述步骤中,编译器类型的影响究竟在哪里。是不是生成的汇编代码变了?

Q3:c 数据类型大小对编译器的依赖性

就c-programming而言,数据类型的大小取决于编译器类型(或)硬件类型。请详细说明这些因素的依赖关系。虽然在堆栈溢出中看到了一些与 Q3 的讨论,但我仍然对此感到困惑。

【问题讨论】:

    标签: c gcc compiler-construction


    【解决方案1】:

    第一季度

    差不多是这样,但可能没有组装阶段。而“预处理”是一个很好的小词,含义丰富。

    对象和机器代码通常几乎相同。目标代码可能包含机器代码或一些可解释的代码,非机器代码。目标代码通常不是执行的最终代码,需要链接器进一步处理。包含机器代码的可执行文件通常需要一些类似于链接器的处理,但这部分是由操作系统完成的。希望可执行文件可重定位,也就是说,能够将它们加载到内存中的任何位置以在那里运行它们。重定位涉及在加载之后但在执行之前修复可执行文件内部的地址。在运行时链接到 DLL 是操作系统执行的另一个类似链接器的功能。

    第二季度

    “预处理”是开始出现类型及其大小的第一步。编译器必须执行类型检查、类型转换和代码/数据生成。在所有这些步骤中,类型都不容忽视。 0xFFFF 是 int 还是 unsigned int?编译器应该为指针保留多少内存?应该为 100 个doubles 的数组分配多少空间?编译器究竟如何将chars 提升为ints?代码优化呢?所有这些问题的答案都需要知道字体大小。当然,生成的程序集或机器代码将取决于它们。

    第三季度

    理论上,类型大小取决于编译器。在实践中,为了避免模拟目标硬件不直接支持的类型的不必要开销,您拥有的类型直接对应于硬件支持的类型。 C 在其起源和本质上几乎是一个可移植的汇编程序,这应该可以解释它的许多“奇怪之处”(太原始,让你很容易自爆,有许多未定义和特定于实现的行为,等等)。

    【讨论】:

    • “预处理”的意义何在? C 标准严格定义了预处理器做什么以及何时完成。显然,“预处理源”是预处理器的输出......(gcc -Ecpp
    • @rubenvb OP有效地将所有编译隐藏在“预处理”一词后面。我是这样理解他的话的。因此,这个词充满了意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多