|
发表于 2004-12-18 12:24:15
|
显示全部楼层
当我还是一个菜鸟的时候,也是这样的想法.
但是,随着我学习计算机知识的深入,回想一开始的想法,觉得自己的想法才是不合理的.
设计计算机系统的人都是深入了结计算机原理的人,你能想到的问题,他们都想到过.
为什么他们不用我们想到的方式来设计系统呢?
在了解计算机系统之前是很难理解这一点的.
就拿字符界面用图形软件来说.
大部分的图形图像软件在字符界面下都是不能用的,这些主要是X应用程序.在linux中图形界面接口有很多中,X是最常用的一种.且X是服务器/客户 方式的图形系统 X应用程序运行过程中需要链接到X服务器,请求服务器完成显示内容的过程.这个过程缺少了X服务器就不能完成. 而另外一些图形界面的应用程序不用X作为她的接口,那么在不启动图形界面的情况下,他也可以在字符模式下运行.比如mplay可以用framebuffer驱动,在图形界面下看电影. 在早期的linux发行版中有一个字符界面的看图软件叫zgv,他用svga库作为图形接口,因此,也可以在图形字符界面下看图.另外,有一个非常有名的图形界面接口叫miniGUI,他是我们中国人自己写的图形接口库,在嵌入式linux应用场合有十分广泛的应用.那么在X下开发的,用X作为图形接口的程序将不能在miniGUI下工作,应为这两种底层的图形接口工作方式是完全不同的,应用程序所用的接口程序动态共享库,也是完全不同的!
那么,如果应用程序,不使用这些图形接口,而独立的编写显示图形的方式不就可以到处运行,不受任何图形接口的限制了吗?相信这是很多初学电脑的人的想法. 这中想法的却很美好,我当初学linux的时候也是这样想的,如果linux的应用程序能像DOS应用一样,只有一个可执行文件,什么东西也不倚赖,那该多好啊?
确实,在计算机发展初期,计算机软件都是这样设计的,这些软件往往都很小,设计成独立的可执行文件没有任何困难,但是随着计算机软件科学的发展,软件越来越大,如果每一个软件都做成独立可执行文件,那将浪费巨大的磁盘空间和内存空间.使得软件根本无法运行.
于是,便产生了动态链接库的概念!
动态链接库是windows的说法(DLL),linux的说法是共享对象(SO),其核心思想就是:软件运行过程中,不同的软件在运行过程中于有很多内容都是一样的,比如你你设计一个软件实现:
(1+2)*3=9的运算过程
而另一个软件是:
(1+2)*4=12的运算过程
那么可以把(1+2)的运算过程设计成一个公用的程序.在两个程序运行过程中动态的调用并运行这些共用的代码,这样就大大减少了磁盘的使用量和内存的使用量.
再回到我们讨论的字符界面运行图形程序的问题上.
X,svga库,miniGUI,等好就是这些"共用"的东西.而各种应用程序就是非公用的部分.
比如一个应用程序的按钮,文本框,滚动条等都是公用程序,在程序运行中又是必需的.
假如,我们设计一个不需要公用程序的软件那会怎么样呢?
首先,这个软件将便得非常巨大
第二,这个软件的设计难度将大大提高,设计者每次开发一个程序都要重复设计一些简单的,已经设计过的东西.
第三,磁盘空间的大量浪费
第四,内存将严重不足,因为没一个一样程序过程,都要重复被加载到内存运行!
因此,设计一个不倚赖任何图形库的软件看似简单,实际设计过程中将非常困难.因为每一件事情都需要程序员去做.这将浪费大量时间和精力.但是有了图形库就不一样.比如程序员要一个应用程序的按钮,他只要在程序中写调用这个按钮程序的语句就可以了,而这个按钮具体如何画程序员根本不用关心,它将由程序员调用的图形接口函数去完成.
因此,基于共享对象的,具有层次结构和接口的程序设计方法是经过长时间的积累总结出来的,有它的先进性,我想再重复一次我说过的话,你所能想到的,那些计算机系统科学家,软件工程师们都已经想到过了! 之所以不那样做,总有他的道理,深入学习下去,总有一天你会明白,并体会这中方式的奥妙! |
|