Sen binding - Late binding
Sen binding , dynamisk binding eller dynamisk forbindelse - selvom det ikke er en identisk proces med dynamisk at forbinde importerede kodebiblioteker - er en computerprogrammeringsmekanisme, hvor metoden, der kaldes på et objekt, eller funktionen kaldes med argumenter, slås op med navn ved runtime . Med andre ord er et navn knyttet til en bestemt operation eller et objekt under runtime, snarere end under kompilering.
Med tidlig binding eller statisk binding i et objektorienteret sprog retter kompileringsfasen alle typer variabler og udtryk. Dette gemmes normalt i det kompilerede program som en forskydning i en virtuel metodetabel ("v-tabel"). I modsætning hertil, ved sen binding, læser kompilatoren ikke nok oplysninger til at kontrollere, at metoden eksisterer eller binder dens slot på v-tabellen. I stedet bliver metoden slået op ved navn ved runtime.
Den primære fordel ved at bruge sen binding i Component Object Model (COM) programmering er, at det ikke kræver, at kompilatoren refererer til de biblioteker, der indeholder objektet på kompileringstidspunktet . Dette gør kompilationsprocessen mere modstandsdygtig over for versionskonflikter, hvor klassens v-tabel ved et uheld kan blive ændret. (Dette er ikke et problem i just-in-time compilation -kompilerede platforme som .NET eller Java, fordi v-tabellen oprettes ved runtime af den virtuelle maskine mod bibliotekerne, når de indlæses i det kørende program.)
Historie
Udtrykket "sen binding" går tilbage til mindst 1960'erne, hvor det kan findes i Communications of the ACM . Begrebet blev meget brugt til at beskrive kaldende konventioner på sprog som Lisp, dog normalt med negative konnotationer om ydeevne.
I 1980'erne populariserede Smalltalk objektorienteret programmering (OOP) og dermed sent binding. Alan Kay sagde engang: "OOP for mig betyder kun beskeder, lokal opbevaring og beskyttelse og skjulning af statsprocesser og ekstrem senbinding af alle ting. Det kan gøres i Smalltalk og i LISP. Der er muligvis andre systemer i hvilket dette er muligt, men jeg kender dem ikke. ”
I begyndelsen til midten af 1990'erne promoverede Microsoft kraftigt sin COM-standard som en binær grænseflade mellem forskellige OOP-programmeringssprog. COM -programmering promoverede lige så tidligt som sent binding, hvor mange sprog understøttede både på syntaksniveau.
I 2000 opfandt Alex Martelli udtrykket " andetypning " for at henvise til et lignende koncept, men med en anden vægtning. Mens sen binding generelt fokuserer på implementeringsdetaljer, fokuserer andetypning på evnen til at ignorere typer og koncentrere sig om de metoder, et objekt i øjeblikket har.
Sent bindende implementeringer
Sen binding i dynamisk indtastede objektorienterede sprog
I de fleste dynamisk indtastede sprog kan listen over metoder på et objekt ændres ved runtime. Dette kræver sen binding.
Sen binding i Lisp
I Lisp . sent bundne globale funktionsopkald slås effektivt op ved runtime via et symbols funktionscelle. Disse funktionsbindinger kan ændres.
Eksempel ved brug af en interaktiv Clozure Common Lisp -session:
? (defun foo ()
(bar pi)) ; a still undefined function BAR gets called
;Compiler warnings :
; In FOO: Undefined function BAR
FOO
? (defun bar (x) ; now we define it
(* x 2))
BAR
? (foo) ; calling foo and it uses the recent definition of BAR
6.283185307179586D0
? (defun bar (x) ; now we redefine BAR
(* x 1000))
BAR
? (foo) ; FOO now calls the new function, there is no need to recompile/link/load FOO
3141.592653589793D0
? (type-of 'bar) ; BAR is a symbol
SYMBOL
? (symbol-function 'bar) ; the symbol BAR has a function binding
#<Compiled-function BAR #x302000D1B21F>
Sen binding i C ++
I C ++ henviser sen binding (også kaldet "dynamisk binding") til det, der normalt sker, når virtualsøgeordet bruges i en metodes erklæring. C ++ opretter derefter en såkaldt virtuel tabel, som er en opslagstabel for sådanne funktioner, der altid vil blive konsulteret, når de kaldes. Normalt bruges termen "sen binding" til fordel for " dynamisk forsendelse ".
Sen binding på COM -sprog
I COM-programmering udføres et sent-bundet metodeopkald ved hjælp af IDispatch- grænsefladen. Nogle COM-baserede sprog som Visual Basic 6 har syntaktisk understøttelse til at kalde denne grænseflade. Dette gøres ved at definere variabelens type som Object. Andre som C ++ kræver, at du eksplicit ringer til GetIDsOfNames for at slå en metode op og påkalde at kalde den.
Sen binding i .NET
I .NET refererer sen binding til tilsidesættelse af en virtualmetode som C ++ eller implementering af en grænseflade. Compileren opbygger virtuelle tabeller for hvert virtuelt opkald eller grænseflade metodeopkald, der bruges i løbetid til at bestemme implementeringen, der skal udføres.
Ligesom COM og Java giver Common Language Runtime refleksions -API'er, der kan foretage sent bindende opkald. Brugen af disse opkald varierer efter sprog.
Med C# 4 tilføjede sproget også den "dynamiske" pseudo-type. Dette ville blive brugt i stedet for Objekttypen for at angive, at sen binding er ønsket. Den specifikke sene bindingsmekanisme, der er nødvendig, bestemmes ved runtime ved hjælp af Dynamic Language Runtime som udgangspunkt.
Visual Basic bruger dem, når variablen er af typen Object, og kompilerdirektivet "Option Strict Off" er i kraft. Dette er standardindstillingen for et nyt VB -projekt. Før version 9 kunne kun .NET- og COM -objekter blive sent bundet. Med VB 10 er dette blevet udvidet til DLR-baserede objekter.
Sen binding i Java
Der er tre definitioner for sen binding i Java.
Tidlige dokumenter på Java diskuterede, hvordan klasser ikke blev knyttet sammen på kompileringstidspunktet. Selvom typer kontrolleres statisk på kompileringstidspunktet, kan forskellige implementeringer for klasser byttes ud lige før runtime ved blot at overskrive klassefilen. Så længe den nye klassedefinition havde de samme klasse- og metodenavne, ville koden stadig fungere. I denne forstand ligner det den traditionelle definition af sen binding.
I øjeblikket er det populært at bruge udtrykket sen binding i Java -programmering som et synonym for dynamisk afsendelse . Specifikt refererer dette til Java's enkelt afsendelsesmekanisme , der bruges med virtuelle metoder.
Endelig kan Java bruge sen binding ved hjælp af sine refleksions -API'er og skrive introspektion meget på samme måde som det gøres i COM- og .NET -programmering. Generelt kalder dem, der kun programmerer i Java, ikke denne sene binding. På samme måde er brugen af "andetypeteknikker" frynset i Java -programmering, hvor abstrakte grænseflader bruges i stedet.
Oracle, den nuværende ejer af Java, har været kendt for at bruge udtrykket sen binding i "andetypning" forstand, når man diskuterer både Java og andre sprog i den samme dokumentation.
Tidlig vs. sen binding i PL/SQL og Ada
Ved brug af tidlig binding mellem Ada og en databaselagret procedure kontrolleres et tidsstempel for at kontrollere, at den lagrede procedure ikke er ændret siden koden blev kompileret. Dette giver mulighed for hurtigere henrettelser og forhindrer applikationen i at køre mod den forkerte version af en lagret procedure.
Ved brug af sen binding udføres tidsstempelkontrollen ikke, og den lagrede procedure udføres via en anonym PL/SQL -blok. Selvom dette kan være langsommere, fjerner det behovet for at kompilere alle klientprogrammer igen, når en lagret procedure ændres.
Denne sondring ser ud til at være unik for PL/SQL og Ada. Andre sprog, der kan kalde PL/SQL -procedurer, samt andre databasemotorer, bruger kun sen binding.
Kritik
Sen binding har dårligere ydeevne end et tidligt bundet metodeopkald. Under de fleste implementeringer skal den korrekte metodeadresse slås op med navn ved hvert opkald, hvilket kræver relativt dyr ordbogsøgning og muligvis overbelastningslogik, men alligevel er den ubetydelig på moderne computere.
For nogle kompilatorer kan sen binding forhindre brug af statisk typekontrol. Når du foretager et sent indbundet opkald, skal kompilatoren antage, at metoden findes. Det betyder, at en simpel stavefejl kan medføre, at en fejl i løbetiden kastes. Den nøjagtige undtagelse varierer efter sprog, men det hedder normalt noget som "Metoden findes ikke" eller "Metoden mangler". Moderne kompilatorer undgår dette ved at sikre, at alle mulige opkald skal have en implementering under kompilering.
Sen binding kan forhindre former for statisk analyse, der er nødvendig i et integreret udviklingsmiljø (IDE). For eksempel fungerer en IDE's "gå til definition" -funktion muligvis ikke på et sentopkaldt opkald, hvis IDE ikke har nogen måde at vide, hvilken klasse opkaldet kan referere til. En moderne IDE løser dette let let især for objektorienterede sprog, da en senbundet metode altid angiver en grænseflade eller baseklasse, hvor "gå til definition" fører, og "find alle referencer" kan bruges til at finde alle implementeringer eller tilsidesætter.
Et lignende problem er, at mulig mangel på skriveoplysninger kan forhindre oprettelse af afhængighedsgrafer. Imidlertid kan andre programmeringsmetoder såsom abstrakte grænseflader resultere i de samme problemer. En moderne IDE kan oprette sådanne afhængighedsgrafer lige så let, som den håndterer "find alle referencer".