Ano, mluvím o Object Pascalu, ačkoliv není in. Asi před rokem jsem zde měl sérii článků o Kylixu, nyní se podíváme na Lazarus a Free Pascal Compiler (dále jen FPC).
Jakožto člověk živící se denně programováním GUI aplikací jsem trošku zhýčkaný a Kylix by mi docela vyhovoval, kdyby:
- nepoužíval Qt
- byly opravovány chyby
- byl multiplatformní
- používal aktuální styl
- a kdyby byl Open Source (není nutné)
Samozřejmě GUI programováním myslím něco jiného než to, že v okně jsou dva editační boxy a tlačítko.
Rád bych vám tímto představil projekt Lazarus.
Proč to, nač to, a tak dále…
Lazarus je Open Source varianta (nikoliv klon) Delphi (píši Delphi, jelikož má k Delphi blíže než ke Kylixu). Liší se v mnoha ohledech, z nichž nejdůležitější je, že jako kompilátor používá FPC.
FPC
FPC je multiplatformní kompilátor Object Pascalu psaný v Pascalu. Není to frontend ke gcc.
Mezi podporované platformy patří Linux, Win32, FreeBSD, NetBSD, Netware, arm, qnx, x86–64, DOS s 32bit extenderem, OS2, Darwin, Sparc, PalmOS, Amiga atd.
Z výčtu je jasné, že kompilátor nemá code generátor pouze pro architektury x86. Schválně to zdůrazňuji. Výsledkem je nativní kód pro cílový procesor a platformu. Možná přijde čas, kdy se bude dát výsledek kompilovat i pro projekt MONO nebo Java Virtual Machine.
V současnosti se blíží verze 2.0 (nyní je aktuální 2.0 beta3 označovaná jako FPC 1.9.3). Ne všechny platformy jsou v aktuální verzi plně funkční (pro některé použijte stabilní řadu 1.0.xx), 2.0 bude nejdříve pro ty hlavní (Linux, *BSD, Win32), pak budou následovat další.
Program umí několik modů, z nichž v jednom umí i příkazy typu variable++ atd. (ne že by to bylo něco nutného pro přežití a nějak to zpřehledňovalo zdrojový kód, ale snad vás to potěší).
Kompilátor umí optimalizace pro cílový procesor, cross kompilaci (v Lazarovi můžete na Linuxu vytvořit funkční Win32 GUI binárku jen přepnutím jednoho přepínače v GUI). Jinak je snad evidentní, že kompilátor je schopen přeložit sám sebe (a to i pro jiné platformy, tj. na Linuxu si mohu vytvořit binárku třeba pro qnx nebo Sparc).
Součástí instalace FPC je i program fpcmake, který vygeneruje makefile pro GNU program make. Takže pro kompilaci projektu pak stačí zadat make v adresáři programu.
Důležitou utilitou je program h2pas, který přeloží hlavičkové soubory pro použití v Pascalu (pokud to již někdo neudělal). Tímto se nenásilně dostáváme k FCL.
FCL (FreePascal Component Library) je knihovna nevizuálních (tedy těch, co nejsou vidět) komponent a tříd. Sem patří různé seznamy (komponent, pointerů, řetězců), čtení ini, registrů (na win), XML, práce se streamy, vlákna, regulární výrazy atd. Dále jsou zde komponenty pro databáze (TDBF, MySQL, Interbase + Firebird, ODBC, SQLLite, Oracle, PostgreSQL) + samozřejmě TDataSet a spol. Samozřejmě si můžete od všech dědit a upravovat, neb je vše pod GNU GPL 2.
Nesmíme zapomenout na grafiku (TFont a freetype, TImage, TImageList, TCanvas – což je virtuální kreslící plocha) a nějaké síťové věci jako sokety a spol. (což mi je jedno, jelikož používám raději knihovnu Synapse).
No a nakonec jsou tam přeloženy věci jako zlib, gtk, bzip2, ncurses, OpenGL, libpng, libgd, unzip, svgalib atd atd. Úplně nakonec pak hlavičkové soubory k libc (takže můj Seksi Commander může namapovat soubory pro svůj interní viewer pomocí mmap :) ).
Dokumentace
FPC používá pasdoc, takže dokumentace je částečně generována ze zdrojových textů, tj. při kompilaci FPC vytváří zdrojáky pro TEX. Nakonec v adresáři docs se například příkazem make pdf vytvoří vlastní aktuální dokumentace (sedm velkých pdf souborů) – samozřejmě musí být nainstalovány příslušné nástroje jako pdfLaTeX.
Jak FPC získat?
FPC bývá v distribuci (MDK 9.* jako balík fpc, Debian ho má taky). Jinak samozřejmě www.freepascal.org. Doporučuji nainstalovat binárku a přeložit si vlastní ze zdrojových kódů (stejně budete zdrojové kódy potřebovat pro Lazara, abyste mohli brouzdat knihovnami).
No takže kompilátor máme, dokumentaci máme, teď ještě nějaké IDE, a protože máme na programování málo času, tak samozřejmě RAD.
Lazarus jako IDE
Takže lazarus.freepascal.org/ a stáhnout zdrojáky jako balík nebo z CVS, v adresáři lazarus dát make, popřípadě jako root make install. Spuštění ./lazarus.
Lazarus v design módu s MultiRename dialogem ze Seksi Commandera – všimněte si těch barevných čar – pozice vůči ostatním prvkům.
Něco o náročnosti
Duron 650 a 128 MB RAM, MDK 9.2 a WindowMaker. Lazarus se kompiluje asi tak 65 s. Start je do dvou sekund, v paměti zabírá kolem deseti MB.
Závislosti (podobné a menší mají i výsledné programy pro Linux)
[radek@localhost lazarus]$ ldd ./lazarus
libpthread.so.0 => /lib/i686/libpthread.so.0 (0x40020000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40070000)
libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0x40153000)
libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0x40299000)
libgdk_pixbuf.so.2 => /usr/lib/libgdk_pixbuf.so.2 (0x402d4000)
libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x402e9000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x402f1000)
libm.so.6 => /lib/i686/libm.so.6 (0x40300000)
libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0x40323000)
libc.so.6 => /lib/i686/libc.so.6 (0x40349000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
libdl.so.2 => /lib/libdl.so.2 (0x4047a000)
libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0x4047d000)
Proč a nač
Lazarus, stejně jako Delphi, Kylix, C++Builder, je RAD nástroj. Na rozdíl od uvedených je, chvilka napětí, multiplatformní a multiwidgetový ™. Tj. překlad může být pro gtk, win32, gtk2, qt, gnome na platformách FreeBSD, OpenBSD, NetBSD, Linux nebo Win32 (včetně cross kompilace), tj. pokud nepoužíváte něco moc exotického (systémového) a FPC to nezapouzdřuje (jako že většinou ano), tak před kompilací zvolíte platformu (a typ widgetů) a Lazarus to přeloží. Překlad je o něco pomalejší než Delphi. První build (tj. soubory nejsou v cache a unity nejsou přeloženy) Seksi Commandera (cca 16000 řádek bez knihoven FCL a LCL) trvá na uvedeném počítači kolem 30 s včetně linkování. Výsledkem je cca 8MB soubor, který se dá stripnout (dá se nastavit v GUI, nebo manuálně) na cca 2 MB. Samozřejmě se dá použít i chytřejší linkování a pak je výsledek lepší, ale o něco pomalejší).
Nezávislost na použitém widgetu je jednou z nejúžasnějších vlastností. Gtk a win32 jsou docela slušně použitelné, gtk2 a qt jsou ve stádiu rozpracovanosti, gnome jsem nezkoušel.
Stabilita a vlastnosti
V současné době je aktuální verze 0.9.1.2, což odpovídá asi tak 8/10 ideálního stavu (ale já jsem náročný).
Teď malá odbočka, abych jen nechválil, co tedy nefunguje:
- Některé editory komponent nejsou hotové (editorem se myslí dialog, který slouží pro nastavování vlastností komponent v design modu, např. pro menu se zobrazí menu designer – ten třeba jakž takž funguje).
- Nefunguje vizuální dědění formulářů (oken) – v design modu, tj. mám základní formulář, kde mám nějaké komponenty jako tlačítka, popisky atd. Po zdědění formuláře nejsou tyto věci v design modu vidět (za běhu ano). Ono se to špatně vysvětluje, ale toto je základ standardních dialogových oken např. v IS, kde v základním okně může být implementována celá logika programu a v následnících se prostě jen natahají komponenty a předefinuje se několik virtuálních metod (uložení záznamu, otevření dat atd. – zbytek jako povolování tlačítek, vyhledávání atd. je pouze v základním okně a ve většině případů se na to nemusí v následnících sahat) .
- V současné verzi FPC nefungují vlákna, neb dochází k velké restrukturalizaci.
- Pracuje se na Drag and Drop u komponent (nikoliv v IDE, tak je to OK).
- Je třeba doladit TAction
- a další drobnosti
Co se mi naopak líbí:
- Skákání mezi deklarací a implementací jedinou klávesou, a to i mezi vloženými soubory (klobouk dolů).
- Vyhledávání identifikátorů kliknutím myší i mezi vloženými soubory.
- V návrhovém modu je u komponent automaticky vidět zarovnání k ostatním (viz barevné čáry na obrázku)
- Nemluvím o takových věcech jako jsou doplňovaní kódu, nápověda, redefinice klávesových zkratek atd.
IDE má zabudovanou komfortní možnost překladu sebe sama. Programátor si nacvaká, co se má překládat, a dá Build. Pak jen znovu spustí program a je to.
Program využívá inteligentně gdb, tj. odchytává jeho výstup a zobrazuje ho v IDE. Zajímavostí je možnost využívat gdb skrze SSH (nezkoušel jsem).
Komponenty
Součástí Lazara je i knihovna LCL (vizuální komponenty). Všechny komponenty jsou dostupné jak pro Windows, tak pro Linux a spol. LCL obsahuje tyto komponenty (tam, kde to z názvu není jasné, napíši účel):
- standardní: Edit, Button, CheckBox, Label, různé panely, groupbox, combobox, listbox
- vylepšené: tlačítko s bitmapou, obrázek, různé mřížky (string, kreslící), splitter, page control (viz tabbed browsing u Mozilly)
- common control (pojmenované podle původní knihovny MS comctrl.dll): Progress bar, ListView, TreeView, ImageList, StatusBar
- nějaké dialogy: save, open, font, kalendář, kalkulačka, barvičky atd.
- kombinace: např. edit s kalkulačkou nebo edit s kalendářem (pro znalé Delphi něco jako z RxLib) atd.
- databázové komponenty: opět klasika (DBEdit, DBGrid, DBLabel, DBImage atd.)
- a teď pozor: součástí instalace je SynEdit (aby ne, když ho Lazarus používá jako hlavní editor)
SynEdit je skupina komponent sloužící pro komfortní editaci textu. Tím myslím včetně klávesových zkratek (ala Borland), code completion, undo, redo, obsluhy schránky, číslování řádků, bookmarků, odskakování textu, sloupcových bloků atd. Dále obsahuje několik highlighterů (komponent sloužících k zvýrazňovaní syntaxe): C, PAS, XML, HTML, PHP, SQL, TEX, Java, Perl, CSS a MultiSyn.
Tato komponenta je základem většiny programátorských editorů na Win32, dále je často používána pro zobrazování SQL syntaxe v DB nástrojích, některé nástroje pro ladění PHP na Windows ji také využívají.
MultiSyn je kombinací HTML+PHP a dalších. Abych si přihřál vlastní polívčičku, tak editor, co je součástí Seksi Commandera, používá právě SynEdit.
Vlastní editor
Takže pokud si chcete vytvořit vlastní editor pro TeX, tak na formulář bouchnete SynEdit (nastavíte mu zarovnání na Client, aby vyplnil plochu), highlighter pro TeX, nadefinujete si barvy, propojíte je, přidáte menu, open a save dialog a napíšete dva řádky kódu na jejich obsluhu (plus další čtyři řádky kódu na obsluhu schránky a undo). Celkem práce tak na hodinku (pro amatéra). Zkompilujete a to je vše. Zbytek si tam můžete později dodělat.
Výsledkem je gtk aplikace (používající aktuální styl) kolem 1.5 MB (stripnutá, dále už to bude přibývat velmi pomalu) s poměrně slušnými závislostmi na knihovnách (viz výše).
Ještě bych rád řekl, že Seksi Commander pro fpc (i s viewerem) už je ve stádiu alfatestů a tento text vznikl v jeho integrovaném editoru :). (pozn. ed.: HTML podle toho vypadalo :) –Johanka)