宏哥
发这个帖子,是因为大多人搞不清库和(系统)原语的区别。这种区别对于技术选择,非常重要。
原语:实质是由软件提供的一组服务,以API形式暴露。例如win32 api,posix,directx以及OCI等。原语背后是系统级别的软件,或者芯片直接提供的服务。软件依赖系统原语的时候,不需要运行库支持。只需要能够按照特定的方式呼叫服务即可。原语从系统设计以来,变化很慢,一般都是增量变化,软件可以高度依赖原语。并且系统提高的服务质量都非常高。举例说明,win32 api从NT4 到win7 ,只是少量的api增加,几乎没有变化。这就是windows系统提供的服务。posix已经快20 年不变了。
库:是由逻辑段代码和数据定义组成的文件集合。类似MFC,STL,Boost,Swing,GTK,QT……等。库最终服务实现,无法脱离原语。库可以实现不依赖原语的逻辑段。有时候,库只是实现对原语的包装,据说是为了提高开发效率,但是能做到这点的,非常罕见。还有一种库,是"呼叫"原语的包装或者协议包装,比如JDBC和servlet。依赖这种东西,取决于后端服务的软件。Java是不可靠的平台,所以用这种语言开发,只能依赖jdbc和servlet。不应该有其他依赖。
开发:开发首选对原语进行依赖。避免对库进行依赖,除非库本身能够提高开发,测试效率。对于java这种被阉割的语言,只有在所有的服务,比如数据服务都委托第三方的时候,才可以选择。类似客户运用,必须禁止以swing这样的东西进行开发,因为它在呼叫系统原语的功能非常弱。GTK,QT也要尽可能避免,除非有清晰的对于Unix平台的需求。MFC,STL,Boost这种库,除非在legacy系统当中,否则也应该禁止使用,他们的设计,以及质量,都太糟糕了,这些东西比较适合喜欢浪费生命在电脑前面,做不出玩意,抱怨社会的人。
案例:
windows和unix都分别提供了原语级别的队列服务,但是如果选择java,就无法使用这些服务。所以OS世界就诞生了很多如activemq这样的垃圾软件,又大又糟糕。如果使用原语,分别都只需要很少几行代码就能实现异步队列服务,前提是,使用能够呼叫系统的语言,比如C#/win,php/unix。
Delphi能成为开发win之王,很大程度就是对原语能完整的呼叫,并且提供成套控件。软件又小又快。Java则正好相反。
以上是面临市场竞争的时候,务必遵循的原则。否则,开发的投入都要打水漂。
之所以说OS软件大多都是垃圾,因为大多无法提供原语级别服务,或者这个服务质量糟糕。很多都是原语的"极其糟糕的"包装,冠之以"面相对象"或者其他"热门"的"高手"术语"。
本页共11段,1198个字符,3011 Byte(字节)