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ň