Это не имеет смысла. Интерпретатор не создает двоичный файл, поэтому не может создать то, что может работать автономно. Где-то, в конечном счете, вам нужен двоичный файл, который является интерпретатором.
Пример начальной загрузки компилятора. Допустим, у нас есть два языка A (ssembler) и C. Мы хотим запустить компилятор C, написанный на C. Но у нас есть только ассемблер, с которого нужно начинать.
- Написать базовый компилятор C в A
- Написать компилятор C на C и скомпилировать с более ранним компилятором, написанным на A
- Теперь у вас есть компилятор C, который может компилироваться сам, вам больше не нужен A или оригинальный компилятор.
Более поздние пробеги становятся просто
- Компиляция программы C с использованием компилятора, написанного на C
Теперь предположим, что вместо этого у вас есть интерпретируемый язык, я назову его Y. Первая версия может называться Y1, следующая Y2 и так далее. Давайте попробуем его «загрузить».
Прежде всего, у нас нет ничего, что могло бы интерпретировать Y-программы, нам нужно написать базовый интерпретатор. Допустим, у нас есть компилятор C и мы написали интерпретатор Y1 на C.
- Написать интерпретатор Y1 на C, скомпилировать его
- Напишите интерпретатор Y2 в Y1, запустите его на интерпретаторе Y1, написанном на C
- Написать интерпретатор Y3 в Y2, запустить его на интерпретаторе Y2, работающем на интерпретаторе Y1 ... Написано на C.
Проблема в том, что вы никогда не можете избежать стека интерпретаторов, поскольку вы никогда не компилируете интерпретатор более высокого уровня. Так что вам всегда нужно будет скомпилировать и запустить тот первый интерпретатор версий, написанный на C. Вы никогда не сможете избежать этого, что, я думаю, является фундаментальной точкой процесса начальной загрузки компилятора. Вот почему я говорю, что ваш вопрос не имеет смысла.