Компилятор переводит с исходного языка на что-то еще, включая байт-код или более простой язык - это не обязательно должен быть машинный код, и он может очень сбрасывать представление, читаемое человеком.Если исходный и выходной языки находятся примерно на одном уровне абстракции, некоторые предпочитают такие термины, как «конвертер», но это также и компиляторы.
Интерпретатор, с другой стороны, не выводит код.Он просто строит внутренние структуры данных из исходного кода, аналогично тому, что делают компиляторы перед генерацией кода - только не создавайте другую эквивалентную программу на другом языке, но выполняет программу сразу.Обратите внимание, что (не JIT-компиляция) виртуальная машина, выполняющая байт-код, также является интерпретатором.Таким образом, CPython не интерпретатор для Python, а компилятор из Python в байт-код CPython - и интерпретатор для этого байт-кода.
Таким образом, ваше определение компилятора в # 1 недостаточно широко, в то время как определение интерпретаторафактически называет комбинацию компилятора и интерпретатора (вы не виноваты, это очень распространенный подход, используемый многими языками, обычно - но ошибочно - называемый «интерпретированный»).# 2 - ложь, поскольку интерпретаторы не выводят код (что могло бы сделать компилятор), в то время как # 3 корректен (вы можете подключить его к интерпретатору для выходного кода, но это все-таки другая программа).