Förvillelser

Hello Zig

I’ve read a few bits and blurbs about the programming languauge Zig here and there since its inception. Never took a closer look. Then José Valim recommended the talk Zig <3 Elixir by Isaac Yonemoto. I checked it out and decided to try the language. Here are some random thoughts about getting to know Zig.

Why!?

I haven’t done much programming suitable for systems, and “lower level” things since before my professional career as a software developer. Back then I really loved C. After C I learned Python, then Haskell and Java. Anyway I wanted to refamiliarize myself with some of the concepts (manual memory management, pointers, etc), and Zig just looked more fun than Rust. There’s a also a pretty good page on Why Zig on the official site, which tbh I didn’t even read until now.

Since Zig is pre 1.0 I knew that this may be a bumpy ride and to expect changes to the language. Yesterday I read about the coming allocator changes for example - Allocgate is coming in Zig 0.9, and you will have to change your code.

Setup

I started by installing the latest Zig and going through the Getting started guide. No issues at all on my 2017 Macbook pro.

❯ zig version
0.9.0-dev.1795+aa61e03f2

Then I read the Ziglearn chapters 0 - 1. Skimmed the rest. I installed the Zig extension for VSCodium.

Ray tracing

I’ve wanted to try the Ray tracing in one weekend thing for a while. Using Zig seemed like a pretty good fit!

And I can “just” port the C++ code, and not fret too much on the details if I don’t feel like it maybe?

That turned out to be mostly true. I did have to think and research a bit more when it came to doing polymorphism in Zig. It’s a much more manual ordeal compared to C++. The result is quite nice though. But that was something I felt could be a good language addition, something like interfaces.

My take on the RTIOW, zigray, is available on github: github.com/vorce/zigray/

I decided to not implement the glass material because I don’t think it looks that good to be honest. I want to explore doing some calculations concurrently with async though, that would be cool. Also adding some textures would be neat.

One thing I didn’t have to worry so much about was memory management in this project. All in all zigray felt like a win.

Zigray in action

Advent of Code

Okay so the ray tracing experiment went pretty well. Last year’s AoC was fun. I don’t feel like putting as much effort in this year though. So maybe a good trade off is to try it in Zig with a more casual attitude towards the whole thing? Yes why not.

First thing I noticed is that parsing text was hard. And it took me to Day 4 or something to learn about std.mem.split and std.mem.tokenize lol. With those it’s better, but still not great. This seems pretty intentional, and I could probably find some library to help me. My mindset is still not in Zig mode.

I got extremely bored with AoC in Zig already on Day 4(!) (edit: I completed four more days after writing this). Way too much manual housekeeping around the actual problem solving I felt. This feeling I think is because of:

  • I’m still much more used to thinking in a FP style, avoiding mutations for example
  • Zig n00b, I simply don’t know the best approaches, structures, or the standard library good enough
  • I know the solution to the problem, and it’s trivial to implement in a language I know better
  • Not pausing and reading more before trying things out

I also had some problems refactoring Zig code, again due to the above I guess. Although the compiler is quite helpful! Documentation on ArrayList and HashMap was sometimes a little lacking. Hard to find examples, I frequently browsed the Zig lang source code, which on one hand was cool and interesting.

Didn’t feel that great about my AoC in Zig sadly.

Impressions

I like Zig! It’s awesome and fun. And it can become a nice tool for me that I’ve been missing, such as for game development. Practically speaking I think it’s clear that it’s better to learn Rust (if you can only pick one) at the moment.

I have a long way to go until I become comfortable and fluent with the language though.

Looking forward to 1.0!