Es funktioniert dann recht gut, wenn der Decompiler den Compiler kennt. Jeder Compiler produziert ja charakteristischen Code. An Hand diesen kann dann ein Decompiler das ganze bis zu einem gewissen Grad wieder rückgängig machen. Im Falle von C funktioniert das einigermaßen. Je abstrakter aber die Sprache wird, desto schwieriger wird auch das decompilieren. Bei C++ ist das schon garnicht mehr wirklich möglich, AFAIK.