首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.6.1  计算机程序设计概述

编写能够在计算机上执行的代码是一个复杂的过程,它可以分解为一些简单的步骤。计算机程序设计的总体目标是能够用高级的、类似于英语的语言来编写容易让人明白的代码,但是最终需要将这些高级代码转换为低级的,可以被机器识别的形式。为什么需要这样做呢?以下面的代码为例:

int Y = 0;

int Z = 0;

for ( int X = 0; X < 32; ++ X )

{

Y = X * 2;

Z += Y;

}

上面的代码对于你我而言应该相当简单,但是对于Intel和AMD处理器来讲却几乎是不可理解的。即使有人建造出了能够识别类似上面C/C++代码的处理器,它也会比现在市面上的处理器慢很多。计算机是设计用于处理那些使用最简单和最基本的格式来进行表示的东西,因此也会在处理那些按照上述要求表示的数据时达到最好的性能。因此,你需要寻找一种方法,这种方法能够将这种更加人性化的、称之为C/C++的语言转化成为最低级的、字节流形式的纯代码。

这就是编译器产生的原因。编译器的任务就是将你的大脑可以很容易明白和解释的C/C++、Java和Pascal代码转化为一系列数字代码opcodes(operation code),即机器码。机器码负责通知处理器执行某个特别具体的任务,例如将内存中的某些内容逐个字节地由一个地方移到另外一个地方或者由循环和分支结构跳转到另外一条指令。为了让该死的CPU能够快速地执行代码,机器码必须应该是机器中最底层的代码。因为纯粹的机器码非常难于理解(它们充其量也就只是一串数据),因此通常被写成更加容易理解的汇编语言形式。汇编语言为每个数字的opcodes提供一个称为指令助记符的特殊标记。下面这段代码就是前面那段程序由编译器转换成为汇编语言程序后的具体形式:

mov dword ptr [ebp-4],0

mov dword ptr [ebp-8],0

mov dword ptr [ebp-0Ch],0

jmp 00401048h

mov eax,dword ptr [ebp-0Ch]

add eax,1

mov dword ptr [ebp-0Ch],eax

cmp dword ptr [ebp-0Ch],20h

jge 00401061h

mov ecx,dword ptr [ebp-0Ch]

shl ecx,1

mov dword ptr [ebp-4],ecx

mov edx,dword ptr [ebp-8]

add edx,dword ptr [ebp-4]

mov dword ptr [ebp-8],edx

jmp 0040103fh

注释:在本节的后续部分以及本书的其他章节中,将会交替使用机器码和汇编语言这两个术语,二者之间的唯一不同就是看起来不太一样。尽管机器码是数据格式而汇编语言是人类可以识别的表现形式,但是它们表示的是同一个内容。

如果你不了解汇编语言,那么它们看起来很像是一堆混乱的ASCII字符。不过,这却是处理器希望见到的形式。所有的变量分配、表达式,甚至是循环都已经被分解成CPU根本不用“思考”就能够迅速执行的一些快速指令。而那些本来就没有用的东西,如变量的实际名称则根本就不用考虑。除了能够很好地解释机器码是多么简单和直接之外,这个例子同时也说明了一个编译器所需要完成的工作是多么复杂。

无论如何,一旦代码被编译了,一切都会变得更加迅速。编译器将所有编译的代码交给一个称为linker(链接器)的程序,它将输入的大量的指令集封装成一个带有一定头信息的、简洁紧凑的可执行文件,并最终生成一个.EXE(或是其他操作系统使用的扩展名)文件。当你运行这个可执行文件时,操作系统将调用程序装载器program loader(通常简写为loader),它负责将代码从.EXE文件中抽取出来并将其装载到内存中。然后,程序装载器将通知中央处理器内存中第一条需要处理的指令的地址,也称为程序入口点(the program entry point,如典型的C/C++程序中主函数main()的入口地址)。接着,程序就可以开始执行了。它可能是显示一幅三维图形,可能是播放Chemical Brothers的一首mp3,或者是接受用户的输入,但是无论它现在正在完成什么样的处理,CPU都正在处理指令。总体过程如图1.3所示。

图1.3  操作系统将机器码从可执行文件中抽取出来并将其载入到内存以供执行

简单地说,这基本上就是计算机科学背后的哲学体系:将问题和算法转化成为高级语言代码,将高级语言代码转换成为低级语言代码,让低级语言代码通过CPU加以执行,从而(有望)解决问题。现在你已经明白了它的工作原理,下面将要学习所有这些是怎样应用到脚本编写过程当中的。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论