После просмотра большого количества сообщений о разнице между компиляторами и интерпретаторами, я все еще не могу понять разницу в их конструкции и внутреннем механизме.
Самое распространенное различие, которое я прочитал, было то, что компиляторсоздает целевую программу, которая является исполняемой {означает машинный код как ее вывод}, которая может быть запущена в системе и затем снабжена вводом.В то время как интерпретатор просто запускает строку ввода за строкой {что именно здесь происходит?} И выдает результат.
Мои основные сомнения:
1) Компилятор состоит из лексического анализатора,синтаксический анализатор, генератор промежуточного кода и генератор кода, но каковы части интерпретатора?
2) Кто обеспечивает поддержку во время выполнения интерпретируемых языков, я имею в виду, кто управляет кучей и стеками для рекурсивных функций?
3) Это характерно для языка Python:
Python включает в себя этап компилятора, а затем этап интерпретатора, а также компилятор создает некоторый байт-код, и затем этот байт-код интерпретируется его виртуальной машиной.
если бы мне пришлось проектировать только компилятор для Python (Python -> bytecode)
a) мне пришлось бы управлять памятью {писать код для управления стеком и кучей} для него?
б) как этот компилятор будет отличаться от традиционного компилятора или, скажем, интерпретатора?
Я знаю, что здесь очень много вопросов, но я действительно хочу понять эти мелкие детали.
Я имею в виду сборник книг Альфреда В. Ахо
Основываясь на отзывах и дальнейших исследованиях, я думаю, что мне следует изменить свой вопрос
Компилятору не нужно выдавать только машинный код в качестве выходных данных
Но один вопрос все еще вызывает у меня сомнения. Допустим, я хочу создать компилятор (Python-> bytecode), и тогда байт-код будет интерпретироватьсявиртуальная машина .. (поправьте меня, если я ошибаюсь).
Затем мне придется написать лексический анализатор для Python, а затем парсер, который сгенерирует какое-то абстрактное синтаксическое дерево .. после этого мне придетсясгенерировать какой-нибудь промежуточный код (3-х адресный код, как упомянуто в книге драконов) или прямые инструкции байт-кода (которые, я полагаю, будут приведены в документации виртуальной машины)?
Придется ли мне писать код для обработки стекаа также для поддержки рекурсии и области действия?