Apa itu Zig ?

Mengidentifikasi Zig sebagai bahasa sistem eksplisit yang bersaing dengan C tanpa runtime dan tanpa pengelolaan memori tersembunyi.

Daftar isi

Zig adalah bahasa pemrograman untuk perangkat lunak sistem, yaitu program yang berdiri paling dekat dengan perangkat keras dan sistem operasi. Bahasa ini menempati kelas yang sama dengan C, tetapi dirancang dengan aturan bahasa modern dan pemeriksaan yang lebih ketat. Topik ini mengidentifikasi ciri utama Zig, menjelaskan tiga prinsip keeksplisitannya, membandingkan posisinya dengan C dan Rust, kemudian menutup dengan program pertama yang dikompilasi dan dijalankan. Setelah topik ini dibaca, identitas Zig dapat dinyatakan dengan istilah teknis yang tepat, lengkap dengan alasannya.

Konsep#

Zig sebagai bahasa sistem#

Bahasa sistem (systems programming) adalah bahasa yang digunakan untuk menulis perangkat lunak yang berinteraksi langsung dengan sumber daya mesin, seperti sistem operasi, driver perangkat, perangkat tertanam (embedded), dan alat baris perintah (command line). Ranah ini selama puluhan tahun didominasi C karena C memberikan kendali penuh atas memori tanpa lapisan tambahan di antara kode dan mesin. Zig mengambil kelas masalah yang sama, yaitu program yang menuntut setiap byte dan setiap langkah eksekusi terkendali, dengan sintaks yang lebih modern serta pemeriksaan yang lebih ketat saat kompilasi.

Zig diciptakan Andrew Kelley dan dikelola oleh Zig Software Foundation (ZSF), yayasan nirlaba yang menangani pengembangan serta pendanaan proyeknya. Seluruh kode Zig bersifat open source, termasuk kode sumber pustaka standarnya yang ikut terdistribusi bersama toolchain. Posisi kelembagaan ini penting diketahui sejak awal karena keputusan teknis besar, seperti perombakan pustaka standar, umumnya dijelaskan resmi pada catatan rilis proyek.

Secara resmi, Zig diperkenalkan sebagai bahasa pemrograman umum yang menyertakan toolchain, yaitu rangkaian alat yang mencakup kompilator, pustaka standar, dan pengelola proses build dalam satu paket. Frasa “umum” berarti Zig tidak terikat pada satu jenis program, tetapi tujuan desainnya tetap pada ranah sistem, sebagaimana tercermin pada kemampuannya mengambil alih peran C dalam proyek baru. Dengan kata lain, Zig bersaing di arena yang sama dengan C, yaitu tempat kendali, kejelasan perilaku, dan ukuran hasil kompilasi dinilai lebih penting daripada kenyamanan penuh otomatis.

Tiga prinsip keeksplisitan#

Desain Zig menetapkan aturan bahwa perilaku program harus terbaca langsung dari kode sumbernya. Aturan ini diwujudkan dengan menolak mekanisme tersembunyi yang lazim pada bahasa lain, dan penolakan itu dirumuskan sebagai tiga prinsip. Ketiganya memengaruhi cara kode Zig dibaca, ditinjau, dan diuji.

  • Tanpa alur kendali tersembunyi. Zig tidak memiliki operator overloading, tidak memiliki exception, dan tidak memiliki destruktor yang dipanggil otomatis, sehingga setiap percabangan dan pemanggilan fungsi terlihat persis seperti yang tertulis.
  • Tanpa alokasi memori tersembunyi. Fungsi yang membutuhkan memori dinamis selalu menerima parameter allocator, yaitu objek yang menyediakan memori, sehingga pihak yang menanggung biaya alokasi terlihat pada tanda tangan fungsinya.
  • Tanpa runtime. Zig tidak memiliki garbage collector, penjadwal tugas, atau mesin virtual yang bekerja di belakang program, sehingga hasil kompilasinya adalah kode mesin yang berjalan langsung di atas sistem operasi atau perangkat keras.

Ketiga prinsip tersebut saling menguatkan dalam kode sehari-hari. Ketika sebuah fungsi dipanggil, tidak ada pemanggilan tambahan yang muncul dari pewarisan atau overloading. Ketika sebuah struktur data bertumbuh, alokasinya terjadi pada baris yang memanggil allocator, bukan di dalam fungsi pustaka yang tidak terlihat. Kode Zig memang menjadi lebih panjang beberapa baris, tetapi perilakunya lebih mudah diaudit dan diperkirakan.

Posisi dibanding C dan Rust#

Dibandingkan dengan C, Zig menawarkan kelas kendali yang sama tanpa pra-prosesor. Peran pra-prosesor C dalam menghasilkan varian kode digantikan oleh comptime, yaitu mekanisme yang mengeksekusi kode pada waktu kompilasi. Zig juga memeriksa kesalahan umum seperti luapan bilangan bulat (integer overflow) pada mode debug, sesuatu yang pada C bergantung pada kedisiplinan penulis dan alat tambahan. Sebaliknya, C memiliki standar internasional, portabilitas yang teruji puluhan tahun, dan ekosistem pustaka yang jauh lebih besar, sehingga keduanya sering dipasangkan melalui interoperabilitas dua arah alih-alih saling menggantikan.

Dibandingkan dengan Rust, Zig memilih jalur yang berbeda untuk keamanan memori. Rust menegakkan aturan kepemilikan (ownership) melalui borrow checker, yaitu pemeriksa yang menolak kode berisiko sebelum program berjalan. Zig tidak menggunakan pemeriksa kepemilikan, tetapi menyediakan pemeriksaan runtime pada mode debug, misalnya pemeriksaan batas indeks dan deteksi kebocoran memori melalui allocator pengujian. Kode Zig karenanya terasa lebih dekat dengan C, sedangkan kode Rust membawa lebih banyak struktur yang dituntut bahasanya.

Perbandingan berikut meringkas perbedaan yang paling menentukan.

AspekCRustZig
Alur kendali tersembunyiMakro pra-prosesorOperator overloading dan destruktor otomatisTidak ada
Alokasi memori tersembunyiEksplisit dan manualDapat tersembunyi di balik tipe pustakaTidak ada, selalu melalui parameter allocator
Pemeriksa kepemilikanTidak adaAda, dijalankan pada waktu kompilasiTidak ada
Status stabilitasStandar ISO yang mapanStabil sejak 1.0Pra-1.0, masih berubah

Tabel di atas menyederhanakan gambaran besar, bukan putusan nilai. C tetap menjadi pilihan yang wajar untuk basis kode lama, Rust menonjol ketika jaminan keamanan memori pada waktu kompilasi diutamakan, sedangkan Zig menawarkan model yang lebih dekat dengan C dengan pemeriksaan yang lebih ketat. Pemilihan bahasa tetap bergantung pada kebutuhan proyek, kebiasaan tim, dan basis kode yang sudah ada.

Contoh Lengkap#

Program pertama#

Identitas sebuah bahasa paling mudah diamati dari program terkecilnya. Berkas halo.zig berikut mencetak satu baris teks yang menyisipkan sebuah string dan sebuah bilangan.

zig halo.zig
const std = @import("std");

pub fn main() !void {
    const nama_berkas = "catatan.txt";
    const jumlah_baris: u16 = 24;
    std.debug.print("Halo, Zig! Berkas {s} berisi {d} baris.\n", .{ nama_berkas, jumlah_baris });
}
text Keluaran
Halo, Zig! Berkas catatan.txt berisi 24 baris.

Baris pertama mengambil pustaka standar melalui @import("std") dan menyimpannya pada konstanta std. Fungsi main ditandai pub agar dapat dijangkau dari luar berkasnya, dan bertipe kembalian !void, yaitu tidak mengembalikan nilai tetapi dapat gagal dengan error. Dua konstanta di dalam fungsi menyimpan data contoh, yaitu nama berkas dan jumlah barisnya. Baris terakhir mencetak teks melalui std.debug.print, kemudian program selesai ketika fungsi main berakhir.

Teks "Halo, Zig! Berkas {s} berisi {d} baris.\n" adalah format string, yaitu templat keluaran yang memuat dua penanda. Penanda {s} menyisipkan argumen sebagai string, sedangkan {d} menyisipkannya sebagai bilangan desimal. Argumennya diberikan dalam bentuk tuple, yaitu kumpulan nilai berukuran tetap, yang ditulis .{ nama_berkas, jumlah_baris } dan urutannya mengikuti urutan penanda. Karakter \n menambahkan baris baru di akhir karena std.debug.print tidak menambahkannya secara otomatis.

Program tersebut dijalankan dengan perintah zig run, yang mengompilasi berkas sumber lalu langsung mengeksekusi hasilnya dalam satu langkah. Jalankan perintah berikut pada direktori yang memuat halo.zig.

bash
# mengompilasi dan menjalankan program pertama
zig run halo.zig
text Keluaran
Halo, Zig! Berkas catatan.txt berisi 24 baris.

Kombinasi kompilasi dan eksekusi dalam satu perintah membuat zig run cocok untuk program kecil dan percobaan cepat. Kegagalan kompilasi lebih baik ditemui pada program empat baris daripada pada proyek yang sudah besar, sehingga membiasakan menjalankan kode sejak dini menguntungkan. Perintah yang sama digunakan ulang di sepanjang jalur ini untuk menjalankan seluruh contohnya.

Kesalahan umum#

Kesalahan pertama berupa mencari pengelola paket atau runtime yang perlu dipasang terpisah sebelum menulis kode. Zig tidak memiliki keduanya, dan seluruh kebutuhan contoh pada jalur ini cukup dilayani toolchain tunggal beserta pustaka standarnya. Menunggu komponen yang memang tidak ada hanya menunda program pertama, sehingga langkah yang tepat adalah langsung menulis berkas .zig dan menjalankannya dengan zig run.

Kesalahan kedua berupa menganggap perilaku rilis lama berlaku pada 0.17.0. Contoh kode dari artikel lama memakai API pustaka standar yang telah berpindah, dan pesan errornya berupa deklarasi yang tidak dikenal. Verifikasi versi dengan zig version sebelum menyalin kode dari sumber luar, dan baca pesan errornya untuk menemukan nama yang berpindah.

Ringkasan#

  • Zig adalah bahasa pemrograman sistem yang bersaing dengan C, diciptakan Andrew Kelley, dan dikelola Zig Software Foundation.
  • Tiga prinsip keeksplisitannya adalah tanpa alur kendali tersembunyi, tanpa alokasi memori tersembunyi, dan tanpa runtime.
  • Terhadap Rust, Zig tidak menggunakan pemeriksa kepemilikan dan mengandalkan pemeriksaan runtime pada mode debug.
  • Titik masuk program Zig adalah pub fn main() !void, sedangkan zig run nama_berkas.zig mengompilasi sekaligus mengeksekusinya.

Referensi#