Carbon versus C++

Migrasi berbantuan tooling dari C++ ke Carbon dan apa yang terbawa dari C++.

Daftar isi

Topik ini menyandingkan Carbon dengan C++ secara berdampingan, yaitu apa yang terbawa dari C++, apa yang diperbarui dari fondasinya, dan bagaimana migrasi berbantuan tooling direncanakan berlangsung. Setelah membacanya, hubungan kedua bahasa dapat dinyatakan dengan tepat, mulai dari kemiripan bentuk program hingga perbedaan status implementasi yang menyertainya. Seluruh klaim bersumber dari dokumen resmi proyek Carbon, sedangkan program C++ dan Carbon pada topik ini dijalankan agar perbandingannya berpijak pada eksekusi nyata.

Yang terbawa dari C++#

Carbon dimaksudkan sebagai penerus yang akrab dengan C++, dan README proyek menetapkan dua hal yang paling menentukannya, yaitu performa yang menyamai C++ melalui LLVM dengan akses tingkat rendah ke bit dan alamat memori, serta ekspresivitas yang sebanding agar arsitektur perangkat lunak yang ada tetap dapat ditulis secara alami. README juga menjanjikan interop dari warisan kelas hingga template, sehingga investasi kode C++ tetap digunakan selama transisi berlangsung. Kurva belajarnya ditujukan landai bagi pengembang C++, karena bahasanya dibangun dari konstruksi yang konsisten dan terasa familier bagi pembacanya.

Kemiripan itu terlihat pada program yang sama dalam dua bahasa. Program C++ berikut mendefinisikan kelas Suhu dengan satu field dan satu metode konversi, lalu mencetak dua hasil konversi.

cpp suhu.cpp
#include <cstdio>

class Suhu {
 public:
  Suhu(double celsius) : celsius_(celsius) {}
  double KeFahrenheit() const { return celsius_ * 9.0 / 5.0 + 32.0; }

 private:
  double celsius_;
};

int main() {
  Suhu beku(0.0);
  Suhu didih(100.0);
  printf("Beku: %.1f F\n", beku.KeFahrenheit());
  printf("Didih: %.1f F\n", didih.KeFahrenheit());
  return 0;
}
text Keluaran
Beku: 32.0 F
Didih: 212.0 F

Program Carbon berikut memuat hal yang sama, yaitu kelas dengan satu field dan satu metode, serta dua instance yang dicetak. Program ini dieksekusi melalui Carbon Explorer pada Compiler Explorer.

carbon suhu.carbon
package sample api;

class Suhu {
  var celsius: i32;
  fn KeFahrenheit(self: Suhu) -> i32 {
    return self.celsius * 9 / 5 + 32;
  }
}

fn Main() -> i32 {
  var beku: Suhu = {.celsius = 0};
  var didih: Suhu = {.celsius = 100};
  Print("Beku: {0} F", Suhu.KeFahrenheit(beku));
  Print("Didih: {0} F", Suhu.KeFahrenheit(didih));
  return 0;
}
text Keluaran
Beku: 32 F
Didih: 212 F
result: 0

Kedua keluaran menyampaikan nilai konversi yang sama, dengan dua perbedaan tampilan yang wajar. Tipe i32 pada versi Carbon membuat nilai bulat 32 dan 212 ditulis tanpa desimal, sedangkan C++ mencetak 32.0 dan 212.0 dari tipe double. Selain itu, Print Carbon tidak menyisipkan baris baru, sehingga Compiler Explorer menampilkan setiap pemanggilannya pada baris tersendiri sebelum baris result: 0 miliknya. Bentuk pemanggilan metode Suhu.KeFahrenheit(beku) mengikuti konvensi interpreter Explorer, sebagaimana dibahas pada topik Kelas dan Metode.

Yang diperbarui dari fondasi C++#

Yang diperbarui oleh Carbon bukan kinerjanya, melainkan fondasi yang membebankan utang teknis C++. README menyebut tiga fondasi baru, yaitu sistem generics modern dengan definisi yang diperiksa penuh, organisasi kode modular, dan sintaks yang konsisten serta sederhana. Sistem generics Carbon memeriksa definisi secara utuh sebelum digunakan, sehingga error tidak lagi menunggu instansiasi untuk muncul, sedangkan template C++ tetap tersedia sebagai opsi demi interop yang mulus dan dapat dimigrasikan bertahap menuju generics yang diperiksa.

Organisasi kode juga diganti dari header C++ menjadi package dan library beserta deklarasi import. Menurut dokumen desain interop, kode C++ justru diimpor melalui mekanisme ini, misalnya import Cpp library "suhu.h" membuat deklarasi dari header tersebut tersedia di dalam package Cpp dengan awalan Cpp. yang eksplisit. Macro C++ yang bernilai ekspresi konstan diimpor sebagai konstanta Carbon. Dengan demikian, kode lama tidak perlu ditulis ulang untuk tetap dapat dipanggil, dan asal-usul setiap simbol C++ terbaca jelas di dalam kode Carbon.

Perubahan fondasi juga menyentuh keamanan. README menargetkan peralihan dari undefined behavior ke erroneous behavior sedapat mungkin, penandaan sisanya dengan sintaks unsafe yang terlihat, serta dukungan pemeriksaan batas dinamis pada API dasarnya. Detail strateginya dibahas pada modul pilar desain, sedangkan yang penting pada perbandingan ini adalah urutannya, yaitu fondasi diperbarui lebih dahulu, kemudian keamanan ditingkatkan bertahap di atas fondasi tersebut.

Migrasi berbantuan tooling dan status keduanya#

README menyatakan rencana alat migrasi yang menerjemahkan kode C++ idiomatik ke Carbon secara mekanis, dan dokumen tujuan proyek merincinya, yaitu migrasi sumber ke sumber yang otomatis untuk segmen besar dari basis kode C++ yang idiomatik dengan interaksi manusia yang sangat rendah. Sasarannya bukan semua kode C++, karena migrasi kode non-modern yang tidak idiomatik dinyatakan non-goal, dan kode yang bekerja karena kebetulan memang tidak dapat dipahami alat apa pun. Peta jalan menargetkan alat migrasi yang layak untuk library dan sistem dunia nyata pada era 0.2, yakni rentang 2027 sampai 2028, sehingga migrasi skala besar masih rencana dan bukan kemampuan hari ini.

Tabel berikut menyandingkan kedua bahasa secara sejajar, dengan sumber klaim yang berbeda untuk masing-masing kolom.

AspekC++ hari iniCarbon menurut dokumen proyek
Statusstandar ISO yang mapan dan digunakan dalam produksieksperimental, README menyatakan belum siap dipakai
Kinerjakendali penuh atas memori dan bitmenargetkan performa menyamai C++ melalui LLVM
Interopmenjadi acuan yang diikuti penerusnyainterop dua arah sebagai syarat mutlak, mesin interop belum tersedia di Explorer
Genericstemplate yang diperiksa saat instansiasigenerics terperiksa pada definisi, template tetap tersedia secara opsional
Keamanan memoribergantung pada disiplin, praktik, dan sanitizer eksternaljalur bertahap menuju subset aman memori, masih berstatus desain
ABIstabilitas biner menjadi kebiasaan penting ekosistemnyaABI stabil untuk seluruh bahasa dan library dinyatakan non-goal

Baris terakhir tabel menunjukkan perbedaan yang paling sering luput. Banyak ekosistem C++ mengandalkan ABI yang stabil secara faktual untuk library biner jangka panjang, dan itulah beban yang menurut dokumen tujuan proyek menghambat evolusi C++. Carbon melepas jaminan luas tersebut demi kebebasan evolusi, dengan konsekuensi pembaruan bergantung pada alat alih-alih kompatibilitas biner.

Ringkasan#

  • Yang terbawa dari C++ meliputi target performa setara melalui LLVM, ekspresivitas sebanding, sintaks yang akrab, serta investasi kode lama yang tetap dipanggil lewat interop dari warisan hingga template.
  • Yang diperbarui adalah fondasinya, yaitu generics terperiksa pada definisi dengan template opsional, organisasi package dan import yang menggantikan header, serta jalur keamanan memori bertahap.
  • Migrasi direncanakan berbantuan alat penerjemahan sumber ke sumber untuk kode C++ idiomatik, dengan interaksi manusia minimal, dan kematangan alatnya ditargetkan pada era 0.2.
  • Kedua bahasa berada pada status yang berbeda, karena C++ mapan dan siap produksi, sedangkan Carbon eksperimental dengan peta jalan 0.2 pada 2027 sampai 2028.

Referensi#