Para ser más precisos, es convertir de un lenguaje de programación a un nivel inferior de un lenguaje de programación. Por ejemplo, hoy en día cuando escribes una aplicación para Android, generalmente escribes en Java. Luego llamas a javac, el compilador de java para compilarlo en bytecode de Java, que es un lenguaje binario que la JVM (Máquina Virtual de Java) interpreta y ejecuta. Pero Android no utiliza JVM y Java Bytecode. Utiliza bytecode optimizado para Android, llamado DEX. Así que el sistema de compilación de Android compila tu bytecode java a bytecode DEX y lo empaqueta en un apk (archivo de aplicación, similar a java jar). En los 'droids modernos, que ejecutan ART (android runtime), una vez que se instala la aplicación, se compila en archivos OAT que son binarios que se ejecutan directamente en la CPU del teléfono.
Todos ellos son lenguajes de programación, Java, java bytecode, DEX, y código máquina. En los viejos tiempos, los programadores escribían código máquina. Luego se inventaron los compiladores (a finales de los 50, el primer lenguaje simbólico propiamente dicho fue fortran). Todavía hay gente que juega con los microcontroladores y los programa en binario pulsando interruptores (cada interruptor es un bit de instrucción) y viendo los resultados en los LEDs, cada uno de los cuales representa un bit. Pero eso es como si un hipster llevara una máquina de escribir a su bar local de café expreso para escribir poesía (mientras tiene un iPhone en su bolsillo)...