En decompiler er et program, der oversætter et eksekverbart modul (opnået ved udgangen af en compiler ) til en tilsvarende kildekode i et programmeringssprog på højt niveau .
Dekompilering er processen med at genskabe kildekode af en decompiler.
Især dekompilering bruges i reverse engineering af programmer.
Succesen med dekompilering afhænger af mængden af information præsenteret i den dekompilerede kode. Bytekoden , der bruges af de fleste virtuelle maskiner (såsom Java Virtual Machine eller .NET Framework Common Language Runtime ) indeholder ofte omfattende metadata, der gør dekompilering ganske mulig, mens native kode er slankere og sværere at dekompilere. Især opkald til subrutiner eller funktioner med indirekte adressering af opkald (i form af programmeringssprog på højt niveau, opkald gennem pointere til funktioner/procedurer) synes at være svære at læse.
Hvis det er kendt på hvilket sprog det dekompilerede program er skrevet, så adskilles og analyseres runtime- bibliotekerne (RTL - runtime library) for compileren fra dette sprog først og fremmest, da kompileringen af programmet i bund og grund reduceres til opkald med forskellige procedureparametre fra disse biblioteker. Derudover giver mange compilere dig mulighed for at se, hvilken assembly-kode programsætningerne bliver til efter kompilering. Disse konstruktioner bliver skabeloner for dekompilatoren, så dekompileringsprocessen svarer på en måde til at genkende et begrænset sæt af sådanne skabeloner i maskinkode. Procedureopkald og returneringer fra dem er de nemmeste at genkende. De tjener som grænser for at genoprette procedurens erklæringer.
Nogle compilere og post-kompileringsværktøjer slører kode for at gøre det sværere at dekompilere.
Dekompilere kan opfattes som bestående af en række faser, som hver især bidrager til visse aspekter af den overordnede dekompileringsproces.