Если я правильно понимаю ваш вопрос, я не думаю, что это жесткое и быстрое правило. Например, вы можете использовать функциональный язык, такой как Lisp, для создания интерпретатора для себя. В этом случае детали реализации реализуются функциональным образом (поскольку Lisp является функциональным языком).
Кроме того, если у вас есть язык Turing Complete, вы можете использовать его для реализации синтаксического анализатора / интерпретатора / компилятора для любого другого языка. Существуют обязательные языки Turing-Complete и функциональные / декларативные языки Turing-Complete.
Но весь код в конечном итоге делается для сборки или машинного кода, что по своей сути является императивом. Теоретически, то, что я сказал выше, верно, но, по-видимому, не на практике:).
Как интересный исторический аспект, LISP был полностью теоретической конструкцией; это была математическая запись для компьютерных языков. Она оставалась теоретической, пока функция LISP eval
не была реализована в машинном коде Стивом Расселом на IBM 704:
По словам Пола Грэма из «Хакеров и художников», с. 185. Маккарти сказал: «Стив Рассел сказал, смотри, почему бы мне не запрограммировать этот eval ..., и я сказал ему, хо-хо, ты путаешь теорию с практикой , это eval предназначен для чтения, а не для вычислений . Но он пошел вперед и сделал это. То есть он скомпилировал eval из моей статьи в машинный код IBM 704, исправив ошибку, а затем объявил об этом как интерпретатор Lisp что это, безусловно, было. Так что в тот момент Лисп имел по существу ту форму, которую он имеет сегодня ... " (выделено мной)
Итак, еще раз, тонкости между теорией и практикой. :)