Při procházení různých konferencí jsem narazil na příspěvek od dřívějšího hlavního vývojáře kompilátoru Delphi Dannyho Thorpe.
V největší diskuzní skupině o Delphi (public.delphi.non-technical) se kdysi někdo zeptal, jaké vlastně optimalizace Delphi používá a dočkal se odpovědi od Dannyho Thorpe (Delphi Compiler Core blog), nyní už ex codegear. Stav odpovídá roku 2005.
Nechám ho raději častečně v originále, protože neznám přesnou českou terminologii pro některé optimalizace. Některé optimalizace jsem tipoval, některé mne celkem překvapují. Vytahuji ho na světlo, jelikož mne zaujal a jelikož je tam beznadějně zahrabaný.
Optimalizace Delphi kompilátoru
The Delphi compiler is a one-pass, top-down parser with incremental code generation. The Delphi compiler does use intermediate representations and multi-stage AST tree trimming optimizations.
Pro váš přehled následuje, kompletní jak jsem dokázal, seznam optimalizací v dnešních kompilátorech.
DT: Přidal jsem poznámku, které z nich Delphi implementuje.
Pozn: Vždy je první optimalizace a tučně odpověď DT.
-Aggregation of global references
No, if this is referring to global constant folding (strings, primarily)
-Algebraic simplifications, including reassociations
Yes, but to a limited degree. We don't replace division with multiply by reciprocal, for example, because of concerns about loss of precision at the edges.
-Basic-block and branch scheduling
Ne.
-Branch optimizations
Ano.
- and conditional moves
Ne.
-Branch prediction
Static.
-Code hoisting
Ne.
-Constant folding
Ano.
-Control-flow optimizations
Nejasné.
-Data prefetching
Ne.
-Data-cache optimizations
Ne.
-Dead-code elimination
Ano.
-Global value numbering
Ne.
-In-line expansion
Ano.
-Induction-variable removal
Ano.
-Induction-variable strength reduction
Ano.
-Instruction prefetching
Ne.
-Interprocedureal constant propagation
Nejasné. Konstanta je konstanta všude, ne?
-Interprocedureal register allocation
Ne.
-Intraprocedureal instruction cache optimization
Ne.
-Leaf-routine optimization
Ne.
-Linear-function test replacement
Nejasné.
-Local and global common-subexpression elimination
Ano.
-Local and global copy propagation
Ne.
-Loop-invariant code motion
Ano.
-Machine idioms
Ne.
-Partial-redundancy elimination
Ano. (for pointer derefs)
-Procedure integration
Nejasné.
-Procedure specialization and clonning
Ne.
-Scalar replacement of aggregates
-Scalar replacement of array references
If this refers to constant expression evaluation, yes.
-Shrink wrapping
??
-Software pipelining, with loop unrolling, variable expansion,
register -renaming and hierarchical reduction
Šablony pro Codegen jsou ručně laděny pro dobré plánování instrukcí pro U a V pipelines Pentium family procesorů.
-Sparse conditional constant propagation
Ne.
-Tail call optimization, including tail recursion elimination
Ne.
-Tail merging
Ne.
-Unnecessary bounds checking elimination
Ano.
Mějte na paměti, že i dobré kompilátory implementují jen malé množství z uvedených a ne vše z uvedeného jsou optimalizace na rychlost.
Ano. Tail recursion optimalizace ze seznamu je například ve skutečnosti astronomicky vzácná. Takové optimalizace mají význam jen v určitých rekurzivních rutinách.
Mantra pro optimalizace v Delphi je udělat každodenní kód lepším. Nemůžeme si dovolit luxus honby za zázračnými optimalizacemi, které většinu času prostě nefungují. Toto necháváme studentům.
Teď zpět k Delphi. Vždy se jednalo o solidní kompilátor se dvěma důležitýma vlastnostma: generuje dobrý kód a je jednoprůchodový (tj. bleskurychlý). Pokud jste překvapeni proč trvá C++ věky kompilace proti Delphi, to je odpověď.
Hodně z toho má Delphi díky jazyku.
To je pravda, kromě jednoprůchodového tvrzení. Codegen fáze je multi-pass intermediate node tree traversals and pruning. My ji akorát děláme mnohem rychleji než tradiční modely kompilátorů, které jsou originálně tvořeny pro dávkové zpracování děrných štítků.
Toto mne přivádí k jinému bodu. Delphi nikdy nebylo navrženo jako high-end kompilátor. Pro účely, pro které je lidé používají generuje více než dostatečně rychlé kódy.
Správně. Může být řečeno, že Delphi je tak rychlé, že někteří lidé věří že může být nejlepší v každém zadání.
Cílem Delphi je být nejproduktivnější vývojový nástroj pro širokou obec vývojářů. Kompilátor je jen malá část z tohoto celku.
originální příspěvek na groups.google.com