C/C++每日一课 >> 程序是怎样生成的(2005-04-22)

原创 2005年05月14日 16:59:00
/* C/C++每日一课*/
/*2005-05-14*/
/*来自 虚拟现实论坛 (http://www.3d-vr.com)*/
/*作者: srj2005*/

对于初学编程语言的朋友们来说, 可能对于自己写的一行行代码是怎么样变成一个可以执行的程序的感到费解,
看到编译器上面乱七八糟的一堆堆的选项更是望而生畏.
所以预先了解一点程序生成的过程, 对于提高自己的兴趣是很有帮助的.

和人们生活中说出来或者写出来的语言一样, 计算机语言也是一些符号用一定的
规则排列成的一个序列. 对于C语言来说, 符号很简单, 他只包括26个英文字母,数字
和少数其他几个字符, 相信念过高中的朋友都会认识. 而重要的就是这些符号排列的规则了,
也就是我们说的C语言的语法. 这里就不详细说了, 相信你既然来到这里就多多少少已经了解一些了.
好了, 现在说具体一点的, 一般你在上面写C语言代码的那个软件我们称之为C语言的
开发环境, 它除了提供一个方便的界面让你编辑文本以外, 还有两个比较重要的功能:
1. 编译功能.  也就是负责把你写的代码翻译成CPU的执行指令, 这是一个很重要的功能, 我们称它为编译器
2. 连接功能:  负责把这些指令按照一定的格式组织起来, 最终行成一个可以在指定平台(操作系统)下面运行的程序. 我们称为连接器

当我们写好一个程序文件, 也就是写好了一个按照C语言语法规则排列的一个字符序列了. 别看你在写的时候把它排列的整整齐齐,非常美观,其实
其实对于计算机来说是一点都不会欣赏的, 他只是把他当作一个字符序列.

一般写好了程序代码以后, 第一件要做的事情就是编译. 编译的时候编译器逐个读入你写的子符序列, 然后从序列中分离出他认识的词,
在根据这些词预先定义的意思(功能), 翻译成CPU指令. 这个过程是发现程序错误最多的一个过程. 因为很有可能他读的时候读到一个词,
结果发现不认识, 或者预期的下一个单词
没有出现. 这些都导致便宜无法进行下去. 这时候编译器就会把错误反馈给你, 告诉你的程序写的不对.
如果这一步成功了的话, 你写的程序这时候就变成一堆的CPU指令序列了. 也就完成了翻译的工作. 其实这个过程是一个相当复杂的过程, 就不细说了

接下来你的程序是不是就可以执行了呢? 还不可以的. 编译的时候编译器是一个源代码文件(C,CPP文件)为单位进行的.
而你可能为了使你的程序逻辑更鲜明而把代码分别放到几个文件里面去了. 这时候就会产生很多个包含着CPU指令的文件.
还有, 你的程序肯定是要在某一个操作系统上面运行的, 而不同的操作系统也有它自己的一套执行指令
组织的规则. 所以现在程序还是跑不起来的. 而这个任务就要交给连接器来完成了. 连接器负责把多个CPU指令文件
(对于C/C++编译器, 这些指令一般保存在后缀名是.OBJ的文件里面)拼节起来, 然后根据你设置的操作系统平台,
最终生成一个可以执行的文件. 比如在Window下面就是你们熟悉的.exe文件. 到此为止, 开发环境就完成了他所有的史命,让你得到了你想要的东西. 真是累坏它了

因为一般用户其实都不太关心编译和连接这两个步骤, 而只想得到最终可用的程序, 所以现在的开发环境里面一般除了编译和连接的菜单以外,
还有一个 建立(Build)菜单,也就是把这两个步骤连起来做了, 而这也是一般用户用的最多的一个选择.

C++每日一课(十五)

指针和字符串 char name[10] = "xiesheng"; cout 数组名是第一个元素的地址,因而cout语句中,name是包含字符r的char元素地址,cout对象认为char的...

C++每日一课(十一)

string类 在C++中可以使用String类来存储字符串类型而不是字符数组来存储。 要使用String类,必须在程序中包含头文件string。string包含在名称空间std当中。因而...

C++每日一课(十)

字符串 字符串就是存在内存中的一连串连续的字符 处理字符串的方式 1.C风格的字符串处理方式 2.基于String类库的处理方法 C风格的字符串处理 以空字符(\0)结尾,来标识字...

C++每日一课(十二)

结构体 数组,可以一次性存储多个元素,但是所有的元素都必须是同一种类型。 C++中的结构体则比数组更为灵活,它可以一次性存储多种类型的数据,比如可以把一个学生的信息存储在结构体当中。如果想存储一个...

C++每日一课(十四)

指针 计算机程序在存储数据时必须要知道的3个属性 1.存在何处 2.存的值是多少 3.存的信息是什么类型 为了达到上面的目的,可以定义一个简单的变量,指出符号名、值、类型 ...

C++每日一课(二)

一、名称空间 如果使用iostream这种无后缀名的头文件,而不是iostream.h,则需要使用下面的名称空间编译指令来使用iostream中定义的过程 using namespace std; 这...

C++每日一课(一)

/*这里是一个预处理器编译指令#include*/ #include /*主函数头*/ int main() { /*using namespace是一个编译指令*/ using nam...

C++每日一课(二十)

分支语句与逻辑运算符 if语句 C++当中在必须要决定执行某个操作时,通常使用if语句来实现选择。 if的两种格式:if、if else if语句的语法 if(test-condit...

C++每日一课(十八)

递增/递减运算符和指针 可以把递增运算符用于指针和基本变量。把递增运算符用于指针时,会把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针的递增和递减。 double a[]{1.1,...

C++每日一课(十九)

while循环 while循环是没有初始化和更新部分的for循环,它只有测试条件和循环体 while(test-condition)     body 第一步,程序会计算圆括号内的测试...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++每日一课 >> 程序是怎样生成的(2005-04-22)
举报原因:
原因补充:

(最多只允许输入30个字)