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ň