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.
#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;
}Beku: 32.0 F
Didih: 212.0 FProgram 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.
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;
}Beku: 32 F
Didih: 212 F
result: 0Kedua 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.
| Aspek | C++ hari ini | Carbon menurut dokumen proyek |
|---|---|---|
| Status | standar ISO yang mapan dan digunakan dalam produksi | eksperimental, README menyatakan belum siap dipakai |
| Kinerja | kendali penuh atas memori dan bit | menargetkan performa menyamai C++ melalui LLVM |
| Interop | menjadi acuan yang diikuti penerusnya | interop dua arah sebagai syarat mutlak, mesin interop belum tersedia di Explorer |
| Generics | template yang diperiksa saat instansiasi | generics terperiksa pada definisi, template tetap tersedia secara opsional |
| Keamanan memori | bergantung pada disiplin, praktik, dan sanitizer eksternal | jalur bertahap menuju subset aman memori, masih berstatus desain |
| ABI | stabilitas biner menjadi kebiasaan penting ekosistemnya | ABI 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#
- Carbon Language: An experimental successor to C++ — Proyek Carbon Language — Menetapkan tujuan performa, interop, keamanan bertahap, rencana alat migrasi, dan status eksperimental proyek.
- Bidirectional interoperability with C and C++ — Proyek Carbon Language
— Menjelaskan
import Cpp library,packageCpp, pemetaan tipe, dan mandat interop pada tingkat semantik. - Goals — Proyek Carbon Language — Merinci migrasi sumber ke sumber berfidelitas tinggi, non-goal migrasi kode non-idiomatik, serta alasan non-goal ABI.
- Roadmap — Proyek Carbon Language — Menetapkan target alat migrasi dunia nyata pada era 0.2 beserta rentang waktunya.
- Compiler Explorer — godbolt.org
— Layanan peramban tempat program
suhu.carbonpada topik ini dieksekusi.