En général tu as plusieurs compilateurs par langage, t'as des compilateurs "officiels", pour différents OS, t'as des compilateurs qui ne génèrent pas de fichiers binaires mais qui "interprètent" un code, c'est un monde assez vaste.
Le premier compilateur a été fait "à la main" pour créer un programme permettant de créer un compilateur un peu plus sophistiqué, ensuite on l'a utilisé pour programmer un compilateur encore un peu plus sophistiqué, etc.