You can_ take a binary and from it, produce source code that, when compiled, would produce essentially the same binary.
However, a big part of software engineering is making sure that your source code is clear, readable, organized, documented, and so forth. Programming languages, especially the so-called ‘object-oriented’ ones, contain a lot of high-level organizational syntax (beyond simple comments) that is used only at compile time for error-checking, and then discarded when producing actual binaries. The output you get from a decompiler has none of this.
Think of it this way: let’s say you have a blueprint for a new airliner your company is producing - this would be the source code. This is organized in terms of systems: structural components, wing framework, engine fuel supply, air conditioning, air conditioning backup, hydraulic master pump drive cylinder B, etc. It’s well-organized, cross-referenced, indexed, documented, you name it. There are comments from engineers describing what each piece does, why it was placed where it was, and so forth.
You have a team of robots build a prototype of this plane. They ignore all your documentation: all they care about are the physical connections between components - wires, welds, and so forth. This is essentially the compilation. For rhetorical purposes, we’ll just say there are no labels on anything.
Your competitor steals the prototype, and has a team of his robots disassemble it - decompiling it. However, without access to your original plans and documentation, it will be incredibly difficult for him to figure out anything about the plane, even if his robots produce an exhaustive list of what is connected/welded to what. If he finds a tank and a pump, he won’t know what it’s for without tracing every single connection going into and out of it - is it is a fuel tank? Engine oil tank? Drinking water tank? Hydraulic fluid tank? Backup hydraulic fluid tank? Air tank? Sewage tank
With enough resources, he could eventually reverse-engineer the entire plane, by tracing every single wire and figuring out what it’s supposed to do. Even then, when making repairs or improvements, he won’t have the experience of the engineers who designed the thing (the comments in source code), who might have discovered that you can’t route wire A through joint B because the vibration will fray it.
That said: it is trivial to ‘decompile’ some languages. Obviously, some are not compiled at all: Python, Perl, Javascript. You can just open up the file and look at the source. Others are compiled, but into a pseudo-assembly language that preserves a lot of the structure of the source code. Java is one of these, and there actually exist programs (called obfuscators) that dick around with compiled Java files in order to make it more difficult to get anything meaningful when decompiling them.
One of them is called Zelix Klassmaster.