Od samego początku C++ jest najlepszym wyborem do tworzenia aplikacji wymagających dużej wydajności. Ale język nadal zawiera pewne przestarzałe praktyki spowodowane jego „zaprojektowaniem przez komisję”.

19 lipca 2022 r. podczas konferencji CPP North C++ w Toronto inżynier Google Chandler Carruth przedstawił Carbon.

Dowiedz się, czym jest Carbon i jak zamierza odnieść sukces w C++.

Co to jest węgiel?

Inżynierowie Google opracowali Węgiel język programowania w celu usunięcia niedociągnięć C++.

Wiele istniejących języki takie jak Golang i Rust już istnieją, które odzwierciedlają wydajność C++ bez jego wad. Niestety, te języki stanowią poważne bariery w migracji istniejących baz kodu C++.

Węgiel ma być czym jest TypeScript dla JavaScript, a Kotlin to Java. Nie jest zamiennikiem, ale następcą języka zaprojektowanego z myślą o interoperacyjności z C++. Ma na celu przyjęcie i migrację na dużą skalę dla istniejących baz kodu i programistów.

Kluczowe cechy węgla

Niektóre z kluczowych funkcji Carbon obejmują interoperacyjność C++, nowoczesne generyki i bezpieczeństwo pamięci.

Współdziałanie z C++

Carbon ma na celu zapewnienie łagodnej krzywej uczenia się programistom C++, za pomocą standardowego, spójnego zestawu konstrukcji językowych.

Na przykład weźmy ten kod C++:

// C++:
#włączać
#włączać
#włączać
#włączać

strukturaKoło {
platforma r;
};

próżniaDrukujCałkowity obszar(standardowe::Zakres koła){
platforma obszar = 0;

dla (stały Okrąg& c: okręgi) {
powierzchnia += M_PI * c.r * c.r;
}

standardowe::Cout << "Powierzchnia całkowita: " <koniec

;
}

automatycznyGłówny(int argc, zwęglać** argv) ->; int {
standardowe::wektor okręgi = {{1.0}, {2.0}};

// Niejawnie konstruuje `span` z `vector`.
PrintTotalArea (kółka);
zwrócić0;
}

W tłumaczeniu na węgiel staje się:

// Węgiel:
pakiet API geometrii;
importMatematyka;

klasaKoło{
var r: f32;
}

fn DrukujCałkowity obszar(kółka: Plasterek (Okrąg)) {
var obszar: f32 = 0;

for (c: Okrąg w kółkach) {
obszar += Matematyka.Pi * c.o * c.r;
}

Wydrukować("Całkowita powierzchnia: {0}", powierzchnia);
}

fn Główny() ->; i32 {
// Tablica o dynamicznym rozmiarze, np. `std:: vector`.
var kręgi: Szyk(Okrąg) = ({.r = 1.0}, {.r = 2.0});

// Niejawnie tworzy `Slice` z `Array`.
PrintTotalArea (kółka);
zwrócić0;
}

Możesz także migrować pojedynczą bibliotekę C++ do Carbon w aplikacji lub dodać nowy kod Carbon do istniejącego kodu C++. Na przykład:

// Kod C++ używany zarówno w Carbonie, jak i C++:
strukturaKoło {
platforma r;
};

// Carbon odsłania funkcję dla C++:
pakiet Geometria API;
import Biblioteka CPPokrąg.h";
import Matematyka;

fn DrukujCałkowity obszar(kółka: Slice (Cpp. Koło)){
var powierzchnia: f32 = 0;

dla (c: por. Okrąg w kręgach) {
obszar += Matematyka. Pi * cr * cr;
}

Print("Całkowity obszar: {0}", powierzchnia);
}

// C++ wywołując Carbon:
#włączać
#włączać "okrąg.h"
#włączać "geometria.węgiel.h"

automatycznyGłówny(int argc, zwęglać** argv) ->; int {
standardowe::wektor okręgi = {{1.0}, {2.0}};

// `Slice` Carbon wspiera niejawną konstrukcję z `std:: vector`,
// podobny do `std:: span`.
Geometria:: PrintTotalArea (kółka);
zwrócić0;
}

Nowoczesny system generyczny

Carbon dostarcza nowoczesny system generyczny ze sprawdzonymi definicjami. Ale nadal obsługuje szablony zgody na bezproblemową interoperacyjność C++.

Ten ogólny system zapewnia wiele korzyści szablonom C++:

  • Kontrole typów definicji ogólnych. Pozwala to uniknąć kosztu ponownego sprawdzania definicji w czasie kompilacji dla każdego wystąpienia.
  • Mocne, sprawdzone interfejsy. Zmniejszają one przypadkowe zależności od szczegółów implementacji i tworzą bardziej wyraźny kontrakt.

Bezpieczeństwo pamięci

Carbon stara się rozwiązać problem bezpieczeństwa pamięci, kluczowego problemu nękającego C++, poprzez:

  • Lepsze śledzenie niezainicjowanych stanów, zwiększenie wymuszania inicjalizacji i zabezpieczenie przed błędami inicjalizacji.
  • Projektowanie podstawowych interfejsów API i idiomów do obsługi dynamicznych kontroli granic w kompilacjach debugowania i wzmocnionych.
  • Posiadanie domyślnego trybu kompilacji debugowania, który jest bardziej wszechstronny niż istniejące tryby kompilacji C++.

Pierwsze kroki z węglem

Możesz eksplorować Carbon już teraz, sprawdzając bazę kodów i używając eksploratora Carbon:

# Zainstaluj bazelisk za pomocą Homebrew.
$ brew zainstaluj bazelisk

# Zainstaluj Clang/LLVM za pomocą Homebrew.
# Wiele wydań Clang/LLVM nie jest zbudowanych z opcjami, na których polegamy.
$ brew zainstaluj llvm
$ eksport PATH="$(brew --prefix llvm)/bin:${ŚCIEŻKA}"

# Pobierz kod Carbon.
$ git klon https://github.com/carbon-language/carbon-lang
$ płyta CD carbon-lang

# Zbuduj i uruchom eksploratora.
$ bazel run //explorer -- ./explorer/testdata/wydrukować/format_only.carbon

Mapa drogowa Carbon ujawnia myślenie długoterminowe

Zgodnie z mapą drogową Carbon, Google upubliczni eksperyment wraz z wydaniem podstawowej wersji roboczej (0.1) do końca 2022 roku. Planują pójść za tym z wersją 0.2 w 2023 i pełną wersją 1.0 w 2024-2025.

Nie wiadomo, czy Google będzie w stanie odtworzyć sukces swoich innych języków, Golanga i Kotlina.