Сказать «компилятор выделяет память» может быть не совсем точным в буквальном смысле, но это метафора, которая наводит на мысль о правильном пути.
Что действительно происходит, так это то, что компилятор создает программу, которая выделяет собственную память. За исключением того, что не программа распределяет память, а ОС.
Так что на самом деле происходит то, что компилятор создает программу, которая описывает требования к памяти, а ОС использует это описание и использует его для выделения памяти. За исключением того, что ОС является программой, и программы на самом деле ничего не делают, они описывают вычисления, которые выполняются процессором. За исключением того, что ЦП на самом деле является просто сложной электронной схемой, а не антропоморфизированным маленьким гомонкулом.
Но имеет смысл думать о программах, компиляторах и процессорах как о маленьких людях, которые живут внутри компьютера, не потому, что на самом деле они есть, а потому, что эта метафора хорошо подходит человеческому мозгу.
Некоторые метафоры хорошо работают для описания вещей на одном уровне абстракции, но не работают так же на другом уровне. Если вы думаете на уровне компилятора, имеет смысл описать процесс генерации кода, который приведет к выделению памяти, когда компилируемая программа фактически выполняется как «выделение памяти». Достаточно близко, что, когда мы думаем о том, как работает компилятор, у нас есть правильная идея, и это не так скучно, что мы забываем, что мы делали. Если мы попытаемся использовать эту метафору на уровне запущенной скомпилированной программы, она вводит в заблуждение странным образом, что вы и заметили.