我是一个非常新的编程人员,我正试图通过一本描述C有4个主要编程阶段的书来学习C:
在编译阶段,已经提到创建了.obj(扩展名)文件。我没有得到创建任何此类文件的部分,因为还提到源代码必须以.c扩展名保存。因此,我用Google搜索了this link,它表示编译已经另外 4个阶段,这也说明头文件已创建并以.h扩展名结尾,而且我也不知道它们的创建点。此外,创建二进制.exe扩展名已被提及编译阶段的一部分,而不是我在下面的书中提到的执行阶段。编码的实际阶段是什么?如何实际查看所创建的所有文件类型?(我使用DEV C ++编译器无法找到特别针对C的下降编译器)
正如我之前提到的,我只是一个初学者,但我很想知道是否还有办法查看编译器实际编译的所有机器语言代码?有办法吗?
答案 0 :(得分:2)
实际上编译器的工作方式比3或4级更复杂。 通常只有编译阶段有6个以上的阶段,这些阶段更为标准:
使用大步骤阶段,我们可以分为4个阶段,从源代码开始并使用可执行代码完成所有过程:
在此阶段,以#字符开头的行将被解释 预处理器作为预处理器命令。
在此阶段,预处理的代码将转换为程序集 特定于目标处理器体系结构的指令。这些形式 一种中等的人类可读语言。
在组装阶段,使用汇编程序翻译 机器代码或目标代码的汇编指令。
链接器将安排目标代码片段以便在其中起作用 有些部分可以成功调用其他部分的功能。它会 还添加包含所用库函数说明的片段 通过该计划。
有关详细信息,请参阅here
关于如何查看汇编代码的问题,您可以从终端使用此命令:
gcc -Wall -S test.c
要在windows中使用gcc命令(假设您使用的是Dev-c ++),只需从终端进入文件夹\Dev-Cpp\MinGW64\bin
,这样您就可以在命令中休息。
答案 1 :(得分:0)
首先编辑C源文件或源文件。然后使用.c扩展名保存包含可执行函数的文件,并且基本上包含这些函数的接口信息的文件以.h扩展名保存。
然后编译,经过两个重要的阶段,即预处理,这本质上是程序天真的字处理指令,并且编译正确。通常,预处理中最重要的一步是将标题合并到.c文件的文本中,尽管宏和其他位片也将被扩展。
传统上,C编译器将每个.c文件编译为.obj文件。然而,现在这种情况不太常见,因为计算机比它们更快,磁盘更大,IDE可能会隐藏obj文件。 obj文件由机器代码和用于链接的符号组成。所以现在编译成机器代码的函数及其名称。
然后,链接器将所有调用连接在一起。它还加入对库函数的调用,标准库函数(如printf())或扩展(如Windows API)。将链接与编译分开的部分原因是链接库,但也因为链接非常快 - 它只是将符号与地址匹配 - 而编译可能很慢。因此,目标文件通常会被保存,只有在实际的C源更改时才会重新编译。
然后链接器创建一个可执行文件。然后操作系统将其加载到内存中并运行它。
您可以检查二进制文件,但除了专家之外,它们几乎没有意义。一些C编译器允许您编译为程序集(gcc中的-S选项),它生成人机可读的机器代码表示。它仍然很难遵循,-S主要用于小片段。
IDE通常会创建一个庞大的文件集,这些文件不是要查看的,而是内部的,包含预编译的头文件,过去编辑的撤消状态,GUI窗口的当前状态等等。上。