现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 C 语言版的 acl 框架库时有人认为是这个轮子是否值得发明,而当我再开发出基于 acl 的 C++ 版的 acl_cpp 库时,自然更有人指出这是重复发明了。其实就是否应该重复发明轮子的问题,我并不想从理论上来说明什么,只是想从实践角度来说明发明这两个轮子的意义。
一、acl 的含义是什么?
acl 最早叫 Advanced C Library,因为它确实比标准 C 库提供了更多有价值的功能,同时屏蔽了底层 API 的一些容易出错的地方;后来觉得似乎叫 a C library 也不错。
二、acl 最早是怎么产生的?
在早期写一些网络服务器程序时,对于网络读写操作,每次都得要调用系统 API 中的 read/write 操作,不仅容易出错,而且写起来效率低下,考虑到网络流的读操作最常用的无非就是读一行、读 N 个字节之类的操作,写操作也主要以写一行数据或写 N 个数据为主,而如果直接使用 read/write 两个 API 来实现,则就会麻烦许多,所以不如写一个简单实用的库,在参考了 Stevens 的网络编程的书以及 Postfix 中有关流的实现后,也实现了一个网络流的读写库,后来不断完善这个功能库,并在应用程序中到处拷贝。后来觉得拷贝实在麻烦,于是编成了静态库。
三、acl 是如何演变的?
随着时间的推移,觉得应该增加更多的功能库,所以就有了字符串处理函数库(ACL_VSTRING)、常用的数据结构(哈希表、动态数组等),其中很多库都是由 Postfix 中的代码修改而来。其中最有价值的改变是移植 Postfix 的服务器框架到 acl 库中,这个移植过程是艰辛而漫长的,但最终的结果却是令人满意的,从当初到如今,笔者依然认为 Postfix 的服务器框架是所见过的服务器程序中(Apache,Squid,Nginx,Ircd,etc,这些服务器除了 Apache 的一些代码最终转为 apr 库外,其它的服务器程序都是高度集成的,很难分离)最强大的:安全、稳定、高效。至此,acl 库最基础的东西有了,相较于 glib 这些仅提供函数功能库的项目而言,acl 框架库不仅有常用的函数功能库,而且有象 Postfix 这样高度抽象的服务器框架。其实经常用 JAVA 开发的程序员可能无法想象,当用 C 进行开发时,开发一个普通的服务器程序是多么地麻烦,尤其是十年之前的国内,有了 acl 库从 Postfix 移植而来的服务器框架,开发服务器程序这项工作变得异常简单了。
然后经过自己的日积月累,又增加了线程池、非阻塞 IO、数据库操作(主要是 mysql)等各种库,因为有段时间一直在修改 Squid,所以对于 Http 协议比较熟悉,因此而产生了 HTTP 协议库,后来偶然的项目因素,又增加了 PING 协议库。
2008年,公司要求开发 WINDOWS 下的针对 FLASH 视频的 P2P 加速项目(主要是觉得视频太费带宽了,谁叫中国的带宽这么贵呀),而当时的 acl 库虽然在 UNIX 环境已经相对成熟了,但还不支持 WIN32,而做 P2P 项目也确实需要网络通信及 HTTP 协议解析,于是花最短的时间将 acl 的网络通信及 HTTP 协议部分移植到 WINDOWS 平台,从而保证了 P2P 项目的完成(现在在网上搜索“和讯风驰”应该还能看到这个P2P的视频加速软件)。既然移植了一部分 acl 中的库,于是痛下决心,经过无数个夜晚的煎熬,终生把 acl 库中的绝大部分函数库(除服务器框架外,目前也是如此)移植到 WINDOWS 平台上了,然后再经过漫长的完善与修改,acl 库现在终于可以支持 win32/linux 平台了,而且也相对稳定了。当然,现在在 acl 库中还有 xml/json 数据格式的流式解析库,丰富的网络功能库(包括DNS 解析、取网卡信息、监听服务、远程连接服务等),事件引擎库(支持select/poll/epoll/kqueue/devpoll/iocp/win32 msg),编码库(包括字符集编码,xml/url 编码,简繁体转换等),单元测试库等。
四、acl_cpp 库的演变过程
自从有了 acl 的库,本人及一些同事在写网络服务器程序时可以非常容易地实现,因为 acl 库有常用的数据结构,所以也不需要使用类似于 glib 第三方的 C 函数库。但后来觉得用纯 C 开发程序还是工作效率较低,所以就尝试着把 acl 库中一些功能库用 C++ 语言进行二次封装,于是便产生 acl_cpp 库,acl 中确实有一些比较有特色的函数库,这些基本都在 acl_cpp 中得到体现。当然 acl_cpp 中还有一些额外的功能库:邮件 mime 流式解析库、handlersocket 库,memcached 客户端库、IPC 通信库、字符集转换库(封装了 iconv)、数据压缩库(封装了 zlib)等多种函数库。acl_cpp 并不是对 acl 库的简单的封装,很多地方都做了优化和扩展,同时在兼顾运行效率的前提下更注重设计。
另外,acl_cpp 也是跨平台的,同时支持 linux 和 win32 两个平台。
五、例子
为了验证 acl 及 acl_cpp 库的功能性及健壮性,也写了大量的例子,从不同角度测试两个库,同时绝大多数例子都在 valgrind 检查过。
六、将来的 acl&acl_cpp 库的发展规划
将来 acl 和 acl_cpp 两个库会继续扩充与发展,只是发展的角度不同,acl 库更注重底层运行效率,acl_cpp 则更注重应用的功能性及开发易用性,此外,希望能开发出一些基于 acl&acl_cpp 框架库更有价值的应用出来,供广大网友使用。对了,jaws 就是一个比较简单的支持 HTTP 协议的 web 服务器及 web 代理服务器(目前和讯的WEB简繁体转换网关用的就是它),有兴趣的朋友可以下载试试。
github: https://github.com/acl-dev/acl
相关推荐
如何避免产品设计中的「生造方案」和「重新发明轮子」? .doc
我想发明智能机器人作文3 为什么叫保姆机器人呢?那是因为这种机器人和保姆一样可以干活。 我想发明智能机器人作文全文共3页,当前为第1页。我设计的这种保姆机器人,头部和人差不多,会思考,会说话。身体是一个...
决不重新发明轮子.docx
如果您对于大量有关面向服务架构的宣传感到晕眩,那么您并不是惟一的一个。在最近的会议上,一个习惯于使用COBOL编码的与会者问道,SOA和他所使用的COBOLcopybook之间的区别在哪里。我从未使用过COBOLcopybook,但是...
重新发明轮子这些是我遇到的一系列面试问题的集合,我被要求重新发明轮子。
NULL 博文链接:https://changzhiwin.iteye.com/blog/505946
NotRetrofit, 为Android和Java类型的安全REST客户端 NotRetrofit ( 实验)贡献者。NotRetrofit将你的REST API 转换为Java接口。... 那么为什么要重新发明轮子? NotRetrofit是第一个用生成的代码实现完整栈的。 指导原则
为什么要重新插入车轮? 你傻吗? 当我使用现有程序注释YOLO V3的训练集时,我感到非常无聊... 所以我想为什么这么无聊? 我找到了答案。 答案是预先存在的程序不敏感。 因此,我决定制作一个敏感的图像标记...
我现在知道,这听起来像是在重新发明轮子,与它的进化后代相比,这太糟糕了,但这只是一个旨在自动化移动应用安全评估的更大项目的一部分。 现在要能够使用转发器,您只需要安装mimtproxy python模块即可。 到那里...
在讲解tmd_tpl的使用方法之前,我要先讲讲为什么要重新发明这个轮子。 那我们要从这世界上所谓的PHP模板引擎都为大家做了哪些贡献说起。 在PHP界谈模板引擎,必不可免的要拿Smarty开刀, 这个无比傻帽的却又带有...
造轮子的目的,不是去重复的发明轮子,而是实际的去动手制作轮子。把一些公认的算法,优秀的思想,用自己的方式表达一下,锻炼一下,让知识成为自己思想的一部分。而不总是去google去百度,xxx好还是zzz好,而是能够...
在讲解tmd_tpl的使用方法之前,我要先讲讲为什么要重新发明这个轮子。那我们要从这世界上所谓的PHP模板引擎都为大家做了哪些贡献说起。在PHP界谈模板引擎,必不可免的要拿Smarty开刀,这个无比傻帽的却又带有一点点...
为什么要浪费时间重新发明轮子? 让自己陷入发明者的脚下并感受到他/她/他们的痛苦。 如果我一开始不知道如何创建产品,该如何期望对产品进行改进/工作? 当您可以重新定义并满足您的需求时,为什么要绑定到软件包...
也许某个人发现一个模块正是他想要的, 但是却不知道如何使用它. 也许某个人为他的任务挑选的不合适的模块. 也许某个人已经厌倦了发明新轮子. 大多时候, 一个简短的例子要比一份手册文档更有帮助
跑表一个超简单的 ...” 我同意,如果你已经有一个完美的轮子,为什么要“重新发明轮子”? 好吧,正如您即将发现的那样,我们并没有重新发明任何东西(还没有!),只是通过构建我们已经知道的东西来
Delphi让我们搭建一个程序变得容易,我希望通过我们的努力,让我们搭建一个项目更容易,利用我们可以想到的任何办法,不管是框架源代码、模版文档、代码生成工具甚至是我们手把手经验的交流,我们的目标就是让一个...
Docker 已经有很多 Java 镜像(例如,在 Docker Hub 中),那么为什么要重新发明轮子呢? 一开始我使用了 。 它运行良好,但仍有一些改进空间: 基本操作系统映像- 它是从构建的,这可能不是最小的映像。 另一...
Docker 已经有很多 Java 镜像(例如,在 Docker Hub 中),那么为什么要重新发明轮子呢? 一开始我使用了 。 它运行良好,但仍有一些改进空间: 基本操作系统映像- 它是从构建的,这可能不是最小的映像。 另一...
我不打算让它稳定或完全可用(已经有一堆成熟、强大的库,为什么要重新发明轮子?)。 然而,我打算尽可能多地学习游戏物理知识,而构建这个库可以帮助我做到这一点。 我也在记录了所有这些工作所以四处看看,检查...