GitHub 或者其他的開源平台中是否有一些適合初學者的 C++ 項目?

我個人的經驗是學習了C++ primer,半本演算法導論,了解並能熟練使用基本的數據結構和演算法,有一定圖像處理的經驗(Opencv,matlab之流),因為最近在看操作系統方面的書,沒啥可以寫的代碼,想順便拿個開源的項目練練手,希望大家能給我推薦一下適合初學者練手的c++項目,謝謝!


--更新--
有人吐槽怎麼下手FreeNOS,上文檔 FreeNOS: FreeNOS Documentation
--更新--

把平時關注的一些c++相關的github的project列下,歡迎補充。

1. FreeNOS
lordsergioinspa/FreeNOS · GitHub

這是我在大學的時候,接觸完整學習的第一個開源的C++項目,當時簡直是,各種驚嘆,裡面有太多值得學習的地方。
這是一個用C++實現的微內核的操作系統,各種宏內核中的服務作為一個獨立的services在微內核中,基於消息的通信方式,這點其實跟mac內核中的mach那部分機制相似。
除了是一個操作系統的實現,另外從中也能很好的學習到OOP的設計方式,整個代碼風格特別好,完全基於面相對象,還有一些常見的設計模式,在接觸了這個開源項目之後,才了解,代碼風格,注釋,doxygen,scons,設計模式。

對於直接入手就啃Linux kernel的同學,個人覺得會門檻有點高,身體還不是特別棒的時候,直接攀登珠穆拉瑪還是有點吃力的,可以先找個黃山爬爬。

2. Chromium
向左向右,怎麼看現在只有Chromium是c++中最龐大的一個,自己在造輪子的時候,可以搜索下這個寶庫,保證有各種型號的輪子。
Chromium涉及了幾乎所有的平台,所以不僅能學到平台之上API的封裝,還有包括Network的各種封裝和借口,協議的C++的實現。
更甚至,webrtc,native client,sandbox,GPU,並行加速,debug,各種神奇的第三方的庫,各種各樣的技術,能潛心學深一個,就可以功力大增。


有空在補充。。。

////////////////////updated 2.28///////////////////////////

3. Node.js
紅的發紫的項目,整個node.js 包括內部的核心V8都是C++的項目,完全的事件驅動,非阻塞IO,性能比nginx還快,可以說是把伺服器徹底的榨乾的節奏,這種設計模式,是現在比較流行的Reactor pattern ,concurrent computing。在構建一些大型的web services中,尤其凸顯優勢,現在移動互聯網時代,在做app push services的時候,後端自己實現的推送服務,基本也是這種思路,An Open Source MQTT v3.1 Broker 並發量能到幾十萬,甚至對內核參數修改過後能到上百萬。
Node.js另一個核心的組建是Marc Lehmann』s libev http://libev.schmorp.de , 基於event驅動的非阻塞IO庫,在node-v0.9.0之後,node.js項目考慮到跨平台的實現,封裝了一個項目libuv/libuv · GitHub,

  • Linux based on (epoll)
  • windows based on IOCP
  • Unix (mac os x) based on kevent

學習下,也能用在自己做不同平台高性能網路


////////////////////updated 3.1///////////////////////////
收到好多點贊,對於每天風平浪靜,只期待不給我彈error的生活,帶來些小激動的。
平時喜歡接觸一些新鮮的概念,產品,可能這也是自己選擇這個行業的一個原因,雖沒有一日如隔三秋的變化速度,但至少三月都會蹦出很多新奇的trend,技術,方向。總有一種學無止境的感覺,對於C++來說,基礎的東西變化不大,哪怕是新的標準C++0x,我的理解是實踐動手,如果有項目能去應用。
知識爆炸,我們可能無法窮盡學習所有的知識,但是可以通過github這個平台完善屬於自己的知識wiki,覺得未來應該是。
看小說,看電影,看code。
這樣一個進去我們習慣的行為。
廢話太多~~~

4. Sandstorm
sandstorm-io/sandstorm · GitHub
Github上面最近比較火的一個項目,主頁上面一句話的介紹「Personal Cloud Sandbox」。主要解決的問題是,在自己的私有人伺服器上面,安裝各種開源的雲服務(GitLab, WordPress......),就像mobile上面的通過應用商店install app那樣快速方便,實現這個目標,要在Linux之上,構建一個基於sandbox的平台,並且留給開發者porting這些web 服務 (.spk file)到應用商店。
個人覺得比較精華的是裡面sandbox部分,每個web app都是跑在LXC的container裡面的,這點是類似Docker的實現,非常高效和輕量。另外會用到seccomp機制,對web app進行系統調用過濾,保障雲主機本身的安全,這一點sandbox的安全機制跟chrome在Linux上面的實現也是一致的。

  • Sandstorm"s server-side sandboxing is based on the same underlying Linux kernel features as LXC and Docker. We use the system calls directly for finer-grained control.
  • (Planned) The kernel attack surface is reduced using seccomp-bpf to block and/or virtualize system calls.

////////////////////updated 3.2///////////////////////////
昨天被柴女神刷屏了,其實我們在用C++的時候,也是在為環境作貢獻,
C++之父在YouTube上面的視頻,C++在數據中心的使用,高性能的優勢,節省不少電。

5. BitCoin
bitcoin/bitcoin · GitHub
BitCoin這兩年很火,拋開比特幣本身,看BitCoin實現,也是C++的項目,構建在P2P網路之上的一套虛擬的支付系統。
我們可以利用的是背後的P2P Protocol,密碼學,支付,去中心化這些。
現在有很多衍生的開源項目,就是利用BitCoin 的這套P2P的框架在做,bitmessage,
https://bitmessage.org/wiki/Main_Page
完全去中心化,能防止老大哥的監聽,在現在雲計算,大數據風行的時代,privacy問題會越來越多,可以借鑒P2P的思路,構建這些去中心化的服務。


////////////////////updated 3.3///////////////////////////
6. CoreCLR
dotnet/coreclr · GitHub
沒看錯,微軟最近一直在放大招,之前開放了 .NET Core的源代碼,這次又把.NET的CoreCLR推到了GitHub。在Windows上運行一個.NET應用所需要的完整軟體棧都已經開源,對Linux和Mac OS X的支持馬上出來。微軟.NET因為整個軟體棧全部開源。開發者可以編譯自己的CoreCLR,在上面跨平台運行.NET程序。
以前Mono做的就是這個事情。對語言,編譯,相關感興趣的可以學習學習,背後開放了RyuJIT,garbage collection等一些技術。
微軟從產品公司變成服務公司,重點放在企業級市場,對桌面這塊越來越開放,節奏很好。

對.net不是很了解,拿來拋磚引玉。


////////////////////updated 3.4///////////////////////////
7. Apache Mesos
apache/mesos · GitHub
簡單介紹 下Mesos, 是twitter背後開源群集管理的核心,現在是apache上的top項目了。
下面是Mesos的architecture

有家雲計算創業公司Mesosphere,正在將這一技術推向一個更廣的高度,可以通過mesos構建的節點,抽象各個public cloud服務商,更可以方便快速的做雲遷移,從AWS可以到GCE。
提到Mesos就會出現這樣的組合,
Mesos + Docker
Docker(可能跑題了,Docker是用Go寫的)是PaaS供應商dotCloud開源的一個基於LXC 的Container引擎,虛擬化解決方案上面殺出的一個新馬。常見的搭配如下,Docker是 Mesos 的first class citizen。

技術 日新月異,是個好時代,別人造的輪子越來越好了,一直有東西學,蠻開心。


////////////////////updated 3.5///////////////////////////
8. Mongo Database
mongodb/mongo · GitHub
NoSQL, BigData

9. DOOM-3
id-Software/DOOM-3 · GitHub
最牛的遊戲engine code
還有一個cocos2d-x
cocos2d/cocos2d-x · GitHub
Itseez/opencv · GitHub

10. HHVM
facebook/hhvm · GitHub
編譯,JIT

歡迎交流討論~


  • LevelDb

LevelDb是谷歌兩位大神級別的工程師發起的開源項目,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型數據持久性存儲的C++ 程序庫。
它是一個持久化存儲的KV系統,和Redis這種內存型的KV系統不同,LevelDb不會像Redis一樣狂吃內存,而是將大部分數據存儲到磁碟上。
  其次,LevleDb在存儲數據時,是根據記錄的key值有序存儲的,就是說相鄰的key值在存儲文件中是依次順序存儲的,而應用可以自定義key大小比較函數,LevleDb會按照用戶定義的比較函數依序存儲這些記錄。

主頁:GitHub - google/leveldb: LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.

  • Boost.Asio

它是非同步輸入輸出的核心。 名字本身就說明了一切:Asio 意即非同步輸入/輸出。該庫可以讓 C++ 非同步地處理數據,且平台獨立。非同步數據處理就是指,任務觸發後不需要等待它們完成。相反,Boost.Asio 會在任務完成時觸發一個應用。非同步任務的主要優點在於,在等待任務完成時不需要阻塞應用程序,可以去執行其它任務。

非同步任務的典型例子是網路應用。如果數據被發送出去了,比如發送至 Internet,通常需要知道數據是否發送成功。 如果沒有一個象 Boost.Asio 這樣的庫,就必須對函數的返回值進行求值。但是,這樣就要求待至所有數據發送完畢,並得到一個確認或是錯誤代碼。而使用 Boost.Asio,這個過程被分為兩個單獨的步驟:第一步是作為一個非同步任務開始數據傳輸。 一旦傳輸完成,不論成功或是錯誤,應用程序都會在第二步中得到關於相應的結果通知.主要的區別在於,應用程序無需阻塞至傳輸完成,而可以在這段時間裡執行其它操作。

主頁:Boost.Asio - 1.58.0

  • SGI STL

SGI STL是STL代碼的經典實現版本,雖然很多編譯器不直接使用這個版本,但是很多卻在此基礎之上進行改進的。比如GNU C++的標準庫就是在此基礎之上改進的。這份代碼還有一個好處是有注釋,代碼書寫非常規範,只要花些時間讀懂它並非難事。

主頁:Download STL source code

  • Muduo

muduo 是一個基於 Reactor 模式的現代 C++ 網路庫,它採用非阻塞 IO 模型,基於事件驅動和回調,原生支持多核多線程,適合編寫 Linux 服務端多線程網路應用程序。

主頁:GitHub - chenshuo/muduo: A C++ non-blocking network library for multi-threaded server in Linux

看這裡值得推薦的C/C++框架和庫


mini型的tinyxml
小型的leveldb


https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System
https://github.com/sindresorhus/awesome
不知道這樣的答案是不是你要的


STL
muduo


我有十年以上一線C++經驗,所以就直接了當了.

- 大多數項目不值得看,都是一些工程代碼,有些寫得很糟糕,有些是workaround, 初學者沒有經驗,會誤把糟粕當精華
- 一定要看些開源項目,有經驗的工程師會先去把項目郵件新聞組讀一遍,了解歷史是那個有什麼坑.
- 看些小的精品C項目倒是可以,比如上面的sqlite,前提還是你要對sql有興趣
- C++坦率地說沒什麼太多工作機會,花時間學點C足夠了,何況你說在看操作系統的書,都是C的天下
- 面向對象也沒什麼神奇,最常用的也就是寫GUI庫和遊戲庫.這些你基本不會有機會去做
- 最好的學習是加入開源項目,給人報bug,這需要興趣和毅力.大多數人好高騖遠,所以也走不到這步

我並不是打擊你, 但是從你所述來看,基礎一般,比較虛,要給開源項目報高質量的bug還有點難,如果真的有對編程有興趣,至少要讀些基本的書籍:
- Writing Solid Code
- Code Complete
- 鍾道隆的所有書籍,很多人知道他的英語學習逆向法,但是他作為工程師的回憶和小結是我讀過所有書籍中最好的.
- 笛卡爾的&<方法論&>


c艹代碼庫之間質量相差極大,好的代碼和差的代碼風格迥異,這裡不與贅述。普遍認為最優秀的代碼是google家的。下面就推薦幾個常見的google代碼庫。

簡單小隻 leveldb,教科書式的存在,如果說有缺點那就代碼都是c艹98的(除了原子操作)。代碼量約20k loc。

龐大體系chromium。雖然是被開源界詬病很多,雖然官方buildbot編譯一次需要3個小時,但是其代碼涉及甚廣,基本涵蓋了客戶端(包括移動端)編程的各個角落。代碼量約2m loc(不含v8、webkit、llvm等各種依賴)。

其他的還有ninja、protobuf、google-perftools等等。除了google,普遍認為排名第二的c艹代碼庫是是apache家的,這個我涉獵甚少,就請看官自己斟酌吧。


如果有興趣和時間的話,可以加入到nfer/cppparser · GitHub項目哦
cppparser
a tools to parse c/c++ source file.


有啊,建議自己照著造一些出來,學習別人的好代碼對自己的幫助很大。我也正在努力,這是我正在造的三個輪子:
GitHub - hunterzhao/EasySTL: 學習STL過程,自己實現的STL代碼
GitHub - hunterzhao/EasyHttp: 一個簡單的http伺服器 python CGI 非常適合新手學習
GitHub - hunterzhao/Damocles: 一個web伺服器並發測試工具
厚顏無恥地歡迎大家給我點star


sourceforge上的amule,p2psearcher可就是從這個改過來的,再順便寫個爬蟲,把這兩個結合起來可是很強大的哦。


c++推薦的是stl庫的代碼和部分boost庫,坦白的來說有點難,因為裡面充斥著各種技巧。另外推薦的是虛幻4的源碼,寫的非常不錯,通俗易懂而且不時有點黑科技。它的代碼規範牆裂推薦,比谷歌的代碼規範詳細很多更加適合新手。再推薦一個c語言的開源——Lua的源碼,工整漂亮十分簡潔。


WizTeam/WizQTClient · GitHub
為知筆記開源


SQLite的代碼值得一看,不過是用C語言寫的。


只看過 primer 太基礎了... c++ 你了解多少,1w 行的小項目寫過嗎,其它語言學過嗎,其實 c++ 很多很複雜的用法比如泛型編程/boost中很多特性只是實現了其它語言中很容易的東西,如果不會用那就是帶類的 c,為什麼要用 c++ 呢,OOP 的弊端你懂么。
先別說讀源碼,優秀的 c++ 類庫你用過幾個,比如你讀過 primer 學過模板了,演算法也學了,boost.graph 圖演算法庫會用么, 源碼不多看得懂么。
開源項目都是大項目,還包括很多代碼是為了避開 c++ 的陷阱,你確定 hold 得住嗎?


推薦閱讀:

如何用c操作圖片?
有個程序猿女朋友怎麼保護隱私?
資料庫設計時的一些細節的東西如何處理?
Pythonic 是什麼意思?
如何學習 Python GUI 編程?

TAG:互聯網 | 編程 | 開源項目 | GitHub | C |