Unix的核心概念是句柄(Handler)

程序开发,脚本,各类开发工具,程序语言讨论

版主: *sake

Unix的核心概念是句柄(Handler)

#1  LTaoist » 周四 11月 24日, 2016年 11:59 pm

unix 在当初设计的时候提出一个思想,说一切都是文件

他们做到了,的确 unix 是一个一切都是文件的操作系统。例如,存储是文件(文件和文件夹来存储,其实文件和文件夹是对磁盘中的内容进行的分割和映射和抽象),硬件是文件(就是 /dev 下面的东西,调用硬件就是对表示硬件的文件做读写),连进程都是文件(某些地方用文件的形式表示一个进程)。

很多从 windows 过来的人可能以为文件就是一个图标,以为文件就是那个可以打开,然后有点反应或者里面有很多文字的东西。可能很难理解,进程怎么会是文件呢?如果不能理解进程是文件,不妨理解一下进程是 file,而我们说的文件只是一种 file 而已,unix 说的一切都是文件,说的是一切都可以被 file 来表示(比如世界由分子和原子表示)。file 是一个比文件更加抽象,而且具有更广泛的内涵的东西。file 并不是那某个图标,某一份躺在磁盘里的东西,它是 unix 的概念世界中的原子。文件这个词是中文的意译,它的英文单词是 file 。什么是 file ? 所有可以读写的东西都是 file 。夸张地说,连人都是 unix 说的 file 。我们怎么对文件操作?通过句柄(读这个文件,或者写这个文件,如此等等)。

但是如果我们用 lisp 的世界观,我们发现世界并不是文件,世界就是一打数据或者代码而已。所以 lisp 的世界观里存储仅仅就是一个函数,硬件是另外一种函数,在这种函数里我们直接调用了硬件的指令,而根本没有什么进程(lisp 程序一直处于一个读入 - 执行的循环,而这个循环本身也是一个函数而已。)

我们发现 unix 的特点就是很多的 geter seter, opener。比如打开一个文件,最底层的函数不是修改这个函数,而是拿到了一个句柄(其实这个句柄就像是一个读写头)。我们发现我们要去知道一个时间,他并不是通过函数计算出来的,读取时间其实本身也是一个文件,因为时间能够被读,这就意味着它是文件而不是什么别的东西。

这样看来,我们如果熟悉了 unix,我们很难想象有什么是不可以被读写的,或者不可以被读写表示的。我们举个例子,我们看到点击,连点击都是读写,点击意味着是发生了一个事件,而且这个事件传递给了一个对象,点击引起了屏幕和应用状态的改变,本质上也是一种 side effect,什么提供了机制?仍然是句柄——注册一个函数,在它被点击的时候调用出来,从这个角度来说,事件其实意味着背后有一个事件池,而绑定事件其实是把这个事件的句柄写进这个事件池。

再没有比事件更复杂的抽象了,对于 unix 来说。这种东西基本是 unix 的极限的,如果说读写某个东西是一个低维度的句柄,而我们能够控制我们怎么读写一个东西,以及控制这种读写本身,无疑是一个高维度的句柄。就在这两种句柄里,我们发现他们可以解释所有 unix 的概念和他们的逻辑:真的就这样就可以了,不需要别的东西了。比如,网络。网络是什么?网络仍然是句柄,网络是什么的句柄?网络的背后是套接字(socket),而套接字仍然是某种概念上的句柄。

lisp 不是这样看的,在 lisp 那里,没有什么事件,世界是一堆的钩子(hook)。我们定义一个钩子,比如说叫“在文件打开的时候”,然后我们把事件挂上去(而不是写进去)。但什么是挂上去?挂上去其实是对列表的操作,意味着对列表追加的一个内容。我们是说事件(onXXX)还是说钩子(hook-of-xxx),虽然实现了类似的功能,但是他们的确不是一样的世界观。

Thinking in files, you will understand the linux. Talk to handler, that is all the mechanism. 这两条规则其实可以总结为 linux 的普遍法则。

Unix 的核心概念是句柄(Handler),就是这个意思。
为了倡导辩证法和宇宙的终极奥义,我说,你们的这种认识是错误的。
头像
LTaoist
使徒
 
帖子: 360
注册: 周日 3月 31日, 2013年 3:46 pm
Cash on hand: 190.80
Bank: 0.80
地址: 帝都
送出感谢: 57
收到感谢: 9
勋章: 2
I knew SuSE from Day One! (1) Donator (1)

回到 开发与开发工具

在线用户

正在浏览此版面的用户:十六薙夜血 和 1 位游客