CPU工作原理
CPU工作原理是它先从内存中获取并执行一条指令,然后再从内存中获取并执行下一条指令,诸如此类(一个吉赫兹的CPU一秒钟能重复这样的操作大约十亿次)。CPU有自己的小工作区一由若干个寄存器组成,每个寄存器都可以储存一个数字。一个寄存器储存下一条指令的内存和地址,CPU使用该地址来获取和更新下一条指令。在获取指令后,CPU在另用一个寄存器中储存该指令,并更新第一个寄存器储存下一条指令的地址。CPU能理解的指令有限(这些指令的集合叫做指令集)。而且这些指令相当具体,其中的许多指令都是用于请求计算机把一个数字从一个位置移动到另一个位置。例如从内存移动到寄存器。
储存在计算机中的所有内容都是数字。计算机以数字的形式储存数字和字符。每个字符都有一个数字码。计算机载入寄存器的指令也以数字形式储存指令集中的每条指令都有一个数字码。计算机程序最终必须以数字指令码(即,机器语言)来表示。
如果希望计算机做某些事,就必须为其提供特殊的指令集列表(程序),确切的告诉计算机要做的事以及如何去做。你必须使用计算机能明白的语言(机器语言)去创建程序。这是一项繁琐、乏味、费力的任务。计算机要完成两数相加这样简单的事,就得分类几个步骤。
1,从内存位置2000上把一个数字拷贝到内存1。
2,从内存位置2004上把另一个数字拷贝到寄存器2。
3,把寄存器2中内容与寄存器1中内容想加,把结果放到寄存器1中。
4,把寄存器1中内容拷贝到2008。
而你要做的是,必须用数字码来表示以上每个步骤!。
高级计算机语言和编译器
高级编程语言(如,C)以多种方式简化了编程工作。首先,不必用数字码表示指令;其次,使用的指令更贴近你如何想这个问题,而不是类似计算机那样的繁多工作。使用高级编程语言 可以在更抽象的层面表达你的想法,不用考虑CPU在完成任务时具体需要哪些步骤。例如两数想加这样写tltal = mine + yours;
。对我们而言,光看这条代码就知道要干什么;而看用机器语言写成等价指令(多条已数字码表示的指令)则费劲得多。但是对计算机而言却恰恰相反。在计算机看来,高级指令就是一堆无法理解的无用数据。编译器就在这里派上了用场。编译器就是把高级语言程序翻译成计算机能理解的机器语言指令集的程序。程序员进行高级思维活动,而编译器则负责处理亢长乏味的细节工作。
编译器还有一个优势。一般而言,不同CPU制造商使用的指令系统和编码格式不同。例如,用Intel Core i7CPU编写的机器语言程序对于ARM CortexA57 CPU而言什么都不是。但是可以找到与特定类型CPU匹配的编译器。因此适用合适的编译器或编译器集,便可让编译器集翻译成不同CPU使用的机器语言。
简而言之,高级语言以更抽象的方式描述行为,不受于特定CPU或指令集。
使用C语言的7个步骤
C是编译型语言。编写C程序理想状态下是7个步骤如下图

实际使用过程中 尤其是在比较大型的项目中,可能要做一些重复工作,根据下一个步骤的情况来调整或改进上一个步骤。
编程机制
生成程序的具体过程因计算机环境而异。C是可移植性语言,因此可以在许多环境中使用,包括UNIX、Linux、MS-DOS、Windows和Macintosh OS。
用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file),大部分C系统,都要求以.c结尾(如,wordcount.c和bugdet.c)在文件名中,点号(.)前面部分被称为基本名(basename)点号后面称为扩展名(extension),基本名与扩展名的组合(例 budget.c)就是文件名。
目标代码文件、可执行文件和库
C编程的基本策略是,用程序把源代码文件转换成可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并以编译的模块。通过这种方式,如果只要改某个模块,不必因此编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。最普遍的即把源代码转换为机器语言代码,并把结果放到目标代码文件(简称目标文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这不是一个完整的程序。
目标文件缺失启动代码(startup code)启动代码充当着程序和操作系统之间的接口。例如,可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况下使用硬件相同,所以目标代码相同,但是Windows和linux所需的启动代码不同,因为这些系统的处理程序方式不同。
目标代码还缺少函数库。几乎所有的C程序都要使用C标准中的函数。目标代码并不包含函数代码,函数真正的代码储存在另一个被称为库的文件中。库文件中有许多函数的目标代码。
链接器的作用是,把你编写的目标代码,系统的标准启动代码和库代码这三部分合并成一个文件,即可执行文件。对于裤代码,链接器只会把程序中要用到的库函数代码提取出来。

目标文件和可执行文件都是由机器语言指令组成的。然而目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
C编译器会创建一个与源代码基本名相同的目标代码文件,但是其扩展名是.o。链接器一旦生成了完整的可执行程序,就会将其删除。如果原始程序有多个源代码文件,则保留目标代码文件。




PC的命令行编译器
C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。例如下载Cygwin和MinGW,这样便可以在PC上通过命令行使用GCC编译器Cywin在自己的视窗运行,模仿linux命令行环境,有一行命令提示。MinGW在Windows的命令提示模式中运行。与GCC最新版本一样,支持c99和c11。Borland的C++编译器5.5也可以下载,支持c90。
源代码应该是文本文件,不是字处理器文件(系处理器文件包含很多额外的信息,如字体和格式等)。因此要使用文本编辑器(如Winfows Notepad)来编辑代码。如果是用字处理器,要以文本模式另存文件。源代码文件的扩展名应该是.c。一些字处理器会为文本文件自动添加.txt扩展名,如果出现则要更改文件名,把txt改为.c。
通常C编译器生成的中间目标代码文件的扩展名是.obj(也可能有其他扩展名)。与UNIX编译器不同,这些编译器在完成编译后通常不会删除这些中间文件。有些编译器生产带.asm扩展名的汇编语言文件,而有些编译器则使用自己特有的格式。
#一些编译器在编译后会自动运行链接器,另一些要求用户手动运行链接器。在可执行文件中链接器的结果是,在原始的源代码基本名后面加上.exe的扩展名。例如,编译和链接concrete.c源代码文件,生成的是concrete.exe文件。可以在命令行输入基本名来运行该程序:
C>concrete
网友评论