Это определения общего случая. То есть, оно правильное, но я обычно использую частный случай, который на интуитивном уровне звучит примерно так "из читаемого набора байт получить нечитаемый". С парой уточнений.
Погоди, я правильно понимаю, что ты только что код на js назвал "читаемым набором байт"? :-) Как по мне - это вполне себе нечитаемый набор байт, ну не более читаемыей чем асм скажем :-) Впрочем, сделать его совсем нечитаемым не просто, а очень просто. :-)
А если серьезно, то, по моему, в русскоязычной терминологии сложились довольно извращенные традиции. Если пойти к истокам, то мы увидим, что транслятор - это сложная штука - переводчик, вникающая в семантику написанного и делающая то, что не сводится к простой компиляции. Скажем fortran - это именно что formula translator (точнее - The IBM Mathematical Formula Translating System). На входе высокоуровневый код, выходе был машкод.
А вот компилятором я бы назвал (если забыть про извращенные терминологические традиции) штуку которая занимается трансляцией (переводом) на основе просто регулярных выражений - работающая чисто с синтаксисом, без разбора семантики исходного и целевого языков.
Исходя из этих определений - "компилятор" Вирта и Oberonjs это именно что трансляторы, ибо разборки с синтаксисом там занимают лишь малую часть кода - самое сложное и интересное таки в сементике.
А вот Сишный препроцессор - это именно что компилятор, ибо занимается тупой подстановкой на уровне синтаксиса.