Pergunta

Eu estou jogando com DLR para obter uma melhor compreensão da mesma. Eu não estou completamente familiarizado ainda com todos os seus conceitos e sua terminologia tão triste por quaisquer erros de terminologia ou conceituais na minha pergunta.

Basicamente, a maneira que eu entendo é que você passar em torno de objetos em árvores de expressão, mas você usa pastas, a fim de expor a funcionalidade dinâmica de seus objetos para outras línguas DLR-aware. Então, ao invés de fazer uma adição, por exemplo, diretamente na árvore de expressão (Com Expression.Add), você cria uma pasta que é chamado pelo site de chamada sempre que for necessário e faz a adição para você.

No entanto, desde que você passar objetos ao redor, no final da operação de adição (se os operadores são, por exemplo, dois Int32 valores) terá à caixa de Int32 resultando a um objeto uma vez que (ainda no ligante) que o que o site de chamada espera. Eu sou um pouco de medo de que esta constante de boxe / unboxing pode afetar o desempenho do tempo de execução um pouco.

Esta é realmente como ele é suposto para trabalhar (com todo o boxing / unboxing) ou estou faltando alguma coisa?

Foi útil?

Solução

Em uma linguagem dinamicamente digitado, a identificação e otimização de uma variável estaticamente digitado é uma otimização específica de domínio. Dentro de implementação de uma dinâmica linguagem particular de X, você poderia manter uma variável local desemoldurado no código gerado, mas assim que você expor uma API dinamicamente digitado, não há nenhuma maneira de digitação garantia estática (a própria natureza das linguagens dinâmicas).

Para evitar o boxe, você tem que identificar pedaços de código que você pode provar tipos estáticos por toda parte, e gerar o código especialmente para eles, quer através Linq.Expressions ou ILGenerator.

Outras dicas

Quanto aos ligantes ir você também pode implementar uma pasta feita sob encomenda. Essa pasta feita sob encomenda pode retornar um tipo não-objeto ou pode fazer outras otimizações específicas. Em IronPython que ues a camada exterior DLR ComboBinder e ComboActionRewriter para otimizar condicionais. Por exemplo, "se a.b:" pode se transformar em um ComboBinder que faz tanto o a.b e a conversão para bool. Se os resultados a.b em um bool não-boxed vamos evitar o boxing e unboxing. Estamos pensando em experimentar em otimizações mais assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top