3 poin oleh GN⁺ 2025-05-31 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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 nextcase menyediakan 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 catch dan try (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 catch memungkinkan 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_substruct dll.
  • Cocok untuk metaprogramming dan refleksi

Literal Base64/Hex

  • Urutan byte dapat dideklarasikan langsung dalam bentuk b64"..." dan x"..."
  • 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_DIR dan -DLLD_DIR)
  • Karena beberapa distro tidak menyertakan pustaka LLD, disarankan mengunduh binary secara langsung
  • Compiler C3 memerlukan dependensi libtinfo

Membuat proyek

  • Perintah c3c init membuat struktur folder standar (LICENSE/README.md/project.json/src dll.)
  • Menyusun fondasi proyek seperti Bluild, target build, dan konfigurasi source (mirip Zig dan Cargo)
  • File main.c3 bawaan 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.

Belum ada komentar.