Eliminación de código muerto
En programación, la eliminación de código muerto es una técnica de optimización de software comúnmente llevada a cabo de forma automática por un compilador optimizador que consta en eliminar cualquier tipo de código muerto, código inalcanzable, código redundante y almacenamiento muerto.[1][2] Resulta importante eliminar este tipo de código por varias razones entre las que se enumeran: ahorrar tiempo de cómputo innecesario, evitar accesos a memoria innecesarios y ejecutar código que no se utilice ya que puede arrojar excepciones.[3]
Algoritmos
Históricamente la eliminación de código muerto fue llevada a cabo mediante la información que se obtiene de un análisis de flujo de datos.[4] Luego se publicó un artículo donde se mostraba esta técnica mediante static single assignment form.[5] Más tarde se mejoró el algoritmo removiendo las operaciones de flujo de control innecesarias.[6]
Ejemplo
Suponiendo el siguiente trozo de código:
int foo() {
int a = 24;
int b = 25; // almacenamiento muerto
int c = a << 2;
if (true) //código muerto
c = a << 2; //código redundante
return c;
b = 24; // código inalcanzable
}
Dado que presenta varios errores una eliminación de código muerto debería de dejar el código de la siguiente manera:
int foo() {
int a = 24;
int c = a << 2;
return c;
}
Dependiendo de que algoritmo se usó y de que forma se realice el código resultante puede variar. Utilizando otras técnicas de optimización como el plegamiento de constantes y la propagación de constantes de forma exhaustiva el código se podría llegar a reducir a lo siguiente:
int foo() {
return 24 << 2;
}
O dependiendo del plegamiento y otras técnicas de optimización se podría calcular 24<<2 e incluso eliminar la función y reemplazar cada llamada a la misma, por ese valor.
Véase también
Referencias
- «Código muerto». Archivado desde el original el 20 de julio de 2013. Consultado el 17 de enero de 2013.
- «FUNDAMENTOS DE OPTIMIZACIÓN». Archivado desde el original el 2 de enero de 2010. Consultado el 17 de enero de 2013.
- Hongwei. «Page 1 Dead Code Elimination throughDependent Types» (en inglés). Archivado desde el original el 9 de marzo de 2012. Consultado el 17 de enero de 2013.
- Ken Kennedy. A Survey of Data-flow Analysis Techniques. In Program Flow Analysis, Muchnick and Jones (editors), Prentice-Hall, 1981.
- Ron Cytron, Jeanne Ferrante, Barry Rosen, and Ken Zadeck. Efficiently Computing Static Single Assignment Form and the Program Dependence Graph. ACM TOPLAS 13(4), 1991.
- Keith D. Cooper and Linda Torczon, Engineering a Compiler, Morgan Kaufmann, 2003, pages 498ff.
Bibliografía
- Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (1986). Compilers - Principles, Techniques and Tools. Addison Wesley Publishing Company. ISBN 0-201-10194-7.
- Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. Morgan Kaufmann Publishers. ISBN 1-55860-320-4.
- Grune, Dick; Bal, Henri E.; Jacobs, Ceriel J.H.; Langendoen, Koen G. (2000). Modern Compiler Design. John Wiley & Sons, Inc. ISBN 0-471-97697-0.