El término "decompilar" se aplica comúnmente a programas cuya función es la de traducir un código ejecutable a código fuente, donde: En comparación, un desensamblador traduce un ejecutable exclusivamente a lenguaje ensamblador que, como diferencia, aún depende del soporte hardware y sigue teniendo un nivel de abstracción mínimo (sólo superior al código máquina), pero resulta legible por humanos (y este código puede volver a ser ensamblado en un programa ejecutable).
Los formatos de bytecode utilizados por muchas máquinas virtuales (como la Java Virtual Machine o el lenguaje .NET (.NET Framework Common Language Runtime)) en ocasiones incluyen metadatos en el alto nivel que hacen que la decompilación sea más flexible.
Esto hace que sea más difícil revertir el código del ejecutable.
El nivel de éxito alcanzado por los descompiladores puede verse afectado por varios factores.
La información descriptiva, especialmente los detalles de los nombres, también acelera el trabajo del compilador.
Por ejemplo, en lenguaje ensamblador x86: podría ser traducido a: Se pueden aplicar varios tipos de análisis al IR.
Una instrucción and da como resultado 3 restricciones; ambos operandos pueden ser enteros, o uno entero y el otro un puntero (en este caso; la tercera restricción surge en el orden de los dos operandos cuando los tipos son diferentes).
Pueden reconocerse varias expresiones de alto nivel, al conocer las estructuras o los arreglos.
Esto puede permitir al usuario agregar comentarios, variables no genéricas y nombres de funciones.
Sin embargo, la decompilación es en ocasiones necesaria a la hora de buscar interoperatividad; las leyes de copyright en Europa y Estados Unidos que permiten en este caso la decompilación hasta un cierto límite.
Pocos casos sobre estos derechos de decompilación se han visto en Europa.