Java запускается в переносимой виртуальной машине которая уже умеет во все архитектуры, а на системных языка тебе нужно компилировать программу для конкретной архитектуры, например: x86, arm.
Это не значит что тебе нужно для каждого процессора отдельно компилировать, это значит что тебе необходимо скомпилировать один раз для каждой архитектуры.
Архитектура подразумевает публичный api который реализуется множеством процессоров.
Не нужно сравнивать прикладные языки с системными.
Единственный низкоуровневый язык - это язык ассемблера, все остальные, включая С - высокоуровневые языки.
Разница лишь в области применения, никто не будет писать фронтенды на С, у каждого из инструментов есть проблема, которую он решает и область применения в которой эта проблема актуальна.