my first instinct was to say "this is just malbolge" but I think you can do better than this -- while the mapping between source code and operations in malbolge is an absolute nightmare, it's the same nightmare every time for the same input program
taking this idea at face value, this is easy to sketch out the fundamentals of: randomly reshuffle the meanings of operators and/or function calls at every compilation, and if compilation fails or program execution crashes, delete the object code and source code.
choosing constraints on the first half to make it "fun", though, is an interesting problem. e.g. you would probably only want to shuffle operations within a given arity, to prevent failure states stemming from unbound arguments, and create a hierarchy of "dangerousness" on operations to allow the program to get its bearings and reset itself to a known state after a brief exploratory period before beginning its execution proper.
