int21h

První dojmy z Freepascalu v2.0.4

28. srpna 2006 vyšel dlouho očekávaný Freepascal v2.0.4 Ještě jsem se s ním neseznámil natolik důkladně, abych na něj mohl napsat podrobnou recenzi, ale první dojmy už jsem si z něho odnesl.
Těšil jsem se, že v této verzi budou vyřešeny vleklé problémy dvojkové řady freepascalu pod systémem DOS. Doufal jsem, že tato verze bude moci nahradit kvalitní FP 1.0.10
Bohužel, nestalo se.
Ve skutečnosti je FP 2.0.4 ještě horší, než jsem myslel. Je to opravdu rána. Účastnil jsem se totiž testování vývojových verzí a psal svoje připomínky tvůrcům Freepascalu. Proto jsem tak překvapen smutnou realitou výsledného produktu.
Nový Freepascal 2.0.4 pro DOS a zřejmě do jisté míry i pro ostatní platformy, je plný chyb. Nejvíce to odneslo IDE, tedy vývojové prostředí. Od minulé verze, tedy od FP 2.0.2 se konečně zobrazuje kurzor myši. Fajn, práce v editoru bez myši byla velice frustrující. Jenže myš se zobrazuje jenom v rozlišení 80x25. Pokud máte nastaven jiný režim, tak se nezobrazí. Naštěstí si ji můžete zapnout pomocí malého triku:
Zmáčkněte Alt-F5 (tedy zobrazte si user screen) a zase se vra>te. Alespoň že tak. Dále nepotěší, že si v nastavení nemůžete vybrat vlastní barvy a vlastní zvýrazňování syntaxe. Nevím jak vy, ale já mám svoje oblíbené barevné schéma, na které jsem zvyklý, a pracovat s jinými barvami je pro mě nepohodlné. Vývojáři tvrdí, že je to kvůli tomu, že výběrník barev z předchozích verzí využíval uzavřené zdrojáky, které nemohly být šířeny licencí GNU. Nové GNU Free vision ještě nemá některé funkce a výběrník barev je jedna z nich. Naštěstí se ale dá obejít i tohle:
Jestli máte současně nainstalovaný FP 1.0.10, tak si otevřete soubor FP.INI z podasresáře BIN a zkopírujte jeho sekci [Colors] do souboru FP.INI z verze 2.0.4
Tímto jsme odstranili nedostatky IDE a můžeme začít pracovat. Předpokládám, že znáte některou z předchozích verzí FP nebo alespoň TP. Verze 2.0.4 žádné nové funkce nepřináší, ale naopak některé ubírá. O nemožnosti nastavit si barvy už byla řeč, ale co je mnohem horší je to, že DOSová verze nemá debugger!
Toto by mělo zaznít ještě jednou. Tedy: DOSová verze nemá debugger!
A to je zlé. To je velmi zlé, protože bez debuggeru se programuje extrémně těžko. Přitom debugger ve verzi 1.0.10 je fantastický. Je mnohem lepší než v TP7 (ačkoli, pravda, pomalejší). A verze 2.0.4 ho najednou postrádá. Překvapení to nicméně není. V testovacích verzích nefungoval a vždycky shodil program, takže ho vývojáři prostě odstranili. A jsem spíše pesimista a bojím se, že se ho nedočkáme ani v budoucích verzích. Tento nedostatek má jenom DOSová verze. Verze pro windows ho má. Zřejmě ale taky není stoprocentní, protože mi při krokování ukázkového programu pro Free vision shodil IDE.
Zatímco v tomto případě tvůrce poněkud omlouvá obtížnost vývoje debuggeru, za druhým velkým nedostatkem je jen a pouze šlendrián. Možná je trochu nefér spílat tvůrcům za program, který tvoří zdarma a ve volném čase, ale přece jen, FP si vydobyl dobré jméno a měl by mít svůj standard. A co tedy jde:
Pokud odskočíte do DOSu (položka Command shell v menu File) tak IDE poškodí proměnné prostředí jako path, comspec, blaster a další. Nejvíce vadí nefunkční proměnná path. Stejný problém vyvstane pokud vyvoláte externí program z nabídky Tools. Například já mám pod klávesovou zkratkou "Shift-F7" Volkov commander. A kvůli jinému nefukčnímu řetězci, řetězci comspec, z nemůžu spouštět další programy. Dobrý co? Ne, opravdu ne!
Blbé je, že zdrojáky IDE nejsou k dispozici, a tudíž to nemůžu opravit.
To, že se špatně zobrazuje nápověda (místo některých znaků se zobrazují HTML entity) jenom podtrhuje celkovou mizérii IDE z Freepascalu 2.0.4
Na závěr ještě dodejme, že se IDE chová při překladu větších projektů značně nestabilně.
Tím končím kritiku IDE.
Samozřejmě ho můžete nahradit jiným editorem. Tím, že nefunguje debugger, o nic nepřijdete. Podívejme se teď na překladač samotný.
Výčet změn jednotlivých verzí je působivý. Dvojková řada Freepascalu postupně zavádí další a další rozšíření jazyka object pascal a tím zlepšuje kompatibilitu s Delphi. Dočkali jsme se tak defaultních parametrů, RTTI, properties a mnoha dalších moderních prvků. Od předchozí verze 2.0.2 je vylepšena správa paměti, lepší práce s řetězci, generuje kvalitnější kód a opravuje množství chyb.
Jenže brzy jsem zjistil, že nefunguje unit Graph. Hned při inicializaci se program ukončí s běhovou chybou č.216.
Vzápěti jsem zjistil, že nefungují (nebo fungují špatně) i jiné mé programy, které jednotku Graph nepoužívají. Po nějakém bádání jsem zjistil strašlivou věc:
FP 2.0.4 generuje chybný kód v inicializační části unitů.
Tedy v této části:
unit MujUnit;
interface
...
implementation
...
begin
{Toto je inicializační část unitu. Kód v tomto bloku obsahuje ne zcela jasnou chybu, kvůli
které se nelze spolehnout na inicializaci jednotek. Například se často neprovedou přiřazení}
end.  
Tohle je tragédie. Nevím jak vy, ale já někdy mívám inicializační části jednotek poměrně rozsáhlé a tohle je průšvih. Chybu můžete vyvolat např. tímto kódem.

{-------------------------------- TEST.PAS ----------------------------------}
uses crt,{jakýkoliv unit-nezáleží na tom, který. Musí být ale uveden před unit1}
     unit1; {pokud je uveden jako první, chyba se neprojeví}
begin
writeln(l); {měl by napsat 14, ale napíše 0}
readln;
end.
{----------------------------------------------------------------------------}




{-------------------------------- UNIT1.PAS ---------------------------------}
unit unit1;


interface
var l:longint;


implementation
uses unit2;


begin
InitMouse;
l:=14; {nějaké číslo}
end.
{----------------------------------------------------------------------------}




{-------------------------------- UNIT1.PAS ---------------------------------}
Unit unit2;
Interface
Procedure InitMouse;


Implementation
Procedure InitMouse;assembler;
asm
xor eax,eax
int 33h {zajímavé je, že třeba "mov eax,3; int 10h" chybu nevyvolá}
end;


Begin
{write(''); Tohle je zajímavé. Když to odkomentuješ, tak problém zmizí}
InitMouse;
End.
{----------------------------------------------------------------------------}   

Jak už jsem psal výše, tato chyba zřejmě postihuje i některé standardní jednotky. Kromě jednotky Graph ještě MsMouse a snad i některé další. MsMouse je o to zákeřnější, že se při inicializaci nezhroutí, ale zaviní chybnou funkci programu podobně jako v ukázce výše.
S oběma jednotkami jsem dělal hokusy-pokusy a možná jsem je patchnul. Jednotka Graph se mi už nehroutí a funguje korektně a MsMouse snad přestane dělat neplechu:
Stáhněte si Graph a MsMouse
Obsah archívu zkopírujte do podadresáře UNITS

Druhý problém s překladačem je mírně změněná syntax assemblerových bloků. Uvnitř asm ... end se už nemůžete odvolávat jménem na názvy položek záznamů. Není už tedy možné zapsat např.
mov eax,rozmer.sirka
Místo toho se musí zapsat:
mov esi,rozmer; mov eax,[esi+n] (n je offset položky sirkav záznamu)

Co říct závěrem? Freepascal 2.0.4 je zklamání. IDE je ještě více zabugované než ve FP 2.0.2 a problém s chybnou inicializací je průšvih. Přes všechny nesnáze se mi po nevelkých úpravách zdrojáků nicméně povedlo přeložit Jupíra 2 včetně editoru a dokonce funguje i zvuk.

Dodatek z 5.září:


Faktická nepoužitelnost FP 2.0.4 mě inspirovala důkladně vyzkoušet předchozí oficiální verzi FP 2.0.4
Když vyšla, tak jsem jí nevěnoval příliš pozornosti, protože mě odradila absence myši v IDE a to, že jsem v ní nedokázal přeložit Jupíra. Jenže po oněch úpravách, které jsem provedl kvůli 2.0.4 se Jupír přeložil úplně krásně a stejně tak i další moje zdrojáky.
S úlevou jsem zjistil, že Freepascal 2.0.4 nemá onu strašlivou chybu s inicializačním kódem jednotek. Nechci nic zakřiknout, ale zdá se, že i unit Graph i MsMouse fungují naprosto bez problémů, stejně tak jako ostatní unity. Všechny prvky syntaxe verze 2.0.4 podporuje 2.0.2 také. Seznam změn tvrdí, že mezi verzemi 2.0.2 a 2.0.4 bylo uděláno přes 1000 změn kódu, ale velká většina se zřejmě týká podpory windowsích procesů (tzv. vláken), FCL a Free vision. Nás DOSařů se tedy týkají jenom údajné optimalizace kódu a generování tzv. PIC kódu. Co to přesně PIC kód je, jsem nepochopil. Asi se tím ale myslí, že kód i data programu mohou být umístěny na libovolném místě v paměti, takže při adresaci nikde nejsou použity absolutní adresy, ale vždy jen offset od nějakého registru.
I verze 2.0.2 se týká nemožnost přímého přístupu k položkám záznamu v assemblerových blocích. Holt asi bude třeba přepisovat...
Co se týká IDE, tak už není všechno tak růžové. Debugger sice jakoby k dispozici je, ale nefunguje. Barvy to samé. Nápověda se rovněž zobrazuje blbě.
Nicméně druhý velký nedostatek, poškozené proměnné prostředí, tu není. Naštěstí tu řádně funguje odskok do DOSu i volání externích utilit. To jsme rádi! Jediný bug, o kterém vím, že je v IDE 2.0.2 a není v IDE 2.0.4 je vyhledávání pozpátku. Jistě ale se mnou budete souhlasit, že na tom programování nestojí a nepadá :-)
S IDE 2.0.2 jsem si dneska trochu hrál a zkoumal jak obejít jeho nedostatky:
nastavení barev:
Použijte nachlup stejný postup, jaký jsem popisoval pro 2.0.4

nápověda:
Použijte nápovědu z Freepascalu 1.0.10
Sice se v ní nepopisují nová rozšíření jazyka, ale poslouží dobře. Originální nápovědu z 2.0.2 či 2.0.4 si můžete uschovat a nahrát si ji jenom když potřebujete osvětlit nějaký rys, o kterém se nepíše v 1.0.10

myš:
Největší oříšek. Je až pozoruhodné, jak je nepříjemná práce v moderním IDE bez myši. Po zapnutí IDE není myš vidět. Bez ohledu na použitý videorežim. Stejně jako v 2.0.4 pomůže stisknout Alt-F5 a poté libovolnou klávesu pro návrat. I tohle je ale poněkud otravné, tak jsem bádal dál.
Řešení jsem našel v předplnění bufferu klávesnice. Jde o to, že do klávesnicového bufferu uměle vložíte scan kódy kláves. Až potom nějaký program bude číst klávesnici, tak mu tyto nasimulované klávesy vypadnou jako první. Tuhle techniku jsem použil i v Editoru Jupíra, takže jsem měl už hotový prográmek Xkeybf, který načte soubor specifikovaný na příkazové řádce a jeho obsahem naplní buffer klávesnice. Bohužel vám nemůžu dát jeho zdroják, protože se mi nějak ztratil...
Takže. Řekněme, že máte adresář C:BAT ve kterém máte uloženy svoje BAT soubory a který je zahrnut do proměnné prostředí path
Vytvořte v něm soubor FP2.BAT

@echo off
xkeybf c:\atfpstart.sss
c: pfpc202\ingo32v2fp %1 %2 %3


Cestu k FP.EXE si upravte podle sebe.
Soubory xkeybf.exe a fpstart.sss najdete v tomto archívu.
Pokud vás zajímá, jak jsem vytvořil soubor FPSTART.SSS tak se mrkněte na tenhle jednoduchý zdroják:
var s:string;
    f:text;
begin
Assign(f,'c:\atfpstart.sss');
rewrite(f);
s:=#0+'DUX';
write(f,s);
Close(f);
end.  
Poznáte, jaké klávesy tu simuluju?
Je to Alt-D (menu debug), U (položka user screen), X (libovolná klávesa :-)

S těmito obezličkami se použitelnost IDE Freepascalu 2.0.2 rozhodně zvýší, a tudíž má význam začít se FP 2.0.2 hlouběji zabývat...
Stejný problém s myší bude týkat všech vašich aplikací napsaných pomocí Free vision. Naštěstí od FV jsou k dispozici zdrojáky, takže se s tím dá něco dělat :-)
2006-12-12 | Laaca
Reklamy:
„Člověk, který nikdy neplakal nežil opravdový život!“ Jan Werich