A problem is undecidable if there is no algorithm (Turing machine) that can solve the problem for all possible inputs. No matter how clever the algorithm, it will fail on some inputs.
Undecidability represents fundamental limitations of computation. These are not limitations of current technology or programming languages, but mathematical impossibilities that apply to any conceivable computing device.
Undecidable problems exist even though they can be stated clearly and seem like they should be solvable. This was one of the most surprising discoveries in computer science.
The most fundamental undecidable problem is the acceptance problem for Turing machines:
A_TM = {⟨M, w⟩ | M is a Turing machine and M accepts string w}
This problem asks: "Given a description of a Turing machine M and an input string w, does M accept w?" This seems like it should be solvable, but it's not!
A_TM is undecidable.
Interestingly, while A_TM is undecidable, it is recursively enumerable:
We can construct a Turing machine that accepts A_TM by simulating M on w. If M accepts w, our machine accepts. If M rejects w, our machine rejects. But if M loops forever on w, our machine also loops forever.