170 likes | 265 Views
Type analyse i FunCalc / CoreCalc. Baggrund og kontekst Formål Designovervejelser → løsning /arkitektur Strategi for implementering og afprøvning Resultater Anvendelighed og perspektiv. Baggrund og Kontekst. CoreCalc (regnearks-funktionalitet)
E N D
Type analyse i FunCalc / CoreCalc Baggrund og kontekst Formål Designovervejelser → løsning /arkitektur Strategi for implementering og afprøvning Resultater Anvendelighed og perspektiv
Baggrund og Kontekst CoreCalc (regnearks-funktionalitet) FunCalc (funktioner defineret i regneark) Simpel intuitiv brugerflade Do. beregningsmodel Anvendelse fra enkle oversigter til komplekse simuleringer og analyser. Regnearks-definerede funktioner kompileres på køretid. Ukendt input type => boxing / unboxing
Formål Hypotese: Bedre kendskab til typer for udtryk i formler => boxing / unboxing kan minimeres. Gennemfør typeanalyse: Regneark er dynamisk typede som fx Scheme, og modsat fx Standard ML og Haskell som er statisk typede. Implementer typeanalyse, baseret på unification og substitution. Udfør målinger baseret på nyt typesystem.
FunCalc Type Lattice E = Error N = NumberPrimitive T = TextPrimitive A = ArrayPrimitive F = FunctionPrimitive E|N|T|F|A Value E|N|F|A E|T|F|A E|N|T|A E|N|T|F N|T|F|A E|N|F E|N|A E|F|A N|F|A E|T|F E|T|A E|N|T N|T|F N|T|A T|F|A E|N E|F N|F E|A N|A F|A E|T T|F N|T T|A Number Function Array Text E N T F A Error None
FunCalc Types <<interface>> IEquatable<Typ> Typ Equals Adjust Subst Union • Signature • resType • argTypes[] • TypeUnion • typs (List) • TypePrimitive • NumberPrimitive • TextPrimitive • Error • TypeArrayPrimitive • Typ elemType • TypefunctionPrimitive • Signature Number Text TypeArray - Array TypeFunction - Function Value
Designovervejelser Forsøg at udnytte det bedste fra både den statiske og dynamiske typeanalyse Afvis ikke input, hvis det giver mening at fortsætte. Håndtering af type(r) ved non-strict funktion. CLR: Håndtering af Value type vs. Reference type. Sameksistens med eksisterende kode. Typenotation for indbyggede funktioner. Soft types, wrapper/worker transformation
Løsning / Arkitektur Typenotation indbyggede typer: (NN)N svarende til N * N → N. Unify (Required Type) Soft types, wrapper/worker transformation Compile: Ansvaret for at aflevere en værdi af brugbar type, uddelegeres til de enkelte udtryk baseret på resultatet af type analysen.
Mapning til CIL kodegenerering Type Analyse Compile Error ErrorValue.type Number NumberPrimitive NumberValue.type Text TextPrimitive TextValue.type FunctionValue.type Function (signature) Array (element type) ArrayValue.type Union Value.type
Strategi for implementering if(this.name.Equals("INTEGRATE") || this.name.Equals("RECIP") || this.name.Equals("TRIAREA") || this.name.Equals("NONSTRICT") || this.name.Equals("XCOSX") || this.name.Equals("BULLETPV") || this.name.Equals("FINDEND") || this.name.Equals("GOALSEEK") ) newCG = true; else newCG = false; Type analysen implementeres i fuldt omfang og erstatter det eksisterende type system. Compile til CLR indført gradvist i eksisterende arkitektur, styret af simpel boolean:
Resultater En generel køretids forbedring på godt 20%. Forbedring på op til 65% i funktion med hyppig rekursion og kald af andre regnearks-funktioner. Forenklet kode. Anvist mulighed for anden anvendelse (dokumentation, support ved dannelse af funktion, kontrol af gyldig anvendelse) Kan danne basis for optimeret memory udnyttelse. Yderligere køretidsforbedring opnået på apply funktion (næste slide)
Apply funktion (original) CIL FunctionValue SdfInfo Call Site Descriptor
Apply funktion (benchmark) CIL FunctionValue SdfInfo Call Site Descriptor
Apply funktion (typebestemt) CIL FunctionValue Call Site Descriptor SdfInfo
Optimering af Apply funktion Løsning: Via typeanalyse infereres signatur som værende: Number → Number, denne fikseres i CIL kode, og funktion loades fra delegater: LoadDelegate Call (korrekt signatur) Er afprøvet (3% yderligere tidsgevinst på INTEGRATE) Afprøvet på goalseek funktion, resultat: 5 gennemløb af goalseek for xcosx funktion forbedret fra 15.800 ns til 7.200 ns, dvs. en forbedring på 54%. Problematik: Funktion ikke kendt på compilerings tidspunkt, men signatur kræves hard-coded i CIL kode. Næste trin: goalseek for partial applied function, hvis fx bulletpv specialiseres med fast nominel rente og antal terminer.
Goalseek funktion (typebestemt) CIL Call Site Descriptor
Anvendelighed og perspektiv Store tidsgevinster påvist. Gennemfør implementering af typer i kompilering af funktioner. Forsøg med andre anvendelser (memory allokering, bruger support under indtastning, dokumentation). Tættere sammenhæng mellem CLR typer og FunCalc typer. Forsøg med polymorfe typer.