There are a couple of "reference implementations" that the Ethereum foundation is supporting.
- Ethereum C++ (known as Eth or "TurboEthereum")
- Go Ethereum (known for the command line client Geth)
- EthereumJ
- Pyethereum
There are a couple of reasons for doing this.
- Finding consensus problems.
Bitcoin was created in an isolated environment, because of this some bugs crept in that are hard to fix because they break the consensus and would require a fork. Because of this anybody wanting to build a app to support the Bitcoin protocol need to add these bugs in or they won't be able to get consensus.
By supporting multiple clients from the start you have multiple people interpreting the white and yellow paper so any consensus issues will pop-up much faster, and they did. Luckily this is happening less and less as the technology matures.
- Spreading the risk.
If there is an attack vector or bug in any of the Ethereum implementations it means the network is usually fine as there is a bigger diversity of clients available. As I'm writing this this is sadly not 100% true yet because Geth has a majority of the network but we hope that the other clients will grow in usage in the coming months.
- Playing on strengths
Not all languages are good in the same thing (some opinions in the next bit)
- C++ is super fast, but harder to build or read.
- Go is easy to build, code and read but loses some of the speed.
- Java can be used in most Enterprise environments and has the best support for Android.
- Python is very easy to understand and read but gives up some speed to do it.
Hope this helps understand it.