Megalakulása óta a C++ az első számú választás a teljesítményintenzív alkalmazások építéséhez. De a nyelv még mindig tartalmaz néhány elavult gyakorlatot, amelyet a „bizottság általi tervezés” okoz.

2022. július 19-én, a CPP North C++ konferencián Torontóban Chandler Carruth, a Google mérnöke bemutatta a Carbont.

Tudja meg, mi az a Carbon, és hogyan kívánja sikeressé tenni a C++-t.

Mi az a szén?

A Google mérnökei fejlesztették ki a Szén programozási nyelv a C++ hiányosságainak kiküszöbölésére.

Sok létező nyelvek, mint a Golang és a Rust már létezik, amelyek a C++ teljesítményét tükrözik hiányosságai nélkül. Sajnos ezek a nyelvek jelentős akadályokat jelentenek a meglévő C++ kódbázisok migrációja előtt.

A szén célja, hogy az legyen mi a TypeScript a JavaScript számára, Kotlin pedig Jávára van. Ez nem helyettesítő, hanem egy utódnyelv, amelyet a C++-szal való együttműködésre terveztek. Célja a meglévő kódbázisok és fejlesztők nagyszabású átvétele és migrációja.

A szén főbb jellemzői

A Carbon néhány kulcsfontosságú funkciója közé tartozik a C++ interoperabilitás, a modern generikusok és a memóriabiztonság.

instagram viewer

Együttműködés C++-szal

A Carbon célja, hogy szelíd tanulási görbét biztosítson a C++ fejlesztők számára szabványos, konzisztens nyelvi konstrukciókkal.

Vegyük például ezt a C++ kódot:

// C++:
#tartalmazza
#tartalmazza
#tartalmazza
#tartalmazza

structKör {
úszó r;
};

üresTotalArea nyomtatása(std::span körök){
úszó terület = 0;

számára (const Kör& c: körök) {
terület += M_PI * c.r * c.r;
}

std::cout << "Összterület: " << terület << endl;
}

autofő-(int argc, char** argv) ->; int {
std::vektor körök = {{1.0}, {2.0}};

// Implicit módon összeállítja a `span`-ot a `vektorból'.
Összes terület nyomtatása (körök);
Visszatérés0;
}

Carbonra lefordítva ez lesz:

Szén:
csomag Geometry api;
importMath;

osztályKör{
var r: f32;
}

fn TotalArea nyomtatása(körök: Szelet (Kör)) {
var terület: f32 = 0;

for (c: Kör a körökben) {
terület += Math.Pi * c.r * c.r;
}

Nyomtatás("Teljes terület: {0}", terület);
}

fn () ->; i32 {
// Dinamikus méretű tömb, például `std:: vector`.
var körök: Sor(Kör) = ({.r = 1.0}, {.r = 2.0});

// Implicit módon létrehozza a "Slice"-t az "Array"-ből.
Összes terület nyomtatása (körök);
Visszatérés0;
}

Egyetlen C++ könyvtárat is migrálhat a Carbonba egy alkalmazáson belül, vagy új Carbon kódot adhat hozzá a meglévő C++ kódhoz. Például:

// A Carbonban és a C++-ban is használt C++ kód:
structKör {
úszó r;
};

// A szén egy függvényt tesz közzé C++ esetén:
csomag Geometry api;
import Cpp könyvtár "kör.h";
import matematika;

fn TotalArea nyomtatása(körök: Szelet (Cpp. Kör)){
var terület: f32 = 0;

számára (c: Cpp. Kör a körökben) {
terület += Math. Pi * c.r * c.r;
}

Print("Teljes terület: {0}", terület);
}

// C++ hívó szén:
#tartalmazza
#tartalmazza "kör.h"
#tartalmazza "geometry.carbon.h"

autofő-(int argc, char** argv) ->; int {
std::vektor körök = {{1.0}, {2.0}};

// A Carbon "Slice" támogatja az "std:: vector" implicit felépítését,
// hasonló: `std:: span`.
Geometria:: Összes terület nyomtatása (körök);
Visszatérés0;
}

Modern generikus rendszer

A Carbon modern generikus rendszert biztosít ellenőrzött definíciókkal. De továbbra is támogatja a választható sablonokat a zökkenőmentes C++ interoperabilitás érdekében.

Ez az általános rendszer számos előnnyel rendelkezik a C++ sablonokhoz:

  • Az általános definíciók típusellenőrzése. Ezzel elkerülhető a fordítási idő költsége a definíciók újraellenőrzésével minden példányosításnál.
  • Erős, ellenőrzött interfészek. Ezek csökkentik a véletlen függőséget a megvalósítás részleteitől, és egyértelműbb szerződést hoznak létre.

A memória biztonsága

A Carbon a C++-t sújtó kulcsfontosságú probléma, a memóriabiztonság megoldására törekszik az alábbiakkal:

  • Az inicializálatlan állapotok jobb nyomon követése, az inicializálás fokozott érvényesítése és az inicializálási hibák elleni védekezés.
  • Alapvető API-k és idiómák tervezése a dinamikus határellenőrzés támogatására hibakeresési és megerősített buildekben.
  • Alapértelmezett hibakeresési móddal rendelkezik, amely átfogóbb, mint a C++ meglévő építési módjai.

Kezdő lépések a szénnel

Már most felfedezheti a Carbont, ha megnézi a kódbázist, és használja a Carbon Explorert:

# Telepítse a bazelisket a Homebrew segítségével.
$ brew install bazelisk

# Telepítse a Clang/LLVM-et a Homebrew segítségével.
# Sok Clang/LLVM kiadás nem olyan opciókkal készült, amelyekre támaszkodunk.
$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"

# Töltse le a Carbon kódját.
$ git klón https://github.com/carbon-language/carbon-lang
$ CD szén-lang

# Építsd meg és futtasd a felfedezőt.
$ bazel run //explorer -- ./explorer/testdata/nyomtatás/format_only.carbon

A Carbon útiterve a hosszú távú gondolkodást mutatja be

A Carbon ütemterv szerint a Google nyilvánosságra hozza a kísérletet egy alapvető működő verzió (0.1) kiadásával 2022 végéig. Ezt tervezik egy 0.2-es verzióval 2023-ban, és egy teljes 1.0-s kiadással 2024–2025-ben.

Hogy a Google képes lesz-e reprodukálni más nyelveik, a golang és a kotlin sikerét, az majd kiderül.