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