Quest-ce quune liaison anticipée et tardive?
On novembre 18, 2020 by adminJentends constamment parler de liaison précoce et tardive, mais je ne comprends pas ce quelles sont. Jai trouvé lexplication suivante que je ne comprends pas:
La liaison anticipée fait référence à laffectation de valeurs à des variables au moment de la conception alors que la liaison tardive fait référence à lattribution de valeurs aux variables pendant lexécution.
Quelquun pourrait-il définir les deux types de liaison et les comparer?
Commentaires
- temps de compilation vs runtime.
- Voici une bonne lecture sur le sujet: en.wikibooks.org/ wiki / Introduction_to_Programming_Languages / …
Réponse
Il y a deux concepts majeurs dans la confusion: la liaison et le chargement. Il est confondu avec le concept de DataBinding, qui est quelque part au milieu faisant souvent les deux. Après y avoir réfléchi, je vais ajouter un autre concept, pour compléter le trifecta, la répartition.
Types
Liaison tardive : le type est inconnu jusquà ce que la variable soit exercée pendant lexécution; généralement par cession, mais il existe dautres moyens de contraindre un type; les langages dynamiquement typés appellent cela une fonctionnalité sous-jacente, mais de nombreux langages typés statiquement ont une méthode pour obtenir une liaison tardive
Implémenté souvent en utilisant des types dynamiques [spéciaux], une introspection / réflexion, des indicateurs et des options de compilateur, ou via des méthodes virtuelles en empruntant et en étendant la répartition dynamique
Early Binding : le type est connu avant que la variable ne soit exercée pendant lexécution, généralement par un moyen déclaratif statique
Implémenté souvent à laide de types primitifs standard
Fonctions
Distribution statique : fonction spécifique connue ou sous-programme au moment de la compilation; il est sans ambiguïté et correspond à la signature
Implémenté en tant que fonctions statiques; aucune méthode ne peut avoir la même signature
Distribution dynamique : pas une fonction spécifique ou sous-programme au moment de la compilation; déterminé par le contexte lors de lexécution. Il existe deux approches différentes de la «répartition dynamique», qui se distinguent par les informations contextuelles utilisées pour sélectionner limplémentation de fonction appropriée.
Dans single [ dynamic ] dispatch , seul le type de linstance est utilisé pour déterminer limplémentation de la fonction appropriée. Dans les langages à typage statique, cela signifie en pratique que le type dinstance décide quelle implémentation de méthode est utilisée quel que soit le type de référence indiqué lorsque la variable est déclarée / affectée. Étant donné quun seul type – le type de linstance dobjet – est utilisé pour déduire limplémentation appropriée, cette approche est appelée « distribution unique ».
Il existe également multiple [ dynamic ] dispatch , où les types de paramètres dentrée aident également à déterminer limplémentation de fonction à appeler. Parce que plusieurs types – à la fois le type de linstance et le (s) type (s) de paramètre (s) – influencent quelle méthode dimplémentation est sélectionnée, cette approche est appelée «répartition multiple».
Implémentée sous forme de fonctions virtuelles ou abstraites; dautres indices incluent des méthodes remplacées, masquées ou masquées.
NB: Que la surcharge de méthode implique ou non une répartition dynamique est spécifique au langage. Par exemple, en Java, les méthodes surchargées sont distribuées de manière statique.
Valeurs
Chargement différé : stratégie dinitialisation dobjet qui reporte lattribution de valeur jusquà ce quelle soit nécessaire ; permet à un objet dêtre dans un état essentiellement valide mais sciemment incomplet et dattendre que les données soient nécessaires avant de le charger; souvent trouvé particulièrement utile pour charger de grands ensembles de données ou attendre des ressources externes
Implémenté souvent en ne chargeant pas délibérément une collection ou une liste dans un objet composite pendant les appels de constructeur ou dinitialisation jusquà ce quun appelant en aval demande à voir le contenu de cette collection (par exemple. get_value_at, get_all_as, etc.).Les variations incluent le chargement de méta-informations sur la collection (comme la taille ou les clés), mais en omettant les données réelles; fournit également un mécanisme à certains environnements dexécution pour fournir aux développeurs un schéma dimplémentation de singleton assez sûr et efficace
Eager Loading : stratégie dinitialisation dobjet qui effectue immédiatement toutes les affectations de valeurs afin davoir toutes les données nécessaires pour être complètes avant de se considérer comme étant dans un état valide.
Implémentée souvent par fournir à un objet composite toutes ses données connues dès que possible, comme lors dun appel de constructeur ou dune initialisation
Liaison de données : implique souvent la création dun lien actif ou dune carte entre deux flux dinformations compatibles afin que les modifications apportées à lun soient reflétées dans lautre et vice versa; pour être compatibles, ils doivent souvent avoir un type de base ou une interface commune
Mis en œuvre souvent pour tenter de fournir une synchronisation plus claire et cohérente entre les différents aspects de lapplication (par exemple, modèle de vue à afficher, modèle à contrôleur , etc.) et parle de concepts tels que la source et la cible, les points de terminaison, lier / délier, la mise à jour et les événements comme on_bind, on_property_change, on_explicit, on_out_of_scope
NOTE DE MODIFICATION: Dernière modification majeure pour fournir une description dexemples de la fréquence de ces événements. Des exemples de code particuliers dépendent entièrement de limplémentation / du runtime / de la plate-forme
Commentaires
- Cette réponse semble trop spécifique aux langages orientés objet.
- @Jack Je nai ‘ pas ce sentiment, je pense que cest un excellent qui couvre de nombreux aspects.
Réponse
Tout ce qui est décidé par le compilateur lors de la compilation peut se référer à EARLY / COMPILE TIME La liaison et tout ce qui doit être décidé à RUNTIME sappelle LATE / RUNTIME binding.
Par exemple,
Méthode Surcharge et méthode Remplacement .
1 ) Dans Surcharge de méthode votre méthode appelle les méthodes ar e décidé par le compilateur dans le sens où la fonction qui va être appelée est décidée par votre compilateur au moment de la compilation. Par conséquent, EARLY BINDING .
2) Dans la méthode Overriding, il est décidé à RUNTIME quelle méthode est va être appelé. Il est donc référencé comme LATE BINDING .
Jai essayé de le garder simple et facile à obtenir. Jespère que cela vous aidera.
Réponse
La liaison tardive se produit lorsque le comportement est évalué à lexécution. Cest nécessaire lorsque vous voulez en effet déterminer comment agir en fonction des informations dont vous disposez uniquement lorsque le programme est en cours dexécution. Lexemple le plus clair à mon avis est le mécanisme de fonction virtuelle, en particulier en C ++.
class A { public: void f() {} virtual void g() {} }; class B : public A { void f() {} virtual void g() {} }; int main() { A* a = new B; a->f(); a->g(); }
Dans cet exemple, a->f()
appellera en fait void A::f()
, car il » est précoce (ou statiquement ) lié, et donc le programme au moment de lexécution pense quil « est juste un pointeur vers une variable de type A
, alors que a->g()
appellera en fait void B::g()
, car le compilateur, voyant que g()
est virtuel, injecte du code pour rechercher ladresse de la fonction correcte à appeler lors de lexécution.
Commentaires
- » Le moteur dexécution « ? Vous ‘ parlez de C ++. C ++ compile directement en code machine, il na ‘ pas besoin dun runtime pour résoudre méthodes virtuelles.
- @tdammers C ++ a en fait besoin dune bibliothèque dexécution, mais pas pour les appels virtuels. Si vous lisez attentivement, vous ‘ remarquerez que cette réponse indique que le compilateur » injecte du code pour rechercher l’adresse de la fonction correcte [ …] au runtime « .
- Eh bien, mais ce code » pour rechercher ladresse de la fonction correcte » est fondamentalement juste un déréférencement de pointeur en deux étapes indépendant du type suivi dun appel de fonction. Il ny a aucune » pensée » impliquée; la seule raison pour laquelle cela fonctionne de manière fiable est que le compilateur vérifie le type au moment de la compilation ; au moment de lexécution, le code généré fait confiance au compilateur pour avoir fait les devoirs de vérification de type. Si vous utilisez des moulages dangereux (par ex.C-style pointer casts), vous pouvez légalement traiter les objets C ++ comme des objets de la mauvaise classe, mais leurs vtables seront complètement foirés et le code se cassera juste.
- @tdammers Jai essayé de rester à lécart de ce genre de réponse, car il ‘ est un détail dimplémentation de compilateurs, ce qui pourrait, ou non, être vrai pour certains compilateurs ésotériques. Ce qui compte, cest le concept.
- @tdammers Et par » le runtime » je veux dire » le programme à lexécution « . De toute évidence, le C ++ nest ‘ pas géré. Mais puisque vous mavez montré que cela peut prêter à confusion, je ‘ m changer pour le texte complet.
Réponse
si vous êtes familier avec les pointeurs de fonction, ce serait un exemple. Les fonctions définies peuvent être considérées comme une liaison anticipée. alors que si vous utilisez des pointeurs Function, sa liaison tardive.
int add(int x,int y) { return x+y; } int sub(int x,int y) { return x-y; } int main() { //get user choice int(*fp)(int,int); //if add fp=add; //else if sub fp=sub; cout<<fp(2,2); }
ici les fonctions add et sub sont des fonctions (son adresse est liée au moment de la compilation)
mais le pointeur de fonction est en retard binding le fp peut appeler add ou sub selon le choix de lutilisateur [à lexécution].
Answer
Liaison anticipée et tardive uniquement ont un sens dans le contexte des types et non de la façon dont vous les décrivez. Presque toutes les langues modernes sont typées dans le sens où toutes les valeurs ont des types fixes. La différence intervient lorsque nous examinons les langages typés dynamiquement et statiquement. Dans les langages à typage dynamique, les variables nont pas de types, donc elles peuvent faire référence à des valeurs de nimporte quel type et cela signifie que lorsque vous appelez une méthode sur un objet référencé par une variable, la seule façon de déterminer si cet appel est valide ou non est de recherchez lobjet dans la classe et voyez si cette méthode existe réellement. Cela permet de faire des choses intéressantes comme lajout de nouvelles méthodes aux classes au moment de lexécution, car la recherche réelle de la méthode est différée jusquau tout dernier moment. La plupart des gens appellent cet état de affaires liaison tardive.
Dans un langage à typage statique, les variables ont des types et une fois déclarées, elles ne peuvent faire référence à aucune valeur qui nest pas du même type. Ce nest pas strictement vrai mais supposons-le pour linstant. Maintenant, si vous savez que la variable ne fera référence quà des valeurs dun type spécifique, il ny a aucune raison de déterminer si un appel de méthode est valide ou non au moment de lexécution, car vous pouvez déterminer la validité avant lexécution du code. Cest ce quon appelle la liaison précoce.
Un exemple pour démontrer la liaison tardive dans ruby:
a = 1 # a is an integer at this point a.succ # asking for its successor is valid class A def method_a # some code end end a = A.new a.method_a # this is also valid a.succ # this is not valid class A # we can re-open the class and add a method def succ # some more code end end a.succ # now this is valid
La séquence dactions ci-dessus nest pas possible dans un langage comme Java où tous les types sont fixés au moment de lexécution.
Réponse
Au lieu de vous donner une définition académique je essaiera de vous montrer certaines des différences en utilisant un exemple du monde réel utilisant VBA:
Liaison anticipée:
Dim x As FileSystemObject Set x = New FileSystemObject Debug.Print x.GetSpecialFolder(0)
Cela nécessite quune référence soit définie sur le composant « Microsoft Scripting Runtime » au moment de la conception . Il présente l’avantage d’obtenir un message d’erreur au moment de la compilation lorsque vous avez une faute de frappe dans FileSystemObject
ou des noms de méthodes comme GetSpecialFolder
.
Liaison tardive
Dim x As Object Set x = CreateObject("Scripting.FileSystemObject") Debug.Print x.GetSpecialFolder(0)
Cela ne nécessite pas la définition préalable dune référence, la création et le type de linstance la détermination ne se produira quau moment de lexécution. Le compilateur « ne se plaindra pas au moment de la compilation lorsque vous essayez dappeler une méthode inexistante de x
, cela conduira à une erreur dexécution uniquement lorsque la ligne spécifique est exécutée .
Donc, l’inconvénient de la liaison tardive est que vous n’avez pas de vérification de type forte ici. Mais cest aussi lavantage – disons que vous avez un composant dans lequel plusieurs versions existent, et chaque version plus récente fournit des fonctions supplémentaires. (Un exemple concret sont les composants MS Office, comme linterface COM Excel) La liaison tardive permet vous écrivez du code qui fonctionne avec toutes ces versions – vous pouvez dabord déterminer la version spécifique du composant, et si vous découvrez que vous navez quune version plus ancienne disponible, évitez dexécuter des appels de fonctions qui ne fonctionnent pas avec cette version.
Réponse
Lexemple le plus courant de liaison tardive est peut-être la résolution dURL Internet. Il prend en charge les systèmes dynamiques et les grands systèmes sans essayer de lier et de lier tous les sites du monde avant de pouvoir en atteindre, mais dun autre côté, il entraîne des frais généraux (recherche DNS, beaucoup moins de routage IP) au moment de lexécution.
De ce point de vue, la plupart des variétés de liaison dans les environnements linguistiques sont plus ou moins précoces, au moment de la compilation ou du lien.
Chaque type a des coûts et des avantages.
Commentaires
- Pouvez-vous site une référence pour cette définition de liaison?Je nai pas entendu parler de la résolution dadresses Internet comme » liant « , même si la liaison est lacte de résolution de noms, je suppose que quelquun a argumenté que le concept de liaison précoce / tardive peut être appliqué à la résolution dURI en adresses Internet. Mais ce n’est pas une interprétation courante, et le concept de liaison précoce / tardive est antérieur à l’époque où les ordinateurs étaient généralement connectés à Internet.
Laisser un commentaire