NES emulator written in D

blahness nospam at example.com
Sun Feb 4 20:56:32 UTC 2018


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.

Quickly,

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 
easy.

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.

* Gotchas
Go doesn't use the same operator precedence rules as C & D. Not 
sure why this surprised me but it lead to some initially 
confusing bugs.

* 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 
machine state.
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.


More information about the Digitalmars-d-announce mailing list