1.2 语言和实现语言的工具
1.2.1 机器语言
你知道香蕉叫什么吗?就叫“香蕉”?叫“banana”?
错,都错。
香蕉叫“牙牙”。
这是一个婴儿的语言。一个婴儿还没学会人类的主要语言,所以面对喜欢的东西总是发出咿咿呀呀的声音,也许你听不懂,但这是他的语言,符合小孩特点的语言。
计算机的机器语言也一样,必须符合计算机的硬件特点,而问题就在这里,越符合机器的特点,同时也就越不符合人类的特点。
计算机全称为电子计算机。20世纪40年代以来,无线电技术和无线电工业的发展为电子计算机的研制提供了物质基础。1943—1946年美国宾夕法尼亚大学研制的电子数字积分和计算机ENIAC(Electroic Numerical Integrator And Computer)是世界上第一台电子计算机。ENIAC计算机共用了18000多个电子管、15000个继电器,占地170 m2。
这是计算机的始祖,一堆电子管。随后,电子计算机进入第二时期,小巧的晶体管取代了电子管;再后来,集成电路又取代了晶体管,电子计算机进入第三时期。
但无论是哪一时期(以后也许不是),计算机始终采用电子器件作为其基本器件,因此电子器件的特点就是计算机的特点。
为什么使用电子元件?为什么木头不能做计算机?还真别说不能,你也应该知道,最早出现的用于计算的机器,真是木头的。以前有人用木头作成齿轮,经过设计,当表示个位数的齿轮转动1圈时,就会带动表示十位数上的齿轮转动1格。以此为原理,只要你转动转轴,木头机器就会算出123+456=579……
电子元件没有齿轮,但它们的特点是它们有两种很稳定的状态:导电或不导电。假如用0表示不通电,1表示通电,再通过集成电路实现进位的机制,于是,计数功能就有了基础。可以用图1-1表示。
图1-1
我们生活中常用的数是逢十进一,称为十进制数。而计算机由于其电子元件的特点,使用的是二进制数。
十进制数:最低位称为个位,高一位称为十位,再高一位称为百位。为什么这样称呼呢?因为在个位上,0表示0,1表示1,2表示2,3表示3, ……;在十位上,0表示0,1表示10,2表示20,3表示30, ……,总之,每高一位长十倍,为十进制。
二进制数:最低位仍可称为个位,但这里称为1位。1位上,0表示0,1表示1。2呢?没有2,因为逢2就得进1(后面同)。高一位称为2位,0表示0,1表示2。再高一位称为4位,0表示0,1表示4。可以看出,每高一位长2倍,为二进制。
现在看图1-1,00、01、10是3个二进制数。根据上面的进位方法,你可以算出它们分别表示十进制数的0、1、2来吗?首先,当面对二进制数时,先要认识到它们从低到高(从右到左)的位依次不再是个位、十位、百位,而是1位、2位和4位。
00:都是0,所以它就是0;
01:2位为0,1位为1,表示0个2和1个1,所以是1;
10:2位为1,1位为0,表示1个2和0个1,所以是2。
计算机的机器语言正是由这些0和1组成的。事实上,计算机里的所有数据,无论是一个程序、一篇文稿、一张照片还是一首MP3,最终都是0和1。
世界就是这样奇妙,万事万物五彩缤纷,但进了计算机,却只是0和1的组合。
机器语言尽是0和1,于是可以想象当时(还没有其他语言时)的程序员是如何编写程序的。他们写程序不用坐在计算机前,而在家里或什么地方,拿笔在纸上画圈,一圈、两圈、三圈(感觉有点像阿Q),圈够了就给专门的打孔小姐照着在纸带上打成孔,最后这些纸带被计算机“吃”进去并读懂,然后执行。如用有孔表示1,无孔表示0,则图1-2表示3行数110、011和101。
图1-2
1.2.2 汇编语言
前面说机器语言尽是0和1,那么是不是随便写一串0和1就算是程序呢?不是。就像汉语是由汉字组成的,可我要是说下面这一串汉字:
天爱我京门北安。
你觉得我是在说人话吗?
机器也有自己的固定词汇,在机器语言里称为机器指令。程序是由指令及数据组成的。这些指令是一些固定的0和1的组合(不同厂商不同型号的机器,其指令又有不同)。作为程序员,就得将这些指令一次次正确地用0和1拼写出来。
你绝不会将“我爱北京天安门”说成上面的话,但极有可能将10101101写成10010101。所以很自然地出现了用符号来表示这些固定的二进制指令的语言,这就是汇编语言。
下面是一段代码,它表示的是:已知b等于1, c等于2,计算b+c的值,并将该值赋给a。
把这段代码的机器语言(左)和汇编语言(右)进行对照,可看出两者各自的特点。
100010100101010111000100 mov edx, [ebp-0x3c] 000000110101010111000000 add edx, [ebp-0x40] 100010010101010111001000 mov [ebp-0x38], edx
汇编语言仅是机器语言的一种助记符,两者之间没有本质的区别,所以很多时候人们把两者等同视之。
无论是机器语言还是汇编语言,都让人看了头痛。
1.2.3 高级语言
汇编语言和机器语言虽然很难记、难写,但它们的代码效率高、占用内存少,这相当符合当时计算机的存储器昂贵、处理器功能有限等硬件特点。
众所周知,计算机的发展迅速,功能越来越强大。一方面,它有能力,人们也要它能完成越来越复杂或庞大数据量的计算功能,机器/汇编语言已经无法满足这些需求;另一方面,硬件的发展和关键元件价格的降低,使得程序员不需要在程序的降低内存占用、减少运算时间等方面花太多的精力,这样,各门高级语言便接二连三地出现了。
一门计算机语言“越符合机器的特点,同时也就越不符合人类的特点”。最早有Pascal、C、C++、BASIC等数百种高级语言,现在又有Java、C#等。高级语言的高级之处在于它总是尽量接近人类的自然语言和思维方式。
当然,一门语言再好,如果没有其实现工具,一切都是空谈。对于C语言,本书推荐使用Microsoft Visual C++6.0开发环境。
1.2.4 语言实现工具
高级语言比较接近人类的语言,用起来得心应手,但更得意的一定是让程序代码变成可执行文件。
无论是写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。这一工具一般称为编程集成环境(IDE)。之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了。下面列出其中最重要的功能项。
(1)方便的代码编辑功能。尽管你可以使用记事本、Word或其他任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。现在的编程集成环境都相当的智能,在很多情况下可以自动完成人们所需的代码,既准确又迅速。
(2)程序编译功能。前面已讲过,人们写的代码在成为机器能懂的可执行程序前,必须通过编译。
(3)程序调试功能。如何尽量减少程序的Bug呢?没有编程集成环境提供的强大调试功能,我们做的程序将毫无质量保证。
(4)其他辅助功能。安装程序的创建已属于另外一种工具的范畴,但人们仍可以通过编程集成环境来决定是最终生成单一可执行文件,还是带有其他动态库。如果是后者,还可以通过集成环境来检查程序运行时调用了哪些动态库文件。
当然,现在市面上可以见到的语言实现工具所提供的功能远不止上面所说的。对于一个工具,只有动手使用了,才会真正了解它。