Encuadernación tardía

ImprimirCitar
Cuando se llaman funciones o métodos son buscados por nombre en tiempo de ejecución

En informática, el enlace tardío o enlace dinámico (aunque no es un proceso idéntico al de vincular dinámicamente bibliotecas de código importadas) es un mecanismo de programación informática en el que el método que se invoca en un objeto, o la función que se invoca con argumentos, se busca por nombre en tiempo de ejecución. En otras palabras, un nombre se asocia con una operación u objeto en particular en tiempo de ejecución, en lugar de durante la compilación. El nombre enlace dinámico se utiliza a veces, pero se usa más comúnmente para referirse al ámbito dinámico.

Con la vinculación temprana, o vinculación estática, en un lenguaje orientado a objetos, la fase de compilación fija todos los tipos de variables y expresiones. Esto se almacena generalmente en el programa compilado como un desplazamiento en una tabla de métodos virtuales ("v-table"). Por el contrario, con la vinculación tardía, el compilador no lee suficiente información para verificar que el método existe o vincular su ranura en la tabla virtual. 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 virtual de la clase puede modificarse accidentalmente. (Esto no es un problema en plataformas compiladas en tiempo real como .NET o Java, porque la máquina virtual crea la tabla virtual en tiempo de ejecución con las bibliotecas a medida que se cargan en la aplicación en ejecución).

Historia

El término "enlace tardío" se remonta al menos a la década de 1960, cuando se lo puede encontrar en Comunicaciones de ACM. El término se usaba ampliamente para describir las convenciones de llamadas en lenguajes como Lisp, aunque generalmente con connotaciones negativas sobre el rendimiento.

En la década de 1980, Smalltalk popularizó la programación orientada a objetos (OOP) y, con ella, la vinculación tardía. Alan Kay dijo una vez: "OOP para mí significa sólo mensajería, retención local, protección y ocultación de procesos de estado y vinculación tardía extrema de todas las cosas. Se puede hacer en Smalltalk y en LISP. Es posible que haya otros sistemas en los que esto sea posible, pero no los conozco".

A principios y mediados de los años 90, Microsoft promocionó intensamente su estándar COM como una interfaz binaria entre diferentes lenguajes de programación OOP. La programación COM promovió por igual el enlace temprano y tardío, y muchos lenguajes admitían ambos a nivel de sintaxis.

En 2000, Alex Martelli acuñó el término "tipificación pato" para referirse a un concepto similar, pero con un énfasis diferente. Mientras que la vinculación tardía generalmente se centra en los detalles de implementación, la tipificación pato se centra en la capacidad de ignorar los 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 con tipado dinámico

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 una vinculación tardía.

Enlace tardío en Lisp

En Lisp, las llamadas a funciones globales con enlaces tardíos 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 función son mutables.

Ejemplo que utiliza una sesión interactiva de Common Lisp en Clozure:

? ()defun Foo () ()bar pi) ; una función aún no definida BAR se llama; Compiler warnings:; En FOO: función no definida BARFOO? ()defun bar ()x) ; ahora lo definimos ()* x 2)BAR? ()Foo) ; llamando foo y utiliza la reciente definición de BAR6.283185307179586D0? ()defun bar ()x) ; ahora redefinimos BAR ()* x 1000)BAR? ()Foo) ; FOO llama ahora la nueva función, no hay necesidad de recompilar/link/load FOO3141.592653589793D0? ()tipo de 'bar) ; BAR es un símboloSYMBOL? ()función de símbolo 'bar) ; el símbolo BAR tiene una función vinculante#Función compacta BAR #x302000D1B21F

Enlace tardío en C++

En C++, el enlace tardío (también llamado enlace dinámico) se refiere a lo que normalmente ocurre cuando se utiliza la palabra clave virtual en la declaración de un método. C++ crea entonces una denominada tabla virtual, que es una tabla de búsqueda para dichas funciones que siempre se consultarán cuando se las llame. Normalmente, el término "enlace tardío" se utiliza en favor del "envío dinámico".

Enlace tardío en lenguajes COM

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

Enlace tardío en .NET

En .NET, el enlace tardío se refiere a la anulación de un método virtual como en C++ o a la implementación de 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 que se ejecutará.

Al igual que COM y Java, Common Language Runtime ofrece API de reflexión que pueden realizar llamadas de enlace tardías. El uso de estas llamadas varía según el lenguaje.

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

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

Enlace tardío en Java

Existen tres definiciones de enlace tardío en Java.

Los primeros documentos sobre Java hablaban de que las clases no se vinculaban entre sí en el momento de la compilación. Si bien los tipos se comprueban estáticamente en el momento de la compilación, las diferentes implementaciones de las clases se podían intercambiar justo antes del tiempo de ejecución simplemente sobrescribiendo el archivo de clase. Mientras la nueva definición de clase tuviera los mismos nombres de clase y método, el código seguiría funcionando. En este sentido, es similar a la definición tradicional de vinculación tardía.

Actualmente, es común utilizar el término enlace tardío en la programación Java como sinónimo de envío dinámico. En concreto, esto se refiere al mecanismo de envío único de Java que se utiliza con métodos virtuales.

Finalmente, Java puede utilizar el enlace tardío mediante sus API de reflexión y la introspección de tipos de la misma forma que se hace en la programación COM y .NET. En general, quienes sólo programan en Java no llaman a este enlace tardío. Asimismo, el uso de técnicas de "tipado pato" está mal visto en la programación Java, y en su lugar se utilizan interfaces abstractas.

Oracle, el actual propietario de Java, es conocido por utilizar el término enlace tardío en el sentido de "tipado pato" cuando habla de Java y otros lenguajes en la misma documentación.

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

Cuando se utiliza un enlace temprano entre Ada y un procedimiento almacenado en una base de datos, se comprueba 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.

Cuando se utiliza el enlace tardío, no se realiza la comprobació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 el enlace tardío.

Crítica

La vinculación tardía tiene un rendimiento más bajo que una llamada a un método vinculada de forma anticipada. En la mayoría de las implementaciones, se debe buscar la dirección correcta del método por nombre con cada llamada, lo que requiere una búsqueda en diccionario relativamente costosa y posiblemente una lógica de resolución de sobrecarga. En la mayoría de las aplicaciones, el tiempo y los cálculos adicionales requeridos son insignificantes en las computadoras modernas.

Para algunos compiladores, la vinculación tardía puede impedir el uso de la verificación de tipos estáticos. Al realizar una llamada de vinculación tardía, el compilador debe asumir que el método existe. Esto significa que un simple error de ortografía puede provocar que se genere un error en tiempo de ejecución. Los compiladores modernos evitan esto al garantizar que cada llamada posible debe tener una implementación durante la compilación.

La vinculación tardía puede impedir formas de análisis estático necesarias para un entorno de desarrollo integrado (IDE). Por ejemplo, la función "ir a la definición" de un IDE puede no funcionar en una llamada vinculada tardíamente, 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 lenguajes orientados a objetos, ya que un método vinculado tardíamente siempre especifica una interfaz o clase base, que es a donde conduce "ir a la definición", y "encontrar todas las referencias" se puede utilizar para encontrar todas las implementaciones o anulaciones.

Contenido relacionado

ALGOL 68S

ALGOL 68S es un lenguaje de programación diseñado como un subconjunto de ALGOL 68, para permitir la compilación mediante un compilador de un solo paso. Fue...

ALGOL Y

ALGOL Y fue el nombre dado a un sucesor especulado del lenguaje de programación ALGOL 60 que incorporaba algunas características radicales que fueron...

Lenguaje de especificación IDL

IDL es un lenguaje de descripción de la interfaz de software creado por William Wulf y John Nestor de Carnegie Mellon University y David Lamb de Queen's...

Alma-0

Alma-0 es un lenguaje de programación informática multiparadigma. Este lenguaje es una versión aumentada del lenguaje imperativo Modula-2 con...

Hacer bucle while

En muchos lenguajes de programación de computadoras, un bucle do while es una declaración de flujo de control que ejecuta un bloque de código y luego...
Más resultados...
Tamaño del texto:
Copiar