Další díl seznamu komponent a užitečností pro Delphi. Dnes o PasDoc, FastReport a FastCode.
PasDoc
Každý správný program má mít dokumentaci a nejlepší dokumentací je zdrojový kód. Proto také většina dokumentačních nástrojů používá nějakým způsobem jako zdroj pro dokumentaci zdrojový kód.
Existuje velké množství programů pro různé jazyky a většina se dá použít i pro Object Pascal. Ale nejlepší pro náš jazyk asi je PasDoc.
Možné výstupy jsou HTML, HtmlHelp, LaTeX, RTF via latex2rtf nebo jednoduché XML.
Fast Report
Pokud potřebujete reportovací nástroj můžete zkusit FastReport. Očesaná verze 2.3 je k dispozici k volnému použití pod názvem FREEREPORT. A věřte, že FastReport dělá svému jménu čest. Pro Delphi 2009+ jsou nutná co nejvyšší verze 4.
FastCode
No a na konec něco hardcore. Sice ne každému už záleží na to tom jak rychle jeho program běží (a to nemluvím o programátorech ve skriptovacích jazycích kde se není čemu divit).
Už několikrát jsem tvrdil, že Delphi má kromě kompilátoru i rozumně vyváženou běhovou knihovnu (RTL) mezi velikostí a rychlostí. Některým lidem to ale nestačí a tak vznikl projekt FastCode (o FastMM už se mluvilo)].
Cílem prvního je snaha ještě více optimalizovat některé často používané funkce a to formou soutěže o nejrychlejší implementaci.
Nutno poznamenat, že pokud máte Delphi 2006 (částečně 2005) a vyšší tak vás toto nemusí zajímat, jelikož autoři Delphi převzali některé funkce a FastMM do Delphi, takže jak samotné Delphi, takže programy jím vytvořené obojí obsahují.
I když mám za sebou jisté zkušenosti ohledně optimalizace na rychlost v assembleru (a to již od ZX Spectra kdy se např. pro rychlé kopírovaní používalo i zásobníku) některé postupy mne překvapily. Některé rutiny (např. move) na začátku programu detekují typ procesoru (jen poprvé) a podle typu procesoru vyberou konkrétní optimalizovanou variantu.
Zajímavostí je jak rutiny nahrazují standardní proceduru svojí variantou a jelikož se to někdy může hodit, tak sem princip bezostyšně vložím.
procedure PatchMove; {Patch System.Move to Divert Calls to New Move Procedure}
const
JumpFarId = $E9;
var
Protect, OldProtect : DWORD;
begin
VirtualProtect(@System.Move, 256, PAGE_EXECUTE_READWRITE, @OldProtect);
if PByte(@System.Move)^ <> JumpFarId then {Check if Already Patched}
begin
PByte(@System.Move)^ := JumpFarId;
PInteger(Integer(@System.Move)+1)^ :=
Integer(@Move) - Integer(@System.Move)-5; {Change Destination}
end;
VirtualProtect(@System.Move, 256, OldProtect, @Protect);
FlushInstructionCache(GetCurrentProcess, @System.Move, 256);
end; {PatchMove}
VirtualProtect umožní zápis do chráněné oblasti procesu, kde na adresu staré procedury se vloží kód skoku a za to adresa nového kódu.
FlushInstructionCache je rutina z FastCode, ale tady šlo hlavně o princip.
To jsem trochu odskočil - každopádně pokud máte starší Delphi a potřebujete trochu více výkonu neváhejte.