Perchè non è dipendente dalla pittaforma?

Sento tanto parlare del java che è indipendente e che con il c++ bisogna ricompilare il programma per ogni tipo di piattaforma?

Per piattaforma si intende macchina+sistema operativo.
Se compilo un programma per linux per intel, devo ricompilarlo per supportare amd?
E per win?