Articulo de referencia

Despacho estático

En informática , el despacho estático es una forma de polimorfismo que se resuelve completamente durante el tiempo de compilación . Es una forma de despacho de métodos, que desc...

En informática , el despacho estático es una forma de polimorfismo que se resuelve completamente durante el tiempo de compilación . Es una forma de despacho de métodos, que describe cómo un lenguaje o entorno seleccionará qué implementación de un método o función utilizar. [ 1 ]

Ejemplos de esto son las plantillas en C++ y la programación genérica en Fortran y otros lenguajes, junto con la sobrecarga de funciones (incluida la sobrecarga de operadores ). Se dice que el código está monomorfizado , con tipos de datos específicos deducidos y rastreados a través del grafo de llamadas , para instanciar versiones específicas de funciones genéricas y seleccionar llamadas a funciones específicas según las definiciones proporcionadas.

Esto contrasta con el despacho dinámico , que se basa en información de tiempo de ejecución (como punteros a tablas virtuales y otras formas de información de tipo en tiempo de ejecución).

El despacho estático es posible porque garantiza que solo existirá una única implementación del método en cuestión. El despacho estático suele ser más rápido que el despacho dinámico, que por su naturaleza tiene una sobrecarga mayor.

Ejemplos

Considere el siguiente programa Rust : [ 2 ]

rasgo Mascota {fn hablar ( & sí mismo );}struct Cat {nombre : Cadena}impl Gato {fn nuevo ( nombre : String ) -> Self {Gato { nombre }}}imple Mascota para gato {fn hablar ( & sí mismo ) {println! ( "{} dice ¡Miau!" , self . nombre );}}fn hablar < T : Mascota > ( mascota : T ) {mascota.hablar ( ) ;}fn main () {let mascota = Cat :: new ( String :: from ( "Simba" ));hablar ( mascota );}

El compilador de Rust monomorfizará el código del programa en tiempo de compilación en:

// [...]// La estructura Cat, la implementación de Cat, la implementación de Pet para la estructura Cat y el rasgo Pet permanecen iguales.fn talk_cat ( mascota : Gato ) {Gato :: hablar ( y acariciar )}fn main () {let mascota = Cat :: new ( String :: from ( "Simba" ));talk_cat ( mascota ); // talk(mascota) se reemplaza por el más especializado talk_cat}

[ Nota 1 ]

Véase también

Notas

  1. Tenga en cuenta que optimizaciones adicionales podrían eliminar "talk_cat", optando por incluirlo directamente en una llamada a la implementación de la estructura de la siguiente manera:
    fn main () {let mascota = Cat :: new ( String :: from ( "Simba" ));Gato :: hablar ( & acariciar );}
    En ese caso, "talk_cat" y "talk" se omitirán de la salida optimizada final debido a la eliminación de código muerto .

Referencias

  1. Elementos de Clojure . Lulu.com. 2019. pág.  68. ISBN 9780359360581Consultado el 17 de julio de 2022 .
  2. "Tipos de datos genéricos - El lenguaje de programación Rust" . doc.rust-lang.org .
  • https://developer.apple.com/swift/blog/?id=27
Obtenido de " https://en.wikipedia.org/w/index.php?title=Static_dispatch&oldid=1355364761 "