Voor een hobbyproject ben ik bezig met runtime compilation dmv de CSharpCodeProvider class in het .Net framework. Dit voor een high-performance parser voor wiskundige formules (dus bijv. "x^2+x+1"). De run-time compiled code verhoogt in vele gevallen de snelheid van een herberekening (als bijv. een variable zoals "x" verandert) met tientallen procenten ten opzichte van de oorspronkelijk gegenereerde expression tree.
De class die ik at runtime compileer extend een abstract class. Ik gebruik hiervoor een template file. Dwz, gegeven een
De CompiledNode werkt als een tierelier, alleen vroeg ik mij af wat er zou gebeuren als ik een tweede CompiledNode compileer. Er bestaan op dat moment immers at runtime immers 2 types met dezelfde naam in dezelfde namespace, maar een verschillende implementatie. Nieuwsgierig schreef ik snel wat testcode om een tweede CompiledNode te genereren met een andere formule erachter en verhip, het werkt gewoon. Ik heb even wat keywords op google zitten intypen, maar ik vind hier geen informatie over. Aangezien ik niet de meest technische informaticus ben (lees: ik weet niet zo heel veel van compilers, intermediate languages en dergelijke), vraag ik mij af of een medetweakers mij kan uitleggen waarom dit goed gaat?
Dus, waarom kun je door middel van run-time compilation een type met exact dezelfde naam in exact dezelfde namespace twee keer declareren met verschillende implementaties zonder dat C# over zijn nek gaat?
De class die ik at runtime compileer extend een abstract class. Ik gebruik hiervoor een template file. Dwz, gegeven een
C#:
genereert het programma een 1
| abstract class Node |
C#:
met daarin gedeeltelijk dynamisch gegenereerde content.1
| class CompiledNode : Node |
De CompiledNode werkt als een tierelier, alleen vroeg ik mij af wat er zou gebeuren als ik een tweede CompiledNode compileer. Er bestaan op dat moment immers at runtime immers 2 types met dezelfde naam in dezelfde namespace, maar een verschillende implementatie. Nieuwsgierig schreef ik snel wat testcode om een tweede CompiledNode te genereren met een andere formule erachter en verhip, het werkt gewoon. Ik heb even wat keywords op google zitten intypen, maar ik vind hier geen informatie over. Aangezien ik niet de meest technische informaticus ben (lees: ik weet niet zo heel veel van compilers, intermediate languages en dergelijke), vraag ik mij af of een medetweakers mij kan uitleggen waarom dit goed gaat?
Dus, waarom kun je door middel van run-time compilation een type met exact dezelfde naam in exact dezelfde namespace twee keer declareren met verschillende implementaties zonder dat C# over zijn nek gaat?