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::wektorokrę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::wektorokrę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.