There used to be a product called Sourcer which would read machine language and then reconstruct assembly language and comment it.
However, assembly language (the pseduo-representation of machine language) is as good as you're ever going to get [realistically speaking]. During the course of language translation, there are a lot of one-way operations that happen.
For instance, suppose you have a function that operates on thirty different values. Your compiler may perform some operations at compile time -- like evaluating constants in the expression. And then it may realize that it only needs one or two registers at any given time to perform the actual calculation.
A library known as Spontaneous Assembly was amazingly faster because it did all its work in registers and not on the stack.
By the time machine code is executed, you've lost all high-level abstractions, variable names, class names, function names, and programmer comments.