Decompilers do exist, and some are quite good at it, but it depends heavily on the platform and compiler.
For example .net/JVM decompilers are doable because the argument types are known clearly(and there is extensive metadata), there is only one compiler, it's a simple stack machine, and not something with random register allocation, the beginning and ending of the functions are known, code is separate from data. These are requirements which make decompilation partially possible ( good enough to be usable ).
Decompiling x86 code is perfectly possible ( and if you did some research you'd find out there are some open source decompilers and even a fairly good commercial decompiler pluging for IDA, for x86 code which is user-assisted, however a bit expensive ). The user provides the function bounds, parameter types, structures, and so on. A lot of data is lost during compilation and can only be recovered by a skilled reverse engineer. Decompilation of such code is possible, but automatic results tend to be not very satisfacatory, but if an user assists the decompiler by providing the needed data which was lost during compiling, but later inferred from the code by the reverse engineer.
Summary:
1)Very usable decompilation for VM languages which provide clear code/data separation, extensive metadata and type info is possible and doable. Examples: Reflector for .net , and plenty of other tools for JVM ( many open source ) (most are free)
2)Usable decompilation of real machine code such as x86 to C is possible and even realistical if the user asissts the decompiler in recovering data which was lost during compilation, such as exact function bounds, stack frames, parameter types and structures. Examples: IDA+Hex Rays (2000$+)
There are also a bunch of good papers which describe how this can be accomplished using modern compiler theory techniques:
M. Van Emmerik. Static Single Assignment for Decompilation. PhD thesis, University of Queensland, 2007.
http://vanemmerikfamily.com/mike/master.pdf or
http://vanemmerikfamily.com/mike/master.ps.gz .
Here's also a bunch of other interesting links:
http://www.program-transformation.org/Transform/HistoryOfDecompilation3
>It is possible, but the reasons why decompilers have not been widespread are mostly political, as in those who know too much about the topic tend to either disappear or stop working on it for mysterious reasons. Not surprising, given what we can do with this sort of knowledge.
As you can see, all of this is very real, and people are doing it right now, there's nothing secretive about it, or mysterious. Nobody is trying to stifle decompiler research, it's just that most of it is not very mainstream, but people have been using it for a while. The most mainstream decompiler I can think of is Reflector, and that is because it's very easy to use and requires little user interaction, however when it comes to decompiling real machine code, the actual decompilation process requires a skilled reverse engineer to assist his decompiler. Alternatively, a skilled reverse engineer can easily decompile code by hand if he is assisted by a good interactive disassembler, however it tends to get boring after a while.