這是我的第 20 篇原創文章
(題圖來自網絡並做適當修改)
1
C++是計算機語言中的絕對神器。尤其是近十多年來快速推出的新標準,C++11/14/17/20……,通常被稱為現代C++(與之相對應的舊標準,則稱為經典C++),可以做到在底層接近字節級或機器代碼級的精細操控,同時在頂層還能夠比拼Java、C#等語言,架構企業級超大型應用。這種「跨層次」性,使得通過學習C++語言所建立起的計算機科學思維,具備獨特的延展性,在各種不同場景都能撥雲見日、遊刃有餘。
C++算是我的日常工作語言之一,但是新標準的語法,我用得並不算多。很早我就希望能夠系統性地學習一遍,但始終未果。最近剛好開始閱讀Scott Meyers的經典《Effective Modern C++》,借著這個契機,我開始重新學習C++。
這本書並不是教材,它是延續早年同系列的《Effective C++》和《More Effective C++》的條款文體,對現代C++的重要內容及最佳實踐,進行詳細闡釋,屬於能力拔高型的書籍。因此,作為學習筆記,我將不限於這本書的內容,並在需要的時候,追溯到其他任何可能有幫助的資料。我的計劃是以這本書為主線,查缺補漏地,完成這次系統性的學習。
2
關於C++新標準,經歷過一段有意思的歷史。經典的C++標準是1998年發布的,被稱為C++98。在那之後的很長時間裡,C++委員會一直試圖推出新標準,卻一再延期。當時對新標準的暫命名為C++0x,然而直到2010年,新標準都未能敲定,以至於當時大家都調侃戲稱「C++0x中的0x,其實是十六進位的意思,所以我們還可以拖五六年」。直到2011年,C++11新標準最終發布,才算讓很多人都鬆了口氣,也看到了C++語言的新希望。同時,為了讓這種拖延症不再如此表現嚴重,C++委員會宣布了之後每三年就會推出一版新標準,而這規則竟然一直堅持到了今天。是的,現在C++23標準已經在向我們揮手啦。
(圖片來自:https://www.modernescpp.com/index.php/c-20-an-overview)
既然現在新標準推出這麼快,以至於很多編譯器都未必能夠很快且很穩定地全部實現。那麼,一個值得了解的問題是,到底大家在現實中會用哪套標準呢?針對這個問題,C++ Stories網站(由Bartlomiej Filipek建立並維護,他也是《C++17 in Detail》和《C++ Lambda Story》兩本書的作者)上每年年末都會在網上發起一個投票統計並展示結果,可以做參考:
(以上兩個截圖來自:https://www.cppstories.com/2021/cpp-status-2021/)
可見,還是有相當多人會快速跟進並使用較新的語言標準的,這應該與新標準帶來的語法簡化和便利性有很大關係(C++能保持向後兼容性,在不犧牲原標準的強大能力的情況下,擴展出更加簡便的語法,這也是很神奇的事)。而C++17的使用率遠高於C++20,則很可能與編譯器的支持情況等有關。所以,預期隨著C++23標準的成熟和推出,C++20的使用者人數及比例應該也會越來越多。
3
那麼,C++語言在生物信息學領域的應用又如何呢?
針對這個問題,可以在GitHub上查詢並選擇bioinformatics這個主題標籤,看到生信相關的不同語言實現的軟體倉庫數量:
(截圖自GitHub,https://github.com/topics/bioinformatics?o=desc&s=stars)
果然,Python獨佔鰲頭,其比例遠高於其他語言。而R緊隨其後。再之後就是C++(Jupyter Notebook中使用的大概率會是Python),比例大概佔到1/20。
然而,在我們通常了解到的生信培訓或課程中,幾乎沒有講授C++語言的內容。大概我們培訓的目的,主要還是希望能快速入門和上手,能夠充當工具人吧。既然如此,在我後續的筆記中,我還是有必要多結合生信的相關背景來做展開,這對於幫助生信從業者們擺脫「工具人」標籤,我想應該會有一定幫助吧。