When coding in High level languages one works with an abstraction: he needs not to be concerned about what underlying hardware his application is running on. He can only assume things about the Hardware and the infrastructure that application is using or running on like language framework or Virtual machine, compiler etc. should take care of the rest. I think that is the reason why you have different set of compilers or Virtual machines.
These sort of details will only matter when you work closer to hardware like when you are really manipulating the registers etc. (programming in assembly, writing firmware etc.)