Como Desenvolvedores Usam Instruções Dinâmicas? Um Estudo em Ruby
Resumo
As instruções dinâmicas, um dos recursos fornecidos pelas linguagens dinâmicas, permitem, em tempo de execução, executar strings como expressões, definir e invocar métodos dinamicamente, etc. Contudo, o uso exacerbado de tais instruções podem impactar negativamente no desempenho do programa, prejudicar a precisão de técnicas de análises estáticas no código e dificultar otimizações feitas pelo compilador. Neste trabalho, portanto, é investigado como os desenvolvedores usam as instruções dinâmicas baseado em dez projetos Ruby de código aberto. Os principais resultados foram: (i) em média, instruções dinâmicas correspondem a 0,53% do total de instruções e metade das instruções dinâmicas utilizadas correspondem ao uso de send; (ii) foi identificado que 897 das 1.856 instruções dinâmicas (48,3%) analisadas são viáveis de serem convertidas para códigos estáticos; (iii) foram identificados, classificados e ilustrados 23 cenários onde os desenvolvedores optam por instruções dinâmicas ao invés de estáticas; e (iv) instruções dinâmicas permitem que o desenvolvedor escreva, em poucas linhas, códigos que serão responsáveis por adaptar o software para diversos cenários.
Referências
Furr, M., An, J., Foster, J. S., and Hicks, M. (2009a). The Ruby intermediate language. In 5th Dynamic Languages Symposium (DLS), pages 89–98.
Furr, M., An, J., Foster, J. S., and Hicks, M. (2009b). Static type inference for Ruby. In 24th Symposium on Applied Computing (SAC), pages 1859–1866.
Furr, M., hoon (David) An, J., and Foster, J. S. (2009c). Profile-guided static typing for dynamic scripting languages. In 24th International Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), pages 283–300.
Hanenberg, S. (2010). An experiment about static and dynamic type systems: Doubts about the positive impact of static type systems on development time. In 25th International Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), pages 22–35.
Hills, M. (2015). Evolution of dynamic feature usage in PHP. In 22nd International Conference on Software Analysis, Evolution, and Reengineering (SANER), pages 525–529.
Hills, M., Klint, P., and Vinju, J. (2013). An empirical study of PHP feature usage: a static analysis perspective. In International Symposium on Software Testing and Analysis (ISSTA), pages 325–335.
Holkner, A. and Harland, J. (2009). Evaluating the dynamic behaviour of Python applications. In 32nd Australasian Conference on Computer Science (ACSC), pages 19–28.
Jensen, S. H., Jonsson, P. A., and Møller, A. (2012). Remedying the eval that men do. In International Symposium on Software Testing and Analysis (ISSTA), pages 34–44.
Meawad, F., Richards, G., Morandat, F., and Vitek, J. (2012). Eval begone!: semi-automated removal of eval from JavaScript programs. In 25th Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), pages 607–620.
Miranda, S., Rodrigues, E., Valente, M. T., and Terra, R. (2016). Architecture conformance checking in dynamically typed languages. Journal of Object Technology, 15(3):1–34.
Palsberg, J. and Schwartzbach, M. I. (1991). Object-oriented type inference. In 6th International conference on object-oriented programming, systems, languages, and applications (OOPSLA), pages 146–161.
Ren, B. M., Toman, J., Strickland, T. S., and Foster, J. S. (2013). The Ruby type checker. In 28th Symposium on Applied Computing (SAC), pages 1565–1572.
Richards, G., Hammer, C., Burg, B., and Vitek, J. (2011). The eval that men do. In 25th European Conference on Object-Oriented Programming (ECOOP), pages 52–78.
Richards, G., Lebresne, S., Burg, B., and Vitek, J. (2010). An analysis of the dynamic behavior of JavaScript programs. In 31st Conference on Programming Language Design and Implementation (PLDI), pages 1–12.