Kylix - oblíbené mýty a omyly

16. 4. 2002
Doba čtení: 10 minut

Sdílet

Dnes zahajujeme nový seriál o vývojovém prostředí Kylix od společnosti Borland. První díl je věnovaný nejoblíbenějším mýtům a omylům, které o Kylixu kolují, a padne také pár slov o instalaci varianty Open Edition.

K tomuto dokumentu mne dohnala reportáž páně Radoomka z letošního LinuxWorldu. Zmíněný ctihodný redaktor se tam zmiňoval o rozhovoru se zástupci firmy vyvíjející jistý učetní software a suše konstatoval, že jelikož je tento software pod Windows napsaný v Pascalu, nelze jej portovat pod Linux a musel by se napsat úplně znovu.

Dalšími indiciemi, které mne přesvědčily o nutnosti sepsat tento pamflet, byly jisté poznámky o Kylixu v konferenci o Linuxu.

Jakožto dlouhodobý spokojený programátor v Delphi a nadšený uživatel Linuxu jsem pojal rozhodnutí toto informační vakuum poněkud vyplnit.

Původně to měl být článek o tom, jak portovat své aplikace v Delphi na Linux, ale rozhodl jsem se ho trochu rozšířit a podívat se na Kylix z pohledu stávajícího programátora v Linuxu. Nechci, aby to byl kurz pro začátečníky, spíše bych rád vyzvedl méně známé (nebo zajímavé) vlastnosti. Pokud hledáte kurz programování v Object Pascalu pro začátečníky, zkuste třeba www.builder.cz.

Předem prosím, uchraňme své datové linky od různým flame war. Buďte ke mně tolerantní. Linux byl vždy otevřeným systémem, kde se snoubily různé programovací jazyky. Já se vás nijak nebudu snažit lámat, chtěl bych pouze ukázat, co můžete od Kylixu očekávat a v čem se liší. Na oplátku se budu snažit být co nejvíce objektivní. Děkuji.

Nezačneme hello worldem, jak je zvykem, ale spíše ujasněním několika pojmů a omylů.

Opravník oblíbených omylů alias FAQ

Kylix, ehm to je Delphi a Delphi to je PASCAL!

Bravo Watsone, bohužel Vaše dedukce není úplná.

Kylix je krátce řečeno port Delphi pod Linux, bude následovat i port C++ Builderu (resp. v současnosti podle mých skromných informací probíhají beta testy). Delphi se ale nerovná Pascal.

Delphi se skládá z několika částí:

  • Optimalizující kompilátor Object Pascalu, jak integrovaný do IDE, tak verze pro command line.
  • Linker a debugger.
  • IDE alias integrované vývojové prostředí. Liší se podle edice.
  • RTL aneb Run Time Library.
  • Knihovna VCL nebo CLX, což je objektová knihovna vizuálních a nevizuálních komponent. Pro Linux je CLX. Liší se podle edice.

Kylix používá Wine

Není to pravda, vývojové prostředí Kylixu (IDE) používá winelib, což je knihovna převádějící některá systémová volání Win32 na nativní systémová volání. Samotný Kylix je nativní aplikace kompilovaná do formátu ELF.

Aplikace napsané v Kylixu používají Wine

Není pravda, aplikace napsané v Kylixu nepoužívají Wine ani winelib. Aplikace využívající GUI používají upravenou knihovnu Qt a je tedy nutno k nim exportovat cestu (Borland vlastní několik procent akcií TrollTechu).

Kylix generuje interpretovaný kód

Kylix (jakožto i Delphi) produkují nativní kód pro cílový procesor. Howgh.

Kylix neumí vytvářet knihovny

Kylix umí generovat jak spustitelné soubory, tak sdílené knihovny (.so). Dále je s ním možno vytvářet aplikace bez GUI (ve světě Windows známé jako konzolové). Ve vyšších edicích, než je Open, lze jednoduše programovat moduly pro Apache (resp. ono to jde podle mne i v Open Edition, ale je to stejně složité jako v jiném jazyku, takže nic moc).

V Kylixu nemohu používat knihovny napsané v jiných jazycích

Neměl by to být problém, ovšem pokud máte hlavičkové soubory k doličné knihovně. Mimochodem na platformě Windows je to horší, protože ne všichni programátoři dodržují dohodnutou volací konvenci pro exportované funkce.
Pozn: v Kylixu je předefinována volací konvence stdcall z pascal na cdecl.

Jak je to s tou GPL? Respektive jaké jsou edice?

Tady musím bohužel říci, že Kylix není GPL. Existují tři edice každé verze Kylixu. Nejvyšší je Enterprise, pak je Professional a pak je jedna zadarmo. U Delphi se jmenuje Personal, kdežto u Kylixu Open Edition. Důležité je, že programy vytvořené jak ve verzi Personal, tak Open Edition se nesmí prodávat. Programy napsané v Kylixu Open Edition musí mít licenci GPL. Dále se edice liší IDE a velikostí knihovny komponent.

Open Edition se dále vyznačuje tím, že u programu v ní přeloženém se zobrazuje v GUI verzi splash screen s informací o licenci. Podle dostupných informací ji lze prý změnit a tedy využít jako regulérní splash.

Jinak existují trial verze edice Enterprise, ale to již nechávám laskavému čtenáři za domácí úkol.

Porovnání jednotlivých edicí je dostupné na adrese www.borland.cz/pr_ky­lix_box.html.

Jak je to s licencemi na Qt?

Licence na Qt je duální, pro GPL programy je licence free, pro komerční ji zaplatil Borland a tudíž se neplatí taky nic.

Mohu psát v Kylixu hry?

Hry je asi nejlepší programovat v SDL (2D) a Open GL (3D). Konverzi headerů pro oboje udělali www.delphi-jedi.org. Hra je pak navíc platformově nezávislá.

Mohu používat funkce z knihovny Libc?

Bez problémů. Stačí napsat uses Libc;. Rád bych ale podotknul, že pokud to jde, používejte raději třídy z knihovny VCL/CLX.

Příkladem může být čtení ze souboru. Můžete použít volání jako v C, ale lepší je použít třeba instanci třídy TFileStream, která sice interně volá libc, ale je následníkem TStream a tudíž můžete otevřený soubor předat všude tam, kde se očekává nějaký stream.

Konverze headerů libc je založena na knihovně glibc 2.2.1 přeložené na jádru 2.2.16. Tato informace je uvedena ve zrojových kódech. Že jsem se o zdrojácích ještě nezmínil? Tak to hnedle napravíme.

Ještě bych rád podotknul, že vzhledem ke shodě s existujícími funkcemi (převážně z RTL) došlo u několika funkcí z Libc k přejmenování (např. close na __close apod. Přejmenované funkce jsou vypsány na počátku Libc.pas.

Jsou k dispozici zdrojové kódy?

Zdrojové kódy ke kompilátoru a k IDE k dispozici nejsou. Ke knihovně CLX (včetně RTL) jsou k dispozici kompletní zdrojové kódy v adresáři source ve stromě Kylixu.

Programy napsané v Kylixu jsou bumbrlíčci

No o nic větší než některé jiné programy. Nepopírám, že výsledné binární soubory nepatří mezi vítěze v soutěži o nejkratší program, ale to nic neříká o tom, jak jsou rychlé, nebo co ze souboru je v paměti. Další věc, na kterou bych upozornil, je, že výsledný kód už nepotřebuje skoro žádné jiné knihovny, navíc díky koncepci balíčků mohou být výsledné programy až neskutečně malé.

Dále uvedu několik příkladů, jak je dosahováno zvýšení rychlosti:

  • Při práci s řetězci je implementováno automatické počítání referencí a kopírování se provádí, až je opravdu třeba.
  • Pro volání funkcí je automaticky (pokud není uvedeno jinak) používáno registrů pro předávání parametrů.
  • Většina programátorů (a celá knihovna VCL/CLX) důsledně používá výjimky, tudíž se neztrácí čas zbytečnými testy, ale vše je napsáno tak, jakoby k chybě dojít nemohlo. Obsluha chyby je pak centralizovaná (a většinou se tedy vůbec nepoužije).
  • Důsledné používání OOP a vlastností jazyka Object Pascal (jako výjimky a property).

V porovnání s C vychází program napsaný v Kylixu o něco málo pomalejší (záleží na typu programu, ale myslím, že je to v současné době plné interpretovaných jazyků a ďábelských procesorů stejně nepodstatné).

Podle mne je to vykoupeno kratším časem kompilace, kratším vývojovým cyklem a přehlednějším programem, i když přiznávám, že v každém jazyku lze napsat hrozné věci.

Kylix obsahuje integrovaný assembler (BASM) se syntaxí TASM (NASM). Umí překládat instrukce pro Pentium Pro, MMX, 3DNow! a SSE instrukce.

Hernajz, co je to property

Skočíme trošku dopředu a já to tedy vysvětlím, aby tu bylo taky něco praktického :). A zároveň ukážeme výjimky, otevřené pole, deklaraci třídy a vytvoření objektu.

unit uTest;
// ukázkový unit na property a výjimky

interface

type
// deklarace třídy
  TTestClass=Class(TObject)

  private
    FfileName:String;  // v chráněné sekci
  protected
    procedure SetFileName(Value:String); // metoda pro uložení property

  public
    property FileName:String read FfileName write SetFileName;
  end; // TTestClass

implementation

uses
  SysUtils, Classes;

procedure TTestClass.SetFileName(Value:String);
begin
  if not FileExists(Value) then  // test na existenci souboru
    Raise Exception.Create(Format('Soubor "%s" neexistuje!',[Value]));
  { V předchozím řádku lze vidět parametr typu otevřené pole,
    sice tam předávám pouze jeden, ale musíte mi věřit. }
  ffilename:=Value;  // mimochodem: Pascal je case insensitivní
end;

end.
-------- Cut here --------
program test;
// Hlavni program ...., je v souboru dpr (jako Delphi Project)

{$APPTYPE CONSOLE} //chceme konzolovou aplikaci
uses
  uTest in 'uTest.pas',
  SysUtils;

var
  TestClass:TTestClass;
begin
  TestClass:=TTestClass.Create; // vytvořme instanci třídy (tedy objekt)
// ve skutečnosti je TestClass pointer :-)
  try
    try
      TestClass.FileName:='test.dpr';
{Teď se provedlo voláni SetFileName a tudíž kontrola existence souboru.
Pokud neexistuje, je vyvolána výjimka (mnou) - to je to Raise}

      writeln(testClass.FileName); // starý dobrý writeln, ale v konzoli
{ Teď je pouze prečtena hodnota FfileName, hodnota je tam vždy správná,
takže si to můžeme dovolit. FFileName je v části private,
a tudíž ji tam mohla zapsat pouze třída TTestClass,
nebo někdo jiný, ale pouze přes property!}

    finally
      // uvolni objekt z paměti
      testClass.Free;   // provede se VŽDY (jak normálně, tak při výjimce)
    end;
  except
    On E:Exception do  // a tohle jen při výjimce, zjednodušená obsluha
      Write(E.message);
  end;
end.

Hezký, ale jaký je v tom fígl?

Zatím Kylix existuje jen na platformě IA32, ale Borland uvažuje o jiných. Kdysi dokonce existoval u Borlandů projekt, který kompiloval Object Pascal do javového bytekodu, ale nebyl dokončen, protože MS (ano MS, ne SUN) změnil nějak definici (už si to přesně nepamatuji).

V létě 2002 má být Delphi optimalizováno pro .NET.

Další nevýhodou je nutnost přeložit hlavičkové soubory u DLL knihoven. Mnoho jich bylo přeloženo, ale přesto.

Existuje volný program, který umí konvertovat header z jazyka C do importního pascalového zdrojáku. Konverzemi headerů se hodně zabývají delphi jedi.

Borland sám staví Delphi do pozice vývojového prostředí pro databáze, s čímž mnoho lidí včetně mne nesouhlasí. Kylix zase podle mne staví do pozice vývojového prostředí pro internetové aplikace (viz moduly pro Apache, ale také další…).

Můžu v Open Edition psát DB aplikace?

Open Edition má ořezanou CLX, hlavně co se týká DB. Základem všeho je třída TDataSet, která v OE není. Takže jsou tři možnosti: buďto používat nativně přístup k DB (např. k MySQL) jako v C, tedy voláním API, nebo zkusit ZeosDB, což by měly být komponenty, které by měly fungovat i s OE, nebo zkusit stáhnout ze sourceforge.net FreeCLX.

Hezký, ale trvám na GPL

No v tom případě můžete zkusit www.freepascal­.org. Plně GPL, překládá pro mnoho různých platforem, ale přitom to není frontend ke gcc. Rozumí borlandím rozšířením Pascalu (ve smyslu OOP) a zavádí další věci jako promenna:=pro­menna2++; apod. Horší je to už s IDE ve smyslu RAD. Existuje sice lazarus.freepas­cal.org, ale nejsem si jím moc jist (mimochodem místo Qt používá Gtk+).

FreePascal má vlastní knihovnu komponent FCL, která je hodně kompatibilní s VCL.

Doporučuji stahovat z CSV, kde je verze 1.1, která má oproti stable 1.0.4 velmi mnoho rozšíření.

Nebo GNU Pascal, ale ten se mi moc nelíbil.

Na co Pascal… Stejnak je lepší ???? – zde dosaďte svůj oblíbený jazyk

Sice jsem převážně mluvil o Object Pascalu a ne Pascalu, ale i tak obdivuji Vaši trpělivost, že jste dočetl až sem. Jinak máte samozřejmě určitě pravdu.

Instalace Open Edition

No a aby výše uvedený program šel přeložit, je nutno mít nainstalován Kylix (nebo free pascal).

Zkusíme tedy nainstalovat Kylix 2 Open Edition.

Pro instalaci je nutné být rootem. Rozbalíme balík (zabalený má zhruba 30 MB). Po rozbalení koukněte do adresáře borpretest, kde se nachází testovací program. Sice se automaticky spustí při instalaci, ale s parametrem -v je větší sranda.

V podstatě jde o to, že v některých verzích libc byla „menší“ chyba v uvolňování knihoven, což test ochotně vysvětlí. Pokud test neprojde, musíte upgradovat libc, nebo ho alespoň opatchovat. Patch lze stáhnout od Borlandů, popřípadě upgradovat od distributora. Podle dokumentace se to může týkat RH 6.2, RH 7.0, MDK 7.2 a SuSE 7.0. Pokud vás to zajímá, dá se stáhnout i samotný test.

Nyní zbývá pouze spustit instalaci a zvolit, kam se má Kylix nainstalovat.

Kylix, obrázek 1

Pokud v následujím kroku instalační program skončí s chybou, zkuste předat instalačnímu skriptu parametr -m. Pokud jste nezvolili instalování menu, tak vězte, že Kylix se spouští příkazem startkylix v adresáři bin ve stromě Kylixu. Při prvním spuštění se spustí generování fontů, a pokud máte jádro 2.4.x, tak to taky tím skončí (alespoň v MDK 8.1, v MDK 8.2 se to zdá v pořádku, tak nevím). V README je o tom zmínka, ale podle mne stačí to okno zavřít.

Po registraci se Kylix konečně spustí, a tím je instalace dokončena.


Kylix v akci
(30898 bytes)

Pozn: demo aplikace jsou pro normálního uživatele read only, takže si je pro pokusy překopírujte k sobě.

Pozn: mimochodem pokud používáte professional nebo enterprise edici, můžete si nastavit klávesy jako v editoru Emacs.

bitcoin_skoleni

Pozn: pokud nemůžete spustit v Kylixu vytvořenou GUI aplikaci mimo IDE, upřete svou pozornost na skriptík kylixpath v adresáři bin ve stromě Kylixu.

Pozn: Pascal sice není case sensitivní, ale linker rozeznává jména souborů jako normální program, tedy case sensitive! To je důležité především pro programátory v Delphi.

Seriál: Kylix