On Sunday, 4 February 2018 at 04:51:00 UTC, Jonathan Marler wrote:
How did it compare to the Go version?
I started implementing one myself as a learning experience and
recall I looked at the Go version a few times
(https://github.com/marler8997/hacknes). Mine was in C++
though since I was also trying to re-familiarize myself with
C++. Definitely curious on your thoughts on how the GO version
compared to your D version.
The code itself is pretty much a 1:1 copy. The style Go forces on
you is easy to replicate in D.
A few things I learned that stood out:
1. It was incredibly easy to move the code from Go to D. Most of
the work only took maybe 4 days. D is very flexible & made it
2. DMD just doesn't produce fast code compared to other modern
compilers. It's a shame LDC or GDC isn't the default D compiler.
Go doesn't use the same operator precedence rules as C & D. Not
sure why this surprised me but it lead to some initially
* Code differences
The only major difference relates to state file serialization.
Go has a binary serialization/encoding library (encoding/gob) in
its standard library which the Go author used to save/load the
Each component (CPU, APU, PPU, etc) is passed the binary stream &
adds what it needs saved.
In the D version I use D's built-in associative arrays
(equivalent to Go's map).
D makes it easy to convert to/from a string representation of
most types so I just convert the AA to a string, compress it &
save it to disk.
* Garbage collector
In the D version this doesn't even come into play because nothing
is allocated during "step" execution. The only allocations are
during console initialization or during things you won't be doing
often like setting the APU sample rate.