8、C语言光线成像(二)选择编程工具
哥哥没有食言,吃完中饭,就开始教导。
“所有的语言,都需要一个编译器,或者解释器。你编写Basic程序,使用了什么工具?”哥哥问道。
“没有用工具啊?”木鸿飞不明白。
“你输入Basic程序前,首先运行什么程序?”哥哥一步一步引导。
“qb.exe” 木鸿飞回答。
“对,qb.exe就是一个编程工具,一个编写Basic语言的工具,它的全称叫做Quick Basic。当然你也可以使用其他的工具来编Basic程序。”哥哥确定的说道。
“啊!难道Quick Basic不就是Basic,Basic不就是Quick Basic吗?他们不是一样的吗?”木鸿飞第一次听说语言和工具的区别,显得十分惊讶。
其实这也是计算机初学者的通病,时至今日很多计算机学生也经常混淆VC++和C++语言。君不见在很多计算机知名论坛上,常常依稀的挂着如下之类帖子:
帖子一:本人是菜鸟,打算学习C++,请问我是学习VC++好,还是学习C++Builder好?
帖子二:弱弱的问一句,VC++是C++的升级版本吗?
帖子三:空中连翻18个筋斗转体720度雪夜跪地裸求C++语言与VC++语言的异同。
……
虽然,木鹏飞当年没有机会见识这些楼主,但却见识过很多具有同样疑惑的实体学生,所以木鸿飞的惊讶早在意料之中,他笑了笑,很平和的说:“呵呵,不一样的。Basic是语言,而Quick Basic只是一个工具。当然这个工具比较强大,有解释器还有IDE界面,……”
“解释器?IDE?”木鸿飞丈二和尚摸不着头脑。
“看来现在讲这些知识还是太早了,”见到弟弟不能理解,哥哥马上调整方案,“总之Quick Basic只是众多Basic编程工具中的一种,还很很多其他的工具,比如Turbo Basic等等。”
木鸿飞点点头,这个内容听的懂。
“与Basic一样,C语言也有很多编程工具,比如说,……”哥哥继续说道。
“是不是Quick C和Turbo C?”木鸿飞突然插话。
“你怎么知道?”现在,轮到哥哥吃惊地盯着木鸿飞。
“呵呵,呵呵,”木鸿飞得意的笑,“猜的。既然有Quick Basic和Turbo C吗,那么应该也有Quick C和Turbo C。”
“虽然你不懂,但我不得不说,你蒙对了!”哥哥无可奈何的说道。
“哦耶,哦耶!我们使用哪个工具,要不是用Quick C吧,我可能比较习惯。”木鸿飞说道。
“C语言和Baisc语言不一样,Baisc语言是微软发家的东西,做的当然好。至于C语言吗,Turbo系列要好一些,目前C语言编程工具最流行的就是Turbo C2.0版,简称TC20,很多地方都用它。”哥哥解释道。
“哦,明白,我们就用TC20吗?”木鸿飞问。
“不,我们使用Borland C++3.1版。”哥哥回答?
“C++?为什么?”木鸿飞隐约知道C++好像也是一种编程语言,“C语言成像,不是C++语言成像啊。”
“你还知道C++,不错啊。”哥哥表扬到。
“呵呵,呵呵,略懂,略懂。”木鸿飞不好意思的摸了摸头,“你的书架上有C++的书,所以我就知道还有一种叫做C++语言的东东。”
“还略懂,我看你一点也不懂!”哥哥笑骂道,“之所以推荐BC31而不用TC20,是有原因的。主要是居于两点,首先,BC31是TC20的升级版本,有很多新功能,你可以感受一下。其次,BC31既可以编C语言程序,也可以编C++程序,但TC20则只能编C程序。”
“哦,既然C++也可以编写C程序,我想使用VC++4.0。”木鸿飞一边说,一边从书架上拿下一本《VC++4.0从入门到精通》。
“为什么?”哥哥问道。
“那还用问,VC++4.0是最新的产品,我们当然希望使用最新的工具。”木鸿飞一本正经的回答。
喜新厌旧,是计算机从业人员的普遍心理。用最快的电脑,装最新的软件,玩最流行的游戏,木鸿飞也不例外。如果这一切体现在编程上,就是学习最新的技术,调用最新的控件,和使用最高的编程工具版本,这似乎是人之常情。
但人之常情不一定正确,就如真理有时掌握在少数人手中一样。虽然计算机行业是一个不断推陈出新的行业,但不能只片面的追求“新”,更多时候需要维持“稳”。 “新”的东西,不一定就具备生命力,也许只是昙花一现,花开花谢后凋落为尘埃遗落到历史的角落里。“新”的技术不一定就完善,也许还需要一个成熟的过程,成熟后的技术也许与目前的大相径庭。“新”的产品也不一定能立即为大众所接受,当年微软推广机顶盒时气势如虹,产品不可谓不新,技术不可谓不好,只可惜时机过早,直到几年之后,机顶盒才为神州大地所接受然并且遍地开花。
很多大学生一味的追求“新”,一定要学习最新的语言,掌握最新的技术,什么“流行”看什么,什么“时髦”学什么,但毕业后才惊奇地发现,貌似很多“高新”单位根本就没有使用这些“高新”技术,甚至这些单位使用的开发工具和技术在大家的眼里几乎等于没有技术。比如Java编程,没有使用Structs显示表示层,没有使用Sprint处理控制业务,没有使用Hibernate设计数据库,没有使用JUnit进行单元测试,甚至很多单元测试不但没有采用最新的测试理论,而且测试准备也不充分,程序员似乎一边摸脑袋一边就完成了测试。
当然,对于木鸿飞来说,现在谈论毕业后的事情还为时过早,就目前而言,选定一个开发工具才是正途。显然木鸿飞希望选择一个“新”的工具,也就是VC++4.0,不过哥哥一句话使他改变了主意。
“安装VC40需要很多磁盘,而且我也没有VC40的安装程序。”
不管哥哥的目的如何,这都是句大实话。因为那个时间计算机还刚刚起步,光盘并没有现在这样流行,很多机器上都没有光驱,更别说U盘了,所以程序拷贝是个大问题。而且网络也远远没有深入人心,偶尔有连接几台电脑相连,也仅仅是局域网,至于联系全世界的因特网,在中国暂时还处于传说之中。在一个没有网络,除了盗版VCD之外就没有其他类型盗版光盘的时代,获取一个VC++4.0的安装盘谈何容易。
其实木鸿飞是幸运的。大学期间,正值计算机蓬勃发展,木鸿飞亲眼目睹了操作系统从DOS到Windows的巨变,编程工具也经历了一个百家争鸣的时期。哥哥短短的几句话,幸运的为木鸿飞定下了一位朋友,一位伴随木鸿飞大学4年的开发工具。这是这位朋友,使木鸿飞不但没有在那个缤纷复杂的时代中迷失自己,还在滚滚洪流中顺利掌握了程序的真谛。
几年以后,当第一次面对学生时,木鸿飞也是这样推荐的,不过推荐理由就要更加充足,请看下面的场景:
(画外音)大家好,木鸿飞有话说节目又和大家见面了。大家知道,计算机语言的编程工具多种多样,以C语言为例,有VC++,有C++Builder,还有大家非常熟悉的TC2.0,那么作为计算机专业学生的我们在学习C语言时,到底应该选择什么编程工具好呢?带着这个问题,我们走访了木鸿飞老师。木老师,请问您觉得应该使用什么编程工具好呢?
木鸿飞:这个问题问的好。选择合适的编程工具,这个问题仁者见仁智者见智,至于计算机专业的学生,我个人强烈建议使用BC++3.1 For DOS版本作为开发工具。
不知名的学生甲(疑惑的眼神):为何?
木鸿飞(很潇洒):估计大家都有这个疑问,现在都用Win2000了,为什么不用VC++6.0在Windows下编程,却仍然选择BC31在DOS下编程。相信这也是广大计算机初学者共同的疑惑,不知名的同学甲,你是不是也这么认为的?(很自信的等待甲同学回答)
不知名的学生甲(摇头):错误。
木鸿飞(吃了一惊):错误?(重新装出潇洒的笑容)相信这也是广大计算机初学者共同的疑惑,不知名的同学甲,你是不是也这么认为的?
不知名的学生甲(摇头):错误。
木鸿飞(压低声音):不知名的同学甲,你应该配合我,你要说:你也是这么认为的。
不知名的学生甲(继续摇头):姓名。
木鸿飞(压低声音):姓名?错误?(灵机一动)不知名的同学甲,你是说你不叫不知名的同学甲。
不知名的学生甲(点头):是的。
木鸿飞(压住怒火):那么请问不知名的同学甲,你贵姓?
不知名的学生甲(指自己):叶子。
木鸿飞:叶子同学,你说你一个跑龙套的,也就是做个群众演员而已,演完就走人了,在我这本书中丝毫没有地位。你不但不按要求剧本演出,居然还要求加上姓名,你是何居心?
不知名的学生甲(坚定的目光):改名。
木鸿飞(同样坚定的目光):不改。
不知名的学生甲(转身就走):不演。
木鸿飞(连忙拉住不知名的学生甲):别,别,你走了谁配合我把戏演下去,不就是开个名字吗,马上该。(画外音)不知名的学生甲改名为叶子。
叶子(笑容):开始。
木鸿飞:(小声)这简直就是威胁导演嘛。(重新装出潇洒的笑容)估计大家都有这个疑问,现在都用Win2000了,为什么不用VC++6.0在Windows下编程,却仍然选择在DOS下编程。相信这也是广大计算机初学者共同的疑惑,甲同学,你是不是也这么认为的?(很焦急地望着叶子)
叶子(点点头):是的。
木鸿飞(叹气): 为什么不选择Windows而选择DOS编程呢?其实不是DOS比Windows好,只是相比之下DOS环境编程更适合于初学者学习而已。
叶子(皱眉头):适合?
木鸿飞:对,更适合。因为在DOS下编程更加单纯。
叶子:单纯?
木鸿飞:是的。大家不要把单纯混淆为简单。单纯是指编程时只需考虑与程序功能相关的地方,不用考虑与程序功能无关之处,与程序代码行长短无关。
叶子:举例!。
木鸿飞:举个例子,大家都喜欢编趣味程序吧,假设我们设计俄罗斯方块程序,这个程序需要画方块。在DOS下画图很方便,直接调用函数即可,比如调用函数Line就可以画线,调用函数bar就可以画方块,是不是很方便。
叶子(点头):方便!
木鸿飞:但是Windows下的俄罗斯方块程序就没有这么简单。你除了考虑画图代码之外,还需要考虑其他很多Windows特性代码,比如画图之前先获取上下文句柄。
叶子:句柄?
木鸿飞:对,只有成功获取了上下文句柄才可以在窗口中作画。但麻烦的是,不同的地方,获取句柄的语句还不一样。比如在处理WM_PAINT消息时,使用“BeginPaint”和“EndPaint”处理句柄;在处理非WM_PAINT消息时,使用“GetDC”和“ReleaseDC”处理句柄;如果需要在窗口上作画,则需要使用“GetWindowsDC”和“ReleaseDC”处理句柄。这些东西与俄罗斯方块游戏本身有关系吗?丝毫没有关系,但是在Windows下编程就得考虑它们!是不是多考虑了很多功能之外的东东?
叶子:是的。
木鸿飞:在Windows下画图是件很麻烦的事情。不过句柄操作不是最麻烦的,最麻烦的是Windows窗口的刷新机制。
叶子:刷新?
木鸿飞:在DOS下一旦调用了bar函数画方块,那么无论何时这个方块都会在屏幕上。但Windows下则不同,即使作了图,但如果切换了窗口,或者改变了窗口大小时,或者窗口从底部变为顶端,你会惊奇的发现,在Windows窗口中辛辛苦苦作的图全部不翼而飞,整个窗口又变成白布了!
叶子:白布?
木鸿飞:是这样的。如果你设计了俄罗斯方块程序,正玩在兴头上,突然QQ闪烁,强行弹出窗口提示你删除360,这个弹出式窗口刚好覆盖了俄罗斯方块窗口(或其一部分),你有着被挟持的感觉,于是愤怒的关闭这个QQ弹出式窗口,希望继续玩游戏。但此时俄罗斯方块窗口中被覆盖的部分已经一片空白,哪里还有方块踪影啊。
叶子:消失?
木鸿飞:这是windows 编程的特性,每当窗口切换或者从覆盖中出现,Windows会清空窗口中被覆盖部分,然后处理WM_PAINT消息。也就是说,所有的画图操作,最好要出现在WM_PAINT消息中,否则不保证其有效性。
叶子:可惜。(突然眼珠一转)MFC!
木鸿飞:你是说使用VC++的MFC编程不用考虑刷新问题吧。诚然MFC编写普通窗口程序是忒简单,但MFC本身的内容过于复杂,用它编程一点也不单纯,有太多的类和对象需要掌握,有太多的与程序功能无关代码需要掌握。如果把初学者比喻成少儿的话,那MFC就是一部少儿不宜的大片。
叶子:有理。
木鸿飞(小声):终于讲完了,(擦拭脸上的汗珠,突然发现了什么)奇怪了,叶子同学,貌似你每次只说两个字?
叶子:习惯。
……
在接下来的几年中,木鸿飞一直不遗余力地推荐DOS下BC3.1编程。不过随着时间的推移,Windows越来越不支持DOS,DOS作为一个历史的产品,淘汰的命运是必然的,其在编程学习上的优势也显得越发欧特曼了。如何在编程学习中与时俱进,如何既保留DOS下编程的单纯又享受windows图形化的便利,成了木鸿飞考虑的问题。幸好,木鸿飞给出了答案:
“在Windows SDK API的基础上,专门封装一套函数库,称之为C语言学习库(C-Language Study Libray,简称csl),该库封装了所有Winows下SDK画图的细节,提供了一个与Dos下编程相似的接口,不就两全其美了吗。”
其实,木鸿飞并不孤独。某一日,当他打开C++之父Bjarne Stroustrup所著《C++程序设计原理与实践》时才惊奇的发现,原来这位誉满世界的大侠选择初学者编程工具的观点上竟与自己惊人的相似——选择一个可以Windows下以DOS方式编写图形程序的工具,真是英雄所见略同!当然这是后话不提。
本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/432000,如需转载请自行联系原作者