大山姆的機機車車™ #6

我是山姆,《大山姆的機機車車™》是我的第一份電子報,希望透過這份小報,把我感興趣的資訊分享給同樣求知若渴的您。

༺ 議題討論 ༻

前二期我摘了 2D Graphics Library 是否納入 C++ 標準的議題,並提出我的看法。Sidney Niu 對此議題的看法與我不同,轉載如下:

這幾期都有提到 C++20 在討論是否要將圖形庫納入標準,實際上現在各家繪圖函式庫的開發社群也都在觀望中。
我個人是偏向支持 SDL2 併入 C++20 或未來的標準。第一個理由是目前的傾向是未來有 C++ on GPU 平行運算,這表示語言可以直接使用初步的繪圖卡指令,那圖形介面真的不是大問題。第二個理由是 boost::filesystem 併入標準也說明了 C++ 並不是非跨平台語言。第三個理由是標準訂下去不見得都會被完整實作,實際上現在三家編譯器 STL 的行為都有不一樣的地方。

SDL2 納入 C++ 標準的難度頗高,主要原因:SDL2 使用 C 語言實作,而非 C++。技術問題好解決,政治問題嘛 ...😏。

我認為各家編譯器 STL 的行為有不一樣的地方不應該被視為「功能」,較正面的做法是努力消除這種情況到越少越好,對 C++ 社群以及開發人員才是好事。

「因為本來就有不一樣的地方,所以再多一些有何不可?」

制定標準的目的在於讓編譯器廠商實作時有所依循,而且大家的目標一致:讓 C++ 程式碼在改動最小甚至完全不用改動的情況下,編譯器吃進去吐出來的程式執行的行為一致。與此原則相違背的提案,我認為都不應該納入標準。各位覺得呢?


人物誌

Fabien Sanglard

這個傢伙擅長由原始碼分析軟體專案,而且鍾情於電腦遊戲。多年來分析了《Doom(毁滅戰士)》、《Quake(雷神之槌)》《Wolfenstein 3D(德軍總部)》、《Duke Nukem 3D(毀滅公爵)》,GIT,還有很多很多

Fabien Sanglard 在《Doom 3 BFG》Code Review 的優秀表現獲得傳奇碼農,前 id Software 頭頭 John Carmack 的肯定。Fabien Sanglard 是法國人,2014 年被 Google 吸收。

題外話,我最喜歡的 FPS 遊戲是《重返德軍總部》(第二名是戰地風雲系列,尤其是 BFBC2),十多年前跟好友多人連線,是一段快樂的日子。

參兩摘

Why C++ is so “Hard” to Learn – adamtcroft.com

C++ 是一匹桀驁不馴的駿馬,一旦駕馭她,不僅「視野變不同」,能選擇的領域也變多了。學 C++ 不需要過人的智力,正確的學習心態才是成功的關鍵--耐心不求快,堅持不放棄。本文作者以自身經驗告訴我們,自認水準一般般的他都能學會 C++(還寫書),其他人一定行的。

you’ll know something a lot of people are freaked out by – and you can be proud of yourself

A Foolish Consistency – // info

有兩種 C++ 人-"East Const" and "West Const"。蝦小,常數宣告也分東西邊?是的,const 寫法有兩種,「相傳」是為了相容於 C 語言,不過我還沒查證。兩種寫法的差別在於 const 是在所「修飾」的型別左邊(West)還是右邊(East):

East Const

float const kSamHeight = 182.5;

West Const

const float kSamHeight = 182.5;

這很重要嗎?多數時候不重要,但重要的時候很重要。現在不是重要的時候,以後再寫文章說明究竟有多重要。現在就想知道?可以先啃這個討論串

本文作者在 C++ 圈頗有「份量」,這篇文章主要是抱怨 C++ Core Guidelines 裡建議使用 West Const 的理由竟然是「比較多人用、大家都這麼用,很多專案都這麼用了...」。

作者認為 East Const 可以讓 C++ 標準更簡潔,本來是這樣:

const modifies what is on its left. Unless there is nothing on its left, in which case it modifies what’s on its right.

可以縮減成這樣:

const modifies what is on its left.

越簡單越不容易出意外,這道理說得通。但 C++ Core Guidelines 基於現實的考量也不算錯。說那麼多,我是 "West Const" 派,你是什麼派呢?

最後,作者的部落格網域頗有新意,你看出來了嗎?

Jonathan Boccara is creating the Fluent C++ blog

Fluent C++ 是這兩年竄起的部落格,內容以 C++ 為主。格主的文章寫得好,累積不少讀者。今年開始推出影片。前幾天開了 Patreon,可以觀察這樣一個讀者不算少的專家,能募到多少錢。Fluent C++ 是值得觀察的部落格,讀者可別錯過。

Oboe is a C++ library which makes it easy to build high-performance audio apps on Android.

Google 釋出針對 Audio 類型的 app 所開發的 C++ library - Oboe。此專案目前還在預覽狀態,不過 JUCE 5.3 已經率先支援

GoingNative 64: C++/WinRT

我是「偽兩棲視窗流」,長期觀注 Microsoft 的各項技術,C++/WinRT 是其一。這支影片訪問兩個人,一個是先前介紹過的「鬍子K」,另一位是 Brent Rector-《ATL Internals》一書的共同作者。WinRT 可以看做 COM 技術的延伸,ATL(Active Template Library)則是開發 COM 應用程式不可或缺的工具。

Brent Rector 相當資深,透過此短片聽聽他對 C++/WinRT 這個新專案的看法。影片中鬍子K示範用 C++/WinRT 開發 Windows 應用程式大概是什麼情況。

摘影片

Chandler Carruth "LLVM: A Modern, Open C++ Toolchain"

如果 IE 是用來下載更佳瀏覽器的瀏覽器,那可以說 g++ 是用來編譯更佳編譯器的編譯器。

雖然 ISO C++17 已經出來一年了,不過目前多數的 Linux 發行版中的套件管理員僅支援 C++11/14 的編譯器,雖然部分 C++17 功能可以使用旗標 -std=c++1z,想要完整的新功能和特性還是要自己編譯新版的編譯器。

Google LLVM 團隊主導者之一 Chandler Carruth 示範 Clang 的下載、編譯以及使用,還有 AddressSanitizer 和 Clang-Tidy 的使用。

三家主流編譯器中目前公認地表最強的為 Clang(編按:我 MSVC 流,這我不承認 😤),未來會一系列介紹 Clang 優化原理。

至於MSVC 派的朋友們可能對於 GCC 旗標的使用不太熟悉,個人推薦《21 世紀 C 語言》第一二章,這本書對於初學者很友善,由淺入深教編譯器旗標還有建置系統。(編按:Red Hat 的這篇〈Recommended compiler and linker flags for GCC〉也很不錯)

By Sidney Niu

CppCon 2016: Jason Jurecka “Game engine using STD C++ 11"

暴雪工程師 Jason Jurecka 介紹遊戲引擎程式設計的細節,包含一個類別成員(Class Member)的順序與要注意資料結構對齊的問題、遊戲主迴圈和任務的排班設計。

臨界區段用 std::atomic ,執行緒池去任務佇列撈資料。有關重要的時序同步問題講者直接說不知道 std::chronostd::time 差別的人重回學校念書吧。(編按:台灣本科有教嗎?)

也有提到為了效能會大量地使用編譯時期(Compile-time)決定,未來也會慢慢介紹有關編譯時期決定的演講。

中英對照:類(class)、結構(struct)、對齊(alignment)、執行緒池(thread pool)、臨界區段(critical section)、佇列(queue)

By Sidney Niu

開源專案

luna: Yet another web framework—this time in modern C++!

講到 Web 應用程式開發,少有人想到 C++。其實世上早有 C++ Web Framework,例如這個這個還有這個。Luna 算是這個新兵,從範例碼看來蠻不錯的,初步編譯 Windows / macOS 都遇到 Conan 方面的問題,再找時間試試...

選書

Game Engine Black Book

本期人物 Fabien Sanglard 的這本書頗「硬」。剖析《Wolfenstein 3D》的遊戲引擎,id Software 到底用了什麼「魔法」得以寫出如此高效的遊戲引擎?此款遊戲在當年引領風騷,可以說是 FPS(第一人稱射擊)遊戲的濫觴。雖然科技演進速度快,但許多觀念經得起時間考驗,歷久彌新。作者花了近三年的時間(中間有段空窗期)完成此書,對遊戲開發有興趣的讀者不妨一讀,我相信必有收穫。

WorkFlowy Tips

WorkFlowy + iPhone 語音輸入=懶人輸入法

影片示範 WorkFlowy 搭配 iPhone 的語音輸入法來降低「雙手耗損」。iPhone 的語音辨識度高,加上 WorkFlowy 「剛剛好」的同步功能,成為我的「快速打稿」利器。

WorkFlowy Academy from Frank Degenaar

我從 Frank Degenaar 學到了很多有用的 WorkFlowy 撇步。Frank 寫了一本 WorkFlowy 電子書,在 WorkFlowy 官方部落格發表文章,且在去年開始了 YouTube 頻道。他的 WorkFlowy 應用術超出你的想像,錯過可惜。

想知道更多 WorkFlowy 撇步,請快步前往 WorkFlowy Tips 。還沒有 WorkFlowy 帳號?請用此連結申請加倍免費清單上限

還有還有,我在臉書開了一個以 WorkFlowy 為主題的社團——山姆的 WorkFlowy 大小撇步現在人很少,快來助拳!

💌 喜歡這一期的內容,請幫我按「👍」。不喜歡請按「👎」,並寫下你認為哪裡做得不好,你的回饋是我進步的動力。想要匿名舉報的話,我開了一個 Sarahah,歡迎使用,謝謝!

本報內含 Affiliate Link 連結若干,也就是我有機會從中獲益,賺點奶粉錢,希望有朝一日能因此日進斗金(誤)。若對這樣的作法有疑慮,請讓我知道或者直接退訂也行,我不會介意,你請別生氣。