论Java的interface与Linux kernel的Abstraction

 

    相信写过Java程序的都知道interface(接口)的概念,同时精通Linux kernel代码的人也应该熟悉Abstraction(抽象)的概念,原本这两个概念风马牛不相及,一个是高级语言的内建特性,一个是操作系统的设计模式,它们有什么相似之处呢?

 

    首先说说Linux kernel的Abstraction, kernel代码99%是用C写的(还有汇编),C是面向过程的编程语言,在架构大型复杂的软件系统时,其实C不是太被推荐使用的,面向对象则使用的较多,不可否认Linux kernel的巨型和复杂是现在任何一个其他软件工作都很难比拟的,那为什么kernel还使用C呢?为什么kernel不用C++呢? 这个问题追溯起来就复杂了,很大程度上是由于历史的原因,在1992年时,linus曾尝试用C++重写kernel(那是的kernel代码行数还比较少),最后放弃了尝试,据linus说是因为当时的C++编译器非常慢(现在已改进很多了),导致kernel性能严重下降,所以linus乖乖的又继续用C写kernel了,直到现在还有很多人提出用C++重写kernel,起码重写kernel的一部分,为什么这个问题被讨论了这么久? 答案就在于kernel中存在着大量的面向对象特性。

 

    相信看多kernel代码的人都会同意这句话“kernel中存在着大量的面向对象特性”, 在kernel community中面向对象这个词没有被提及太多,他们更习惯称之为Abstraction, kernel中处处都存在着Abstraction, 如广为人知的VFS,driver实现,socket实现,net实现,sysfs,具体而言Abstraction在kernel中的普遍存在形式是数据结构的抽象化,OO语言中的method对应与C语言中的函数指针,举个例子,要写一个新的driver,你需要实现你的数据结构,此数据结构中需包含driver的初始化函数,及其他操作函数,这些函数的原型是你无法改变的,你只能根据这些函数原型提供driver的具体实现,这不就是Java中的interface概念吗,kernel的扩展就是提供那些已定义好的interface的实现类。从设计模式的角度来看,这就是OCP,开闭原则。

 

    kernel中的Abstraction不仅仅只有interface模式这么简单,还包含了其他面向对象的一些属性,如继承,但类似java中interface这种抽象模式则是应用最为广泛的。

 

    如果想更深的了解Linux kernel中的面向对象,请看以下两篇文章,比本文说的更有深度,本文只是把kernel中的最常用设计模式和Java做了个通俗的比较而已

 

    Object-oriented design patterns in the kernel:

Part 1: http://lwn.net/Articles/444910/

Part 2: http://lwn.net/Articles/446317/


 

 

你可能感兴趣的:(java,object,kernel,OCP,oriented)