F . P . C
C o m p i l e r
FPC - Free Pascal Compiler
1. část
Ahoj lidi, já jsem John a řekl jsem si, že vám dneska něco
povím o FPC. Je to programovací jazyk, jehož výhody vám přiblížím v
následujících slintech.
Doufám, že většina z vás programuje. A asi vás většina prošla
vývojovým stadiem zvaným Pascal. ReDox by jistě řekl, že na Pascal
máme honem rychle zapomenout a skočit na DJGPP. Jenže víme, že
plácal je jeden z jazyků, od kterých se utíká velmi těžko. Už zde
byly mnohokrát popisovány výhody a nevýhody pascalu a céčka, ale
myslím, že zde cosi řečeno nebylo.
V podstatě je pravda, že je pascal hnusnej, protože nutí
programátora dělat programy jako pro XT. No posuďte sami, na
32-bitové registry si člověk ani nesáhne, leda by psal ve strojáku,
no to ale sorry, to je svinstvo. Protected mode je podporován v
podobě 64kB bloků a má mnoho omezení, takže se v něm pohodlně
programovat nedá. Navíc my, kteří jsme zvyklí psát jak prasata,
hojně vkládat assembler a zcela svobodně se rozvalovat na 640kB
konvenční paměti, si s protected modem pod BP70 ani neškrtnem.
Zkrátka BP je pro pořádné programování nepoužitelný. V době, kdy je
standard 32MB paměti (alespoň dle Mukrabzoftu), se člověk prostě
nemůže spokojit s 640kB paměti. Je naprosto nechutné pomyšlení na
to, že jsme všichni mohli využívat 386+ instrukční sadu již dříve,
ale kvůli Pascalu se stále tvoří 16ti bitové programy, jejichž
účinnost je dosti malá.
Hodně lidí vám při takovýchto problémech doporučí
přeorientování na DJGPP. To je sice jedno z řešení, ale nikomu se
nic moc nechce přeučovat, takže se BP stále trochu drží. Hlavně
když se Pascal stále učí na středních školách. Je fakt, že je pro
výuku ideální, ale kvůli špatnému a zastaralému kompilátoru se v
něm nedá slušně programovat. No ale to je přesně ono, co tím vším
chci vystihnout. Pascal jako JAZYK není špatný, ale jde o to, že
KOMPILÁTOR je senilní. Proč zatracovat jazyk jen kvůli debilnímu
kompilátoru. Kdyby céčko mělo debilní kompilátor, taky by se na něj
každý vykašlal. Takže vyzývám všechny, aby rozlišovali jazyk Pascal
a BP kompilátor. Myslím, že jazyk je dobrý, ale chce to moderní
překladač.
FPC. Free Pascal Compiler. Stručně:
Schopnosti: 32-bit protected mode, flat memory,
virtual mem (swapfile), AT&T a Intel syntaxe
Kompatibilita: 99% BP70
DPMI server: cwsdpmi, go32, hodně dalších
Překladač: Pascal -> Assembler -> EXE
Základní velikost EXE: 80kB
Dokumentace: v HTML a TeXu
Velikost (verze 0.99.8): 5MB
IDE: to bychom toho chtěli moc, ale pracuje se na něm.
Odpovídá parametrům slušných překladačů. Mohou zde být jisté
nevýhody, jako například málo knihoven, ale vzhledem k tomu, že to
není ani první verze, tak se do budoucna nechá očekávat mnoho
vylepšení. Já jsem na FPC přeskočil ze dne na den a jsem nadmíru
spokojen. Je zde všechno, co potřebujete k normálnímu programování.
Záleží na tom, co od toho chcete. Neslibuji, že to umí všechno, ale
když si napíšete nebo jen trochu poopravíte některé své staré
unity, tak se brzy zabydlíte a budete spokojeni. Flat memory - na
celou paměť potřebujete jeden 32-bitový ukazatel a sáhnete kam
chcete. Jinak je to klasický pascal. Bordel je v interruptech, ale
to je normální. Bordel je taky v labelech a v Intelovské syntaxi,
ale to je taky pohoda. Podpora virtuální paměti je taky hezká věc -
cwsdpmi udělá na disku swapfile, a když dojde pamět, tak místo
toho, aby vám program spadnul nebo skončil, tak se akorát procvičí
hadr.
Velkou výhodou je možnost vytvářet plnohodnotná makra, úplně
jako v C. Samozřejmostí je podpora OOP, včetně Delphiového objekt.
modelu. Taky jsou tu strukturované návrat. hodnoty funkcí,
operátory +=, *= atd. (C ztratilo další ze svých výhod), zpracování
chyb (taky z Delphi, prostě je kritický blok programu uzavřený mezi
try...except, a při chybě, která by normálně program shodila, to
skočí do bloku except...end, a v něm se to zpracuje a program jede
dál), a další. Důležitá poznámka: FPC není pouze pro DOS! Existují
verze pro Win32 i pro Linux, a to nejen na platformě i386! (m68000
a Alpha)
Před nějakou dobou vyšel ve Výhni megačlánek o GNU projektu,
včetně popisu GNU C a jeho srovnání s ostatními překladači.
Testovací program byl přiložený v C i v Pascalu, šlo o počet for
cyklů s testkódem za nějakou dobu, tak jsem na něj pustil FPC, se
všemi optimalizacemi (a bude jich ještě víc!) a výsledek: GNU C -
asi 5 000 000, FPC - asi 3 500 000. To přibližně odpovídá údajům v
článku, ale důležité je, že ostatní překladače měly 2 200 000 a
míň!!!
Protože IDE ještě není k dispozici, budeme potřebovat externí
debugger. U FPC sice jeden je (gdb), jenže se ovládá kompletně
řádkovými příkazy, což je jen pro tvrďáky. Ten co je v TP IDE
samozřejmě nejde použít, takže zkuste RHGDB. Teď si asi nevzpomenu
na adresu, ale najdete ho u RHIDE a ten najdete u DJGPP, které
najdete zaručeně. Debugger si dejte do Tools (viz dále), parametrem
je vaše exe, ale pozor, pokud budou v cestě dosovská \, rhgdb je
vypustí a výsledkem je blbost. Musí tam být unixová /.
Co bude dál? V příští verzi už má být IDE, založené na Free
Vision (port Turbo Vision). Mezi knihovnami bude i kompletní GUI
(graphical user interface). A taky 64bitový integery.
Jinou možností je GNU Pascal. To však není pascal, ale
pas-C-al. Syntaxe je sice taky rozšířena jako u FPC, ale co se týče
funkcí, umí pouze to, co je ve standardním pascalu. Takže o
souborových operacích nebo heapu si může nechat jen zdát. Pokud
ovšem nechcete všechno tahat z C knihovny. Je zřejmě určený jen pro
OS co mají vlastní C knihovnu, takže pro DOS je nepoužitelný. IDE -
snad RHIDE, jenomže na něj je GPC pouze provizorně navlečen, s
minimální podporou. GPC vůbec je pouze rozšíření GNU C, a podle
toho to vypadá. (tím ale vůbec nemyslím, že by GNU C bylo špatný!)
Takže teď utíkejte na inet, stáhněte to, instalujte a jedeme dál.
Zde je magická adresa:
www.brain.uni-freiburg.de/klaus/fpc/fpc.html
download: /sdown.html
První překlad
Takže jste si nainstalovali FPC přes install.exe a máte něco jako:
C:\FPC\BIN\GO32V2\
Tady nás to hlavně bude zajímat. Máte tam taky program
ppc386.exe. Ten je klíčový. Zkuste si malý prográmek:
--------TEST.PAS------------------------------
uses crt,dos;
var data:array of byte;
begin
writeln('Nazdar lidi: ');
data[1]:=20;
writeln(data[1]);
writeln('Free mem: ',memavail);
readkey;
end.
Přeložíte to takhle:
PPC386 TEST.PAS
Povedlo? Doufám, že ano. Flat memory funguje. No ale jsou zde
zákeřnosti, které budou bránit překompilování vašich starých
unitů. Nejdříve si ale uděláme malé IDE.
IDE a příkazy kompilátoru
Nevím, jak jste ten program napsali, možná v editoru M602 jako
já celý tenhle článek, ale asi by se vám nelíbilo pořád skákat tam
a zase zpátky. Mně se to taky nelíbilo. Proto jsou tu IDE. Neboť
FPC nedisponuje svým IDE, použijeme Borlandovské (IDE je u Borlandu
docela slušné). Nejenže je zde barevné zvýrazňování, ale také
watch, čili taková malá kalkulačka (občas se hodí). Je tu help,
jehož příkazy se od FPC moc neliší. Je zde zkrátka snesitelné
vývojové prostředí, které nám postačí na překlenutí doby do vydání
vlastního FPC IDE.
Nalezeme si tedy do Turbo Pascalu. Dobré je si zvolit
automatické ukládání konfigurace, nastavit zvýrazňování assembleru,
čísel, stringů, značek apod.
Protože budeme potřebovat nějak spouštět překladač přímo z
editoru, použijeme funkci přímo pro tento účel vytvořenou. Jmenuje
se tools. Nastavit se dá v Options-Tools. Buttonou New si přidáte
nový jakoby program. Zde nadefinujete jeho název, cestu k exáči a
parametry. Jsou zde proměnné a funkce, které mohou vygenerovat
například název právě otevřeného okna, nebo vytáhnout z názvu
souboru pouze příponu a podobně. Ale pozor, nevyplácí se pouštět
ppc386, čili kompilátor, přímo, protože to Borlandi nemají rádi.
Nevím, jak to bude běhat vám, ale mě to přímé spouštění nechodí,
takže budu zde interpretovat raději spouštění přes baťák, čili
dávkový soubor. V konečném stadiu to vypadá asi takhle:
Title
Free Pascal Compiler
Program path
c:\command.com
Command line
/C fpccomp.bat name(edname)
Hot key nastavte třeba na shift+F8.
Takže program se jmenuje Free Pascal Compiler. Abychom mohli
bezpečně spustit baťák, použijeme command.com. (Možná je to humus,
ale nedá se svítit.). Spustí se nám fpccomp.bat s parametrem
obsahujícím pouze název souboru bez přípony. Předpokládá se
standardní přípona *.PAS, ale jde to samozřejmě upravit.
-------- FPCCOMP.BAT ---------------
@echo off {aby zbytečně nekecal}
c:\fpc\bin\go32v2\ppc386.exe -Rintel -Sg -B -a %1.pas
------------------------------------
Pozor, příkazová řádka je case sensitive, čili je dělá se
rozdíl mezi malými a velkými písmeny. Vzhledem k tomu, že parametrů
je nechutně mnoho, můžou se napsat do souboru ppc386.cfg, a není
nutné je dávat na řádku. FPC automaticky čte ppc386.cfg, paramtery
na řádce mají ale větší váhu.
-a způsobí, aby se vygenerovaný assemblerový kód nemazal. Budete
si moci přečíst asm v *.S. Občas se to dost hodí.
-Rintel Nastaví standardně syntaxi na Intel. Jinak se
standardně nastaví syntaxe AT&T.
-Sg Povolí labely a goto. Je to dobré povolit, nevím co to
dělá, když se to nechá zakázané. Ale labely se používají, takže
bych to nechal povolené.
-B Přeloží i použité unity, čili build.
Možná vám bude vadit, že chybová hlášení budete muset hledat
bůhví kde na monitoru a že pro jejich zobrazení je potřeba Alt-F5.
Nejlepší bude, když výpis bude vždy třeba uprostřed monitoru, po
výpisu počká na stisk klávesy, a ještě se vám ukáže v IDE, kde si
ho můžete dát třeba do maličkýho okýnka dolů. Proto se výpis
přesměruje do souboru parametrem -Feadresar\soubor, ten se vypíše,
a ještě si ten soubor předem otevřete v IDE. Vypadá to asi takhle:
------------------ FPCCOMP.BAT --------------------------
@echo off
cls
echo (12x znak #10)
echo [compiling...]
c:\fpc\bin\go32v2\ppc386.exe %1.pas
echo (#10)
type c:\fpc\bin\go32v2\fpcmsg.txt
echo [konec]
pause > nul
---------------------------------------------------------
Ve ppc386.cfg je navíc řádek:
-Fec:\fpc\bin\go32v2\fpcmsg.txt
Jestli chcete, jdou vytvořit i takové vymoženosti, jako
prekompilace. To je zhruba to, že na *.pas pustíte nejdříve svůj
vlastní program, který rozebere řádek s uses a udělá vlastní build.
Já jsem si naprogramoval prekompilátor kvůli AT&T syntaxi. Nějakým
způsobem se stalo, že nejde udělat: mov byte ptr es:[13245678h],al
Zkrátka nejsou povoleny přímé hodnoty ukazatelů. Ale když se napíše
{ASMMODE DIRECT}, čili kompilátor se přehodí na AT&T syntaxi, tak
lze přímou hodnotu ukazatele klidně napsat. Je ale problém
přehazování z AT&T na Intel a zpět. Když píšete kus assembleru v
asm stati, tak abyste přehodili na AT&T, musíte nejdříve dát end;,
pak přehodit na DIRECT, což je vlastně AT&T, neboť všechen
assembler je standardizován na AT&T, pak se znovu hodit do stati
asm a napsat instrukci v AT&T syntaxi. No a tím samým způsobem se
přehodit zase zpátky na Intel. Vypadá to asi takhle
mov al,al
mov bl,bl
end;
{ASMMODE DIRECT}
asm
movb %al,%bl {toto je AT&T syntaxe, ekv. mov bl,al}
end;
{ASMMODE INTEL}
asm
mov al,al
mov bl,bl
--> Docela zdlouhavé, ne? Proto je dobré zavést něco jako
speciální kombinaci znaků, která určuje, že následující text je v
AT&T syntaxi. Použil jsem {!}. Je to vykřičník v komentářích, takže
při překladu je to neškodné. Prekompilátor projede *.pas a tyto
znaky {!} nahradí sekvencí přehození na AT&T a pak se zase hodí
zpátky. Vytvoří se tak *.swp. Překládá se pak samozřejmě *.swp. Na
to je nutno trochu upravit Tools, ale to je hračka. Předpokládám,
že si tyto pomocné programy vytvoříte sami, takže se s nimi tady
nemusím zaobírat. Kdybyste přeci jenom chtěli, tak mi napište, rád
vám pošlu podrobnosti.
Nakonec vyřešíme ještě spouštění přeložených exáčů. Přes
klasické Ctrl+F9 to nejde, protože by nám Borlandi začali překládát
otevřený soubor a bylo by to špatně. Použil jsem opět Tools a na
hot key shift+F9 se přes command.com spustí exáč se jménem
otevřeného okna.
Title: Exec
Program path: command.com
Command line: /C name(edname).EXE
To by bylo pro dnešek všechno. Příště se podíváme na nějaké
finty a programování interruptů. Když by cokoli, tak klidně
napište. Pozdravujte Billa.
John
(smrzj@gjr.chrudim.cz)
PaK
(kvasnicp@gjr.chrudim.cz)
výheň