底层和封装

2019-09-10

写这篇是源于我开的新坑tinyserver,尝试着研究一下select、poll、epoll技术。

最开始我是用C语言来写的,但进展非常缓慢。

当然很大的原因是我并不是一个C语言高手,只能算是掌握,并不熟悉“最佳实践”,比如我就曾花了一个晚上来考虑,要分割字符串到底是用strtok,strtok_r,strsep哪个好,这样自然写起来慢。

另一点,因为C更加“底层”,必须关注更多底层细节。比如内存方面:内存的申请和释放都需要特别注意。而参数传递也需要注意,有的api参数接受的是值,有点则接受的是地址(指针),传入地址可能其指向的值会被修改(传入传出参数),传来传去像我这样经验不多的人,很容易就搞蒙了。正因为C需要关注更底层的细节,使得C能更直接操作硬件,也造就了其无与伦比的性能 —— 但需要有足够的经验才能用好C。

随后我用Python试着重写tinyserver,一切换到Python,我就感受到了生产力的极大提高——需要说的是我也并不是深入掌握Python,属于掌握基本语法+查询文档的那一档。Python 真的太方便了,几乎你能想到的操作,都有很方便的、易于理解的接口供你调用。

举个例子:我需要在服务端建立一个TCP server 来监听客户端的连接,那么大概就是这几个步骤:

对于C语言来说,这几个步骤看似简单,但里面仍有不少细节需要实现,比如地址的初始化和转换(serveraddr、sockaddr),主机字节序和网络字节序(大端序)的转换等,实现起来无疑是繁琐的。我用了二十行代码 才实现了一个创建socket、bind、listen操作。而在 Python中几行即可搞定 无需考虑太多细节,因为标准库的在背后帮我们做了这些事情。

上面的建立server socket的例子只是一个缩影,看看Python标准库中那些接口,就能明白为什么Python能这么流行,特别是在新手中,因为直接调就完事了!

到了这里,C 对比 Python ,或者说 C 对比其他更高级抽象的语言,它们的区别就是:底层和封装之分。

C提供了足够的底层操作,也就提供了极致的性能,但也带来繁琐;而高级语言带来了便利,也屏蔽了底层操作。这就需要取舍,而大多数人需要的是便利而不是底层细节。