Как уже сказали в других ответах, компиляторы и интерпретаторы пишут так же на языках программирования.
Насчет компиляторов так же считается, что зрелый язык позволяет написать собственный компилятор на себе самом. И для многих компилируемых языков компиляторы действительно написаны на них самих. Но тем не менее, самый первый компилятор все равно придется написать на другом языке, в современном мире для этого очень часто выбирают OCaml, хотя и другие языки вполне подойдут.
Интерпретируемые языки нуждаются в интерпретаторе, который пишется на компилируемых языках. Простор выбора тут огромен, но чаще все же встречается или C или C++.
Так же еще встречается JIT компиляция (js (не всегда), lua), при которой весь процесс компиляции происходит непосредственно перед выполнением, а так же гибридная AOT+JIT компиляция (C#, Java), когда исходный код компилируется в байткод при разработке (AOT), а перед исполнением байткод компилируется в машинный код (JIT), что позволяет получить плюсы от обоих типов компиляции. JIT компиляторы как и интерпретаторы как правило пишут на AOT-компилируемых языках.
Ну и надо не забывать, что почти у каждого языка бывает стандартная библиотека, которая может быть написана как на самом языке (C, C++, Go, Rust), на самом языке + на другом, чаще на C или C++ (js (не во всех движках), C#, Java, python (не уверен, что он не к следующему типу больше)), либо полностью на другом языке (php, python (?)). Тут все сильно зависит, на сколько в языке доступно низкоуровневое общение с ОС и железом, а так же на сколько это быстро можно выполнить не ломая "сахара" языка.