Для компилятора сообщения об ошибках компилируемого кода являются «нормальным» выводом, поэтому они должны быть записаны в stdout, а не в stderr. Единственные сообщения, которые должны быть записаны в stderr, будут об ошибках в работе самого компилятора (например, если файл, который составляет часть компилятора, не может быть найден, поэтому компилятор не может быть запущен).
То же базовое правило применимо к большинству других программ: если рассматриваемое «сообщение» является частью «стандартного» вывода этой программы, и пользователь обычно ожидает, что оно будет включено, когда / если они перенаправят вывод, тогда это должно быть записано в стандартный вывод. Стандартная ошибка предназначена для сообщений, которые пользователь обычно хочет / должен видеть, даже если они имеют стандартный вывод, перенаправленный в файл - в первую очередь те, в которых говорится, что программа не может быть запущена, поэтому нет вывода или если он может быть неполным или недействительным.