現代C++與受控代碼的對弈:性能 vs 生產力
英文原文:Modern C++ vs Managed Code: Performance vs Productivity
最近,一場有趣的討論在微軟公司的 Herb Sutter 和 Mono 項目的 Miguel de Icaza 之間展開,話題是關于本地代碼和 Just-In-Time 編譯器的優點對比,雙方對各自的觀點都提出了比較深刻見解。把他們的觀點匯總起來,其實就可以很好地反映出本地代碼和受控代碼的發展現狀。
Herb Sutter 的觀點由他對于一個問題的回答而展開。這個問題是:“什么時候,優秀的 JIT 技術才能拯救受控代碼?”Sutter 對此的觀點可總結如下:雖然 C++ 和受控代碼經常被人們拿來針鋒相對地比較,但是,這兩種語言在性能和生產力方面做出的基本權衡策略是完全不同的。
Herb Sutter 世界首屈一指的 C++ 專家
Sutter 認為,C++的策略,主要是在側重在性能方面的提升,而不同的是,受控代碼(也就是像 Java/.NET 這些基于虛擬機的代碼)則側重在如何提高程序員的生產力。更深一步,Sutter 表示:首先,JIT 編譯技術并不是問題的主要矛盾。主要矛盾來自于更根本的因素,受控語言在設計伊始就考慮如何提高程序員生產力方面深思熟慮,而不惜以犧牲程序的運行的效率 為代價
Miguel de Icaza 在了解了 Sutter 的觀點后,隨后也提出了自己的觀點。
“受控語言的設計者們在進行設計的時候,優先考慮的是語言的安全性問題,然后才是語言的性能。比如,對數組的越界訪問是一種非法操作,當這種操作發生時,受控語言會讓程序立刻中止運行,而不是等到其直接造成系統崩潰,或者是留下巨大的安全隱患漏洞。”
Miguel de Icaza, Linux 技術界的傳奇人物,GNOME 和 Mono Project 的核心人物
在關于基于 JIT 的語言方面,兩位牛人對其是否能產生優化代碼這一問題,有截然不同的觀點。
“其次,就算是 JIT 本身的問題,一個 JIT 編譯器產生的編譯代碼肯定不可能比常規的優化編譯器產生的編譯代碼更好。因為 JIT 編譯器的主要目的是怎么讓程序編譯得更快,而不是如何產生優化的代碼(讓其運行得更快)”,Herb Sutter 這樣說道。
但是,我對上述的說法有點不贊同。總的來說,上面的說法對于早期的 JIT 編譯器沒有問題,而且 Sutter 所指的可能就正是 Microsoft 早期的 .NET JIT 編譯器。但是,現在的 JIT 編譯器已經完全不同于他理解中的那種了。 Miguel de Icaza 回應道。
de Icaza 認為 JIT 編譯器必須回應對產生代碼質量的質疑:“…在產生代碼質量和產生代碼的速度的平衡性方面。JIT 編譯器更加側重于如何縮短編譯代碼的時間,而不是產生代碼的質量。”然而,Mono 允許用戶使用 LLVM 編譯框架,產生更高質量的代碼。de Icaza 注釋道:“【Mono 用戶】LLVM 編譯框架,也就是蘋果 Mac OS Lion 操作系統使用的編譯器,只要這個編譯器進步了,Mono 產生的代碼的質量也會隨之進步。”
選擇 LLVM 編譯框架做后端,能讓 Mono 用戶有機會根據他們特定項目的需要進行選擇,是要提高編譯的速度,還是要提高產生代碼的質量。這就給項目提供了更大的靈活性,在開發進行中,需要反復進行 編譯的時候,可以選擇提高編譯速度來降低每次編譯的時間。當項目接近結束的時候,則可以選在提高編譯代碼的質量,來提高終端用戶的體驗。
盡管 JIT 選擇更加側重語言的安全性,而不是語言的執行效率,但這并不意味著受控代碼的運行時(runtime)執行效率將來不會改進。de Icaza 提出了幾個可改進的方面,包括意向,擴展虛擬機,限制動態語言特性,以及更好地支持語言特性和本地硬件之間的映射等等。
Sutter 則發表了下列評論,作為他最初觀點的補充。他認為 C++ 從根本上就具有性能優勢。
“就像‘保健品’和‘處方藥’這兩個東西有本質的區別一樣,在語言性能方面,C++永遠只是吃‘保健品’強身健體,而受控語言則是在吃‘處方 藥’治病救人。受控語言采取了那么多“卓越的手段”提升運行性能,也都是屬于吃藥治病的范疇。而且“保健品”吃得少,“處方藥”吃得多,這種局面是無法避 免的。你無法忽略“保健”的作用(某種程度上,你先“保健”,如果“保健”不行,再吃藥也不遲。但是,如果你一開始不“保健”,等拖到需要“吃藥”的程 度,這個時候再“保健”就沒有任何意義了。),如果你真的很在意程序的運行性能的控制,那就應該以優化程序運行性能為重(而不是用什么辦法來補救性能的缺 失)。
不知道讀者對 C++ 和受控代碼之間的權衡有什么看法。開發者會推進受控代碼不斷發展,來彌補其在性能上的不足么?新的 C++ 標準的語言特性又是否需要重新審視一下受控代碼開發者的觀點呢?
作者:Jeff Martin 編譯:伯樂在線 - 黃小非