Engineer Journal - Learn Zig #1

Posted on Feb 17, 2024

Pengenalan

selamat datang dan selamat membaca. sesi ini akan berisikan perjalanan dalam mempelajari Zig - a general-purpose programming language. target pembaca utama para pemula dan pelajar ’this Zig’ karena penulis sendiri juga seorang pemula.

jadi, mari mulai perjalanan ini.

💡 perlu diinformasikan juga bahwa penulis memiliki latarbelakang sebagai backend engineer yang umumnya membangun aplikasi web/mobile dengan JavaScript, Java, dan Kotlin. sehingga tulisan ini dapat terpengeruh pengetahuan dan pengalaman yang penulis punya

Zig?

Zig is a general-purpose programming language and toolchain for maintaining robust, optimal and reusable software.

dikutip dari halaman depan Website Zig bahwa Zig merupakan bahasa pemrograman:

  • general-purpose -> digunakan untuk membuat software/program dengan berbagai kasus penggunaan
  • robust -> program yang dijalankan sesuai dengan apa yang ditulis, apapun kondisinya. bahkan ketika out-of-memory sekalipun
  • optimal -> menghasilkan kode dan program berjalan se-efektif dan efisien mungkin dalam hal performa
  • reusable -> kode dapat digunakan kembali sebagai bagian dari program lain, atau menjadi program pada platform yang berbeda

secara umum, Andrew Kalley - pembuat Zig ingin membuat bahasa layaknya C namun lebih baik.

Bahasa Layaknya C

pada presentasinya, Andrew menjelaskan cara untuk membangun program berkualitas:

  • 👎🏻 garbage collector: program ini akan membuat glitch latensi proses yang tidak dapat diprediksi
  • 👎🏻 auto heap allocator: membuat crash program saat out-of-memory
  • 👎🏻 hidden control flow: menghasilkan banyak tingkah laku program yang tak terdefinisi. sulit untuk debug, integrasi dengan IDE, dan diinterpretasi oleh developer
  • 👍🏻 fast like C or better: sip!

jika demikian, mengapa tidak menggunakan C? atau ada juga Rust dan Golang. Golang memiliki garbage collector dan auto head allocator. Rust memiliki domain knowledge bahasa yang rumit seperti konsep pinjam dan meminjamkan. dan C, memiliki hidden control flow dengan directive dan preprosessornya

misal pada C,

// hello.c
#include <stdio.h>

int main(int argc, char **argv){
  if(true) {
    printf("hello\n"); 
  } else {
    printf("uh?what?\n");
  }
}

kode di atas akan menghasilkan teks “hello” pada konsol.

$ gcc -o hello hello.c
$ ./hello
$ hello

namun, behavior berbeda apabila terdapat modifikasi directive,

// hello.c
#include <stdio.h>
#undef true
#undef false
#define true 0
#define false 1

int main(int argc, char **argv){
  if(true) {
    printf("hello\n"); 
  } else {
    printf("uh?what?\n");
  }
}

akan menghasilkan program dengan hasil tak sesuai ekspektasi.

$ gcc -o hello hello.c
$ ./hello
$ uh?what?

bayangkan itu ada di library terdalam yang anda gunakan :O

Projects <3 Zig

beberapa project dan perusahaan yang sudah adopsi Zig:

  • bun -> JavaScript runtime yang ngebut -> Site
  • Uber -> adoptasi dalam bentuk compiler, untuk support infrastructure yang banyaknya menggunakan arm64 -> Blog
  • Tigerbeetle -> db dengan penggunaan khusus untuk data model finansial -> Site

Dah.

penulis sendiri ingin mencoba mempelajari bahasa ini agar menambah opsi bahasa low-level yang dapat digunakan saat membangun solusi yang memiliki performa baik namun optimal.

Beberapa bahasa pernah penulis pelajari dan implementasikan di pekerjaa.

  • JavaScript -> bahasa yang diinterpretasikan dan dijalankan di runtime engine seperti NodeJs dan bun
  • Java -> menggunakan pendekatan hybrid namun JVM mengambil resource memori yang tinggi
  • Go -> bahasa yang kemudian di-compile ke host native, namun masih memiliki garbage collector
  • Rust -> memiliki konsep yang sulit untuk dipahami. sebelum program jalan dengan aman, pengembangkan dipaksa ‘bergelut’ dengan compiler.

tidak lengkap rasanya jika tidak menyertakan ‘hello world’,


// hello.zig
const std = @import("std");

pub fn main() void {
    std.log.debug("hello world\n", .{});
}

akan menghasilkan program dengan hasil “hello world”. tentunya

$ zig build-exe hello.zig
$ ./hello
$ hello world

dokumentasi lain untuk mempelajari Zig:

  • zig.guide: A structured introduction to Zig
  • Ziglings: Learn Zig by fixing tiny broken programs
  • Zig on Exercism: Solve coding exercises and get mentored to develop fluency in Zig

sampai bertemu di post lain