Sen bindning
Inom beräkningar är sen bindning eller dynamisk länkning - även om det inte är en identisk process som att dynamiskt länka importerade kodbibliotek - en datorprogrammeringsmekanism där metoden som anropas på ett objekt , eller funktionen som anropas med argument, slås upp med namn på körtid . Med andra ord, ett namn är associerat med en viss operation eller objekt under körning, snarare än under kompilering . Namnet Dynamisk bindning används ibland, men används oftare för att referera till dynamiskt omfång .
Med tidig bindning , eller statisk bindning , i ett objektorienterat språk fixar kompileringsfasen alla typer av variabler och uttryck . Detta lagras vanligtvis i det kompilerade programmet som en offset i en virtuell metodtabell ("v-tabell"). Däremot, med sen bindning, läser kompilatorn inte tillräckligt med information för att verifiera att metoden existerar eller binder dess plats på v-tabellen. Istället slås metoden upp med namn vid körning.
Den främsta fördelen med att använda sen bindning i Component Object Model- programmering (COM) är att det inte kräver att kompilatorn refererar till biblioteken som innehåller objektet vid kompilering . Detta gör kompileringsprocessen mer motståndskraftig mot versionskonflikter, där klassens v-tabell kan ändras av misstag. (Detta är inte ett problem i just-in-time kompilering -kompilerade plattformar som .NET eller Java , eftersom v-tabellen skapas vid körning av den virtuella maskinen mot biblioteken när de läses in i det program som körs.)
Historia
Termen "sen bindning" går tillbaka till åtminstone 1960-talet, där den kan hittas i Communications of the ACM . Termen användes ofta för att beskriva samtalskonventioner på språk som Lisp, men vanligtvis med negativa konnotationer om prestanda.
På 1980-talet populariserade Smalltalk objektorienterad programmering (OOP) och med det sen bindning. Alan Kay sa en gång: "OOP betyder för mig bara meddelanden, lokal lagring och skydd och döljande av tillståndsprocesser, och extrem sen bindning av alla saker. Det kan göras i Smalltalk och i LISP. Det finns möjligen andra system i som detta är möjligt, men jag är inte medveten om dem."
I början till mitten av 1990-talet marknadsförde Microsoft kraftigt sin COM-standard som ett binärt gränssnitt mellan olika OOP-programmeringsspråk. COM-programmering främjade lika tidig som sen bindning, med många språk som stödde båda på syntaxnivå.
År 2000 myntade Alex Martelli termen " anka typning " för att referera till ett liknande koncept, men med en annan betoning. Medan sen bindning i allmänhet fokuserar på implementeringsdetaljer, fokuserar duck typing på förmågan att ignorera typer och koncentrera sig på de metoder som ett objekt för närvarande har.
Sen bindande implementeringar
Sen bindning i dynamiskt typade objektorienterade språk
I de flesta dynamiskt typade språk kan listan över metoder på ett objekt ändras under körning. Detta kräver sen bindning.
Sen bindning i Lisp
I Lisp slås sena bundna globala funktionsanrop effektivt upp under körning via en symbols funktionscell. Dessa funktionsbindningar är föränderliga.
Exempel med en interaktiv Clozure Common Lisp- session:
? ( defun foo () ( bar pi )) ; en fortfarande odefinierad funktion BAR anropas ;Compiler warnings : ; I FOO: Odefinierad funktion BAR FOO ? ( defun bar ( x ) ; nu definierar vi det ( * x 2 )) BAR ? ( foo ) ; ringer foo och den använder den senaste definitionen av BAR 6.283185307179586D0 ? ( defun bar
( x ) ; nu omdefinierar vi BAR ( * x 1000 )) BAR ? ( foo ) ; FOO anropar nu den nya funktionen, det finns inget behov av att kompilera/länka/ladda in FOO 3141.592653589793D0 ? ( typ av 'bar' ) ; BAR är en symbol SYMBOL ? ( symbol-funktion 'bar ) ; symbolen BAR har en funktionsbindning # <Compiled-function BAR #x302000D1B21F >
Sen bindning i C++
I C++ avser sen bindning (även kallad "dynamisk bindning") vad som normalt händer när det virtuella
nyckelordet används i en metods deklaration. C++ skapar då en så kallad virtuell tabell, som är en uppslagstabell för sådana funktioner som alltid kommer att konsulteras när de anropas. Vanligtvis används termen "sen bindning" till förmån för " dynamisk utskick" .
Sen bindning på COM-språk
I COM-programmering utförs ett sen-bundet metodanrop med hjälp av IDispatch- gränssnittet. Vissa COM-baserade språk som Visual Basic 6 har syntaktisk stöd för att anropa detta gränssnitt. Detta görs genom att definiera variabelns typ som Objekt. Andra som C++ kräver att du uttryckligen anropar GetIDsOfNames för att leta upp en metod och Invoke för att anropa den.
Sen bindning i .NET
I .NET hänvisar sen bindning till att åsidosätta en virtuell
metod som C++ eller implementera ett gränssnitt. Kompilatorn bygger virtuella tabeller för varje virtuellt eller gränssnittsmetodanrop som används vid körning för att bestämma implementeringen som ska köras.
Liksom COM och Java tillhandahåller Common Language Runtime reflektions-API:er som kan göra sena bindningsanrop. Användningen av dessa samtal varierar beroende på språk.
Med C# 4 lade språket också till den "dynamiska" pseudotypen. Detta skulle användas i stället för objekttypen för att indikera att sen bindning önskas. Den specifika sena bindningsmekanismen som behövs bestäms vid körning med Dynamic Language Runtime som utgångspunkt.
Visual Basic använder dem när variabeln är av typen Object och kompilatordirektivet "Option Strict Off" är i kraft. Detta är standardinställningen för ett nytt VB-projekt. Före version 9 kunde endast .NET- och COM-objekt bindas sent. Med VB 10 har detta utökats till DLR-baserade objekt.
Sen bindning i Java
Det finns tre definitioner för sen bindning i Java.
Tidiga dokument om Java diskuterade hur klasser inte länkades samman vid kompilering. Medan typer kontrolleras statiskt vid kompilering, kan olika implementeringar för klasser bytas ut precis före körning helt enkelt genom att skriva över klassfilen. Så länge den nya klassdefinitionen hade samma klass- och metodnamn skulle koden fortfarande fungera. I denna mening liknar den den traditionella definitionen av sen bindning.
För närvarande är det populärt att använda termen sen bindning i Java-programmering som en synonym för dynamisk utsändning . Specifikt hänvisar detta till Javas enda sändningsmekanism som används med virtuella metoder.
Slutligen kan Java använda sen bindning med sina reflektions-API:er och typ introspektion ungefär på samma sätt som det görs i COM- och .NET-programmering. Generellt sett kallar de som bara programmerar i Java inte detta för sen bindning. Likaså är användningen av "ankatypning"-tekniker ogrundad i Java-programmering, med abstrakta gränssnitt som används istället.
Oracle, den nuvarande ägaren av Java, har varit känd för att använda termen sen bindning i bemärkelsen "anka typning" när man diskuterar både Java och andra språk i samma dokumentation.
Tidig vs. sen bindning i PL/SQL och Ada
När man använder tidig bindning mellan Ada och en databaslagrad procedur kontrolleras en tidsstämpel för att verifiera att den lagrade proceduren inte har ändrats sedan koden kompilerades. Detta möjliggör snabbare körningar och förhindrar att programmet körs mot fel version av en lagrad procedur.
Vid användning av sen bindning utförs inte tidsstämpelkontrollen, och den lagrade proceduren exekveras via ett anonymt PL/SQL-block. Även om detta kan vara långsammare, tar det bort behovet av att kompilera om alla klientapplikationer när en lagrad procedur ändras.
Denna distinktion verkar vara unik för PL/SQL och Ada. Andra språk som kan anropa PL/SQL-procedurer, såväl som andra databasmotorer, använder endast sen bindning.
Kritik
Sen bindning har sämre prestanda än ett anrop för tidig bindning. Under de flesta implementeringar måste den korrekta metodadressen slås upp med namn med varje anrop, vilket kräver relativt dyr ordbokssökning och möjligen överbelastningsupplösningslogik, men den är i allmänhet försumbar på moderna datorer.
För vissa kompilatorer kan sen bindning förhindra användningen av statisk typkontroll. När du gör ett sent bundet anrop måste kompilatorn anta att metoden existerar. Detta innebär att ett enkelt stavfel kan orsaka ett körtidsfel. Det exakta undantaget varierar beroende på språk, men det brukar heta något i stil med "Method Not Found" eller "Method Missing". Moderna kompilatorer undviker detta genom att se till att alla möjliga anrop måste ha en implementering under kompileringen.
Sen bindning kan förhindra former av statisk analys som behövs av en integrerad utvecklingsmiljö ( IDE). Till exempel kanske en IDE:s "gå till definition"-funktion inte fungerar på ett sen-bundet anrop, om IDE:n inte har något sätt att veta vilken klass anropet kan referera till. En modern IDE löser enkelt detta speciellt för objektorienterade språk eftersom en sen-bunden metod alltid anger ett gränssnitt eller basklass, vilket är där "gå till definition" leder, och "hitta alla referenser" kan användas för att hitta alla implementeringar eller åsidosätter.
Ett liknande problem är att eventuell brist på skrivinformation kan förhindra skapandet av beroendediagram. Men andra programmeringsmetoder som abstrakta gränssnitt kan resultera i samma problem. En modern IDE kan skapa sådana beroendegrafer lika enkelt som den hanterar "hitta alla referenser".