Domanda

Quando si discute l'evoluzione dei linguaggi di programmazione, Alan Kay dice che il più importante attributo della sua Smalltalk è tardiva; dà la lingua sua malleabilità e l'estensibilità, e permette l'accoppiamento inadeguato da riscritta nel tempo. Sei d'accordo? Ci sono compensante vantaggi per l'associazione anticipata che spiegano il motivo per cui sembra essere la dominante dei due paradigmi per i domini in cui entrambi potrebbero essere utilizzati?

La mia esperienza personale (che non è ampia o abbastanza in profondità per essere autorevole), sulla base di implementare applicazioni web con JavaScript, jQuery, jsext, ActionScript, PHP, Java, RoR e asp.net sembra suggerire una correlazione positiva tra la fine rilegatura e riduzione gonfiare. L'associazione anticipata Sono sicuro che consente di rilevare e prevenire alcuni errori sicurezza rispetto ai tipi, ma in modo da fare il completamento automatico e un buon IDE, e le buone pratiche di programmazione in generale. Quindi tendo a prendere me il tifo per il lato tardiva, prima che il mio lato del rischio-evasione ripristina il mio punto di vista razionale.

Ma io davvero non ho un buon senso per come bilanciare i compromessi.

È stato utile?

Soluzione

Tradizionalmente il grande vantaggio di associazione anticipata è per le prestazioni: un linguaggio tardiva deve portare le informazioni sul tipo su tutti i suoi dati in fase di esecuzione, e perde l'opportunità di fare alcune ottimizzazioni in fase di compilazione. Questa differenza è diventato molto meno significativo, anche se, come i computer diventano più veloci, e come VM ottenere più intelligenti su come ottimizzare al volo.

Altri suggerimenti

Nella mia esperienza di entrambi i software ad alte prestazioni (ad esempio giochi, masticazione di numeri) e il software le prestazioni neutro (siti web, la maggior parte tutto il resto), c'è stata una enorme vantaggio di associazione tardiva: la malleabilità / manutenibilità / estensibilità che hai citato.

Ci sono state due principali vantaggi di associazione anticipata. La prima:

  • prestazioni Runtime

è comunemente accettato, ma in genere irrilevante perché nella maggior parte dei casi è fattibile per lanciare l'hardware il problema, che è più conveniente. Ci sono, naturalmente, eccezioni (ad esempio, se non si possiede l'hardware è in esecuzione su).

Il secondo vantaggio di associazione anticipata:

  • facilità di sviluppo

sembra essere sottovalutato. In progetti di grandi dimensioni in cui gli sviluppatori stanno lavorando con i componenti di altre persone, IDE in grado di leggere i primi attacchi e li usa per comunicare allo sviluppatore (con il completamento automatico, documenti, ecc). Questo è meno pratico con il late-binding, perché le associazioni vengono create in fase di esecuzione. E 'ancora possibile con i linguaggi late-binding se l'IDE può dedurre definizioni di strutture dal codice, ma dal momento che la struttura può sempre essere modificata in fase di esecuzione, non è così affidabile.

facilità di sviluppo è un grosso problema. Si riduce al minimo il tempo costoso programmatore - e il più grande team di sviluppo, il più significativo diventa. Avresti bisogno di equilibrio che contro la flessibilità che si ottiene con i linguaggi late-binding.

L'associazione anticipata vs. tardiva è in realtà una funzione di architettura linguaggio. Primi mezzi leganti che il codice può essere costruito in cui un'istruzione macchina appena salta ad un indirizzo e inizia a eseguire da lì (probabilmente mediante una tabella di ricerca). L'associazione tardiva richiede un riferimento simbolo e tipo da guardò in alto (di solito una ricerca tabella di hash) per ogni accesso, che rallenta la lingua verso il basso.

Mentre alcuni linguaggi VM-based come Java sono presto vincolati codice macchina nativo può veramente solo fare l'associazione anticipata direttamente. Per fare l'associazione tardiva ha a che fare lo stesso tipo di ricerca hash come interprete di linguaggio dinamico avrebbe fatto. L'associazione tardiva quindi richiede un pezzo di codice da eseguire per ottenere l'indirizzo (questo è come OLE automazione funziona). Non può essere fatto direttamente dalla CPU - il codice deve essere eseguita.

Si noti che il codice di fare il late binding effettivamente avere i propri obiettivi di filiale presto legati alla funzione di hash di ricerca e così via. Quindi, da questo punto di vista, l'associazione anticipata è necessaria per qualsiasi codice che deve essere eseguito direttamente dalla CPU. L'associazione tardiva deve essere fatto nel software.

L'associazione anticipata è necessaria anche per un bel una vasta gamma di ottimizzazioni di codice.

Architetture come C hanno un punto debole nella scrittura di codice vicino al metallo, per così dire. Dove si vuole fare questo l'aspetto associazione anticipata è praticamente inerente l'architettura del linguaggio. In un linguaggio tardo rilegato come Python l'associazione tardiva è anche intrinseco. Alcune lingue offrono sia, ma il tipo particolare, saranno legati alla esecuzione della particolare costrutto.

Late-abbuffate consente al sistema in esecuzione ad estendersi. Ad esempio, il sistema si avvia sapere su Wolves. Col passare del tempo un metodo evolveDomesticate (), a Wolf (?), Gira una nuova classe chiamata Cane e crea un'istanza che e noi abbiamo i cani ora. Smalltalk avrebbe salvato l'immagine tutto il sistema, quindi se si chiude verso il basso e riavviato, esisterebbero ancora i cani dopo il riavvio. Una volta che si evolvono per gli oggetti in esecuzione su hardware particolare e collegati in una rete a maglie non c'è una vera arresto dell'intero ecosistema (non fino a Sun fa saltare in aria). Credo che questo è ciò che Alan Kay stava parlando del vantaggio di late-binding, diventare un Dio.

Credo che ci sono modi migliori / modelli per evitare l'accoppiamento inadeguato, come l'inversione del controllo, l'iniezione di dipendenza, fabbriche, ...

Ma, mi piace la versione indipendenza "facile da usare" di
tardiva Basta usare

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

e tardiva capirà, che tipo di Excel.Application, e dove ottenere da ...

compilare vincolante in cui il collegamento viene effettuato durante il tempo della compilazione è conosciuto come l'associazione anticipata tempo

binding dinamico in cui il collegamento di funzione svolta durante l'esecuzione quando la funzione viene chiamata è noto come associazione tardiva

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top