Google 後開發的 Carbon 真的會取代 C++ 嗎?

csdn 發佈 2024-04-28T20:22:09.679658+00:00

在 2022 年的 CppNorth 大會上,Chandler Carruth 發表了一項主題演講,標題是:Carbon Language: An experimental successor to C++,其中提到了一門名為「Carbon」的全新開源開發語言,號稱是 C++ 的繼承者。

【CSDN 編者按】

Carbon 真的能成為 C++ 的替代品嗎?目前我們只能猜測,但請不要忘記 Swift 或 Kotlin 等語言的誕生。

原文連結:

https://semaphoreci.com/blog/carbon

未經授權,禁止轉載!

作者 | Manuel Rubio 譯者 | 彎月

出品 | CSDN(ID:CSDNnews)

在 2022 年的 CppNorth 大會上,Chandler Carruth 發表了一項主題演講,標題是:Carbon Language: An experimental successor to C++,其中提到了一門名為「Carbon」的全新開源開發語言,號稱是 C++ 的繼承者。

但是,為什麼我們需要 C++ 的繼承者?這個想法從何而來?

在 2019 年 CppCon 大會的最後一天,Chandler Carruth 和 Titus Winters 發表了一項驚人的演講,他們討論了什麼是 C++?我認為,該演講傳達的一個最有趣的想法是,「語言是工具,我們必須使用正確的工具來完成工作。」

在談話的最後,他們提出了不同的建議,旨在解決 C++ 開發人員面臨的一些常見問題,這些建議包括:

  • 注重性能的軟體。我們不僅需要考慮速度,還要考慮延遲、內存利用率和電池利用率等。

  • 軟體的進化,語言的進化。C++ 是幾十年前編寫的,語言設計者也會犯錯,我們應該根據當前大多數語言的變化來改進和升級 C++——但是,社區中總是有人反對改變。

  • 簡單且易於閱讀、理解和編寫。我認為 John Carmack 的這句話總結得很好:「原始C語言的一大優點是,大多數高級開發人員都有能力編寫自己的 C 編譯器,而了解自己所用的工具是非常有價值的。但如果是C++編譯器的話,我就需要大量的時間來學習編寫。」

  • 安全與測試。更安全的 API、廉價的安全緩解措施以及使用持續集成單元和集成測試的綜合測試方法。所有不受信任的輸入都會持續進行模糊測試,所有測試都使用檢查構建模式(sanitizer、斷言等)。

  • 快速且可擴展的開發,本質上就是模塊。

  • 硬體、作業系統、環境。定義我們承諾支持的內容,並以可預見的方式持續推進。我們不會有意去破壞已有 20 年歷史的平台,但我們也不會繼續支持。

我們可以改進 C++ 或使用其他語言嗎?

在2022年的 CppNorth大會上,Carruth 為我們提供了這方面的信息。他首先提到了上一次演講的建議,並討論了為什麼 C++ 無法實現這些它們。主要問題在於,C++ 積累了幾十年的技術債務,在此期間社區優先考慮的是向後兼容性,因此未能修復技術債務。

那麼,是否可以利用現有的一種語言來代替 C++?使用垃圾回收的語言很棒,但我們不會考慮它們,因為這些語言會付出性能的成本,而且大多數 C++ 開發人員認為他們不想在這方面讓步。

Rust 程式語言是一個不錯的選擇,因為它是內存安全的,並且非常適合作為低級語言的替代品,但請看下面的替代關係,Rust 實際上無法替代 C++:

  • C –> C++

  • JavaScript –> TypeScript

  • Objective C –> Swift

  • Java –> Kotlin

  • C++ –> Rust?

Rust 是一門運行良好的語言,如果你準備開發一個新項目,那麼非常推薦。但如果你需要將 C++ 生態系統連同各種深層次的依賴都遷移到 Rust,那將會是一項非常艱巨的任務。我們不推薦這種做法。

我們需要的是一位「繼承者」。這裡的「繼承者」指的是在現有生態系統中構建的語言,無需建立新語言,它可以提供互操作性,而且學習和採用也很方便,理想情況下,所有的輔助工具也可以繼續提供支持。從本質上來說,「繼承者」是其父輩語言的超集。

Carbon 程式語言是什麼?

在討論了C++的問題後,Carruth 提出了一個問題:下一步該怎麼辦?在討論了為什麼我們不能改進 C++,為什麼我們不能使用 Go 語言或其他垃圾收集語言,以及我們不能使用 Rust 語言(或其他低級語言)後,Carruth 認為我們需要為 C++ 創建一門「繼承者」:Carbon。

Carbon 採納了改進 C++ 的建議,並將其融入了語言的設計目標,同時他們還照顧到了一個新的關鍵性目標,也是最重要的一個目標:與現有 C++ 代碼的互操作性和遷移。

根據官網的信息,Carbon 語言的創建理由如下:

「從根本上說,Carbon 是一種後繼語言,而不是嘗試逐步發展C++。Carbon 將圍繞與 C++ 的互操作性以及現有 C++ 代碼庫和開發人員的大規模採用和遷移而設計。[...] 通過這種方法,我們可以在 C++ 現有生態系統的基礎上構建軟體,並繼續支持現有的投資、代碼庫和開發人員群體。」

Go 或 Dart 會消失嗎?

Carruth 是谷歌程式語言與軟體基礎技術主管,而且 Carbon 語言這項計劃始於谷歌,所以人們擔心 Golang 甚至 Dart 的支持可能會減弱。然而,谷歌是一家大公司,他們需要通過不同的平台和不同的項目開發軟體。這意味著,他們需要不同的語言來處理不同的工作。

谷歌的生產環境使用 Go 來提供一些服務(dl.google.com 的下載伺服器),但正如 Carruth 所說,大型 C++ 項目的遷移非常困難,而且無法完成。

Dart 是一種建立在JavaScript 和其他語言之上的語言,其使命是成為 Flutter 項目的主要語言,解決跨平台創建應用程式的問題。由於 Flutter 不支持 C++,因此 Carbon 在這種環境下基本沒有任何用處,因此 Dart 語言不會受到影響。

如何使用這種新語言?

在 2022年 的 Core C++ 會議期間,Jon Ross-Perkins(谷歌的資深軟體工程師,擁有兩年 Carbon 語言的經驗)談到了 Carbon 語言的語法和權衡弊端。

首先,他強調了目前這個項目仍處於實驗階段,但我想通過工具初步窺探一下這個生態系統。Ross-Perking 提到了該項目的下列工具:

  • 編譯器。無需多說,代碼的編譯非常重要。

  • 格式化程序。正確地格式化代碼。

  • 語言的自動升級。從比格式化程序更高的層次上整理我們的代碼。

  • IDE 和 LSP 支持。

  • 重構支持。

  • 包管理器。

關於編寫代碼,保持開發的上下文不變很重要,但是,我們需要保留那麼多信息嗎?為了簡化上下文,Carbon 提供了特定的保留字,這樣工具的使用會更容易,代碼的可讀性也更高。這些保留字包括:

  • var:用於聲明變量。

  • class:用於定義類。

  • fn:用於定義函數。

  • interface :用於定義接口。

  • let:用於聲明常量。

示例如下:

var radius: Printer(Circle);class Circleclass Printer(template t:! Type)fn Drawinterface Shapelet Pi: f32

我認為,我們可以直接看看語法的細節以及代碼示例。但在瀏覽代碼之前,我需要說明該語言目前仍處於實驗階段,並且與大多數實驗一樣,它可能會逐步發展起來,也有可能會消失。但就目前的情況來看,這是一個很有希望的項目。

關於語法,由於第一版還沒有正式發布,所以將來實際的代碼可能會與這裡有所出入。如果你想看看該語言最新的發展,可以查看設計文檔https://github.com/carbon-language/carbon-lang/blob/trunk/docs/design/README.md),其中包含設計人員和開發人員貢獻的建議和變更。

import Math;// Returns the smallest factor of `n` > 1, and// whether `n` itself is prime.fn SmallestFactor(n: i32) -> (i32, bool) { let limit: i32 = Math.Sqrt(n) as i32; var i: i32 = 2; while (i <= limit) { let remainder: i32 = n % i; if (remainder == 0) { Carbon.Print("{0} is a factor of {1}", i, n); return (i, false); } if (i == 2) { i = 3; } else { // Skip even numbers once we get past `2`. i += 2; } } return (n, true);}

以上代碼使用了兩個不同的函數。看來 Carbon 包中的函數是默認導入的,而 Math 包需要導入才能使用。

我們還使用了兩個常量(let)。第一個limit是整個函數的常量,而第二個remainder是 while 循環範圍內的常量,每次疊代都會創建並綁定一個值。常量limit還聲明了一個不同於 Math.sqrt 函數返回的類型,但它利用 as i32 進行了轉換。

我們看到 return 中定義了一個元組。基於這種技術,函數將返回兩個值,而不是一個值。Python、Erlang 或 Elixir 等語言也使用了這種數據類型。這樣,我們就可以不同情況下處理一組值。

展望未來

目前 Carbon 還是一個實驗性項目,但你可以查看它的線路圖,了解近期的進展。通過前面所說的文檔,我們可以看到 Carbon 的預期發布時間(停止實驗)原定於 2023 年,後來變成了 2024 年,如今又推出到了2025~2026 年。然而,我們可以看到 Carbon 正在快速發展,而且沒有停止。

Carbon 真的能成為 C++ 的替代品嗎?目前我們只能猜測,但請不要忘記 Swift 或 Kotlin 等語言的誕生。在文本開頭,我們列舉了有關C++的多項建議,相信大多數想要解決這些問題的大公司都會接受並採用 Carbon。

關鍵字: