標籤:

如何閱讀protobuf源碼?

protobuf非常強大易用,但是我想閱讀源碼不知如何下手。


這是個平台無關的庫,裝個VS2017,把它編譯運行起來,單步跟蹤、goto definition什麼的都很方便。

protobuf 大概分成兩部分:compiler 和 runtime 。

compiler 的前端是手寫的遞歸下降 parser ,如果你學過編譯原理,很容易讀懂。這個編譯器的後端是各個目標語言的代碼生成器,可以選你熟悉的來讀。前後端通過 descriptor 聯繫起來,非常清晰,也便於擴展。

runtime 主要功能是序列化和反序列化。每個目標語言各有一套,可以根據需要來讀,一般要結合生成的代碼一起讀。


我就提示幾點:

  1. 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類?

TAG:protobuf | C |