Encuadernación anticipada vs.encuadernación tardía:¿Cuáles son los beneficios y desventajas comparativos?

StackOverflow https://stackoverflow.com/questions/367411

Pregunta

Al hablar de la evolución de los lenguajes informáticos, Alan Kay dice que el atributo más importante de su Smalltalk es el enlace tardío;le da al lenguaje su maleabilidad y extensibilidad, y permite refactorizar el acoplamiento inadecuado con el tiempo.¿Estás de acuerdo?¿Existen ventajas compensatorias para la vinculación temprana que expliquen por qué parece ser el paradigma dominante de los dos paradigmas para dominios en los que cualquiera de ellos podría usarse?

Mi experiencia personal (que no es lo suficientemente amplia ni profunda como para ser autorizada), basada en la implementación de aplicaciones web con javascript, jQuery, jsext, actionscript, php, java, RoR y asp.net, parece sugerir una correlación positiva entre el enlace tardío y la hinchazón. reducción.Estoy seguro de que el enlace temprano ayuda a detectar y prevenir algunos errores de seguridad de tipos, pero también lo hace el autocompletado y un buen IDE, y buenas prácticas de programación en general.Así que tiendo a encontrarme apoyando el lado de la vinculación tardía, antes de que mi lado de evitación de riesgos restablezca mi perspectiva racional.

Pero realmente no tengo una buena idea de cómo equilibrar las compensaciones.

¿Fue útil?

Solución

Tradicionalmente, la gran ventaja de principios de unión es para el rendimiento: un lenguaje de enlace en tiempo tiene que llevar la información de tipo sobre todos sus datos en tiempo de ejecución, y pierde la oportunidad de hacer algunas optimizaciones en tiempo de compilación. Esta diferencia se ha convertido en mucho menos significativa, sin embargo, como las computadoras se vuelven más rápidos y, como máquinas virtuales más inteligentes acerca de la optimización sobre la marcha.

Otros consejos

En mi experiencia tanto de software de alto rendimiento (por ejemplo, juegos, cálculo numérico) y el software de rendimiento neutro (sitios web, casi todo lo demás), ha habido un enorme ventaja de enlace tardío: la maleabilidad / mantenimiento / extensibilidad que usted ha mencionado.

Ha habido dos principales beneficios de enlace anticipado. El primero:

  • el rendimiento en tiempo de ejecución

Es comúnmente aceptado, pero generalmente irrelevante, ya que en la mayoría de los casos es posible que tirar de hardware en el problema, que es más barato. Hay, por supuesto, excepciones (por ejemplo, si usted no posee el hardware se está ejecutando en).

El segundo beneficio de enlace anticipado:

  • Facilidad de desarrollo

Parece ser subestimado. En grandes proyectos donde los desarrolladores están trabajando con componentes de otras personas, entornos de desarrollo pueden leer las primeras fijaciones y los utilizan para informar al desarrollador (con terminación automática, documentos, etc.). Esto es menos práctico con el enlace tardío, porque los enlaces se crean en tiempo de ejecución. Todavía es posible con lenguajes finales vinculantes si el IDE puede inferir definiciones de la estructura del código, pero dado que la estructura siempre se puede cambiar en tiempo de ejecución, que no es tan fiable.

Facilidad de desarrollo es un gran problema. Se minimiza el tiempo de programador caro - y cuanto mayor sea su equipo de desarrollo, más significativo se vuelve. Que había necesidad de equilibrar eso contra la flexibilidad que se obtiene con lenguas de unión a finales de los años.

Encuadernación anticipada vs.El enlace tardío es realmente una función de la arquitectura del lenguaje.La vinculación anticipada significa que se puede crear código donde una instrucción de máquina simplemente salta a una dirección y comienza a ejecutarse desde allí (posiblemente a través de una tabla de búsqueda).El enlace tardío requiere que se busque un símbolo y una referencia de tipo (generalmente una búsqueda en una tabla hash) para cada acceso, lo que ralentiza el lenguaje.

Si bien algunos lenguajes basados ​​en VM, como Java, tienen un código de máquina nativo de enlace temprano, en realidad solo pueden realizar un enlace temprano directamente.Para realizar un enlace tardío, debe realizar el mismo tipo de búsqueda de hash que haría un intérprete de lenguaje dinámico.El enlace tardío requiere que se ejecute una porción de código para obtener la dirección (así es como funciona la automatización OLE).La CPU no puede hacerlo directamente: el código debe ejecutarse.

Tenga en cuenta que el código que realiza el enlace tardío en realidad tendrá sus propios objetivos de rama de enlace temprano en la función de búsqueda de hash, etc.Entonces, desde esta perspectiva, el enlace anticipado es necesario para cualquier código que la CPU vaya a ejecutar directamente.La vinculación tardía debe realizarse mediante software.

La vinculación anticipada también es necesaria para una amplia variedad de optimizaciones de código.

Las arquitecturas como C tienen un punto óptimo a la hora de escribir código cerca del metal, por así decirlo.Cuando desee hacer esto, el aspecto de vinculación temprana es prácticamente inherente a la arquitectura del lenguaje.En un lenguaje de enlace tardío como Python, el enlace tardío también es inherente.Algunos lenguajes ofrecen ambos, pero el tipo particular utilizado estará vinculado a la construcción particular que se esté ejecutando.

Late-atracones permite que el sistema en funcionamiento para extender sí mismo. Por ejemplo, el sistema se pone en marcha saber acerca de los lobos. A medida que pasa el tiempo un método evolveDomesticate (), en Wolf (?), Hace girar una nueva clase llamada Perro y crea una instancia de eso y tenemos perros ahora. Smalltalk sería guardar la imagen de todo el sistema por lo que si se cierra el sistema y se reinicia, los perros todavía existirían después de reiniciar. Una vez que evolucionan a los objetos que se ejecutan en hardware en particular y conectado en una red de malla no hay una verdadera desconexión de todo el ecosistema (no hasta Sol explota). Creo que esto es lo que Alan Kay estaba hablando de la ventaja de enlace tardío, convertirse en un Dios.

Creo que hay mejores formas / patrones para evitar el acoplamiento apropiado, como la inversión de control, inyección de dependencias, fábricas, ...

Sin embargo, me gusta el "fácil de usar" independencia versión de finales de unión
Sólo tiene que utilizar

var excel = CreateObject("Excel.Application");

y el enlace en tiempo se darán cuenta de qué clase de Excel.Application, y dónde obtenerlo de ...

compilar unión en el que la vinculación se lleva a cabo durante el tiempo de compilación que se conoce como enlace anticipado tiempo

unión dinámica en la que la vinculación de función realizada durante la ejecución cuando la función se llama se conoce como el enlace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top