`
zsxxsz
  • 浏览: 452010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

我为什么要发明一个轮子?

阅读更多

      现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 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简繁体转换网关用的就是它),有兴趣的朋友可以下载试试。

 

个人微博:http://weibo.com/zsxxsz

github: https://github.com/acl-dev/acl

分享到:
评论
1 楼 foxbryant88 2015-11-15  
膜拜中~

相关推荐

    用于标记图像中物体边界框以训练神经网络 YOLO 的 GUI.zip

    你为什么要重新发明轮子?你傻吗?当我使用预先存在的程序来注释 YOLO V3 的训练集时,我感到非常无聊......所以我想为什么它这么无聊?我找到了答案。答案是,预先存在的程序并不敏感。所以我决定制作一个用于物体...

    TRIZ方法_关于发明创造的工程性方法

    总的来说,TRIZ提供了一个框架,让工程师和创新者能够系统性地处理复杂问题,跨越不同领域和行业,借鉴历史上的成功案例,避免重复发明轮子,从而加速创新进程。通过掌握TRIZ方法,个人和企业可以提升其解决问题的...

    决不重新发明轮子.docx

    在创新的道路上,"决不重新发明轮子"是一种智慧的体现,尤其在信息技术领域,其重要性愈发凸显。该理念的核心在于,在面对快速变化的技术环境和激烈的市场竞争时,企业应避免重复他人的劳动成果,而是应更多地注重在...

    了不起的轮子PPT课件.pptx

    这份课件向我们展示了一个简单的发明如何成为人类文明进步的关键,并促使我们对这一“了不起的轮子”背后所蕴含的智慧和便利性有了更加深刻的认识和赞赏。轮子的历史,就是人类不断探索、创新和突破的历史,它的故事...

    用于使轮胎就位在轮子上的气动轮胎就位器的制作方法.docx

    - 设备包含一个快速空气释放(RAR)气阀,与空气罐连接,能快速释放增压空气。 4. **RAR气阀结构**: - RAR气阀内置活塞,活塞在缸内可滑动,控制腔室内有压缩弹簧和柔性衬垫。 - 活塞有控制气体通道,允许受限的...

    《他发明了什么》教学设计.pdf

    很抱歉,由于没有提供具体的文件内容,我无法直接生成与《他发明了什么》教学设计相关的详细IT知识点。但是,我可以根据标题推测这可能是一份关于科技历史或创新发明的教学资料,因此,我可以概括一些与发明和科技...

    发明轮子之“红黑树 二”

    通过阅读博客文章"发明轮子之“红黑树 二”",我们可以期待作者对红黑树的深入解析,包括更复杂的操作如旋转和颜色调整,以及如何在实际编程中应用这些概念。"redblacktree"这个文件名可能是该系列教程的源代码示例...

    中班科学轮子PPT学习教案.pptx

    在互动式的教学中,教师可以引导孩子们思考轮子为什么能省力,不同材料和设计的轮子有哪些优缺点,激发他们对科学的兴趣和探索精神。同时,这也是一种寓教于乐的方式,让孩子们在愉快的学习氛围中掌握知识,提升科学...

    省力的轮子PPT课件.pptx

    轮子作为人类历史上重要的发明之一,它的出现极大地改变了人类的生产和生活方式,提升了工作效率,减轻了人力负担。 首先,轮子的主要特点包括圆形结构、旋转运动和滚动摩擦。圆形设计使得轮子在转动时具有连续性,...

    轮胎压保持系统、带轮胎的车轮、车辆和轮胎用阀门部件的制作方法.docx

    为了提高系统的稳定性和效率,本发明还提出了释放阀和逆流防止阀之间的相互关联设计,确保当一个开启时,另一个关闭,避免了功能上的冲突,并增强了系统的整体性能。 气泵的驱动机构作为该系统的关键部分,其设计...

    轮胎的发展史-wy.ppt

    轮胎的发展历程可以追溯到19世纪初,最初...从最初的木制轮子到现在的高科技轮胎,每一个重大创新都代表了科技进步对交通出行的巨大影响。轮胎技术的演变不仅提升了驾驶体验,也直接影响了汽车工业和交通运输业的发展。

    科学1年级上册第12课《轮子的故事》知识课程拓展.ppt

    《轮子的故事》是小学科学课程中的一个章节,旨在向孩子们介绍人类历史上重要的发明——轮子,以及它如何改变了我们的生活方式。本课不仅涵盖了基础知识,还拓展了与轮子相关的一些科技发展和交通工具的进步。 首先...

    轮子的秘密.doc

    总之,《轮子的秘密》通过一系列精心设计的活动,将复杂的科学原理转化为孩子们喜闻乐见的学习内容,使他们在探索轮子的奥秘的同时,也学会了如何运用这些原理去理解世界,培养了他们的好奇心和探索精神,为他们未来...

    科学《有趣的轮子》教案.doc

    从最初的简单木轮到如今的多样化轮胎,孩子们将通过生动的故事和丰富的图片,了解人类如何一步步将轮子从一个简单的工具,发展到复杂多样的现代形式。这一过程不仅仅是技术的进步,更是人类智慧的体现。通过对轮子...

    我发明的两用裤作文.doc

    这篇文档实际上是一个学生的作文,描述了他发明的一种两用裤,这种裤子在雨天既能防止鞋子被打湿,又能在非雨天保持整洁。虽然这不是一篇真正的IT知识文章,但是我们可以从中提取出一些创新思维和问题解决技巧,这些...

    重新发明轮子:这些是我遇到的一系列面试问题的集合,我被要求重新发明轮子

    在IT行业中,"重新发明轮子"通常是指在已有成熟解决方案的情况下,重新设计或实现一个功能,这在面试中常用来考察候选人的基础理解、问题解决能力以及编程思维。本篇将围绕Go语言,深入探讨可能出现在面试中的相关...

Global site tag (gtag.js) - Google Analytics