Domanda

Sto giocando con DLR per comprenderlo meglio. Non ho ancora familiarità con tutti i suoi concetti e la sua terminologia, quindi mi dispiace per eventuali errori terminologici o concettuali nella mia domanda.

Fondamentalmente, il modo in cui lo capisco è che passi intorno agli oggetti negli alberi delle espressioni ma usi i raccoglitori per esporre la funzionalità dinamica dei tuoi oggetti ad altri linguaggi compatibili con DLR. Quindi, invece di fare un'aggiunta, ad esempio, direttamente nell'albero delle espressioni (With Expression.Add), crei un raccoglitore che viene invocato dal sito di chiamata ogni volta che è necessario e fa l'aggiunta per te.

Tuttavia, poiché si passano oggetti in giro, al termine dell'operazione di addizione (se gli operandi sono, ad esempio, due valori Int32), si dovrà racchiudere Int32 risultante in un oggetto poiché (ancora nel raccoglitore) che cosa si aspetta il sito di chiamata. Ho un po 'paura che questo costante boxing / unboxing possa influire in qualche modo sulle prestazioni del runtime.

È davvero così che dovrebbe funzionare (con tutta la boxe / unboxing) o mi sto perdendo qualcosa?

È stato utile?

Soluzione

In un linguaggio tipizzato dinamicamente, l'identificazione e l'ottimizzazione di una variabile tipizzata staticamente è un'ottimizzazione specifica del dominio. All'interno dell'implementazione di un particolare linguaggio dinamico X, è possibile mantenere una variabile locale senza riquadro nel codice generato, ma non appena si espone un'API di tipo dinamico, non c'è modo di garantire la tipizzazione statica (la natura stessa dei linguaggi dinamici).

Per evitare il pugilato, dovrai identificare parti di codice che puoi provare in tutti i tipi statici e generare codice appositamente per loro tramite Linq.Expressions o ILGenerator .

Altri suggerimenti

Per quanto riguarda i raccoglitori, puoi anche implementare un raccoglitore personalizzato. Tale raccoglitore personalizzato può restituire un tipo non oggetto o può eseguire altre ottimizzazioni specifiche. In IronPython utilizziamo lo strato esterno DLR ComboBinder e ComboActionRewriter per ottimizzare i condizionali. Ad esempio " if a.b: " può trasformarsi in un ComboBinder che esegue sia la conversione a.b che la conversione in bool. Se a.b si traduce in un bool non boxato, eviteremo il boxe e il unboxing. Abbiamo in programma di sperimentare ulteriori ottimizzazioni come questa.

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