值得學習的C/C++開源專案
轉自http://ezlippi.com/blog/2014/12/c-open-project.html
值得學習的C語言開源專案
Libevent
libev是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和訊號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且程式碼精簡(4.15版本8000多行),是學習事件驅動程式設計的很好的資源。
下載連結:https://github.com/libevent/libevent
Memcached
Memcached 是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提供動態資料庫驅動網站的速度。Memcached 基於一個儲存鍵/值對的 hashmap。Memcached-1.4.7的程式碼量還是可以接受的,只有10K行左右。
下載地址:
Redis
Redis 是一個使用 C 語言寫成的,開源的 key-value 資料庫。Redis支援的操作和資料型別比Memcached要多,現在主要用於快取,支援主從同步機制,Redis的學習可以參考<>一書。
Webbench
Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的效能,最多可以模擬3萬個併發連線去測試網站的負載能力。Webbench使用C語言編寫, 程式碼實在太簡潔,原始碼加起來不到600行。
APR(Apache Portable Runtime)
這是由 Apache 社群維護的 C 開源庫,主要提供作業系統相關的功能(檔案系統、程序、執行緒、使用者、IPC)。此外還提供了一些網路相關的功能。
APR 原先是 Apache Web 伺服器的一個組成部分,後來獨立出來,成為一個單獨的開源專案。
主頁:https://apr.apache.org
NGINX
Nginx是由俄羅斯軟體工程師Igor Sysoev開發的一個高效能的HTTP和反向代理伺服器,具備IMAP/POP3和SMTP伺服器功能。Nginx最大的特點是對高併發的支援和高效的負載均衡,在高併發的需求場景下,是Apache伺服器不錯的替代品。目前,包括新浪、騰訊等知名網站已經開始使用Nginx作為Web應用伺服器。
主頁:
Tinyhttpd
tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部程式碼只有502行(包括註釋),附帶一個簡單的Client,可以通過閱讀這段程式碼理解一個 Http Server 的本質。
cJSON
cJSON是C語言中的一個JSON編解碼器,非常輕量級,C檔案只有500多行,速度也非常理想。
cJSON也存在幾個弱點,雖然功能不是非常強大,但cJSON的小身板和速度是最值得讚賞的。其程式碼被非常好地維護著,結構也簡單易懂,可以作為一個非常好的C語言專案進行學習。
CMockery
cmockery是google釋出的用於C單元測試的一個輕量級的框架。它很小巧,對其他開源包沒有依賴,對被測試程式碼侵入性小。cmockery的原始碼行數不到3K,你閱讀一下will_return和mock的原始碼就一目瞭然了。
主要特點:
- 免費且開源,google提供技術支援;
- 輕量級的框架,使測試更加快速簡單;
- 避免使用複雜的編譯器特性,對老版本的編譯器來講,相容性好;
- 並不強制要求待測程式碼必須依賴C99標準,這一特性對許多嵌入式系統的開發很有用
Lua
Lua很棒,Lua是巴西人發明的,這些都令我不爽,但是還不至於臉紅,最多眼紅。
讓我臉紅的是Lua的原始碼,百分之一百的ANSI C,一點都不摻雜。在任何支援ANSI C編譯器的平臺上都可以輕鬆編譯通過。我試過,真是一點廢話都沒有。Lua的程式碼數量足夠小,5.1.4僅僅1.5W行,去掉空白行和註釋估計能到1W行。
下載地址:http://www.lua.org/
SQLite
SQLite是一個開源的嵌入式關係資料庫,實現自包容、零配置、支援事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C程式碼,250K。
下載地址:http://www.sqlite.org/ 。
UNIX v6
UNIX V6 的核心原始碼包括裝置驅動程式在內 約有1 萬行,這個數量的原始碼,初學者是能夠充分理解的。有一種說法是一個人所能理解的程式碼量上限為1 萬行,UNIX V6的核心原始碼從數量上看正好在這個範圍之內。看到這裡,大家是不是也有“如果只有1萬行的話沒準兒我也能學會”的想法呢?
另一方面,最近的作業系統,例如Linux 最新版的核心原始碼據說超過了1000 萬行。就算不是初學者,想完全理解全部程式碼基本上也是不可能的。
NETBSD
NetBSD是一個免費的,具有高度移植性的 UNIX-like 作業系統,是現行可移植平臺最多的作業系統,可以在許多平臺上執行,從 64bit alpha 伺服器到手持裝置和嵌入式裝置。NetBSD計劃的口號是:”Of course it runs NetBSD”。它設計簡潔,程式碼規範,擁有眾多先進特性,使得它在業界和學術界廣受好評。由於簡潔的設計和先進的特徵,使得它在生產和研究方面,都有卓越的表現,而且它也有受使用者支援的完整的原始碼。許多程式都可以很容易地通過NetBSD Packages Collection獲得。
值得學習的C++開源專案
LevelDb
LevelDb是谷歌兩位大神級別的工程師發起的開源專案,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型資料永續性儲存的C++ 程式庫。
它是一個持久化儲存的KV系統,和Redis這種記憶體型的KV系統不同,LevelDb不會像Redis一樣狂吃記憶體,而是將大部分資料儲存到磁碟上。
其次,LevleDb在儲存資料時,是根據記錄的key值有序儲存的,就是說相鄰的key值在儲存檔案中是依次順序儲存的,而應用可以自定義key大小比較函式,LevleDb會按照使用者定義的比較函式依序儲存這些記錄。
Boost.Asio
它是非同步輸入輸出的核心。 名字本身就說明了一切:Asio 意即非同步輸入/輸出。該庫可以讓 C++ 非同步地處理資料,且平臺獨立。非同步資料處理就是指,任務觸發後不需要等待它們完成。相反,Boost.Asio 會在任務完成時觸發一個應用。非同步任務的主要優點在於,在等待任務完成時不需要阻塞應用程式,可以去執行其它任務。
非同步任務的典型例子是網路應用。如果資料被髮送出去了,比如傳送至 Internet,通常需要知道資料是否傳送成功。 如果沒有一個象 Boost.Asio 這樣的庫,就必須對函式的返回值進行求值。但是,這樣就要求待至所有資料傳送完畢,並得到一個確認或是錯誤程式碼。而使用 Boost.Asio,這個過程被分為兩個單獨的步驟:第一步是作為一個非同步任務開始資料傳輸。 一旦傳輸完成,不論成功或是錯誤,應用程式都會在第二步中得到關於相應的結果通知.主要的區別在於,應用程式無需阻塞至傳輸完成,而可以在這段時間裡執行其它操作。
SGI STL
SGI STL是STL程式碼的經典實現版本,雖然很多編譯器不直接使用這個版本,但是很多卻在此基礎之上進行改進的。比如GNU C++的標準庫就是在此基礎之上改進的。這份程式碼還有一個好處是有註釋,程式碼書寫非常規範,只要花些時間讀懂它並非難事。
Muduo
muduo 是一個基於 Reactor 模式的現代 C++ 網路庫,它採用非阻塞 IO 模型,基於事件驅動和回撥,原生支援多核多執行緒,適合編寫 Linux 服務端多執行緒網路應用程式。