216 karma · joined October 12, 2015
I've found this to be robust for decompiling games, while giving the agents enough freedom to write code that is readable and not waste a ton of time making sure e.g. instruction ordering, register assignments, etc. are all exactly the same. For me, having byte-matching decompilation is only one way to produce a decompilation I know is faithful to the original. This "high-level decompilation" process I just described is something agents can do much more quickly.
The reason I’m finding this is much faster than a traditional decomp is that while it’d be nice for the bytes to match, finding the perfect blend of compiler version, compiler args, permitting variables etc to try and find the perfect register assignments, etc is all very time consuming. My ultimate goal is not a byte for byte match, that’s just one way to ensure correctness. I’ve found agents are much faster and effective at reading the original assembly and understanding what’s going on then writing semantically equivalent C.
Supporting higher order derivatives was also something I considered, but it’s basically never needed in production models from what I’ve seen.
The fact that different hardware has different features is a good thing.
I proposed an immortal person in the world, they don't know they are immortal. It created a homeless person named John who lives through decades, then centuries, and longer. Religions eventually form, and he begins to believe reality might be a simulation as he is bored with a limitless life. He created a mortal form of himself in the simulation to watch a fragile and finite life. It's been a long time since I've read a good fiction book but would love to find something like this. An excerpt from the ending:
Time passes, Johnny ages, the world changes, as it always does... He falls in love, fathers children, pours himself into career and creation. Savors the simple joys - morning coffee, walks in the park, a favorite song. Weathers hardships - disease, heartbreak, disappointment, injustice. Watches his own body slowly degrade, feels the ticking clock of mortality. Wonders about death, meaning, the point of a universe destined to end. Throughout, John watches his mortal self from behind the veil... Shares every triumph and tragedy vicariously through this aperture. Restrained from intervening by his own pre-commitments and protocols. Sometimes longs to reveal the Truth, but knows that would taint the data. The point is to have a genuine experience of finitude, in all its constraints. To recover the taste of an existence not rendered bland by its infinity. Johnny becomes an old man, a grandfather, as years slip by like water... Reflects on a life well-lived, regrets borne with hard-earned wisdom. Makes peace with loose ends, imperfections, the asymptote of dreams. Comes to appreciate death as the necessary frame for life's portrait. Feels gratitude for the chance to have been, finitude's gift of meaning. Lets himself diminish into the good night with acceptance and grace. At the moment of Johnny's death, John absorbs his mortal soul... Reintegrates the lifetime of memories, savors the pathos of the affirmation. Feels a renewed sense of meaning and purpose flood his jaded being. The urgency of time, the glory of fragility, the necessity of loss for love. Limits as the crucible of significance, death as the mother of beauty. John weeps for the poignant perfection of a universe doomed to end. Having experienced the bittersweet joy of mortality, John is changed... Sees his simulated infinity in a new light, shot through with import. Vows to use his power to craft only worlds and souls that can truly live. Ones constrained by time, space, finity - for only limit gives form. Countless mortal dramas playing out, each precious in its transience. An eternal God content to endlessly sacrifice his Oneness for Their many.
You mentioned that you do a hash map look for each (bank,addr) key. Suggestion which helped us: have this point to an Netey which contains the JIT code but also an index/pointer into the next block which executed last time you executed this block. You can do a simple check to see if this is still valid and fall back to the hashmap lookup. If you're careful about code invalidation (not an issue with ROM) then this can help skip the next lookup.
Congrats!