19 poin oleh GN⁺ 2026-01-04 | 4 komentar | Bagikan ke WhatsApp
  • Bahasa evolusioner yang mewarisi sintaks dan semantik C sambil meningkatkan keamanan dan kemudahan penggunaan, sehingga tetap mempertahankan lingkungan yang familier bagi pengembang C yang sudah ada
  • Menyediakan kompatibilitas penuh dengan C ABI, sehingga bisa langsung diintegrasikan ke proyek C/C++; ada contoh sebagian kode vkQuake yang dikonversi ke C3 dan dibangun dengan kompiler c3c
  • Meningkatkan struktur kode dan daya ekspresi melalui sistem modul, operator overloading, dan makro waktu kompilasi
  • Mencakup fitur modern seperti pemrograman berbasis kontrak (Gradual Contracts), penanganan error zero-overhead, serta refleksi saat runtime dan waktu kompilasi
  • Di mode debug, secara otomatis menyediakan pemeriksaan keamanan dan stack trace terperinci, sehingga menguntungkan untuk mendeteksi bug dan menjaga stabilitas

Ikhtisar C3

  • C3 adalah bahasa pemrograman yang dikembangkan berdasarkan sintaks (syntax) dan semantik (semantics) dari bahasa C
    • Tujuannya adalah mengembangkan bahasa sambil tetap mempertahankan bentuk yang familier bagi programmer C yang sudah ada
  • Mendukung operator overloading yang presisi dan berorientasi tujuan
    • Tanpa struktur overloading C++ yang kompleks, vektor, matriks, dan operasi fixed-point dapat diekspresikan secara alami
  • Mendukung pemrograman berbasis kontrak, sehingga batasan saat runtime dan waktu kompilasi dapat dinyatakan secara eksplisit
    • Memperkuat stabilitas kode dan konsistensi spesifikasi
  • Menggabungkan keunggulan penanganan error berbasis Result dan exception
    • Menyediakan struktur manajemen error yang terintegrasi secara alami dengan kode C
  • Mendukung type introspection baik saat waktu kompilasi maupun runtime
  • Inline assembly: tanpa string atau batasan kompleks, assembly dapat ditulis seperti kode biasa
  • Di mode debug, secara otomatis menyisipkan bound checks dan value checks saat runtime
  • Pustaka standar C3 secara bawaan menyediakan stack trace terperinci di build debug
    • Memungkinkan identifikasi lokasi error yang spesifik alih-alih sekadar “segmentation fault”

Ergonomi dan Keamanan

  • Melalui Optionals, memberikan keamanan dalam penanganan error dan null
  • Sintaks defer mendukung otomatisasi pembersihan resource
  • Dengan slices dan foreach, iterasi yang aman dapat dilakukan
  • Contracts berbasis komentar memungkinkan penyataan kondisi batasan kode
  • Dalam konteks @pool, mendukung pembebasan memori otomatis

Performance by default

  • Dapat menulis vektor SIMD secara langsung untuk kontrol tingkat hardware
  • Mendukung penyetelan performa secara detail lewat pemilihan berbagai allocator memori
  • Mengadopsi desain tanpa overhead dalam penanganan error
  • Memanfaatkan waktu kompilasi yang cepat dan optimasi backend LLVM
  • Menyediakan inline assembly yang mudah digunakan

Batteries included standard library

  • Menyediakan struktur data standar, termasuk kontainer dinamis dan string
  • Menjamin portabilitas lintas platform melalui abstraksi cross-platform
  • Mengizinkan akses native platform saat diperlukan

Leverage existing C or C++ libraries

  • C3 sepenuhnya kompatibel dengan C ABI, sehingga tidak memerlukan “tipe kompatibel C” atau deklarasi fungsi terpisah
  • Kode C dapat di-link dari C3, dan kode C3 juga dapat di-link dari C

Modules are simple

  • Sistem modul yang sederhana dan intuitif
    • Pengaturan default disusun secara masuk akal sehingga tidak mengganggu alur pengembangan
  • Menyediakan manajemen namespace melalui modul
  • Menyederhanakan struktur enkapsulasi dengan kontrol eksplisit
  • Melalui interface, perilaku bersama dapat didefinisikan
  • Menyediakan fitur generic modules untuk mengimplementasikan pembuatan generic type secara sederhana dan jelas
  • Mendukung penggunaan ulang struktur melalui subtyping struct

Macros without a PhD

  • Makro waktu kompilasi dapat ditulis dalam bentuk yang mirip dengan fungsi biasa
  • Mendukung makro yang sadar tipe dan memahami informasi tipe dalam kode
  • Mendukung pembuatan kode yang lebih jelas dan lebih kuat dibanding preprocessor C

4 komentar

 
kayws426 2026-01-06

Bermacam-macam bahasa terus bermunculan. LONG LIVE C-LANG !!!
Tapi kalau nanti muncul c4, apakah itu akan benar-benar meledak populer...

 
bus710 2026-01-05

Karena Zig setiap tahun membawa breaking changes, meski saya suka bahasanya, sekarang jadi tidak terlalu tertarik lagi untuk memakainya.

Sebaliknya, setelah melihat perkenalan c3, secara keseluruhan rasanya seperti gabungan C + Go, jadi nyaman dibaca dan ditulis, dan sepertinya stres akibat upgrade versi juga akan jauh lebih sedikit.

 
mhcoma 2026-01-05

Saya juga sambil sedikit memberi dukungan... belakangan ini saya memakainya dan cukup menyenangkan.
Saya suka karena rasanya hanya memperbaiki hal-hal yang tidak nyaman saat memakai C.
Dokumentasi resminya agak belum matang
(untuk mencari tahu berbagai fitur, sering kali penjelasannya tertulis di tempat yang tiba-tiba dan tidak terduga...)

 
GN⁺ 2026-01-04
Pendapat Hacker News
  • Saya suka arah yang terkendali dalam filosofi desain C3
    Bahasa ini tidak memaksakan model memori baru, juga tidak berusaha menjadi seperti C++
    Terutama karena kompatibilitas ABI penuh, kita bisa langsung mencampurkan berkas C3 ke sistem build C yang sudah ada tanpa perlu menulis binding
    Saya mengapresiasi visi pemeliharanya yang mengejar evolusi, bukan revolusi
    Layak direkomendasikan sebagai bahasa untuk dipelajari di akhir pekan. Lebih modern dari C99, tetapi tetap terasa familier
    • Saya penasaran apakah kita bisa menulis pustaka dalam C3 lalu mengekspor simbol untuk dipakai di binding
      Alasan saya belum bisa sepenuhnya meninggalkan C adalah karena cstring dan pointer yang tidak dibebaskan
    • Saya ragu apakah kompatibilitas ABI penuh itu benar-benar sepenting itu
      Yang berbahaya bukan bahasa C itu sendiri, melainkan implementasi dan ABI-nya
      Dengan fat pointer, perbaikan varargs, UBSan, MTE, dan semacamnya, hasilnya bisa cukup baik
  • Saat membaca bagian Contracts di dokumentasi resmi C3, saya jadi punya pertanyaan
    Jika kompiler tidak wajib memeriksa kontrak, dan pelanggarannya bisa menjadi perilaku tak terdefinisi, saya tidak tahu bagaimana cara memercayai dan menggunakannya
    Fitur ini keren, tetapi juga tampak agak berisiko
    • Kontrak adalah invariant yang menyatakan “kondisi yang harus selalu benar”
      Ini bisa diabaikan, diperiksa saat runtime, atau diasumsikan selalu benar untuk dipakai dalam optimasi
      Misalnya, validitas pointer bisa diperiksa, sementara syarat input ganjil bisa dibiarkan sebagai asumsi
    • Kontrak adalah sarana untuk mengekspresikan niat dengan cara yang terstandarisasi
      Tim besar bisa mewajibkannya, dan alat seperti Visual Studio bisa hanya menampilkan peringatan sehingga orang bisa mempelajarinya secara bertahap
    • Tiga kalimat di dokumentasi itu masing-masing berarti
      1. kompiler tidak harus menggunakan kontrak
      2. pelanggaran bisa menjadi perilaku tak terdefinisi
      3. dalam mode aman, kontrak diperiksa dengan assert saat runtime
        Jadi, saat pengembangan bisa diaktifkan, dan saat rilis bisa dimatikan agar tidak memengaruhi performa
    • Pada akhirnya, ini adalah cara untuk mengekspresikan secara eksplisit di dalam kode optimasi berbasis asumsi yang sebenarnya sudah dilakukan kompiler
    • Saya memahami kontrak sebagai batasan lunak untuk menyatakan “kondisi yang hampir tidak pernah dilanggar”
      Kondisi yang memang wajib diperiksa seharusnya ditangani langsung lewat kode di dalam fungsi
  • Ada penjelasan rinci di repositori GitHub C3
    Beberapa perbedaannya dari C adalah tanpa berkas header, namespace berbasis modul, slice, operator overloading, modul generik, penanganan error berbasis Result, serta pemeriksaan runtime dalam mode aman
    • Fitur-fiturnya bagus, tetapi susunannya terasa agak tidak seimbang
      Secara pribadi saya merasa kurang adanya overloading fungsi, parameter default, dan pengembalian tuple
  • Di C3, menyebut Result atau Expected sebagai Optional terasa membingungkan
    Seharusnya itu berarti “T atau E”, bukan “T atau kosong”, jadi namanya terasa kurang tepat
    Tautan dokumentasi terkait
    • Optional di C3 berbeda dari Option<T> maupun Result<T, E>
      Tipe error dibatasi hanya satu kode bilangan bulat, dan ini sangat sesuai dengan filosofi “evolusi, bukan revolusi”
      Sintaks type? juga intuitif
    • Di dalam kode, kata “Optional” tidak dipakai secara langsung
      Ini adalah desain yang mempertahankan makna C sambil mengurangi beban out param
    • Saya kurang suka ketika nama konsep diubah secara sewenang-wenang, tetapi jika hanya salah satu yang didukung, Optional adalah nama yang lebih jelas
      Result sudah punya makna umum sebagai nilai hasil pengembalian, jadi bisa membingungkan
    • Meski begitu, “Option” atau “Maybe” punya makna lain, jadi menurut saya “Result” atau “Either” lebih tepat
  • Ada video live streaming Tsoding selama lebih dari 30 jam menggunakan C3
    Playlist YouTube
  • Saya pernah berinteraksi dengan pengembang C3, Odin, dan Zig
    Saya terkesan bahwa ketiga bahasa ini bukan sekadar bersaing, tetapi juga saling belajar sambil berbagi trade-off
    • Saya penasaran bahasa mana yang paling masuk akal untuk lingkungan embedded
    • Katanya “bukan kompetisi, melainkan pembelajaran”, tetapi rasanya tetap saja kompetisi yang dibungkus dengan bahasa sopan
  • Setelah melihat sekilas dokumentasinya, dua pertanyaan saya terjawab
    1. Karena berbasis LLVM, portabilitasnya tinggi
    2. Tagged enum tidak didukung
      Sebagai gantinya, ditambahkan fitur seperti makro dan refleksi
    • Saya menganggap tagged union tidak efisien untuk bahasa sistem
      Ia memakan memori sebesar tipe terbesar, dan alur program berpindah ke pemeriksaan tipe saat runtime, sehingga keunggulan bahasa bertipe statis jadi hilang
      Menurut saya lebih baik diimplementasikan sendiri saat memang diperlukan
  • Saya berpikir kapan membuat bahasa baru benar-benar bernilai
    Saya pernah mengimplementasikan sendiri generik, slice, dan propagasi error di C, tetapi membuat kompiler terlalu rumit
    Karena itu saya memakai variasi C dan Go secara bersamaan
    • Berkat LLVM, ternyata membuat bahasa keluarga “C yang lebih baik” lebih mudah daripada yang dibayangkan
      Hambatan masuknya cukup rendah sampai-sampai prototipe bisa dibuat hanya dalam sehari
    • Membuat bahasa selalu bernilai
      Itu adalah satu-satunya cara untuk mewujudkan paradigma baru menjadi nyata
      Bahasa itu sulit karena harus menyelaraskan sintaks, pustaka standar, tooling, sampai runtime, tetapi justru karena itu dampaknya terhadap masa depan besar
    • C3 awalnya adalah proyek independen yang dimulai Christoffer, yang sebelumnya berkontribusi pada C2, karena ia frustrasi dengan lambatnya kecepatan pengembangan
      Berkat LLVM, ia bisa membuat kompiler baru sendiri
    • Nilai sebuah bahasa ada pada kemampuannya membangun pemahaman bersama dengan orang lain
      Variasi C buatan sendiri tidak masalah jika dipakai sendirian, tetapi untuk berkolaborasi atau memakai pustaka eksternal, kita butuh bahasa yang sama
  • Awalnya saya kira ini bahasa yang sederhana, tetapi ternyata saya terkejut dengan daftar fitur yang kaya
    Dan saya suka karena mereka menyebut exception sebagai “Excuses”, terasa lucu dan cerdas
  • Menurut saya, situs web seperti inilah yang seharusnya menjadi contoh untuk situs bahasa pemrograman
    • Sebaliknya, desainnya terasa kekanak-kanakan dan amatir
      Terutama karena ada tautan Discord di navigasinya, kesan itu jadi makin kuat