Mempelajari C3
(alloc.dev)- C3 berbasis bahasa C dan menyediakan fitur tingkat lanjut seperti modul, operator overloading, generics, dan eksekusi saat waktu kompilasi
- Sambil mempertahankan sintaks C yang familier, bahasa ini dilengkapi sintaks yang meningkatkan produktivitas dan stabilitas seperti penanganan error, defer, dan foreach
- Dengan diperkenalkannya kontrak deklaratif (contracts) serta optional type dan mekanisme penanganan error, keamanan dan kejelasan meningkat
- Didukung lingkungan pengembangan yang praktis seperti pustaka standar dan integrasi sistem build, serta alokasi memori sementara
- Dalam build, pembuatan proyek, dan struktur kode, ada kemiripan dengan bahasa Zig, sehingga terlihat adanya eksperimen desain bahasa baru
Ikhtisar dan Fitur C3
Apa itu C3?
- C3 adalah bahasa yang dibangun di atas bahasa C, mempertahankan sintaks yang familier sambil menyediakan fitur-fitur yang sulit dicapai di C seperti sistem modul, operator overloading, generics, eksekusi saat waktu kompilasi, penanganan error, defer, value methods, contracts bertahap, slices, foreach, dan dukungan tipe dinamis
- Struktur modul berbasis namespace mencegah benturan nama (menggunakan namespace imperatif seperti
abc::Context) - Tujuan utamanya adalah meningkatkan produktivitas dan menyediakan fitur pemrograman sistem modern dengan aman
Karakteristik bahasa
Contoh Hello World
- Secara sintaks mirip dengan C
- Deklarasi fungsi harus secara eksplisit menggunakan keyword
fn - Fungsi pustaka standar seperti I/O sangat kuat dan dapat langsung mencetak berbagai tipe
Loop foreach
- Berbeda dari C, sintaks foreach didukung secara bawaan
- Untuk iterasi melalui referensi, tambahkan
&di depan nama variabel (fitur tingkat lanjut) - Mendukung break dan continue, mirip foreach di bahasa lain
Loop while
- Sebelum C99, deklarasi tidak bisa ditulis di dalam kondisi while, tetapi di C3 deklarasi internal dimungkinkan
enum dan switch
- switch mendukung break implisit (campuran break implisit/eksplisit bisa menimbulkan pro dan kontra)
- Keyword
nextcasemenyediakan perpindahan case yang jelas (mempermudah implementasi jump table) - Alur switch-case yang rumit di bahasa seperti Zig dan C bisa dikendalikan dengan lebih ringkas
Keyword defer
- Saat scope berakhir, pernyataan yang dijadwalkan dengan defer dijalankan dalam urutan terbalik, sehingga pembersihan resource lebih aman
- Pemanfaatan defer yang dipadukan dengan
catchdantry(mengendalikan alur penanganan error)
struct dan union
- Di dalam struct diperbolehkan sub-struct/union bernama maupun anonim, sehingga mudah merancang pola tagged union
- Perbedaan antara anonim (duplikasi field dengan nama yang sama) dan benturan nama dijelaskan secara ketat
Mekanisme penanganan error
- Tanda
?mendukung optional type, menggabungkan error dan opsi nilai untuk meningkatkan kenyamanan - Keyword
catchmemungkinkan percabangan untuk state kosong (tanpa Optional) / error - Dibanding Rust dan Zig, pemisahan antara error dan nilai opsional lebih lemah (kelebihan: sederhana, kekurangan: tujuan menjadi kurang jelas)
- Operator
!(rethrow) dapat digunakan untuk meneruskan exception
Contracts
- Kondisi sebelum/sesudah fungsi (Require/Ensure) ditulis di antara
<* .. *>(kondisi diperiksa saat kompilasi) - Mendukung analisis fold saat waktu kompilasi (analisis statis belum diimplementasikan)
Method pada struct
- Method terkait dibentuk dengan penulisan tipe + titik (
Foo.next), dengan namespace tersedia (termasuk untuk primitive) - Method diperbolehkan pada semua tipe seperti struct/union/enum
Makro
- Makro berbasis evaluasi saat waktu kompilasi (keyword
macro) $dipakai untuk parameter waktu kompilasi,#untuk meneruskan sebelum evaluasi- Bergaya C (meminimalkan masalah makro yang saling terjerat, menekankan stabilitas AST, pemeriksaan prefiks
@, dll.) - Refleksi tipe dan eksekusi waktu kompilasi ditangani lewat makro
Properti tipe
alignof, kindof, extnameof, sizeof, typeid, methodsof, has_tagof, tagof, is_eq, is_ordered, is_substructdll.- Cocok untuk metaprogramming dan refleksi
Literal Base64/Hex
- Urutan byte dapat dideklarasikan langsung dalam bentuk
b64"..."danx"..." - Kebutuhannya bisa digantikan oleh makro bawaan
$embed(dalam praktiknya jarang dipakai)
Tipe primitif
- Berbagai tipe dasar seperti int, uint, char (selalu unsigned), bool, float, int128/uint128
- Tipe terpisah untuk pointer/ukuran seperti iptr, uptr, isz, usz (sedikit kurang intuitif)
- Berbeda dari C, ukuran bit dijamin
Lainnya
- Dilengkapi set fitur yang luas seperti operator overloading, subtyping struct, generics, runtime dispatch, tipe any, dan bitfield struct (bitstructs)
Praktik: Pengalaman mencoba C3
Instalasi C3
- Mendukung dua cara: binary prebuilt dari situs resmi atau build langsung dari source
- Perlu memasang LLVM dan LLD (jika ada masalah linking, gunakan flag CMake
-DLLVM_DIRdan-DLLD_DIR) - Karena beberapa distro tidak menyertakan pustaka LLD, disarankan mengunduh binary secara langsung
- Compiler C3 memerlukan dependensi libtinfo
Membuat proyek
- Perintah
c3c initmembuat struktur folder standar (LICENSE/README.md/project.json/srcdll.) - Menyusun fondasi proyek seperti Bluild, target build, dan konfigurasi source (mirip Zig dan Cargo)
- File
main.c3bawaan sangat ringkas (pendapat: cocok untuk pengguna baru)
Membuat kalkulator
Desain dan tujuan
- Menerapkan Recursive Descent Parser dan logika inti kalkulator sambil mempraktikkan berbagai sintaks C3 seperti fungsi, I/O, manajemen memori, dan loop
- Tujuannya memahami langsung sisi unggul dan sisi kurang nyaman seperti intuitivitas sintaks dan produktivitas dalam praktik
Pemrosesan input
- Menggunakan allocator sementara (tmem) dengan
@pool, dan memori dibebaskan otomatis saat scope berakhir (arena allocator) - Mendukung tmem (sementara) dan mem (umum) sebagai mekanisme manajemen memori standar, dengan pola pengoper allocator per fungsi (menggabungkan kelebihan Zig dan C)
- Fungsi main wajib secara eksplisit menyatakan nilai balik (dipaksa oleh compiler)
- Fungsi yang aman meski nilai baliknya diabaikan diberi atribut
@maydiscard(mencegah pengabaian yang sembrono)
Implementasi tokenizer
- Memecah input pengguna menjadi daftar token
- Memanfaatkan berbagai kontrol alur seperti List dari pustaka standar C3, sintaks foreach, dan switch-case (gabungan
nextcase, break implisit/eksplisit) - Ada kebingungan terkait sintaks slice (indeks kedua ujung sama-sama inklusif) dan slice panjang 0 (ada sintaks terpisah untuk menentukan panjang)
- Penggunaan campuran allocator sementara/umum menunjukkan transparansi dan fleksibilitas dalam manajemen memori, lebih unggul dibanding beberapa bahasa lain seperti Rust
Implementasi parser
- Catatan pengalaman menulis parser secara langsung (diabaikan)
Kesimpulan dan pendapat umum
- C3 mengejar titik temu antara bahasa sistem tradisional dan desain modern
- Bahasa ini dirancang dengan mempelajari Zig, Rust, dan C, sebagai bahasa yang menyeimbangkan performa dan stabilitas kode
- Berbagai fitur menonjol seperti modularitas, penanganan memori/error/contracts yang aman, metaprogramming yang kuat, dan sistem build yang intuitif
- Kurva belajar relatif bisa dimasuki secara bertahap bagi yang sudah berpengalaman dengan C
- Ekosistem seperti language server dan IDE masih belum matang, dan beberapa sintaks masih memecah selera sehingga perlu perbaikan
- Layak diperhatikan sebagai bahasa alternatif generasi berikutnya untuk pengembangan low-level/sistem di dunia kerja
Belum ada komentar.