2008-12-15 19 views
20

Al hablar sobre la evolución de los lenguajes de programación, 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 que el acoplamiento inapropiado sea refactorizado a lo largo del tiempo. ¿Estás de acuerdo? ¿Hay ventajas compensatorias para la vinculación temprana que expliquen por qué parece ser el dominante de los dos paradigmas para dominios en los que cualquiera de ellos podría usarse?Enlace anticipado vs. enlace tardío: ¿cuáles son los beneficios y desventajas comparativas?

Mi experiencia personal (que no es lo suficientemente amplia o profunda como para ser autoritaria), basada en implementar aplicaciones web con javascript, jQuery, jScript, actionscript, php, java, RoR y asp.net parece sugerir una correlación positiva entre fijación tardía y reducción de la hinchazón. El enlace anticipado estoy seguro ayuda a detectar y prevenir algunos errores de tipo de seguridad, pero también lo hacen la autocompletación y un buen IDE, y buenas prácticas de programación en general. Por lo tanto, tiendo a atraparme en busca del lado vinculante tardío, antes de que mi lado de evitar el riesgo restaure mi perspectiva racional.

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

+1

Algo en lo que pensar es que muchos idiomas ofrecen ambos, incluidos VB, Objective-C, C++/COM y C#. –

Respuesta

12

Tradicionalmente, la gran ventaja del enlace anticipado es el rendimiento: un lenguaje de enlace tardío tiene que llevar información de tipo sobre todos sus datos en tiempo de ejecución y pierde la oportunidad de realizar algunas optimizaciones en tiempo de compilación. Sin embargo, esta diferencia se ha vuelto mucho menos significativa a medida que las computadoras se vuelven más rápidas y las máquinas virtuales se vuelven más inteligentes sobre la optimización sobre la marcha.

+0

Entonces, ¿espera que cada vez más recurramos a lenguajes de enlace tardíos? ¿O que los idiomas existentes cambiarán de temprano a tarde? ¿Los conceptos razonables de java tardío y C# son vinculantes? – dkretz

+0

@ [le dorfier]: el hardware sigue acelerándose, por lo que la sobrecarga se vuelve menos significativa –

+0

Lo sé. ¿Pero es esa la única razón por la que todos los idiomas no son vinculantes de forma tardía? Smalltalk fue casi aceptablemente rápido hace 20 años, ahora debería ser muy rápido, pero no es dominante. En particular, todavía estamos cargados de C# y java precoces como los idiomas de elección para la mayoría de las aplicaciones nuevas que no son web. – dkretz

2

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

Pero, me gusta el "fácil de usar" independencia versión de enlace en tiempo de
sólo tiene que utilizar

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

y Tardío de unión se darán cuenta de qué clase de Excel.Application, y dónde obtenerlo de la unión ...

3

temprana versus tardía unión es realmente una función de LAN arquitectura de indicadores La vinculación anticipada significa que el código se puede construir donde una instrucción de la máquina simplemente salta a una dirección y comienza a ejecutarse desde allí (posiblemente a través de una tabla de búsqueda). La vinculación tardía requiere un símbolo y una referencia de tipo para buscar (por lo general, una búsqueda de tablas hash) para cada acceso, lo que ralentiza el idioma.

Mientras que algunos lenguajes basados ​​en VM, como Java, son código de máquina originariamente enlazado, solo pueden hacer directamente la vinculación anticipada. Para hacer el enlace tarde, tiene que hacer el mismo tipo de búsqueda hash que un intérprete de lenguaje dinámico. La vinculación tardía requiere la ejecución de un fragmento 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 ser ejecutado.

Tenga en cuenta que el código que hace la vinculación tardía en realidad tendrá sus propios destinos de bifurcación enlazados en la función de búsqueda de hash, y así sucesivamente. Entonces, desde esta perspectiva, el enlace temprano es necesario para cualquier código que sea ejecutado directamente por la CPU. La vinculación tardía debe hacerse en el software.

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

Arquitecturas como C tienen un punto ideal para escribir el código cerca del metal, por así decirlo. Donde quiera hacer esto, el aspecto de vinculación temprana es bastante inherente a la arquitectura del lenguaje. En un lenguaje vinculado tardío como Python, la vinculación tardía también es inherente. Algunos idiomas ofrecen ambos, pero el tipo particular utilizado estará vinculado a la construcción particular que se está ejecutando.

+0

La vinculación tardía también es posible simplemente en idiomas de nivel inferior. Esto se debe a que solo tiene que completar una tabla de salto mediante hash-lookup una vez que se une últimamente.Después de eso, simplemente puede llamar a las últimas funciones vinculadas a través de la mesa de salto, que es de bajo costo. Por lo tanto, solo el proceso de vinculación tardía de una sola vez necesita tiempo. – mmmmmmmm

11

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

Ha habido dos beneficios principales de la unión temprana. La primera:

  • 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. Por supuesto, existen excepciones (por ejemplo, si no posee el hardware en el que se está ejecutando).

El segundo beneficio de enlace anticipado:

  • Facilidad de desarrollo

parece estar subestimado. En proyectos grandes donde los desarrolladores trabajan con componentes de otras personas, los IDE pueden leer los enlaces iniciales y usarlos para informar al desarrollador (con autocompletado, 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 los lenguajes de enlace tardío si el IDE puede inferir definiciones de estructura del código, pero dado que la estructura siempre se puede cambiar en el tiempo de ejecución, no es tan confiable.

La facilidad de desarrollo es un gran negocio. Minimiza el costoso tiempo del programador, y cuanto más grande sea su equipo de desarrollo, más significativo se vuelve. Debería equilibrar eso con la flexibilidad que obtiene con los lenguajes de enlace tardío.

+4

Yo sostengo que los lenguajes que se encuentran en un principio son en realidad más difíciles de desarrollar. Si bien obtienen ventajas de las herramientas que utilizan información en tiempo de compilación, también sufren pérdidas tales como verbosidad y redundancia, y complicaciones sustanciales de lenguaje para adaptarse a la tipificación dinámica ocasional sin dejar de ajustarse a las limitaciones del sistema de tipos. P.ej. los genéricos son una excelente característica del lenguaje, pero también son una complicación sustancial. Los lenguajes dinámicos no necesitan dicha función porque * todo * es genérico, todo el tiempo, independientemente de si el autor original lo intentó o no, sin requerir ninguna sintaxis adicional. –

+2

Una vez escribí un ensayo sobre esto, erm ... Aquí está: http://tartley.com/?p=456 –

-1
tiempo

compilación de unión en el que se realiza de enlace durante el tiempo de compilación se conoce ya en la unión

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

+1

Es más complicado que eso. Las DLL no se vinculan hasta el tiempo de ejecución, pero en * la mayoría de los casos ('GetProcAddress' o' dlsym' a un lado), eso todavía se considera enlace anticipado. – cHao

3

Late-binging permite que el sistema en ejecución se extienda. Por ejemplo, el sistema comienza a conocer lobos. A medida que pasa el tiempo, un método evolveDomesticate(), en Wolf (?), Hace girar una nueva clase llamada Dog y crea eso y tenemos Dogs ahora. Smalltalk salvaría toda la imagen del sistema, por lo que si la cerraba y reiniciaba, Dogs seguiría existiendo después del reinicio. Una vez que evolucionas a objetos que se ejecutan en un hardware particular y conectados en una red en malla, no hay un cierre real de todo el ecosistema (no hasta que Sun explote). Creo que esto es lo que Alan Kay estaba hablando de la ventaja de la vinculación tardía, convertirse en un Dios.

Cuestiones relacionadas