📄 第01章 程序漫谈.htm
字号:
Numerical Integrator And
Computer)是世界上第一台电子计算机。ENIAC计算机共用了18000多个电子管,15000个继电器,占地170 m2 …… </P>
<P> </P>
<P>这是计算机的始祖,一堆电子管。随后,电子计算机进入第二时期,小巧的晶体管取代了电子管;再后,集成电路又取代晶体管,电子计算机进入第三时期。
</P>
<P> </P>
<P>但无论是哪一时期(以后也许不是),计算机始终采用电子器件作为其基本器件,因此,电子器件的特点,就是计算机的特点。 </P>
<P> </P>
<P>为什么使要电子?为什么木头不能做计算机——还真别说不能,您也应该知道,最早出现的用于计算的机器,真是木头的。你用过计算尺吗?算了,这玩意儿太简单。以前有人用木头作成齿轮,经过设计,当表示个位数的齿轮转动一圈时,就会带动表示十位数上的齿轮转动1格。以此原理,只要你转动转轴,木头机器就会算出123+456
= 579…… </P>
<P> </P>
<P>电子元件没有齿轮,但它们的特点是它们有两种很稳定的状态:导电或不导电,假如用不通电时表示0,通电时表示1,再通过集成电路实现进位的机制。于是,计数功能就有了基础。我们用图表示:
<P><IMG height=85 src="第01章 程序漫谈.files/newlst3.jpg" width=232 border=0>
<P>
<P>我们生活中常用的数逢十进一,称为10进制。而计算机,由于其电子元件的特点,它是二进制数。这里简单地对比一下这两种进制造成的区别,以帮助你更容易看明白上图。
<P>
<P>十进制数:最低位称为个位,高一位称为十位,再高一位称为百位。为什么这样称呼?因为在个位上,0表示0,1表示1,2表示2,3表示3……;在十位上,0表示0,1表示10,2表示20,3表示30……总之,每高一位长十倍,为十进制。
<P>
<P>二进制数:最低位仍可称为个位,但这里称为1位。1位上,0表示0,1表示1,2呢?没有2,因为逢2就得进1(后面同)。高一位称为2位,0表示0,1表示2,再高一位称为4位,0表示0,1表示4。可以看出,每高一位长2倍,为二进制。<BR>
<P>现在看上面的图,00,01,10,是三个二进制数。根据上面的进位方法,你可以算出它位分别表示十进制数的0,1,2来吗?如果你算得出来,不错,值得表扬。算不出来,别急,我来告诉你。首先,当你面对二进制数时,先要扳过来它们从低到高(从右到左)的位依次不再是个位十位百位,而是:1位,2位和4位。<BR>
<P>00:都是0,所以它就是0;
<P>
<P>01:2位为0,1位为1,表示0个2和1个1,所以是1;
<P>
<P>10:2位为1,1位为0,表示1个2和0个1,所以是2。
<P>
<P>计算机的机器语言正是由这些0和1组成。事实上,计算机里的所有数据,无论是一个程序,一篇文稿,一张照片,一首MP3,最终都是0和1。
<P>
<P>世界就是这样奇妙。万事万物五彩缤纷,但进了计算机,却只是个0和1的组合。不由得你会想起道教的古老玄机:“无极生太极,太极生两仪,两仪生四象,四象生八卦,八卦生十六爻”
<P>
<P>严重跑题。
<P>
<P>机器语言尽是0和1,于是我们可以想像当时(还没有其它语言时)的程序员是如何编写程序的。他们写程序不用坐在计算机前,而在家里或什么地方,拿笔在纸上画圈,一圈两圈三圈(感觉有点象阿Q?),圈够了就给专门的打孔小姐照着在纸带上打成孔。最后这些纸带被计算机“吃”进去并读懂,然后执行。<BR>来看一眼侏罗纪的程序吧:
<P>
<P><IMG style="FLOAT: left" height=164 src="第01章 程序漫谈.files/newlst4.jpg"
width=136 border=0>
<P>
<P>(如用孔表示1,则左图表示三行数110,011,101)
<P>
<P>面对这样的“程序”你是否表示狐疑?别以为我瞎说,也许你的电脑很先进,是P4吧?但在你的电脑上,仍有那种程序历史遗迹:软驱是也。如果有软驱,那你应该能找到一张软盘。知道软盘有写保护吗?仔细看看那个写保护的开关——就是一个方孔——打开,告诉软驱本张软盘不能进行写操作,关闭,告诉软驱本张软盘可以进行写操作。
<P>
<P>
<P>
<P>
<P>
<H4>1.3.2 <A name=汇编语言>汇编语言</A><BR></H4>
<P>前面说机器语言尽是0和1,那么是不是可以随便写一串0和1就算是程序呢?不是。就像汉语是由汉字组成,可我要是说下面这一串汉字:
<P>
<P>天爱我京门北安
<P>
<P>你觉得我是在说人话吗?
<P>
<P>机器也有自己固定词汇,在机器语言里,称为机器指令,程序是由指令及数据组成。这些指令是一些固定的0和1的组合(不同产商不同型号的机器,其指令又有不同)。作为程序员,就得将这些指令一次次正确地用0和1拼写出来。
<P>
<P>你决不会将“我爱北京天安门”说成上面的话,但你极有可能将 10101101 写成
10010101,对不?所以很自然地,出现了用符号来表示这些固定的二进制指令的语言,这就是汇编语言。
<P>
<P>下面是一段我从C++ Builder的CPU调试窗口摘出的代码,它实现的功能是:
<P>
<P>已知b 等于 1; c等于2; 然后计算 b + c 值,并将该值赋给 a 。
<P>
<P>把这段代码的机器语言(左)和汇编语言(右)进行对照,你可看出二者各自特点。
<P><BR>
<P>10001010 01010101 11000100 mov edx,[ebp-0x3c]
<P>
<P>00000011 01010101 11000000 add edx,[ebp-0x40]
<P>
<P>10001001 01010101 11001000 mov [ebp-0x38],edx
<P><BR>
<P>汇编语言仅是机器语言的一种助记符,没有本质的区别,所以很多时候,我们把二者等同视之。
<P>
<P>无论是机器还是汇编语言,都让人看了头痛,好在我们并不去学它们。
<P>
<H4>1.3.3 <A name=高级语言>高级语言</A><BR></H4>
<P>汇编语言和机器语言虽然很难记难写,但它们的代码效率高,占用内存少,这相当符合当时计算机的存储器昂贵,处理器功能有限等硬件特点。
<P>
<P>众所周知,计算机的硬件发展飞速,功能越来越强大。一方面,它有能力,人们也要求它能处理越来越复杂或庞大数据量的计算功能,机器/汇编语言已经无法胜任实现这些需求;另一方面,硬件的发展和关键元件价格的降低,使得程序员不需要在程序的降低内存占用,运算时间上花太多的精力,
这样,各门高级语言便接二连三地出现了。
<P>
<P>那么,高级语言“高级”在何处呢?前面我们说过,一门计算机语言“越符合机器的特点,同时也就越不符合人类的特点”
。人类总是希望凡事能舒服点就舒服点,于是某一天,先知先觉们一声怒吼“是该到让计算机语言接近人类的时候了!”从此冒出了Pascal,冒出了C,
C++, BASIC语言等数百种高级语言,现在又有Java,
C#等等。高级语言高级在哪里呢?就高级在它总是尽量接近“高级动物”的自然语言和思维方式。
<P>
<P>那么多高级语言,我们为什么挑了C++呢?
<P>
<P>向来头痛这种问题,其实无论是Pascal,
BASIC,还是C++,甚至C和C++相比,每一种语言都有极大的相通之处,又都有各自的独到之处。我大致鼓吹一下C++吧。]
<P>
<P>首先,这是全世界用得最多的计算机程序语言。
<P>
<P>其次,C/C++语言既有高级语言的优点,又在很多方面保留了低级语言速度快,可进行很多具有可直接映射硬件结构的操作的长处,我们无时不用的Windows等操作系统,就是用C和汇编写成。事实上很多人称它为中级语言,这样两头俱备的语言,当然值得学。
<P>
<P>再次,C语言本身,只有32个关键字(固定词),C++也只是进行了有限的扩展。另外,C/C++语言是众多语言中最简洁,紧凑,灵活的语言,学得易,用得爽!
<P>
<P>再再次,由于前面所说的,C/C++是中级语言,它所生成的机器代码自然更接近于直接用汇编所写(和其它语言相比),所以,同样的程序,用C/C++写,代码小却跑得快。
<P>
<P>再再再次,C/C++语言是少见的,不专属于(因为版权或龚断)某一家公司或组织,你完全不必担心你只是学了某门某户的C或C++,到别的地儿全玩不转。C/C++有美国国家标准协会制定语言标准。事实上,你就是到UNIX,Linux上写点C/C++代码,也能跑。
<P>
<P>最后,一门语言再好,如果没有其实现工具(语言本身只是一种规范,必须有编译器可以实现它),那么又不成了屠龙之技,C/C++,你可能用微软的VC,也可以用我们推荐的Borland
C++ Builder,二者都相当优秀。
<P>
<H4>1.3.4 <A name=语言实现工具>语言实现工具</A></H4>
<H5>1.3.4.1 <A name=C++Builder的基本功能>C++ Builder的基本功能</A><BR></H5>
<P>我们用高级语言写程序,我们很得意,因为高级语言比较接近人类的语言,我们用起来得心应手,所以我们当然得意。但我们更得意的一定是让程序代码赶快变成可执行文件。
<P>
<P>无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。这一具一般成为编程集成环境(IDE)。之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了。这里列出其中最重要的功能项。
<P>
<P>1、 代码编辑
方便的代码编辑功能。尽管你可以使用记事本、Word或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。相反,现在的编程集成环境,都相当的智能,举例如代码自动功能,可以很多情况下自动完成我们所需的代码,既准确还迅速。Borland公司出品的编程集成环境不仅有常见的关键字高亮等功能,还支持代码模板,支持键盘宏,同样支持高级的脚本插件功能。
<P>
<P>2、 界面设计
可视化的程序界面设计功能。你所要产生的窗口,在设计期间就真实地出现,包括字体,颜色,定位,比如,你不仅可以插入falsh的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。
<P>
<P>3、 程序编译 这更是编程工具的主要功能。前面已讲过,我们写的代码,在成为机器能懂的可执行程序时,必须通过编译。
<P>
<P>4、 程序调试 如何尽量减少你的程序的BUG?没有编程集成环境都提供的强大调试功能,我们做的程序将毫无质量保证。
<P>
<P>5、 代码优化 Borland
提供的编译器不仅在编译速度一直在美国屡获大奖,而且其代码自动优化功能一直领先对手几近一个时代。使用编程集成环境,我们可以轻松获得更快更优的最终可执行程序文件。
<P>
<P>6、 辅助程序安装
程序的安装已属于另外一种工具的范畴,但我们仍可以通过编程集成环境来决定最终生成单一可执行文件,还是带有其它动态库。如果是后者,我们还可以通过集成环境来检查程序运行时调用了哪些动态库文件。<BR>C++
Builder 提供的功能远不止我上面所说的,并不是因为我嘴笨,而是我认为对一个工具,你只有动手使用,才会真正了解它。
<P>
<P>C++是一门语言,而Borland C++ Builder
则是语言实现工具。作为一个编程工具,CB提供以上功能正是份内之事。在这个意义上,你可以认为CB是Word2000,而C++则是英语或汉语。正如我们用英语或汉语在Word2000上写出优美文章,编程可说为:我们用C++语言在CB上编写出优美的程序。
<H5>1.3.4.2 <A name=VCLvsMFC>VCL vs. MFC</A> </H5>
<P>
<P>在作为一种编程工具的意义上,我们认为C++ Builder和你也许常听的VC (Visual
C++)没有什么本质的区别。就像Word2000和WPS2000在本质都是字处理软件。但现在我们要从另外一个角度讨论C++
Builder这个编程工具。
<P>
<P>这个角度,就是“封装”——面向对象编程思想中的最重要也是最基础的概念。
<P>
<P>一个要学习编程的人,可能从C开始学起。学C时,我们没有接触那些挺玄的概念,到了C++,一切就来了,什么面向对象,什么封装、继承、多态……于是我们兴奋起来,努力去理解,掌握,运用这些概念所代表的技术,在掌握这些别人暂时未理能的概念之后而颇有成就感……。现在我要问的是,为什么要有这些概念?这些技术?正确回答这个问题,不仅有助于我们今后对编程语言各种概念的学习,而且它能让我们避免成为新技术的奴隶——这一切也许听起来有些形而上,不过我想通过以下讨论,至少可以回答一个很现实的问题:为什么要选C++
Builder?而不是我们更常听的VC?这是我碰到的编程初学者较疑惑的问题之一。
<P>
<P>如果人类长有翅膀,那么飞机大抵永远不会被发明。飞机的发明,是为了弥补人类自已不能飞翔的缺陷。不能说所有的技术都是这样,但C++对于C的发展,完全是为弥补程序员脑力的不足。一个在校生在学会C后,往往并没有机会用C去实践一个大中型的项目,体会不到在一个庞大软件工程中,非面向对象语言的短处,所以在之后学习C++的过程中,也就很难真正体会到面向对象语言的长处。简短一点说:不知道C的短处,就不懂C++的长处。相反,倒是很快就发现C++的缺点:它的代码效率多数情况下都要比C低不少。
<P>
<P>前面我们说过低级语言与高级语言的对比。C++语言也正是从语法结构,语言功能上来限定或实现一门编程语言更加接近人在现实生活中的思维习惯,从而达到减轻人的记忆和判断上的负担。这其中最佳的方法之一就是所谓的“封装”。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -