将输入程序称为源程序,输出程序称为目标程序。相应地,源程序所使用的程序设计语言被称为源语言,目标程序的语言被称为目标语言。程序变换的源语言和目标语言可以是同一种语言,也可以是不同语言。编译和程序优化可以看作是两种典型的程序变换,前者源语言和目标语言不同,后者相同。
程序变换大多由相应的程序变换算法和系统自动完成。程序变换系统往往包括源语言的编译器前端作为其子系统,对源程序进行语法分析并将其转化为系统内部表示(如抽象语法树)。此外,程序变换系统往往还需要各种程序分析技术,以确保目标程序和源程序的行为的一致性。最终,需要将目标程序的系统内部表示反向转化为符合目标语言语法的合法程序。
程序变换在软件工程领域有着重要的应用,除了上述的编译和程序优化外,还包括程序合成、不同语言之间的程序翻译、反向工程、程序正则化、程序混淆(program obfuscation)、文档生成和程序可视化等。
大多数程序变换要求要么源程序和目标程序等价,即它们分别在源语言和目标语言的语义定义下具有相同的行为;要么目标程序是对源程序的精化,即目标程序的行为比源程序行为具有更强的确定性。