(2023-09-25) How I started learning OCaml... and paused it
----------------------------------------------------------
Two posts ago, I told that I would start looking at three native-compiled
(that is, no VM) programming languages as potential C replacement 
candidates. So, OCaml became my first guniea pig of choice. And, to tell you 
the truth, this is the language I really had the highest hopes for. And I 
really can recommend it to everyone. No matter what they say, it's really 
easy to pick up and start writing real-life code. It's also relatively easy 
to compile fully static binaries using it. You can see the Makefile of my 
OSmol server ([1]) for an example of how to do this. Yes, OCaml is so easy 
that I was able to write a simple and robust Gopher server (that's powering 
this very Gopherhole right now!) within <45 SLOC and about 2 days of digging 
through courses and manuals. And the binary of this server doesn't require 
any runtime dependencies on my VPS, as it's fully self-contained and 
statically linked with musl libc. I couldn't be happier with the results of 
my preliminary tests...

...Except one "minor" issue. Can you guess the final binary size?

979184 bytes.

I'm not kidding. This is with musl — with glibc, it's well over 1.6 megs. And
I had installed Flambda optimizer and used all kinds of optimization tricks 
on the musl-gcc and/or zig cc sides as well. If anything, I was expecting 
around 45-50K, as this is the usual size of a static musl linked binary that 
is that simple. Although I *kinda* guess what's going on there, it's obvious 
that the OCaml compiler does absolutely nothing to remove unused code 
present in the standard library and included ".cmxa"s from the final binary. 
I looked around on teh interwebz and found nothing significant on the topic 
except some "post-link optimization frameworks" that don't actually change 
the bigger picture much in terms of executable size, and the mere existence 
of such frameworks shows that the current OCaml implementation just wasn't 
designed with static linking and _low-level_ dead code elimination in mind. 
For a Gopher server, that's kinda OK, but for my entire spectrum of intended 
language purposes, that's just unacceptable. I want my programs to be able 
to run in RAM- and disk-limited environments, where even a phone with 256 MB 
RAM is not the worst case scenario, so a megabyte per single process image 
(not even a whole process!) is too costly, regardless of how awesome the 
language itself is.

That's why I decided to put learning OCaml on hold and move on to my next
candidate. It will take some time as well, so I guess I'll share my thoughts 
on it in two weeks or so.

--- Luxferre ---

[1]: https://git.sr.ht/~luxferre/OSmol