Apa itu Carbon?

Carbon sebagai bahasa penerus C++ eksperimental dari Google beserta tujuan utamanya.

Daftar isi

Topik ini memperkenalkan Carbon, sebuah bahasa pemrograman eksperimental yang dikembangkan secara terbuka dan diprakarsai oleh Google. Pembahasan mencakup latar kemunculan Carbon, pendekatan bahasa penerus yang dipilih, tujuan utama desain, serta wujud proyek yang dapat dilihat hari ini. Setelah membacanya, kedudukan Carbon di antara bahasa-bahasa pemrograman lain dapat dinyatakan dengan tepat, lengkap dengan tujuan yang membedakannya.

Mengapa C++ perlu penerus#

C++ masih menjadi bahasa yang dominan untuk perangkat lunak performance-critical, yaitu perangkat lunak yang kinerjanya menentukan mutu sistem secara keseluruhan, seperti mesin basis data, mesin permainan, dan sistem operasi. Basis kode C++ yang ada sangat besar dan terus tumbuh, sehingga bahasa ini tetap dipakai di banyak sistem penting. Meski demikian, README resmi proyek menyebut C++ semakin sulit ditingkatkan untuk memenuhi kebutuhan pengembang masa kini.

Dokumen resmi Difficulties improving C++ menjelaskan dua penyebab utamanya. Pertama, C++ mewarisi utang teknis (technical debt) dari puluhan tahun perjalanan bahasanya, mulai dari pra-pemrosesan teks yang diwarisi C hingga aturan promosi bilangan bulat yang rumit. Kedua, C++ memprioritaskan kompatibilitas mundur (backwards compatibility) pada tingkat sintaks maupun ABI (application binary interface), sehingga fitur lama hampir tidak pernah dilepas dan fitur baru terus ditumpuk di atasnya. Akibatnya, perbaikan secara bertahap dari dalam bahasa dinilai sangat sulit dilakukan.

Para perancang Carbon juga meninjau bahasa-bahasa modern seperti Go, Swift, Kotlin, dan Rust. Bahasa-bahasa tersebut memberikan pengalaman pengembang yang baik, tetapi desainnya menghadirkan hambatan nyata bagi migrasi dari C++, mulai dari perubahan gaya perancangan perangkat lunak hingga biaya kinerja. README proyek menyatakan dengan lugas bahwa pengembang yang dapat menggunakan salah satu bahasa tersebut sebaiknya menggunakannya. Carbon ditujukan untuk kelompok yang tidak dapat meninggalkan C++ begitu saja, misalnya karena basis kode dan investasi yang sudah ada di atasnya.

Pendekatan bahasa penerus#

Carbon memilih jalur yang disebut bahasa penerus (successor language), yaitu bahasa baru yang didesain untuk menggantikan bahasa lama secara bertahap tanpa memutus ekosistem yang sudah ada. README proyek memberikan dua preseden yang pernah terjadi sebelumnya, yaitu TypeScript untuk JavaScript dan Kotlin untuk Java. Pada kedua preseden itu, bahasa baru hidup berdampingan dengan bahasa lamanya, sehingga pemindahan dapat dilakukan library demi library. Carbon dimaksudkan untuk mengisi peran yang sama bagi C++.

Syarat yang melekat pada pendekatan ini adalah interop dua arah (bidirectional interoperability) dengan C++, yaitu kemampuan kode Carbon dan kode C++ untuk saling memanggil di dalam satu aplikasi. Dengan syarat itu, sebuah library di tengah basis kode C++ yang besar dapat beralih ke Carbon tanpa memindahkan sisanya. Bagian yang masih berjalan baik di C++ tidak perlu disentuh, sedangkan bagian baru atau yang sedang ditulis ulang dapat menggunakan Carbon. Diagram berikut menggambarkan kedudukan kode Carbon baru di dalam aplikasi C++ yang sudah berjalan.

Satu aplikasiKode C++ yang adaaplikasi dan library lamaKode Carbon barulibrary yang ditulis ulangC++ memanggil CarbonCarbon memanggil C++
Interop dua arah antara C++ dan Carbon dalam satu aplikasi

Interoperabilitas dua arah juga menentukan bentuk kerja migrasinya. Kode C++ yang ada dapat memanggil library Carbon yang baru dibuat, dan sebaliknya kode Carbon dapat memanggil library C++ yang sudah teruji. README bahkan merencanakan alat migrasi yang menerjemahkan kode C++ idiomatik ke Carbon secara mekanis, sehingga pemindahan tidak selalu dilakukan baris demi baris. Semua rencana itu diarahkan pada satu tujuan, yaitu menurunkan biaya berpindah sampai ke tingkat yang membuat migrasi bertahap masuk akal bagi basis kode besar.

Tujuan utama dan batasan desain#

README proyek menetapkan lima syarat yang harus dipenuhi sebuah bahasa penerus C++. Kelimanya menjadi tolok ukur yang digunakan untuk menilai setiap keputusan desain Carbon.

  • Performa yang setara C++, dengan dukungan LLVM serta akses tingkat rendah ke bit dan alamat memori.
  • Interop dua arah yang mulus dengan C++, sehingga satu library dapat beralih ke Carbon tanpa memindahkan sisanya.
  • Kurva belajar yang landai bagi pengembang C++, dengan struktur bahasa yang konsisten dan mudah dibaca.
  • Ekspresivitas yang setara, agar pola perancangan perangkat lunak yang sudah ada tetap dapat diungkapkan.
  • Migrasi yang dapat diskalakan, termasuk alat penerjemahan sumber ke sumber (source-to-source) untuk kode C++ yang idiomatik.

README juga menyebut dua non-goal secara eksplisit, yaitu ABI yang stabil untuk seluruh bahasa dan library, serta kompatibilitas maju maupun mundur yang sempurna. ABI yang stabil berarti biner hasil kompilasi tetap dapat dipakai antarversi tanpa kompilasi ulang. Carbon melepaskan jaminan itu demi kebebasan menata ulang bahasanya hingga ke fondasinya. Sasaran penggunaannya juga jelas, yaitu perangkat lunak performance-critical yang selama ini menjadi wilayah C++, dengan keamanan memori (memory safety) yang ditempuh melalui jalur bertahap, bukan jaminan yang tersedia sejak hari pertama.

Wujud proyek dan bahasanya hari ini#

Proyek Carbon diumumkan pada Juli 2022 melalui keynote konferensi CppNorth dan sejak itu dikembangkan di repositori GitHub carbon-language/carbon-lang. Struktur proyeknya terbuka, dengan model tata kelola serta proses evolusi bahasa yang didokumentasikan. Aspek desain yang sudah ditulis antara lain generics, tipe kelas, pewarisan, overloading operator, struktur leksikal, serta organisasi kode. Sementara itu, toolchain, yakni kompilator beserta alat pendukungnya, masih dalam pengembangan dan menjadi fokus kerja utama proyek saat ini.

Cara tercepat melihat bahasanya adalah menjalankan program kecil di peramban melalui layanan Compiler Explorer. Program berikut menghitung jumlah bilangan 1 sampai 10 dan memperlihatkan rasa sintaks Carbon, seperti kata kunci fn untuk fungsi, tipe yang ditulis setelah nama variabel, serta perulangan while.

carbon jumlah.carbon
package sample api;

fn Jumlah(hingga: i32) -> i32 {
  var total: i32 = 0;
  var i: i32 = 1;
  while (i <= hingga) {
    total += i;
    i += 1;
  }
  return total;
}

fn Main() -> i32 {
  Print("Jumlah 1 sampai 10: {0}", Jumlah(10));
  return 0;
}
text Keluaran
Jumlah 1 sampai 10: 55
result: 0

Keluaran tersebut diperoleh dari eksekusi nyata melalui Carbon Explorer di Compiler Explorer. Baris pertamanya berasal dari pemanggilan Print, sedangkan baris result: 0 ditambahkan oleh Explorer berisi kode kembalian dari fungsi Main. Struktur programnya terbaca mirip bahasa keluarga C, yaitu fungsi bernama, perulangan, dan nilai kembalian, dengan penulisan tipe yang mengikuti nama variabel. Detail sintaks tidak dibahas di sini, karena yang penting pada tahap ini adalah mengenali bentuk bahasanya secara kasat mata.

Ringkasan#

  • Carbon adalah bahasa penerus C++ yang bersifat eksperimental, diprakarsai Google, diumumkan pada Juli 2022, dan dikembangkan terbuka di GitHub.
  • Pendekatannya mengikuti TypeScript untuk JavaScript dan Kotlin untuk Java, yaitu bahasa baru yang hidup berdampingan dengan ekosistem lamanya.
  • Tujuan utamanya meliputi performa yang setara C++, interop dua arah dengan C++, kurva belajar yang landai, ekspresivitas yang setara, dan migrasi berskala besar.
  • ABI yang stabil untuk seluruh bahasa dan library serta kompatibilitas maju mundur yang sempurna dinyatakan eksplisit sebagai non-goal.

Referensi#