1.、计算机程序运行的目的1.1、什么是程序?
计算机程序运行的目的是什么呢?笼统讲是为了达到人类的目的,但是说的更具体点,计算机运行程序的目的到底是什么呢?搞清这个问题之前我们还是来看看程序是什么吧。
程序是什么?最为直观的表达就是:程序=数据+代码。对于计算机来说,一个程序就是一堆代码加一堆数据。代码告诉cpu如何加工数据,而数据则是被加工的对象。比如我们写一个加法程序,对于计算机来说,如果程序的动作是执行加法,数据就是加数和被加数,当然我们也可以将加法运算的过程封装成一个函数,即便不封装成一个子函数,那它也是在主函数(main)里。其实程序都是由一个个的函数组合而成。这是C语言模块化的一个强烈表现。
1.2、计算机运行程序的目的
此内容由EEWORLD论坛网友caiyuxia1原创,如需转载或用于商业用途需征得作者同意并注明出处
既然我们已经知道了程序是什么,那么我们在就可以来探讨计算机运行程序的目的是什么了,其实运行程序的目的无外乎如下几个:要么是得出一个确定的运行结果,要么是关注运行的过程,要么二者皆有。得到一个结果还是可以理解的,但说程序运行只是为了过程可能就不太好理解了,比如那些没有返回值的函数不都是在注重过程,它们并不会返回一个结果
函数程序的形参就是待加工的数据,当然函数内还需要一些临时数据(局部变量),函数本体就是代码,(程序的组成:代码+数据)函数的返回值就是结果,函数体的执行就是过程,函数的运行目的:结果或者过程或者全有。
例子1:
int add(int a, int b)
{
return a + b;
}
// 这个函数的执行就是为了得到结果。
例子2:
void add(int a, int b)
{
int c;
c = a + b;
printf("c = %d.\n", c);
}
// 这个函数的执行重在过程(重在过程中的printf),返回值不需要
例子3:
int add(int a, int b)
{
int c;
c = a + b;
printf("c = %d.\n", c);
return c;
} // 这个函数又重结果又重过程
通过上面的例子,大家应该有了新的认识。理解了程序的组成和程序运行的目的。
1.3、静态内存SRAM和动态内存DRAM
上一节我们探讨了什么是程序,运行程序的目的是什么,这一节我们准备谈一谈存储和运行程序的硬件—内存,内存大致分为静态内存(Static RAM/SRAM)和动态内存DRAM(Dynamic RAM/DRAM)。
SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲,而DRAM的速度要比SRAM慢,但是DRAM的价格SRAM要便宜很多。
DDR RAM(Date-Rate RAM)是种改进型的RAM,它可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了,并且它有着很好的成本优势,因此DDR是目前电脑中用得最多的内存。目前在很多高端的显卡上,大都配备了高速DDR,用于提高带宽,以求大幅度提高对3D加速卡像素的渲染能力。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps4244.tmp.jpg
DDR内存
不管是SRAM还是DRAM,对于我们编程者来说,我们并不需要详细的了解其内部原理,只需要来接即可。实际上内存就是存储代码和数据的,这就是内存的本质。那么内存中到底存储的是什么东西呢?那么我们的数据和代码以什么样的方式存储在我们的内存中呢?我们接下来就会讲到。
1.4、冯·诺依曼结构和哈佛结构
按数据(全局变量、局部变量)和代码(函数)的存储方式可以分为俩类,那就是冯·诺依曼结构(又称作
普林斯顿体系结构)和哈佛结构。
冯诺依曼结构:数据和代码放在一起。
哈佛结构:数据和代码分开存在。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps4254.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps4255.tmp.png
冯·诺曼结构 哈佛结构
在冯·诺曼结构中,程序中的代码和数据同一存储在同一个存储器中,而且数据和代码共用一条传输总线。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此当初选择这种结构是自然的。比如ARM
公司的ARM7、MIPS公司的MIPS处理器,都
采用了冯·诺伊曼结构。但是这种指令和数据共享同一总线的结构,使得
信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高
。 与冯·诺曼结构相反,哈佛结构是一种将指令和数据分开存储器的结构。中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,然后执行操作并并读取下一条指令。
在指令和数据分开储存的方式中,指令和数据的存取可以同时进行,同时可以使指令和数据有不同的数据宽度,并且在执行时还可以预先读取下一条指令,
哈佛结构的微处理器通常都具很高的执行效率。目前使用
哈佛结构的中央处理器和微控制器有很多,像Microchip公司的PIC系列芯片、
摩托罗拉公司的MC68系列、Zilog公司的Z8系列、
ATMEL公司的AVR系列和ARM公司的
ARM9、ARM10和
ARM11,甚至连
51单片机也属于哈佛结构。
因为两种存储方式毕竟是不同的,所以其产生的效果也是不同的。不过现实中这两种方式都在被用。比如在三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器S5PV210上运行应用程序时,所有应用程序的代码和数据都被存放在DRAM中,所以用的是冯诺依曼结构。又比如是单片机,某些单片机里面既有代码存储器Flash,又有数据存储器RAM。当我们把代码烧写到Flash中,代码直接在Flash中原地运行,但是用到的数据(全局变量、局部变量)不能放在Flash中,而是放在RAM(SRAM)中,这种用的就是哈佛结构。
1.5、总结:程序运行为什么需要内存呢?
我们从程序是什么?运行程序的目的是什么?再到内存种类以及程序在内存中的存储方式进行了探讨,总结起来内存实际上是用来存储程序中可变数据的,而c程序中的可变数据为全局变量、局部变量等,当然在gcc中,其实常量也是存储在内存中的,而大部分单片机,常量是存储在flash中的,也就是在代码段。另外从变量的名字来看,什么是变量?变量就是在内存中分配一块内存空间,并且将它的地址和变量名相关联。可见当我们在定义变量的时候就已经在和内存在打交道了,所以内存对我们写程序来说非常重要。
程序越简单所需要的内存也就会更少,程序越庞大越复杂,那么所需要的内存也就越多。倘若没有内存,我们的数据将会没有地方可以存储。但反过来,即使有内存,内存也不是无限的,所以可见内存管理非常的重要。其实很多编程的关键其实围绕内存而展开,譬如说数据结构(数据结构研究数据如何组织并在内存中的存放)和算法(算法研究如何加工存入放的数据)。所以如何实现在合理使用内存的同时让我们的程序更加的完善,这一直是一名优秀程序员应该关注的东西。那究竟应该如何管理内存呢?接下来我们就来谈谈这个问题。