Как первоначально компилировали сами компиляторы написанные на яву?
См. "Раскрутка компилятора". Кратко - создаётся (в машкодах, ассемблере, или другом языке) компилятор минимального подмножества языка, пригодного для разработки. Затем на этом подмножестве пишется компилятор, способный скомпилировать само это подмножество. Ну и дальше процесс продолжается итеративно, добавляются фичи в язык, дописывается компилятор и тд.
Дополню. Вот тут хорошее описание как все происходит. 
Все делается в 3 фазы. 
https://gcc.gnu.org/install/build.html