如何閱讀protobuf源碼?
protobuf非常強大易用,但是我想閱讀源碼不知如何下手。
這是個平台無關的庫,裝個VS2017,把它編譯運行起來,單步跟蹤、goto definition什麼的都很方便。
protobuf 大概分成兩部分:compiler 和 runtime 。
compiler 的前端是手寫的遞歸下降 parser ,如果你學過編譯原理,很容易讀懂。這個編譯器的後端是各個目標語言的代碼生成器,可以選你熟悉的來讀。前後端通過 descriptor 聯繫起來,非常清晰,也便於擴展。
runtime 主要功能是序列化和反序列化。每個目標語言各有一套,可以根據需要來讀,一般要結合生成的代碼一起讀。
我就提示幾點:
- Protobuf有一套插件體系,protoc編譯器將協議的schema描述通過標準輸出發送給插件,以達到跨語言而又無需使用Protobuf源碼就可實現插件功能。
2. Protobuf分析協議schema的詞法器支持注釋讀取,這點比大多數編譯器要高級而且複雜一些。
3. Protobuf的C++實現比其他語言多了一套動態消息,文件是dynamic_message。如果你不寫C++這塊可以忽略,動態消息的功能在其他語言里會通過語言的反射直接實現,不需要為C++這麼封裝。
4. Protobuf的流是可以抽象的,從內存、文件到zip文件,有相應的類進行描述。
5. 最新3.x版本的Protobuf的代碼實現比2.x複雜很多,如果實在看的困難可以下載2.x的代碼看下,老版本特性少一些,代碼和生成代碼相對簡單。
帶著工程問題去閱讀源碼才是最好的打開方式。瞎讀會浪費很多時間。
譬如,protobuf 是如何壓縮解壓縮數據的,是如何組織數據,如何實現反射等等等。
多提問,多實踐。我感覺題主的學習方法好像有點不是特別好,我覺得應該先看原理介紹,理解了原理以後自己根據原理實現一次,實現完了以後再和官方的源碼做對比,看看自己還有哪些地方考慮的沒有官方全面、做的沒有官方好,然後針對自己平時的使用需求,分析如何更有針對性的優化設計和實現會更好,並進行相應的測試和分析。所以,官方的源碼應該是相關原理的一種參考示例,而不是學習教科書。
建議第一步是在草稿紙上序列化和反序列化一個複雜message,第二步是給protobuf寫測試代碼,後面的事情都是水到渠成
推薦閱讀:
※為什麼說 Scala 是 JVM 上的 C++?
※C++ 中 cout 是個對象,包含頭文件後可以直接用,那麼它是在哪裡定義的呢?
※學習c++多線程編程主要用pthread還是c++11中的thread類?