2025-11-19 -- Maybe more Java?
==============================

For quite a while now, my "toolchest" has looked like this:

-   C or Assembler for very low-level tasks.
-   C with GTK for GUI programs.
-   Python for "normal" programs or larger scripts.
-   Shell scripts for glueing other tools together.

Rust  is  very,  very slowly creeping in as well, I sometimes use it for
"systems programming" or other "low-level-ish" tasks. But I'll  be  hon-
est,  Rust  is so hard to learn, I always shy away from it and don't use
it often enough.

Regarding GTK: I loved it during the GTK2 days but now I have  to  admit
that  I'm  not  that much of a fan anymore. It has become a pretty heavy
toolkit by now. I've pretty much stopped using it in  my  own  code  and
this now leaves a gap.

I've  dabbled a bit with PyQt6. And I've noticed that I'm slowly getting
tired of Python's dynamic typing. I find it more comfortable to  have  a
compiler  that reliably tells me when types are wrong (or when there are
typos), because frankly, I don't think I've ever really made use of  dy-
namic typing *at runtime* (except for parsing JSON files into dictionar-
ies,  I  guess). My brain doesn't work that way. I want static typing. I
want to get all kinds of stuff out of the way before  the  program  even
runs. That's just not the case with Python, you always have to test each
and  every  code path just to catch typos (or more serious errors). Some
people might say that this is good practice anyway,  but  I'm  not  con-
vinced -- how many projects really do have 100% test coverage? (I didn't
find tools like mypy or Python's type hints to be helpful.)

Long  story  short,  I  used IBM Java 1.0.1 on OS/2 Warp 4 for Advent of
Code in 2024 and that was a surprisingly nice experience. That's an  an-
cient  version,  of course. I wasn't new to Java, but I stopped using it
while Java 6 was still the most recent version.

Java is bad in these regards:

-   Does not produce native binaries. You always need a JVM.
-   Memory management is annoying. Having to decide  up-front  how  much
   RAM my program is going to use is a bit silly.
-   The  code  can  get  rather "wide" because many class names are very
   long.

But on the other hand, these properties are great:

-   Compiled language, static typing.
-   Memory safety is not an issue.
-   Produces small "binaries".
-   The offical documentation is really good  and  a  pleasure  to  work
   with.
-   It  can  do proper multithreading (unlike Python). I've already used
   multithreading extensively during my Java 6 days and it was nice  to
   work with.
-   OpenJDK is Free Software now.
-   It appears to be very stable with few surprises and shenanigans, old
   stuff  still works, probably because it's used so much (?) in enter-
   prise software.

And JVM ramp-up times are not an issue anymore. This used to  be  annoy-
ing,  but  that's  a thing of the past. A "java Hello" takes 33 ms on my
box.

I'm currently toying around with making a little file  manager  in  Java
that uses Swing for a GUI. Swing is *not that bad*.

I'll also try to catch up with new features that landed in Java.

And then we'll see. Maybe I'll get fed up quickly. Maybe not.