永发信息网

为什么要对C源程序进行编译、链接

答案:4  悬赏:80  手机版
解决时间 2021-07-30 20:40
  • 提问者网友:川水往事
  • 2021-07-30 11:24
求解
最佳答案
  • 五星知识达人网友:酒者煙囻
  • 2021-07-30 11:57
C++程序从编译到链接然后再到调用的整个过程如下。
只是个人最近观点,希望能与志同道合的同学一起讨论。

注:这里只是研究C++的主流编译过程,与Java没有任何关系,因为使用的技术完全不一样(Java是编译和解释结合的语言)。并且由于不同的编译器厂商对于程序的编译过程不尽相同,但是主要流程还是一样的。

其实长久以来我就一直很不清楚obj文件的内容到底是什么,有人说是汇编,有人说是机器语言。如果是机器语言的话,那编译的过程是怎样加入操作系统信息的呢?因为这个问题的不断扩展和困扰,便决定彻底研究一下,网上几乎找不到相关资料,作者参照了基本系统编程的书籍后自行整理而来,数目见底,仅供参考,欢迎讨论。

一个C++工程中会存在cpp文件,头文件,库文件。

1. 首先经历的是预处理过程,将头文件加载进来,并且将各种#define信息代入。这时会见不到头文件,工程经过处理后会生成以cpp文件为基础的编译单元。有人可能会问那么头文件到哪里去了。其实头文件将cpp文件中的#include替换掉了。因此在以后的编程中需要严格注意include的先后顺序。因为C++语言是一种很注重申明的语言,为什么会这样这与程序的编译过程和链接过程的算法有关。貌似话题有点转远了,其实在这个阶段是生成一个个独力的编译单元。

2. 在编译单元生成之后,便是将编译单元进行编译,其实对于主流的编译其实存在两个阶段,首先是生成汇编语言,然后使用汇编器生成机器语言。其实这里要讲解的是汇编语言怎么变成机器语言的呢。机器语言顾名思义就是0101的二进制代码。对于一个类似于MOV AX,BX(这里写的是Intel 80x86的汇编代码,其实几乎每一种不同架构的芯片的汇编语言不怎么一样)的代码而言就是将MOV和AX和BX原封不动的用0101替换掉,如MOV代码是35的话AX为01,BX为10的话翻译的机器代码就是350110,二进制也就是001101010000000100010000。
看这个网址, http://tinggo.javaeye.com/blog/436683这个解释的很好,相信你会明白
全部回答
  • 1楼网友:上分大魔王
  • 2021-07-30 15:56

C 语言 属于 较为底层的语言 虽然说可以直接操控硬件

但是 毕竟计算机 不是人

他只认识 0 和 1

这些 当然就需要编译器来 为我们 翻译给 计算机听!!

gcc编译出来的程序在本地执行 arm-linux-gcc编译出来的程序在目标机(ARM平台)上执行 嵌入式应该用交叉编译器(如果不是在ARM本身上开发)
  • 2楼网友:山河有幸埋战骨
  • 2021-07-30 14:19

首先要说的是C语言属于高级语言,不能直接被计算机识别而执行,所以需要一些操作来转化。。

一开始是编译预处理,对宏,包含指令,编译指令等进行处理,然后是词法语法分析,将源代码翻译成中间代码(一般是汇编),接着优化代码,,然后将中间代码翻译成机器语言(目标文件),机器语言是计算机的基层语言,能被计算机直接识别。。

接着链接目标文件,生成可以执行文件。。。

大概就是这样。。详细的LZ可看这个总结。。

http://bbs.zdnet.com.cn/thread-1614727-1-1.html

  • 3楼网友:举杯邀酒敬孤独
  • 2021-07-30 12:47

程序设计语言分为两类;编译型和解释型。

编译型的程序设计语言就需要先编译后运行,程序在编译会产生“中间代码”,这个过程与机器无关,而运行时是运行通过编译产生的“目标代码”即机器语言。如c语言就属于这种类型。

解释型,不产生“中间代码”是边解释源代码,边执行解释生成的目标代码即执行机器代码。如java语言。

注:计算机只识别机器语言,即二进制。

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯