Liaison anticipée par rapport à la liaison tardive: quels sont les avantages comparatifs et les inconvénients?

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

Question

Lors de l'examen de l'évolution des langages informatiques, Alan Kay dit que l'attribut le plus important de son Smalltalk est la liaison tardive; il donne la langue sa malléabilité et l'extensibilité, et permet un couplage inapproprié d'être refactorisé au fil du temps. Êtes-vous d'accord? Y at-il des avantages pour le début compensent la liaison qui expliquent pourquoi il semble être la dominante des deux paradigmes pour les domaines où pourraient être utilisés soit?

Mon expérience personnelle (ce qui est large ou assez profond pour faire autorité), basée sur la mise en œuvre des applications web avec javascript, jQuery, jsext, actionscript, php, java, RoR et asp.net semble indiquer une corrélation positive entre la fin la liaison et la réduction de ballonnement. que la liaison anticipée Je suis aide à détecter et à prévenir certaines erreurs de Sûreté du typage, mais pour faire autocomplétion et un bon IDE, et les bonnes pratiques de programmation en général. Donc, je tends à me rattraper enracinant pour le côté tardif de liaison, avant mon côté-évitement du risque restaure mon point de vue rationnel.

Mais je n'ai pas vraiment un bon sens pour savoir comment équilibrer les compromis.

Était-ce utile?

La solution

Traditionnellement, le grand avantage de la liaison précoce est la performance: une langue liaison tardive doit transporter des informations de type sur toutes ses données lors de l'exécution, et perd l'occasion de faire quelques optimisations au moment de la compilation. Cette différence est devenue beaucoup moins importante, cependant, que les ordinateurs deviennent plus rapides, et que les machines virtuelles devenir plus intelligent d'optimiser à la volée.

Autres conseils

Dans mon expérience des deux logiciels de haute performance (jeux, crissement numéro) et le logiciel de performance neutre (sites, plus tout le reste), il y a eu un énorme avantage de la liaison tardive: la vous avez mentionné malléabilité / maintenabilité / extensibilité.

Il y a eu deux principaux avantages de la liaison anticipée. Le premier:

  • les performances d'exécution

est communément admise, mais généralement pas pertinente parce que dans la plupart des cas, il est possible de jeter le matériel au problème, ce qui est moins cher. Il y a, bien sûr, des exceptions (par exemple si vous ne possédez pas le matériel que vous utilisez sur).

Le deuxième avantage de la liaison anticipée:

  • Facilité de développement

semble être sous-estimés. Dans les grands projets où les développeurs travaillent avec des composants d'autres personnes, IDEs peuvent lire les premières liaisons et les utiliser pour informer le développeur (avec autocomplétion, docs, etc). Ceci est moins pratique avec une liaison tardive parce que les liaisons sont créées lors de l'exécution. Il est encore possible avec les langues de liaison tardive si l'IDE peut déduire des définitions de structure du code, mais étant donné que la structure peut toujours être modifiée lors de l'exécution, il est pas fiable.

Facilité de développement est une grosse affaire. Il minimise le temps de programmeur cher - et plus votre équipe de développement, plus il devient important. Vous auriez besoin d'équilibrer cela contre la flexibilité que vous obtenez avec des langages liaison tardive.

La liaison anticipée par rapport à liaison tardive est vraiment une fonction de l'architecture de la langue. Liaison anticipée signifie que le code peut être construit où une instruction machine saute juste à une adresse et commence à exécuter à partir de là (peut-être via une table de consultation). La liaison tardive nécessite un symbole et référence type à regardé (généralement une table de hachage de recherche) pour chaque accès, ce qui ralentit la langue vers le bas.

Alors que certaines langues à base de machine virtuelle tels que Java sont liés au début du code machine ne peut vraiment faire la liaison anticipée directement. Pour ce faire la liaison tardive, il doit faire le même genre de recherche de hachage comme un interpréteur de langage dynamique serait. La liaison tardive nécessite alors un morceau de code à exécuter pour obtenir l'adresse (ce qui est de savoir comment fonctionne l'automatisation OLE). Il ne peut pas être fait directement par la CPU - le code doit être exécuté.

Notez que le code exécutant la liaison tardive aura fait ses propres objectifs de branche début liés à la fonction de recherche de hachage et ainsi de suite. Ainsi, dans cette perspective, la liaison précoce est nécessaire pour tout code qui doit être exécuté directement par la CPU. La liaison tardive doit être fait dans le logiciel.

La liaison anticipée est également nécessaire pour une très grande variété de code Optimisations.

Architectures comme C ont un sweet spot dans le code écrit proche du métal, pour ainsi dire. Où vous voulez faire l'aspect contraignant précoce est à peu près inhérente à l'architecture de la langue. Dans une langue tardive liée tel que Python la liaison tardive est également inhérente. Certaines langues offrent à la fois, mais le type utilisé seront liés à la construction particulière en cours d'exécution.

Late-binging permet au système de roulement à se prolonger. Par exemple, le système démarre savoir sur les loups. Comme le temps passe une méthode evolveDomesticate (), Wolf (?), Fait tourner une nouvelle classe appelée Dog et instancie que nous avons des chiens maintenant. Smalltalk sauverait toute l'image SYSTEM donc si vous le fermez et redémarrés, les chiens existeraient encore après le redémarrage. Une fois que vous évoluez à des objets en cours d'exécution sur le matériel particulier et connecté à un réseau maillé il n'y a pas d'arrêt réel de l'écosystème (pas avant coups de soleil levant). Je pense que c'est ce que Alan Kay a parlé de l'avantage de-liaison tardive, devenir Dieu.

Je pense qu'il ya de meilleures façons / modèles pour éviter un couplage inappropriés, comme l'inversion de contrôle, l'injection de dépendance, usines, ...

Mais, j'aime l'indépendance de version « facile à utiliser » de liaison tardive
Il suffit d'utiliser

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

et la liaison tardive va comprendre, quel genre de Excel.Application, et où obtenir de ...

compilation de liaison dans lequel la liaison est effectuée pendant la période de compilation est connue sous le nom de liaison au début

dynamique de liaison dans laquelle la liaison de la fonction exécutée lors de l'exécution lorsque la fonction est appelée est connu comme liaison tardive

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top