Parche de mono

Técnica de programación informática

En programación informática , el parcheo de código es una técnica que se utiliza para actualizar dinámicamente el comportamiento de un fragmento de código en tiempo de ejecución. Se utiliza para ampliar o modificar el código de tiempo de ejecución de lenguajes dinámicos como Smalltalk , JavaScript , Objective-C , Ruby , Perl , Python , Groovy y Lisp sin alterar el código fuente original.

Etimología

El término parche de mono parece provenir de un término anterior, parche de guerrilla , que se refería a cambiar el código de manera disimulada (y posiblemente de manera incompatible con otros parches similares) en tiempo de ejecución. La palabra guerrilla , casi homófona de gorilla , se convirtió en mono , posiblemente para que el parche sonara menos intimidante. [1]

Una etimología alternativa es que se refiere a “jugar con el código” (manipularlo). [ cita requerida ]

A pesar de lo que sugiere el nombre, el "parche de mono" es a veces el método oficial para extender un programa. Por ejemplo, los navegadores web como Firefox e Internet Explorer solían fomentarlo, aunque los navegadores modernos (incluido Firefox) ahora tienen un sistema de extensiones oficial. [ cita requerida ]

Definiciones

La definición del término varía según la comunidad que lo utilice. En Ruby , [2] Python , [3] y muchos otros lenguajes de programación dinámica , el término parche de mono solo se refiere a modificaciones dinámicas de una clase o módulo en tiempo de ejecución, motivadas por la intención de parchear el código de terceros existente como una solución temporal a un error o característica que no actúa como se desea. Otras formas de modificar clases en tiempo de ejecución tienen nombres diferentes, en función de sus diferentes intenciones. Por ejemplo, en Zope y Plone , los parches de seguridad a menudo se entregan mediante la modificación dinámica de clases, pero se denominan correcciones urgentes . [ cita requerida ]

Aplicaciones

El parcheo de mono se utiliza para:

  • Reemplazar métodos / clases / atributos / funciones en tiempo de ejecución, por ejemplo, para eliminar una función durante la prueba;
  • Modificar/ampliar el comportamiento de un producto de terceros sin mantener una copia privada del código fuente;
  • Aplicar el resultado de un parche en tiempo de ejecución al estado en la memoria , en lugar del código fuente en el disco ;
  • Distribuir correcciones de seguridad o comportamiento que se encuentren junto con el código fuente original (un ejemplo de esto sería distribuir la corrección como un complemento para la plataforma Ruby on Rails );

Trampas

Los parches de mono maliciosos, escritos de forma incompetente y/o mal documentados pueden provocar problemas:

  • Pueden dar lugar a problemas de actualización cuando el parche hace suposiciones sobre el objeto parcheado que ya no son ciertas; una nueva versión puede muy bien romper el parche. Por este motivo, los parches de mono suelen ser condicionales y solo se aplican si corresponde. [4]
  • Si dos módulos intentan aplicar un parche al mismo método , uno de ellos (el que se ejecute último) "gana" y el otro parche no tiene efecto, a menos que los parches de mono se escriban con un patrón como alias_method_chain. [5]
  • Crean una discrepancia entre el código fuente original y el comportamiento observado que puede resultar muy confuso para cualquiera que no conozca la existencia del parche. Por ejemplo, el núcleo de Linux detecta módulos propietarios y de terceros, como el controlador de Nvidia , que alteran las estructuras del núcleo, de modo que los desarrolladores no pierdan el tiempo tratando de depurar un problema que no pueden solucionar. [6]
  • Pueden estar escritos con código malicioso para atacar al programa principal o entre sí. Como ejemplo, en 2009, Giorgio Maone, desarrollador de NoScript , atacó la extensión Adblock Plus para Firefox, añadiendo excepciones para que los anuncios en sus propios sitios web funcionaran. El código ofensivo también se aseguró de que si el usuario intentaba eliminar las excepciones, se añadieran de nuevo. La disputa provocó una ira generalizada, lo que llevó a una guerra de ida y vuelta entre las nuevas reglas de bloqueo de anuncios que se imponían a los usuarios, seguidas del sabotaje de las nuevas por parte de Maone, lo que finalmente llevó a Mozilla a intervenir para cambiar las políticas con respecto a los complementos. [7]

Ejemplos

El siguiente ejemplo de Python parchea el valor de Pi desde la biblioteca matemática estándar de Python para que cumpla con la Ley Pi de Indiana .

>>> import  math >>> math . pi 3.141592653589793 >>> math . pi  =  3.2  # parchea con un mono el valor de Pi en el módulo math >>> math . pi 3.2 ================================ REINICIAR ================================= >>> import  math >>> math . pi 3.141592653589793 >>>

Véase también

Referencias

  1. ^ "Glosario — Definición de 'parche de mono'". Sistema de gestión de contenido Plone . Archivado desde el original el 22 de enero de 2021 . Consultado el 2 de julio de 2021 . cuando alguien creó un parche de guerrilla con mucho cuidado y trató de evitar cualquier batalla, intentó que sonara menos contundente llamándolo parche de mono
  2. ^ Nutter, Charles Oliver. "Refinando Ruby". Charles Oliver Nutter .
  3. ^ Biswal, Bimal. "Monkey Patching in Python". Consejos de tecnología de software . Soluciones Mindfire. Archivado desde el original el 22 de agosto de 2012. Consultado el 9 de diciembre de 2013 .
  4. ^ Zakas, Nicholas C. (2 de marzo de 2010). "JavaScript mantenible: no modifiques objetos que no son de tu propiedad - Human Who Codes". Human Who Codes .
  5. ^ "Novedades en Rails: módulo#alias_method_chain". Ruby on Rails .
  6. ^ "Núcleos contaminados: la documentación del núcleo de Linux". www.kernel.org . Consultado el 12 de julio de 2020 .
  7. ^ Paul, Ryan (4 de mayo de 2009). "Mozilla considera un cambio de política tras la batalla por las extensiones de Firefox". Ars Technica . Consultado el 12 de julio de 2020 .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Parche_de_mono&oldid=1216352798"