我爲何要發明一個輪子?

      如今成熟的開發庫與開發框架有不少,因此平時咱們在開發本身的應用程序時通常直接拿來用就能夠了,因此當我先是開發出 C 語言版的 acl 框架庫時有人認爲是這個輪子是否值得發明,而當我再開發出基於 acl 的 C++ 版的 acl_cpp 庫時,天然更有人指出這是重複發明了。其實就是否應該重複發明輪子的問題,我並不想從理論上來講明什麼,只是想從實踐角度來講明發明這兩個輪子的意義。mysql

      1、acl 的含義是什麼?linux

      acl 最先叫 Advanced C Library,由於它確實比標準 C 庫提供了更多有價值的功能,同時屏蔽了底層 API 的一些容易出錯的地方;後來以爲彷佛叫 a C library 也不錯。程序員

      2、acl 最先是怎麼產生的?web

      在早期寫一些網絡服務器程序時,對於網絡讀寫操做,每次都得要調用系統 API 中的 read/write 操做,不只容易出錯,並且寫起來效率低下,考慮到網絡流的讀操做最經常使用的無非就是讀一行、讀 N 個字節之類的操做,寫操做也主要以寫一行數據或寫 N 個數據爲主,而若是直接使用 read/write 兩個 API 來實現,則就會麻煩許多,因此不如寫一個簡單實用的庫,在參考了 Stevens 的網絡編程的書以及 Postfix 中有關流的實現後,也實現了一個網絡流的讀寫庫,後來不斷完善這個功能庫,並在應用程序中處處拷貝。後來以爲拷貝實在麻煩,因而編成了靜態庫。sql

      3、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 協議庫。json

      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 編碼,簡繁體轉換等),單元測試庫等。數組

      4、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 兩個平臺。

      5、例子

      爲了驗證 acl  及 acl_cpp 庫的功能性及健壯性,也寫了大量的例子,從不一樣角度測試兩個庫,同時絕大多數例子都在 valgrind 檢查過。

      6、未來的 acl&acl_cpp 庫的發展規劃

      未來 acl 和 acl_cpp 兩個庫會繼續擴充與發展,只是發展的角度不一樣,acl 庫更注重底層運行效率,acl_cpp 則更注重應用的功能性及開發易用性,此外,但願能開發出一些基於 acl&acl_cpp 框架庫更有價值的應用出來,供廣大網友使用。對了,jaws 就是一個比較簡單的支持 HTTP 協議的 web 服務器及 web 代理服務器(目前和訊的WEB簡繁體轉換網關用的就是它),有興趣的朋友能夠下載試試。

 

我的微博:http://weibo.com/zsxxsz

相關文章
相關標籤/搜索