Kind of annoying that this has every instruction taking memory operands directly, instead of a load/store architecture like Moxie. This makes it much harder to write a secure virtual machine, since you need to make sure there are boundary checking in many places instead of just two.
I'm not quite sure about the issue you've raised here - we have already written all the boundary checks and completed all the unit tests to prove that they work (it is basically just *one* function that each op code which needs to check if a memory location is valid calls and it could easily be *inlined* for better performance).
Actual AT machine code doesn't need to do any such checks as the machine will simply gracefully fail if they attempt to read or write outside of their valid memory range.
The design choices made were primarily about keeping the *code size* of the ATs as small as possible (thus only the SET_VAL op code takes a 64 bit literal value and most other op codes take one or two 32 bit addresses) and preventing anything such as "self-modifying code" or invalid branching.
Also I am neither a fan of the JVM nor Java (and haven't written any code in Java since the 1990s) so it is perhaps unsurprising I had not even heard of the Moxie project that you mention before I read your post.
Anyway - if Moxie is suitable for blockchain usage then of course people should decide which VM is the best fit for their blockchain (we are not claiming AT is *the best VM* but simply that it is *available* and that we have already built an atomic cross-chain transfer program for it so it should be quite useful even as is and without a higher level language).
In regards to "dead code" it is envisioned that ATs with no UTXOs left could be removed as part of pruning.
As far as performance goes only testing will reveal how useful an addition AT is (note that limits are recommended to prevent AT from ever becoming too big a burden for peers to handle).