stringtranslate.com

Encuadernación tardía

En informática , el enlace tardío o enlace dinámico [1] , aunque no es un proceso idéntico al enlace dinámico de bibliotecas de códigos importados , es un mecanismo de programación informática en el que se busca el método que se invoca sobre un objeto , o la función que se llama con argumentos. por nombre en tiempo de ejecución . En otras palabras, un nombre se asocia con una operación u objeto particular en tiempo de ejecución, en lugar de durante la compilación . El nombre enlace dinámico se utiliza a veces, [2] pero se utiliza más comúnmente para referirse al alcance dinámico .

Con el enlace temprano , o enlace estático , en un lenguaje orientado a objetos , la fase de compilación corrige todo tipo de variables y expresiones . Esto generalmente se almacena en el programa compilado como un desplazamiento en una tabla de métodos virtuales ("v-table"). [3] Por el contrario, con el enlace tardío, el compilador no lee suficiente información para verificar que el método existe o vincular su ranura en la tabla v. En cambio, el método se busca por nombre en tiempo de ejecución.

La principal ventaja de utilizar el enlace tardío en la programación del modelo de objetos componentes (COM) es que no requiere que el compilador haga referencia a las bibliotecas que contienen el objeto en el momento de la compilación . Esto hace que el proceso de compilación sea más resistente a los conflictos de versiones, en los que la tabla v de la clase puede modificarse accidentalmente. (Esto no es una preocupación en plataformas compiladas justo a tiempo como .NET o Java , porque la máquina virtual crea la tabla v en tiempo de ejecución contra las bibliotecas a medida que se cargan en la aplicación en ejecución. [4] )

Historia

El término "encuadernación tardía" se remonta al menos a la década de 1960, donde se puede encontrar en Comunicaciones de la ACM . El término se usó ampliamente para describir convenciones de llamadas en lenguajes como Lisp, aunque generalmente con connotaciones negativas sobre el rendimiento. [5]

En la década de 1980, Smalltalk popularizó la programación orientada a objetos (OOP) y con ella el enlace tardío. Alan Kay dijo una vez: "Para mí, la programación orientada a objetos significa solo mensajería, retención local y protección y ocultación del proceso estatal, y vinculación tardía extrema de todas las cosas. Se puede hacer en Smalltalk y en LISP. Posiblemente existan otros sistemas en que esto es posible, pero no estoy al tanto de ellos." [6]

Desde principios hasta mediados de la década de 1990, Microsoft promocionó fuertemente su estándar COM como una interfaz binaria entre diferentes lenguajes de programación orientada a objetos. La programación COM promovió igualmente el enlace temprano y tardío, y muchos lenguajes admitían ambos a nivel de sintaxis.

En el año 2000, Alex Martelli acuñó el término " tipificación de pato " para referirse a un concepto similar, pero con un énfasis diferente. Mientras que el enlace tardío generalmente se centra en los detalles de implementación, el tipeo pato se centra en la capacidad de ignorar tipos y concentrarse en los métodos que tiene actualmente un objeto.

Implementaciones de enlace tardío

Enlace tardío en lenguajes orientados a objetos tipados dinámicamente

En la mayoría de los lenguajes de tipado dinámico , la lista de métodos de un objeto se puede modificar en tiempo de ejecución. Esto requiere vinculación tardía.

Encuadernación tardía en Lisp

En Lisp , las llamadas a funciones globales con enlace tardío se buscan de manera eficiente en tiempo de ejecución a través de la celda de función de un símbolo . Estos enlaces de funciones son mutables.

Ejemplo de uso de una sesión interactiva de Clozure Common Lisp :

? ( defun foo () ( bar pi )) ; se llama a una función BAR aún no definida ; Advertencias del compilador :; En FOO: función indefinida BAR FOO      ? ( defun bar ( x ) ; ahora lo definimos ( * x 2 )) BAR       ? ( foo ) ; llamando a foo y usa la definición reciente de BAR 6.283185307179586D0  ? ( defun bar ( x ) ; ahora redefinimos BAR ( * x 1000 )) BAR       ? ( foo ) ; FOO ahora llama a la nueva función, no es necesario volver a compilar/vincular/cargar FOO 3141.592653589793D0  ? ( tipo de 'barra ) ; BAR es un símbolo SÍMBOLO   ? ( símbolo-función 'barra ') ; el símbolo BAR tiene un enlace de función # < BARRA de función compilada #x302000D1B21F >     

Enlace tardío en C++

En C++, el enlace tardío (también llamado "enlace dinámico") se refiere a lo que normalmente sucede cuando virtualse usa la palabra clave en la declaración de un método. Luego, C++ crea la llamada tabla virtual , que es una tabla de búsqueda para dichas funciones que siempre se consultará cuando se llamen. [7] Por lo general, el término "enlace tardío" se utiliza en favor de " envío dinámico ".

Enlace tardío en idiomas COM

En la programación COM, se realiza una llamada a un método de enlace tardío mediante la interfaz IDispatch . Algunos lenguajes basados ​​en COM, como Visual Basic 6, tienen soporte sintáctico para llamar a esta interfaz. [8] Esto se hace definiendo el tipo de variable como Objeto. Otros, como C++, requieren que llame explícitamente a GetIDsOfNames para buscar un método e Invoke para llamarlo.

Enlace tardío en .NET

En .NET, el enlace tardío se refiere a anular un virtualmétodo como C++ o implementar una interfaz. El compilador crea tablas virtuales para cada llamada a un método virtual o de interfaz que se utiliza en tiempo de ejecución para determinar la implementación a ejecutar.

También al igual que COM y Java, Common Language Runtime proporciona API de reflexión que pueden realizar llamadas de enlace tardío. El uso de estas llamadas varía según el idioma.

Con C# 4, el lenguaje también agregó el pseudotipo "dinámico". Esto se usaría en lugar del tipo de objeto para indicar que se desea el enlace tardío. El mecanismo de enlace tardío específico necesario se determina en tiempo de ejecución utilizando Dynamic Language Runtime como punto de partida.

Visual Basic los usa siempre que la variable es de tipo Objeto y la directiva del compilador "Option Strict Off" está vigente. Esta es la configuración predeterminada para un nuevo proyecto de VB. Antes de la versión 9, sólo los objetos .NET y COM podían enlazarse en tiempo de ejecución. Con VB 10 esto se ha ampliado a objetos basados ​​en DLR.

Enlace tardío en Java

Hay tres definiciones de enlace tardío en Java.

Los primeros documentos sobre Java discutían cómo las clases no estaban vinculadas entre sí en el momento de la compilación. Si bien los tipos se verifican estáticamente en tiempo de compilación, se pueden intercambiar diferentes implementaciones para clases justo antes del tiempo de ejecución simplemente sobrescribiendo el archivo de clase. Mientras la nueva definición de clase tenga los mismos nombres de clase y método, el código seguirá funcionando. En este sentido es similar a la definición tradicional de consolidación tardía.

Actualmente, es popular utilizar el término enlace tardío en la programación Java como sinónimo de envío dinámico . Específicamente, esto se refiere al mecanismo de despacho único de Java utilizado con métodos virtuales.

Finalmente, Java puede utilizar el enlace tardío utilizando sus API de reflexión y la introspección de tipos de la misma manera que se hace en la programación COM y .NET. En términos generales, aquellos que sólo programan en Java no llaman a este enlace tardío. Del mismo modo, el uso de técnicas de "tipificación de pato" está mal visto en la programación Java, y en su lugar se utilizan interfaces abstractas.

Se sabe que Oracle, el propietario actual de Java, utiliza el término enlace tardío en el sentido de "tipificación de pato" cuando se habla de Java y otros lenguajes en la misma documentación. [9]

Enlace temprano versus tardío en PL/SQL y Ada

Cuando se utiliza el enlace anticipado entre Ada y un procedimiento almacenado en una base de datos, se verifica una marca de tiempo para verificar que el procedimiento almacenado no haya cambiado desde que se compiló el código. Esto permite ejecuciones más rápidas y evita que la aplicación se ejecute con la versión incorrecta de un procedimiento almacenado. [10]

Cuando se utiliza el enlace tardío, no se realiza la verificación de la marca de tiempo y el procedimiento almacenado se ejecuta a través de un bloque PL/SQL anónimo. Si bien esto puede ser más lento, elimina la necesidad de volver a compilar todas las aplicaciones cliente cuando cambia un procedimiento almacenado.

Esta distinción parece ser exclusiva de PL/SQL y Ada. Otros lenguajes que pueden llamar a procedimientos PL/SQL, así como otros motores de bases de datos, solo utilizan enlace tardío.

Crítica

El enlace tardío tiene un rendimiento peor que una llamada a un método enlazado anticipadamente. En la mayoría de las implementaciones, se debe buscar la dirección del método correcto por nombre con cada llamada, lo que requiere una búsqueda en el diccionario relativamente costosa y posiblemente una lógica de resolución de sobrecarga. En la mayoría de las aplicaciones, el cálculo y el tiempo adicionales necesarios son insignificantes en las computadoras modernas.

Para algunos compiladores, el enlace tardío puede impedir el uso de la verificación de tipos estáticos. Al realizar una llamada tardía, el compilador debe asumir que el método existe. Esto significa que un simple error ortográfico puede provocar un error de tiempo de ejecución. Los compiladores modernos evitan esto asegurándose de que cada llamada posible debe tener una implementación durante la compilación.

El enlace tardío puede impedir las formas de análisis estático que necesita un entorno de desarrollo integrado (IDE). Por ejemplo, es posible que la función "ir a definición" de un IDE no funcione en una llamada de enlace tardío, si el IDE no tiene forma de saber a qué clase puede hacer referencia la llamada. Un IDE moderno resuelve esto fácilmente, especialmente para los lenguajes orientados a objetos, ya que un método de enlace tardío siempre especifica una interfaz o clase base, que es a donde conduce "ir a la definición", y "buscar todas las referencias" se puede usar para encontrar todas las implementaciones o anula. [11]

Ver también

Referencias

  1. ^ Schreiner, Axel-Tobias (1994). Programación orientada a objetos con ANSI-C (PDF) . Múnich: Hanser. pag. 15.ISBN _ 3-446-17426-5.
  2. ^ Booch, Grady. Análisis y Diseño Orientado a Objetos. Addison-Wesley, 1994. p71
  3. ^ "Uso de enlace anticipado y enlace tardío en automatización". Microsoft . 2003-09-06. Archivado desde el original el 27 de junio de 2014 . Consultado el 27 de junio de 2014 .
  4. ^ "La estructura de la máquina virtual Java: vinculación dinámica". Microsistemas solares . 1999, seg. 3.6.3 . Consultado el 21 de septiembre de 2013 .
  5. ^ Técnicas de ingeniería de software, JN Buxton, Brian Randell , Comité Científico de la OTAN, Comité Científico de la OTAN, 1970
  6. ^ "Dr. Alan Kay sobre el significado de" programación orientada a objetos"". Purl.org . Consultado el 16 de agosto de 2013 .
  7. ^ "12.5 - La mesa virtual «Aprende C". Learncpp.com. 2008-02-08 . Consultado el 16 de agosto de 2013 .
  8. ^ "Uso de enlace anticipado y enlace tardío en automatización". Soporte.microsoft.com . Consultado el 15 de enero de 2011 .
  9. ^ "Llamar a WebLogic Server desde una aplicación cliente COM". Descargar.oracle.com . Consultado el 16 de agosto de 2013 .
  10. ^ "Enlace temprano y tardío, módulo Oracle SQL * para la guía del programador de Ada". Descargar.oracle.com . Consultado el 15 de enero de 2011 .
  11. ^ KathleenDollard. "Encuadernación temprana y tardía: Visual Basic". aprender.microsoft.com . Consultado el 12 de abril de 2023 .