‘壹’ 调试时,对C语言源程序进行编译的目的是什么
建议看看编译原理。
我们的PC机,只能认识机器码,不认识C语言的。编译,就是让C语言变得让机器认识。
编译过程,一般是:
C语言-->汇编语言-->2进制文件。
2进制文件由操作系统装载,并调度运行。
‘贰’ 执行C语言一定要先编译么,不可以直接执行么
一般来说编译过后就成了基本上能执行的2进制代码。但是这些2进制代码并不完善,一个程序往往需要调用不止一部分的代码,所以需要把这些代码全部整合起来才能执行。
即时你的程序看起来只有一个文件,但是编译过后,多多少少里面至少会调用到一些操作系统功能,和其它的一些设置,所以依然需要组建这个过程把这个程序和这些系统默认的代码组建起来形成一个完成、单一的可执行文件。所以一般组建过程就包含了组建内部和外部代码,一般来说内部代码就是我说的系统预留的必要的一些代码(例如怎么具体完成把一些字符显示在屏幕上呀这些功能),而外部代码就是额外的调用自己写得或者别人写得其它程序功能(往往当你的程序调用了非c标准函数的时候)。
所以就算你的代码可以编译,但是可能因为组建并不成功(例如需要组建的代码本身有bug,或者丢失,或者版本不匹配),你的程序依然可能无法正确运行。
‘叁’ 为什么要编译
在汇编语言之后,上世纪50年代,科学家有发明了好几种用人类语言书写程序的方法,被称为计算机高级语言。如PASCAL语言、BASIC语言、C语言等。高级语言源程序都可以用记事本(Notepad)打开和编辑。高级语言源程序也要经过翻译才能被计算机接受。把高级语言翻译成机器语言的方法大体有两种,一种被称作“解释”,如GWBASIC、BASIC、QBASIC等语言,这种方式下,源程序被翻译出一个完整的操作步骤,计算机就作出相应反应,执行一步,再翻译再执行,逐步达到源程序制定目标。另一种方式被称作“编译”,如PASCAL语言和C语言等,这种方式下,计算机把源程序全部翻译成它自身能读懂的、被称作目标程序的机器语言程序,然后再一次执行。二者的区别在于编译程序能产生目标程序而解释程序则不能产生目标程序。用高级程序设计语言编写的程序,要转换成等价的可执行程序,必须经过编译和连接。同样一段高级语言程序通过不同的编译器可能产生不同的可执行程序。计算机不能直接执行符号化的程序,而是通过汇编程序、解释程序和编译程序而将符号程序转换为可执行程序。高级语言需要编译成目标代码或通过解释器解释后才能被CPU执行。
‘肆’ 为什么c/c++开源库使用前需要编译
这样可以运行,但有两个问题:
每个新程序要使用开源库中的api,都需要重新编译部分甚至整个开源库源代码,这会浪费大量的时间;
如果有多个程序同时使用同一个库,每个程序都将生成一份这个库的二进制文件,这会浪费大量的磁盘空间;当这些程序同时运行时,每个程序的内存中都会装载一份库的二进制代码,这会浪费大量的内存空间。
因此,直接将第三方库的源代码包含到当前程序的代码中编译是效率非常低下的方式,实际中除非极特殊情况,不会考虑使用这种方式,而是将开源库源代码编译成二进制的动态链接库,其他程序要使用其中的API时,只需要指定动态链接库的入口点,程序运行时加载动态链接库 并找到其中的函数入口点就可以调用开源库API。并且,当有多个程序调用此动态链接库时,只会占用一份内存空间。
‘伍’ C语言编译原理是什么
编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。
1、预处理阶段:
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)
2、汇编阶段:
插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。
3、编译阶段:
将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。
4、链接阶段:
在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。
‘陆’ c语言中的源程序必须经过编译连接生成可执行程序才能运行,这句话是对不对
哥们,这么理解是对的,不过感觉有点表面。
建议看看计算机一些原理,像你说的这个问题我会想到,计算机最终只能识别二进制码,
所以其实不管我们一切啥语言,最终都是通过编译器编译成二进制码,计算机才能识别
而去运行,而c语言编写的程序,肯定是要经过一系列的编译,链接,生成可执行的文件。
在windows系统中,执行文件都是.exe为扩展名的。不过在linux系统中就不一样了,linux
系统并不区分扩展名,所以也就无所谓什么.exe之类的文件,只要知道最终生成可执行的
二进制文件就可以了。
‘柒’ c程序写好要编译和综合是啥意思
书写出来的是源程序,也就是.c和.h文件。 肉眼可读。
最终运行的是可执行文件,也就是二进制文件。 windows上是.exe文件。
从源文件到可执行文件要经过编译和链接,你说的综合应该就是链接。
编译是每个.c文件编译成对应的目标文件(.o, .obj, .tco这类的,不同工具扩展名有所不同)
链接是把这些目标文件整合成可执行文件。
‘捌’ C语言为什么要先编译成汇编语言
C语言,具有可移植性,或者说同样的代码可以在不同cpu平台上运行得到同样的结果
汇编语言,移植性差,一般针对某型cpu,每个类型的cpu都有自己的汇编语言
为保证C语言编制的通用算法的可移植性,比如我们用C编写了一套mp3解码算法程序,要在pc机上、手机上都能用,那么我们就采用通用的C编译器,将C语言程序编译成指定CPU的汇编语言,再汇编成机器可执行程序。
另一个用途是程序优化问题,在C语言层次,由于是高级语言,不涉及底层硬件,那么底层硬件的特性不能够得到充分利用,在需要优化算法的场合,我们需要将C语言算法编译生成汇编程序,然后修改需要优化的汇编程序达到目的。比如,你在手机上经常会遇到音频解码器,需要安装,而且不同的cpu需要选择不同的解码器,这些解码器应当就是在汇编层次上优化了算法的可执行代码,关键部分经过汇编级优化,不需要优化部分仍然使用C语言编译的结果。
‘玖’ 用C语言编的程序,要生成可执行文件的时候,要编译、链接,编译是什么意思啊链接是什么意思编译和链接
编译就是把C代码转换成CPU可执行的机器指令,每个.c文件生成一个.obj文件。
链接就是把生成的(多个) .obj 文件及用到的库文件(.lib)一起组合生成可执行文件(.exe)。
‘拾’ c语言为何需要编译和连接才能运行
的文件(也称为源代码)而已,需要经过1定的处理才能转换成机器上可运行的可履行文件。
我们将对C语言的这类处理进程称为编译与链接。