2012年(16)
分类: C/C++
2012-08-14 19:56:29
|
计算机不懂得我们人类的语言,没有耳朵,它又是如何听懂我们下达的指令的呢?
谭老师对这个问题给出的答案是:“人和计算机交流,也需要解决语言问题。需要创造一种计算机和人都能识别的语言,这就是计算机语言。”这段话给计算机语言下了一个定义,但是我们学习的目的,不仅仅是为了知道什么是计算机语言,而是想通过计算机语言与计算机进行沟通,给计算机下达指令让计算机为我们做事。那么,我们到底又是如何利用计算机语言在计算机和人之间进行沟通的呢?这就是程序这个在人和计算机之间的“传令官”的功劳了。我们通过跟我们人类使用的自然语言比较接近的高级程序设计语言(例如我们常见的C语言、C++语言等等)在程序中表达我们的旨意。而程序则负责调度各种计算机资源(申请内存,执行计算等等)来完成我们下达的旨意。
1.2.A 如何用计算机语言来表达一个程序计算机的天职是接受并执行我们的指令,为我们工作。在计算机世界中,我们要通过程序这个传令官向计算机传达一个命令,必须经过下面的三个步骤:
l 第一步:在源文件中用程序设计语言表达指令
我们(程序员)通过计算机程序设计语言表达我们的指令。通常,我们的指令是记录在某个文件,以源代码的形式出现的。在进行具体操作的时候,根据我们所使用的开发平台,具体的操作步骤可能有所不同。
如果我们是在Windows平台下的Visual C++这个集成开发环境中进行C语言程序的开发,在这一步中,我们首先要创建一个项目。我们可以通过它的“File→New…”菜单命令来打开“新建项目对话框”,然后在其中选择我们的项目类型为“Win32 Console Application”,然后输入项目名称(例如,helloworld)并选择项目文件存放的位置(例如,“C:\sourcecode\”)。填写完成这些项目的基本信息后,我们点击“OK”按钮进入下一步的设置。
在Visual C++中创建一个C语言程序的新项目
在接下来的向导页面中,Visual C++为我们提供了几个项目模板以供选择,为了简便,我们选择“An Empty Project”选项,并点击“Finish”按钮完成项目参数设置,Visual C++将为我们创建一个没有任何文件的空项目。
项目创建完成后,接下来的工作才是创建新的源文件并将其添加到项目中。再次点击“File→New…”菜单项,在弹出的新建文件对话框中,选择文件类型为“C++ Source File”,然后输入文件名(例如,helloworld.c。注意,C语言程序的源文件是以.c为后缀的),最后点击“OK”按钮,Visual C++就会为我们创建一个新的空白的源文件helloworld.c并将其添加到当前项目中。最后,我们在这个空白的新源文件中输入如下代码,让计算机在屏幕输出“Hello World”字符串:
// HelloWorld.c
#include "stdio.h"
int main()
{
// 在控制台窗口输出“Hello World”这个字符串
printf("Hello World");
return 0;
}
这样,我们就完成了一个C语言程序项目的创建和源代码的输入工作。
如果我们的开发环境是Linux\UNIX,这一过程将更加简单。我们只需要使用系统自带的文本编辑工具(例如,vi或者是vim等)创建一个名为helloworld.c的文本文件,并编辑其内容如上即可。
l 第二步:将源代码编译成可执行文件
有了源文件,我们只是在文件中用程序设计语言表达了我们的指令(让计算机输出一段字符串,也就是“printf("Hello World");”),然而,我们在源文件中记录的指令是以高级程序设计语言表达的,这种语言接近于人类使用的自然语言,我们人类可以大致看懂,但是对于计算机来说,恐怕就是天书了。我们这里的编译器,更像一个翻译官,由它负责将我们在源代码文件中以高级程序设计语言表达的指令翻译成计算机可以理解的机器语言,并记录在可执行文件中。
在Windows开发平台下,可执行程序通常是一个扩展名为.exe的文件,而在Linux\UNIX开发平台下,则可以是其他任何的可执行文件。要完成将源文件翻译成可执行文件的这一编译过程,在Windows开发平台下,我们可以在Visual C++中通过执行“Build→Build helloworld.exe”或者是“Build→ Rebuild All”菜单命令来完成。而在Linux开发平台下,则需要调用GCC编译器的编译命令来完成,例如:
gcc helloworld.c –o helloworld
这个命令的意义是,调用GCC编译器,将helloworld.c源文件编译成可执行文件helloworld。
经过这个编译过程后,我们就得到了可执行的helloworld.exe或者是helloworld文件。也就是刚才我们编写的源代码文件变为了:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
63 79 67 67 63 6A 2D 31 32 2E 64 6C 6C 00 5F 4A
76 5F 52 65 67 69 73 74 65 72 43 6C 61 73 73 65
73 00 00 00 48 65 6C 6C 6F 20 57 6F 72 6C 64 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
哦,对我们来说,这已经是天书了。
l 第三步:计算机执行可执行程序
当计算机执行这个可执行程序时(在Visual C++中,可以方便地通过“Build→Execute helloworld.exe”菜单命令来执行这个程序),这些指令会被调入计算机,虽然我们人类看不懂这些指令,但是计算机却能够看懂,最终将其翻译成“0101”的机器语言,并遵照这些指令执行,完成我们下达的旨意。
010101010001010100001001000100001100101010101001010101001001000100010100101110
用0和1 表示的机器语言就像上面这样。
整个过程,可以用下面这幅图来表示:
一个C语言程序的一生
1.2.B 从汇编语言到高级语言——风格各异的计算机语言在理解了计算机语言的本质以及使用过程之后,我们有必要来了解一下计算机世界中的各种语言。就像现实世界中有很多种语言一样,有广为人知的英语,也有只有几百人知道的土著语言;有写起来方方正正的汉语,也有写起来拐弯抹角的阿拉伯语。不同的语言各具特色,也都有各自不同的应用场景。这一现象在计算机世界中也是同样的。虽然计算机语言可以泛指所有人与计算机交流的语言,包括谭老师介绍的机器语言、符号语言以及高级语言,但是实际上,机器语言和符号语言我们都很少用到,更多的,我们与计算机沟通是通过高级语言,也就是我们在这里要介绍的高级程序设计语言。
在过去的几十年间,大量的计算机程序设计语言被发明、被取代、被修改或组合在一起成为新的计算机语言。经过实践的检验,现在还在业界普遍流行的计算机程序设计语言主要有以下几种:
l 汇编语言
汇编语言(Assembly Language)是面向机器的程序设计语言。它是一种功能很强的程序设计语言,也是可以充分利用计算机所有硬件特性并能直接控制硬件的语言。相对于机器语言,在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序(也被称作汇编器),汇编程序是系统软件中的语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编,也就对应于高级程序设计语言的编译,而汇编程序也就对应于高级语言的编译程序。
现在主流的汇编器如MASM、TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写Windows的应用程序也不是一件难事,但这并不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。大多数情况下,C语言程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在操作系统中也可以完全用C语言来实现,再加上GCC这样一些优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边,放进历史博物馆了。但实际情况是,C语言程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:汇编语言精简、高效,同时与库无关。特别是当今越来越流行的嵌入式硬件环境下的开发,首先必然面临如何减少系统大小、提高执行效率等问题,而这正是汇编语言的用武之地。在这一领域,目前正是汇编语言的春天。
l C语言
C语言是我们这本书的主角,在程序设计当中,自然少不了它的戏份。作为一种计算机程序设计语言,它既具有高级语言的面向过程的特点,又具有汇编语言的面向底层的特点。它可以作为操作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围非常广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体应用包括单片机以及嵌入式系统开发等。关于C语言,我们稍后还有详细介绍。不要走开,马上就来。
l C++语言
说到C语言,就不得不提到C++语言。单单从它们的名字上,就可以看出它们之间的亲戚关系。C++语言是一种优秀的面向对象程序设计语言,它是在C语言的基础上增加了一些现代程序设计语言的机制(例如面向对象思想、异常处理等)发展而来的,但它比C语言更容易为人们所学习和掌握。C++以其独特的语言机制在计算机科学的各个领域中得到了广泛的应用。相对于C语言的面向过程的设计方法,C++的面向对象的设计思想让它有了一个质的飞跃,使得C++更加适合于对性能要求较高的、大型的复杂系统的开发。
l Java语言
Java语言诞生于1991年,起初被称为OAK语言,Java平台是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻的,甚至差点夭折。但是,网络的出现改变了OAK的命运。从此,Java与网络结下了不解之缘。
要全面地介绍Java,我们需要用到很多定语,它是一种简单的、跨平台的、面向对象的、分布式的、解释执行的、健壮安全的、结构中立的、可移植的、性能优异的、多线程的、动态的高级程序设计语言。
在众多的计算机程序设计语言中,Java确实是一颗耀眼的明星。当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。如果你希望进行网络相关的开发,Java语言确实是一个不错的选择。
程序设计语言中的刀枪剑戟
除了我们在上面介绍的几种程序设计语言之外,还有很多优秀的程序设计语言我们没有介绍,比如Python、C#、PHP等等。尽管人们多次试图创造一种通用的语言,却没有一次尝试是成功的。各种语言都有自己的特点,也都有自己的应用领域,并没有高低优劣之分。我并不会因为这本书是讲解C语言的,就将C语言吹到天上去了。我们能做的,就是根据各种语言的特点,根据自己的需要,根据自己的应用场景,来选择合适的语言。