Vysoká škola ekonomická v Praze Fakulta informatiky a statistiky Vyšší odborná škola informačních služeb v Praze
Jan Fikejs Srovnání programovacích jazyků PHP a Ruby Bakalářská práce
2007/2008
Zadávací list Autor práce
Jan Fikejs Rodné číslo: 801219/0780
Vedoucí práce
Ing. Jan Klas, Ph.D.
Název práce
Srovnání programovacích jazyků PHP a Ruby
Zaměření práce
Srovnávací studie
Plánovaná obhajoba
22. 1. 2008
Datum: 12. 10. 2007
Vedoucí bakalářské práce
Prohlašuji, že jsem bakalářskou práci na téma Srovnání programovacích jazyků PHP a Ruby zpracoval samostatně a použil/a pouze zdrojů, které cituji a uvádím v seznamu použité literatury. V Praze dne 27.12. 2007
Podpis
Obsah Obsah ................................................................................................................................4 1 Autorská anotace .....................................................................................................5 2 Dosud publikovaná srovnání PHP a Ruby ..............................................................6 3 Seznam oblastí srovnání ........................................................................................10 4 Popis použitých metod...........................................................................................11 5 Vlastní oblasti srovnání jazyků..............................................................................12 5.1 Architektura jazyka ........................................................................................... 12 5.2 Oblast použití .................................................................................................... 12 5.3 Syntaxe.............................................................................................................. 13 5.4 Proměnné a práce s nimi ................................................................................... 14 5.4.1 Deklarace proměnných ............................................................................ 14 5.4.2 Platnost proměnných ............................................................................... 14 5.4.3 Datové typy ............................................................................................. 15 5.4.4 Konstanty................................................................................................. 15 5.4.5 Práce s řetězci .......................................................................................... 15 5.4.6 Metody pro práci s poli............................................................................ 16 5.5 Vstup a výstup................................................................................................... 18 5.5.1 Metody pro práci se vstupem .................................................................. 18 5.5.2 Metody pro práci s výstupem .................................................................. 18 5.5.3 Práce se soubory ...................................................................................... 18 5.5.4 Práce s adresáři ........................................................................................ 19 5.6 Řízení chodu programu..................................................................................... 20 5.6.1 Větvení programu .................................................................................... 20 5.6.2 Cykly ....................................................................................................... 20 5.7 Výrazy a operace............................................................................................... 21 5.7.1 Logické operátory.................................................................................... 21 5.7.2 Regulární výrazy ..................................................................................... 21 5.7.3 Matematické operace............................................................................... 23 5.8 Síťové a databázové služby............................................................................... 23 5.8.1 Práce s FTP.............................................................................................. 23 5.8.2 Práce s emailem ....................................................................................... 25 5.8.3 Práce s databází ....................................................................................... 25 5.9 Implementace .................................................................................................... 26 5.10 Vývojové prostředí....................................................................................... 27 6 Závěr ......................................................................................................................28 7 Seznam použitých zdrojů:......................................................................................31 8 Přílohy ...................................................................................................................33
4
1 Autorská anotace V dnešní moderní době, na začátku 21. století, nejsou již webové stránky dávno tvořeny jen čistým HTML kódem a textem, který je zobrazen uživateli. Nejen při tvorbě webových aplikací, ale i při tvorbě běžných webových stránek je dnes prakticky nutností stránky vytvářet dynamické a to nejen kvůli jejich obsáhlosti, tedy přílišné náročnosti a časté aktualizaci například zpravodajských webů, ale také kvůli samotnému zefektivňování přístupu k informacím, protože samotné webové stránky dnes jsou schopné reagovat na chování uživatele a tím mu usnadnit pohyb po webu ale hlavně lépe zpřístupnit ty informace, o které má zájem. Cílem této práce je srovnat dva konkurenční jazyky pro tvorbu webových aplikací a zjistit, zda je v českém prostředí výhodnější vytvářet webové aplikace pomoci právě velmi rozšířeného programovacího jazyka PHP, nebo u nás neznámého, ale ve světě také velmi rozšířeného programovacího jazyka Ruby, které si postupně i u nás získává stále více uživatelů. Volbu programovacího jazyka ovlivňuje mnoho faktorů. Proto se v první části zaměřím na již provedená srovnání obou jazyků a publikované závěry. Na jejich základě stanovím oblasti pro vlastní srovnání. Podle jejich výsledku stanovím závěry pro použití jednoho, nebo druhého jazyka. V této práci se zaměřím čistě na oba programovací jazyky – tedy čistě na PHP a Ruby a nikoliv na hojně používané frameworky k oběma jazyků, protože jejich srovnání by bylo časově daleko náročnější, krom toho již plně nezohledňuje jazyky jako takové.
5
2 Dosud publikovaná srovnání PHP a Ruby PHP a Ruby většinou srovnávají jednotliví programátoři. Jedná se většinou o jejich osobní názory, které publikují na svých blozích. Pro ilustraci vybírám z dostupných srovnání tato: - Blue Lee, blog RefreshinglyBlue.com, příspěvek PHP vs Ruby – Practical Language Differences (20.8.2007) (http://www.refreshinglyblue.com/2007/8/20/php-vs-ruby-practical-languagedifferences) - Brad Feld, blog Feld Thoughts, příspěvek PHP vs Ruby (24.10.2007) (http://www.feld.com/blog/archives/2006/10/php_vs_ruby.html) - Derek Silvers, blog O’Reilly Ruby, příspěvek 7 reasons I switched back to PHP after 2 years on Rails (22.9.2007) (http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_ p_1.html) - Jakub Mrozek, Blog RonnieWeb, příspěvek Ruby vs. PHP (7.5.2007) (http://weblog.ronnieweb.net/?p=102) - Staff Writer, blog CMSWire, příspěvek PHP vs Java vs Ruby (15.11.2006) (http://www.cmswire.com/cms/industry-news/php-vs-java-vs-ruby-000887.php) - David Grudl, blog La Trine, příspěvek Ruby on Rails? Děkuji, nechci (http://latrine.dgx.cz/ruby-on-rails-dekuji-nechci) - Diskuse Ask MetaFilter, vlánko Should I switch from PHP to Ruby? (4.12.2005) (http://ask.metafilter.com/28418/Should-I-switch-from-PHP-to-Ruby) - Stefan Mischook, blog Killersites.com, příspěvek PHP vs. Ruby (9.5.2006)(http://www.killersites.com/blog/2006/php-vs-ruby/) - Stefan Mischook, blog Killersites.com, příspěvek Will PHP kill Ruby? (7.8.2006) (http://www.killerphp.com/articles/will-ruby-kill-php/) Blue Lee v článku PHP vs Ruby – practical Language Differences uvádí: „Mám dojem, že jen velmi málo lidí bude oponovat tím, že PHP je elegantnější a schopnější jazyk než Ruby. Upřímně, Ruby je pravděpodobně nejoblíbenější jazyk se kterým jsem kdy pracoval a to jsem pracoval už s jazyky ASP, ASP.NET, VB.NET, C#, Java a Perl 6
a se všemi značně několik let. Ruby je jak vysoce přesný a výstižný, což není obvyklé a posilňující.“ Na hosting autor zastává názor, že to je největší úskalí Ruby. Z vlastní zkušenosti ví, že mnoho malých klientů nemá prostředky na založení vlastních VPS a i kdyby mělo, hostingové společnosti nemají dostatek zaměstnanců, kteří by mohli správu těchto VPS“ (virtuálních privátních serverů) „mohli zajišťovat. Proto je z finančních důvodů výhodnější poskytovat správu PHP, než jen kvůli malým odlišnostem v obou jazycích ještě spravovat servery s Ruby.“ „U větších projektů tyto obtíže se správou stojí za zvážení, ale pro malé až střední projekty, je PHP mnohem jednodušší na rozmístění, méně nákladné na hosting a programovací jazyk funguje na všech typech sítí. Pro naše projekty, čas, který zabere vývoj s PHP není o nic delší než s Ruby on Rails“ Brad Feld v článku PHP vs. Ruby poukazuje na tyto závěry: „PHP dominuje novými řádkami kódu a pouze PHP a Ruby mají vzrůstající tendenci. ... Ruby je jasně nový trendní jazyk. Podle nabídky a poptávky, byste předpokládali že toto je hlavní indikátor významného postupu v dalších dvou grafech v roce 2007. Můj závěr je odlišný od Robinova – pokud se zdá, že PHP je dominantní dnes, rapidní růst nových projektů v Ruby indikuje, že je momentálně v pozici ,jazyka příští vlny aplikací’. To se shoduje s tím co vidím a slyším od všech lidí pracujících v nových projektech“. Derek Silvers, ve svém článku 7 reasons I switched back to PHP after 2 years on Rails: publikuje následující závěry: „Existuje něco co Ruby (Ruby on Rails) umí a PHP ne? Není. Nechci to co nepotřebuji.. určitě nevyužiji 90% kódu Ruby. ... Nepotřebuji přizpůsobovat svoje způsoby programování Rails. PHP řeknu přesně to, co od něj chci a ono si neztěžuje. Ruby se všemi možnými pluginy a vychytávkami jsem musel znásilnit abych mohl zintegrovat mnohojazykovou databázi s 95ti tabulkami. ... Miluji SQL. Sním o frontách a myslím v tabulkách. Vždycky jsem bojoval proti migracím v Rails, které předemnou schovávali milované SQL. Miluji Ruby za to, že jsem díky němu opravdu pochopil OOP. ..Ruby je tak krásné. .. Ale hlavní důvod proč se programátor učí nový jazyk je, ten že nový jazyk je o mnoho lepší než starý, ale to je proto, že teď je lepší programátor!
7
Přeze všechno co jsem psal, těším se na to, až budu používat Rails, jednoho dne, kdy začnu kompletně nový projekt s Railsy od začátku. Kdybysme zahodili starý kód a udělali vše v Rails, bylo by to mnohem jednodušší.“ David Grudl ve svém příspěvku příspěvek Ruby on Rails? Děkuji, nechci, píše: „Ruby je špatný jazyk. Navádí programátory k špinavým technikám, tzv. bad code smell. A framework Ruby on Rails jich plně využívá ... a vážně porušuje základní principy OOP, jmenovitě třeba zapouzdření... ..Ruby v tomto ohledu není dobrý jazyk. Propagace Ruby používá slova jako štěstí a radost z programování. Má dlouholetá zkušenost programátora spíš říká něco o zoufalství a bolení hlavy. Realita ale není černobílá a nadšení uživatelů z Ruby on Rails chápu.“ Jakub Mrozek, Blog RonnieWeb v příspěvku Ruby vs. PHP píše: „Ruby mě zaujalo svou jednoduchostí řešit složité problém a tím, že v Ruby snad vše funguje na první pokus. Když si PHP nainstaluju, nebudou v něm fungovat základní aplikace jako phpMyAdmin ani web napsaný v ZF ... Ruby je velmi populární v zahraničí, u nás je prakticky neznámý, bohužel, nicméně vím, že se tato situace začíná měnit, třeba já nyní přecházím na jiný hosting, který Ruby standardně nabízí. Dále nabízí Ruby on Rails.“ Stefan Mischook, blog Killersites.com, příspěvek PHP vs. Ruby zmiňuje následující: „PHP je mnohem dostupnější než Ruby – co se týče hostingu, PHP je velmi rozšířený a vyzkoušený jazyk, který používají velké weby jako Yahoo, Digg a Flickr. PHP je jednoduchý na naučení a jednoduchý na používání. .“ Stefan Mishook, Will PHP kill Ruby?: píše: „Přestože Ruby a PHP jsou oba skriptovací jazyky, které dělají vývoj webových aplikací jednodušší než to je, jak se píše v Java worldu, jsou to velmi rozdílné „bestie“... každý oslovuje jiné publikum. ... Chci poukázat na to, že Ruby je výborný jazyk a myslím že to je dobrý důvod pro PHP vývojáře aby se naučili aspoň základy Ruby: je vždycky dobré se naučit další jazyky protože to z vás udělá lepšího programátora. To znamená, že věřím, že se Ruby se nebude snažit, ani nebude naplňovat potřeby většiny PHP programátorů, protože Ruby může být hodně abstraktní. PHP je často kritizováno za procedurální a objektově orientované řešení věcí... já myslím že to je právě jedna z jeho předností. Myslím, že využití PHP je nedoceněno v následujících aplikacích: email z webové stránky, zpracování jednoduchých formulářů a uložení do databáze, vytvoření jednoduchého 8
obchodu s 10ti položkami. Můj názor je, že pro mnoho PHP projektů, může být OOP (objektově orientované programování) destruktivní. V Ruby je všechno objekt (i čísla) a jádro jazyka má velmi propracované konstrutory, které potřebují být pochopeny aby využili Ruby efektivně – silné stránky Ruby jsou zároveň slabými.“ Shrnutí Z výše uvedené rešerše vyplývá, že v názorech na PHP a Ruby převažují spíše osobní preference sympatie k jednotlivým jazykům. Pouze dva z uvedených autorů (Silvers, 2007; Grudl, 2007) významněji kritizují Ruby. Grudl především díky přílišné volnosti, kterou Ruby programátorovi nabízí a hlavně kvůli, podle něj, porušování základních principů OOP. Programátor tak může libovolně změnit funkčnost libovolné třídy. Silvers kritizuje Ruby především za praktickou nemožnost převodu PHP kódu do Ruby, resp. konkrétně do Ruby on Rails (framework pro Ruby), protože stejné věci je nutné v Ruby řešit příliš složitě a s využitím prakticky všech rozšíření, které Ruby nabízí. Já osobně si nemyslím, že přílišná volnost dělá z programovacího jazyka automaticky špatný programový jazyk. Silvers se ve své snaze přepsat PHP kód do Ruby patrně opravdu pokoušel o nemožné. Podle jeho článku nelze soudit jakým způsobem přesně postupoval, ale na závěr sám přiznává, že i díky tomuto nezdaru, se od Ruby mnohé naučil a rád začne budovat další projekt čistě na Ruby. Další autor (Lee, 2007) poukazuje na závažný hendikep Ruby, což je hosting. S tím mohu jen naprosto souhlasit, protože hosting Ruby není zdaleka nabízen v takové míře, jako hosting PHP, což je jistě důležitým faktorem, který brání masovějšímu rozšíření Ruby. Ostatní autoři (Deshook, 2007; Mrozek, 2007; Feld, 2007) zastávají ten názor, že Ruby je jazyk, který má světlou budoucnost, je jednoduchý, vyzkoušený (také velkými portály). Mishook zároveň poukazuje, na to, že každému nemusí vyhovovat vše, a komu vyhovuje PHP nemusí vyhovovat Ruby a naopak. Podle mého názoru obecně existuje mnoho různých programovacích jazyků a každý si jistě vybere takový, který mu vyhovuje a nebude za každou cenu programovat v takovém jazyku, jehož struktura je mu nevyhovuje. 9
3 Seznam oblastí srovnání Programovací jazyky PHP a Ruby budu srovnávat z pohledu běžného (průměrného) programátora. Zaměřím se na oblasti, které podle mého názoru ovlivňují výběr programovacího jazyka.
Architektura jazyka Určuje celkový koncept jazyka i způsob práce s ním. Podle mého názoru má pro vývojáře podobný význam jako syntaxe.
Syntaxe Syntaxe má zásadní vliv na způsob práce s jazykem. Existují různé skupiny jazyků s podobnou architekturou, sémantikou i syntaxí. Z vlastních zkušeností mohu říci, že pokud je programátor zvyklý používat určitý jazyk, při volbě nového jazyka dává přednost jazyku s obdobnou syntaxí. Vzhledem k velkému množství příkazů a možných parametrů, se v této práci zaměřím pouze na základní stavební prvky programu a základní služby. Konkrétně se zaměřím na oblasti, které se mohou v různých jazycích lišit. Typicky se jedná o deklarace metod a proměnných, datové typy, řízení chodu programu, práce se vstupem a výstupem, práce se síťovými službami a databázemi.
Implementace Stejně tak důležité jako jsou silnice pro auta, je důležitá implementace pro programovací jazyky. Pro samotné využití programovacích jazyků (pro webové aplikace) v praxi je zásadní hosting a podporované platformy. Jazyk může být sebelepší, ale pokud je těžké najít server, kde bychom mohli vytvořené aplikace provozovat, nebude mít příliš široké využití. Stejně tak, pokud jazyk nelze provozovat na všeobecně rozšířených operačních systémech..
Vývojové prostředí V dnešní době málokdo programuje tzv. „na koleně“. Samotná struktura a syntaxe jazyka by měla být pro uživatele dobře srozumitelná, ale dobré a moderní vývojové prostředí, může programátorovi ulehčit velkou část práce a urychlit rutinní činnost.
10
4 Popis použitých metod V této práci jsem použil metodu kvalitativního srovnávání. V první fázi zpracování tématu bylo nutné vyhledat již zpracované materiály na zadané téma od většího počtu autorů. Na základě jejich analýzy bylo možné názory jednotlivých autorů na danou problematiku srovnat a zhodnotit faktory, podle kterých jazyky porovnávali. Shrnutí jednotlivých autorů mi umožnilo vymezit oblasti pro srovnání obou jazyků. V další fázi bylo nutné shromáždit potřebné materiály týkající se jednotlivých oblastí srovnání a jejich následné prostudování. Na základě získaných poznatků bylo nutné jednotlivé oblasti v obou jazycích srovnat. Tato část vyžadovala širší prostudování materiálů týkajících se obou jazyků v daných oblastech. Při srovnávání jednotlivých metod, jsem porovnával jejich funkcionalitu, názvy i syntaxi v obou jazycích, přičemž hlavním kritériem pro srovnání byla funkcionalita. Na základě získaných poznatků bylo možné zhodnotit výsledky srovnání, zároveň je srovnat s již dříve zjištěnými názory autorů, kteří se podobnou problematikou již dříve zabývali.
11
5 Vlastní oblasti srovnání jazyků 5.1
Architektura jazyka
„Ruby je interpretovaný skriptovací programovací jazyk. Díky své jednoduché syntaxi je poměrně snadný k naučení, přesto však dostatečně výkonný, aby dokázal konkurovat známějším jazykům jako je Python a Perl. Je plně objektově orientovaný – vše v Ruby je objekt.“ (Wikipedie, PHP 2007)
„RAA (archiv aplikací pro Ruby), stejně jako Ruby Forge, slouží jako repozituře pro širokou škálu Ruby aplikací a knihoven, obsahující více než dva tisíce položek. Přestože počet dostupných aplikací nekoresponduje s dostupnými materiály v Perlu nebo Pythonu, je zde široké množství nástrojů a pomůcek, které podporují další rozvoj jazyka.“ (Wikipedia, Ruby 2007) „PHP je skriptovací programovací jazyk, určený především pro programování dynamických internetových stránek. Nejčastěji se začleňuje přímo do struktury jazyka HTML, XHTML či WML, což je velmi výhodné pro tvorbu webových aplikací. PHP lze ovšem také použít i k tvorbě konzolových a desktopových aplikací.“ (Wikipedie PHP, 2007)
5.2 Oblast použití Ruby: Oblast použití skriptovacích jazyků je obecně široká. Stejně tak i oblast použití Ruby. „Asi nejčastější využití najde na platformě Linux (a jiných systémech typu Unix) při psaní skriptů pro usnadnění každodenní práce. Díky své přehledné syntaxi a striktní objektovosti se hodí i k psaní velkých projektů, CGI skriptů, ba dokonce GUI aplikací (GTK2, TK, Qt, wxRuby atd.). Jelikož podporuje regulární výrazy, je Ruby vhodným jazykem pro zpracování textových souborů.“ (Wikipedie, Ruby 2007)
PHP: „V kombinaci s databázovým serverem (především s MySQL nebo PostgreSQL) a webovým serverem Apache je často využíván k tvorbě webových aplikací. Díky velmi častému nasazení na serverech se vžila zkratka LAMP – tedy spojení Linux, Apache, MySQL a PHP nebo Perl.“ (Wikipedie, PHP 2007) 12
„PHP je obecně provozované na webových serverech, kde PHP kód slouží jako vstup pro vytvořený webových stránek, které jsou výstupem serveru. Lze použít i skriptování z příkazové řádky a aplikace na straně klienta. PHP může být provozované na většině webových serverů a prakticky na všech operačních systémech a běžně dostupných platformách. PHP Group také nabízí kompletní zdrojový kód uživatelům pro další vývoj nebo vlastní úpravy k vlastnímu užití.“ PHP tedy funguje jako jakýsi filtr. Na vstup překladače přichází data v podobě PHP příkazů, textu a HTML. Na výstupu dostaneme čisté HTML pro zobrazení v prohlížeči. (Wikipedia, PHP 2007)
5.3 Syntaxe Syntaxe Ruby je velmi podobná jazykům Perl a Python. (Wikipedia, Ruby 2007) Kód PHP se oproti Ruby typicky vkládá přímo do HTML kódu a je nutné jej ohraničit programovými závorkami. Existuje i verze Ruby Erb (Embedded Ruby), které se vkládá přímo do HTML, stejně jako PHP. Erb je nutné stejně jako PHP ohraničit programovými závorkami. (Více viz http://rubydoc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html) Tab. 1 Programové závorky pro vkládání kódu PHP a Ruby Erb PHP
Ruby
První varianta
<% kod_Ruby %>
Druhá varianta
= kod_PHP; ?>
<%= kod_Ruby %>
(autor) Třídy a definice metod jsou označeny klíčovými slovy. Deklarace funkcí v PHP a definice metod v Ruby je prakticky totožná. (V Ruby se stejně jako v jiných objektově orientovaných programovacích jazycích funkce nazývají metody). Pro účely této práce budu používat pro označení metod v Ruby i funkcí v PHP označení „metoda“. Definice se liší jen klíčovými slovy. Deklarace funkce v PHP se provádí pomocí klíčového slova function, v Ruby pomocí klíčového slova def. Návratovou hodnotu funkce se získá pomocí klíčového slova return. V Ruby se však return nemusí nutně použít, protože funkce automaticky vrací poslední vyhodnocený výraz. Tělo funkce je v PHP
13
ohraničeno složenými závorkami, v Ruby je deklarace funkce ukončená klíčovým slovem end. Každý příkaz je v PHP (až na několik výjimek) ukončen středníkem a konec řádku je interpretovaný jen jako mezera. V Ruby je konec řádku chápán jako konec příkazu, ale lze použít i středník pro jeho ukončení. Proměnné v Ruby nejsou oproti PHP i Perlu uvozeny žádným speciálním znakem. Použití tohoto speciálního znaku však mění platnost proměnné. Velkým rozdílem Ruby oproti PHP i dalším jazykům je platnost proměnných. Ty jsou v Ruby implicitně lokální. Příkazy v PHP mají většinou syntaxi odpovídající jazykům Pascal, Basic. Konstrukce příkazů Ruby je podobná již zmíněným jazykům Perl a Python a dále například Javě. Syntaxí podrobněji se zabývám v následujících kapitolách.
5.4 Proměnné a práce s nimi 5.4.1 Deklarace proměnných V PHP ani v Ruby není třeba proměnnou předem definovat ani specifikovat její typ. Proměnné se přiřadí vhodný typ v okamžiku, kdy se proměnná poprvé použije. Rozdíl je zde jen v syntaxi. „Proměnné začínají znakem ‚$‘, po kterém následuje jméno proměnné. V PHP není potřeba proměnné deklarovat předem. Proměnná je deklarována okamžikem, kdy ji poprvé použijeme. Pokud do proměnné nic neuložíme, přiřazovacím příkazem, má proměnná obsah prázdného řetězce“ (Kosek 1999, s 42). V Ruby není proměnná nijak uvozena. Pro její název je možné použít malá písmena abecedy nebo podtržítko „_“.
Tab. 2: Rozdíly v zápisu proměnných Zápis proměnné
PHP
Ruby
$promenna
promenna nebo _promenna
Zdroj: (autor)
5.4.2 Platnost proměnných V Ruby jsou všechny proměnné lokální, pokud nejsou deklarované jako globální. Globální proměnné jsou uvozeny znakem „$”.
14
V PHP jsou také všechny proměnné automaticky lokální. Globální proměnné navíc nejsou automaticky uvnitř funkcí k dispozici a jejich použití ve funkci povolit pomocí příkazu global následovaného seznamem proměnných, které se mají ve funkci používat. Ke globálním proměnným lze také přistupovat pomocí globálního asociativního pole $GLOBALS.
5.4.3 Datové typy Oba jazyky nabízí prakticky totožné datové typy, ale Ruby oproti PHP obsahuje ještě typ range (rozsah), který se chová podobně jako jednorozměrné pole. Asi jediný výrazný rozdíl se týká naplňování pole. Více viz kapitola 8.4.6. „Ke zjištění typu proměnné můžeme“ v PHP „použít funkci GetType (<<proměnná>>). Ta vrací jméno typu <<proměnné>>. Pokud chceme zjistit, zda má proměnná nějaký konkrétní typ, můžeme použít funkce Is_Integer(), Is_Double, Is_String(), Is_Array(), Is_Object().“ (Kosek 1999, s. 48). Pokud potřebujeme jednorázově změnit typ proměnné je to možné pomocí metody SetType. V Ruby podobné metody nenajdeme. V Ruby, stejně jako v PHP dochází ke změně typu proměnných automaticky, podle hodnoty, kterou obsahují.
5.4.4 Konstanty V PHP je nutné konstanty definovat pomocí klíčového slova define v tomto tvaru: define (<<jméno konstanty>>, <
>). V Ruby je konstantě přiřazena hodnota přiřazovacím příkazem v těle programu. Od proměnné se odlišuje tím, že její název začíná velkým písmenem. Při snaze o změnu hodnoty konstanty se v obou jazycích vyvolá varování, ovšem v Ruby se změna hodnoty provede, ale v PHP nikoliv.
5.4.5 Práce s řetězci Skupina funkcí pro práci s řetězci je velmi důležitá, protože s nimi pracují programátoři každý den. „Řetězcové proměnné jsou v Ruby uchovávány v objektech třídy String. Jsou to v podstatě sekvence 8-bitových znaků, takže v objektu String lze uchovávat i binární data (například načtená ze souboru). Obvykle se řetězce inicializují pomocí konstant
15
uzavřených v uvozovkách nebo apostrofech .... Navíc nabízí Ruby pohodlnou cestu k inicializaci dlouhých, několikařádkových řetězců.“ (Lahvička 2006) Práce s řetězci je v obou jazycích odlišná, avšak část metod má v obou jazycích velmi podobný název a jejich funkce se nijak neliší. Na počet funkcí pro práci s řetězci je bohatší Ruby, to ovšem neznamená, že by operace, pro které nemá PHP vlastní metodu, nebylo možné s řetězci provést. Požadovanou operaci s řetězce je však nutné provést za pomoci kombinace jiných metod. Ruby navíc ještě obsahuje metodu pro převod řetězce na typ integer a float. V PHP tyto funkce neexistují, protože veškeré konverze proměnných probíhají automaticky. To znamená, že například změna z datového typu string na integer proběhne automaticky po odstranění uvozovek ohraničující samotný řetězec. Ovšem jednotlivým proměnným lze přímo zadat jejich typ. Tedy obdobná operace lze provést převedením proměnné a nastavením cílové proměnné na požadovaný typ. PHP i Ruby má pro práci s řetězci mnoho podobných metod. PHP obsahuje mnoho konverzních a převodních metod pro řetězce a dále řadu metod pro kryptování. Kryptovací funkce obsahuje i Ruby. S nimi se ale pracuje odlišně než v PHP a kryptovací metoda se většinou volí pomocí parametrů kryptovací funkce. Rozdíl v zápisu jednotlivých funkcí s řetězci mezi oběma jazyky ukazuje tabulka 3 (viz příloha)
5.4.6 Metody pro práci s poli PHP i Ruby má pro práci s řetězci řadu metod. PHP má definovaný větší počet metod než Ruby, avšak jednotlivé metody pro práci s poli v Ruby mají většinou širší okruh využití, než funkce v PHP. Takže některé operace, které lze provést v Ruby pomocí jedné metody pomocí různých parametrů, jsou v PHP řešeny několika samostatnými metodami. Rozsah metod v jednotlivých oblastech použití se v obou jazycích značně liší. Například PHP disponuje větším počtem metod pro vytváření nových polí. V Ruby lze však dosáhnout stejného výsledku použitím jediné metody s různými parametry. 16
PHP a Ruby obsahuje cca polovinu totožných nebo obdobných metod pro různé operace s prvky pole. Tyto metody mají většinou i v obou jazycích stejný název. Druhá polovina metod je odlišná. Tyto metody ve většině případů rozšiřují funkci jiných metod, ale v každém jazyce odlišně. V PHP je potřeba při zápisu na jednom řádku, tedy přiřazení více hodnot do pole, nutné použít klíčového slova array a uzavřít jednotlivé hodnoty mezi závorky. V Ruby stačí těchto více hodnot uzavřít mezi hranaté závorky. V PHP nenajdeme asociativní pole Hash, které najdeme ve všech podobných jazycích. V PHP je toto pole sloučené s typem běžného pole. Ruby asociativní pole hash obsahuje. Hash slouží pro ukládání více hodnot. Místo indexů se však k označení prvků používá takzvaných klíčů, pomocí kterých se k jednotlivým prvkům také přistupuje. Z tohoto důvodu PHP obsahuje metody pro práci s klíči a pole. V Ruby tyto metody nejsou potřebné, protože stejná funkcionalita je dosažena pomocí syntaxe pro objekty. Stejně tak pouze PHP obsahuje metody pro práci s klíči pole, protože v Ruby lze stejné funkcionality dosáhnout bez speciálních metod. PHP obsahuje desítku metod pro třídění pole. V Ruby je stejná funkčnost řešena pomocí jediné metody a různých parametrů. Ruby oproti PHP obsahuje několik metod pro mazání zadaných prvků pole. Oba jazyky mají metody pro provedení logických operací (+, -, průnik) s polem. Ovšem jen Ruby má zabudované metody pro ekvivalenci a srovnání obsahu obou polí. V PHP je toto nutné řešit pomocí kombinací jiných metod. Rozdíly v zápisu metod pro práci s polem ilustruje následující tabulka 4 (viz příloha)
17
5.5 Vstup a výstup Oba programovací jazyky pracují obdobně s výstupem. Se vstupem pracují oba jazyky odlišným způsobem. Ruby používá podobné způsoby práce se vstupem jako jazyky nižší úrovně (například Perl, Pascal), PHP používá k práci s údaji vkládaných uživatelem především formuláře.
5.5.1 Metody pro práci se vstupem Pro práci se vstupem má Ruby 4 metody. gets, resp. readline, get a post. Chování příkazů gets a readline je shodné. Oba načtou řetězec ukončený znakem ENTER, hodnoty jsou automaticky typu string. Nevýhodou je zde fakt, že se vstupní údaje načtou včetně znaku pro zalomení řádku. Ten je potřeba odstranit pomocí funkce chop, kterou lze použít přímo na vstupu (gets.chop). Potřebujeme-li s hodnotami pracovat jako s čísly, je nutné řetězec převést na číslo. Pomocí metody to_i na celé, pomocí metody to_f na reálné číslo. V PHP se pro práci se vstupem používají jen metody get a post, které slouží pro přístup k proměnným prostředí, v případě, že je skript spuštěný ze serveru. Chování těchto metod je v obou jazycích obdobné.
5.5.2 Metody pro práci s výstupem PHP i Ruby nabízí tři příkazy pro výpis. V PHP jsou to echo, print a printf. Příkaz echo slouží k výpisu jednoho nebo více výrazů. Všechny výrazy, zadané jako parametry příkazu, jsou automaticky převedeny na string. Print vytiskne obsah jednoho řetězce, printf vytiskne zformátovaný řetězec, jako argument lze zadat více řetězců. Ruby nabízí podobné dva příkazy puts a print a printf. Ty se od sebe vzájemně liší jen tím, že puts po vypsání zadaného údaje automaticky přejde na nový řádek, print na nový řádek sám nepřejde. Printf navíc nabízí možnost formátování výstupu.
5.5.3 Práce se soubory PHP i Ruby obsahují obdobné metody pro práci se soubory. Ruby navíc obsahuje některé metody, které jsou rozšířením funkčnosti jiných metod. Atributy metod Fopen / .open a Fwrite, puts, print, fprint jsou v obou jazycích totožné.
18
Ruby obsahuje oproti PHP navíc metodu pro procházení souboru po řádcích a po znacích, zjištění čísla aktuálního řádku, zjištění shodnosti souborů. Dále Ruby, oproti PHP, navíc obsahuje metody pro práci s adresářovou cestou. Výčet zápisu jednotlivých metod pro práci se soubory v obou jazycích shrnuje tabulka 5 (viz příloha).
5.5.4 Práce s adresáři Pro práci s adresáři disponují oba jazyky prakticky totožnými procedurami, jak plyne z tabulky 6. Oba jazyky mají oproti druhému pár odlišných metod s odlišnou funkčností. PHP nemá zabudovanou metodu pro smazání adresáře, Ruby ano. Ruby navíc obsahuje několik metod pro práci s ukazatelem v adresáři. PHP obsahuje jen metodu pro přesunutí ukazatele na začátek. Tab. 6 Metody pro práci s adresáři PHP
Ruby
Změna aktuálního adresáře
ChDir()
.chdir
Změna kořenového adresáře pro aktuální proces
ChRoot()
Smazání zadaného adresáře
RmDir()
.delete, .rmdir, .unlink
Vypsání obsahu adresáře do pole
ScanDir()
.entries
Vytvoření adresáře
MkDir()
.mkdir, .new
Vrácení aktuálního adresáře
GetCwd()
.getwd
Otevření adresáře
OpenDir()
.open
Zavření adresáře
CloseDir()
.close
Aplikování zadané metody na každý údaj v adresáři
.each
Přečtení údaje z adresáře
ReadDir()
.read
Přesunutí ukazatele na začátek
RewindDir()
.rewind
Přesunutí ukazatele na zadanou pozici
.seek
Vrácení aktuální pozice v adresáři
.pos, .tell
(autor)
19
5.6 Řízení chodu programu 5.6.1 Větvení programu Oba jazyky používají obdobnou syntaxi podmiňovacího příkazu if. V Ruby je nutné i jednořádkový příkaz if ukončovat příkazem end, což není v PHP nutné, ale je to možné pomocí příkazu endif, což může být užitečné ve složitějších konstrukcích, které obsahují více příkazů. Při zápisu ve tvaru „if-endif“ je však nutné za příkaz if, elseif, nebo else, navíc zapsat dvojtečku. V tomto případě není nutné blok vnitřních příkazů uzavírat mezi složené závorky. Syntaxe konstrukce „if-else“ a „if-elseif-else“ je v obou jazycích obdobná. Ruby navíc ještě obsahuje negaci samotného if, tedy „unless-else-if“. Syntaxe je obdobná jako u příkazu if. Větvení pomocí příkazu case má v obou jazycích odlišný zápis, avšak funkčnost je stejné. V Ruby má tvar case <> when <> <> .. else <
> end. PHP užívá syntaxi switch <> { case <>: <> break; .. default: <
> }, nebo syntaxi „switch <>: ... endswitch;
5.6.2 Cykly Oba programovací jazyky obsahují standardní cykly, jako jsou for, while, repeat. Použití cyklu for se však v Ruby zásadně liší. Slouží výhradně pro procházení položek seznamu. Jeho zápis vypadá následovně: for i in [<<položky seznamu>>, <<položky zeznamu>>] do <> end. Cyklus for se v PHP definuje podobně jako v ostatních jazycích, tedy ve tvaru for(<>; <<podmínka cyklu>>; <>) příkaz; . PHP ještě obsahuje podobný cyklus foreach, který slouží k procházení prvků pole. Jeho syntaxe je obdobná: foreach ($pole as $hodnota) příkaz; Cyklus while je v obou jazycích a má obdobnou syntaxi jako v jiných programovacích jazycích. Ze standardních cyklů obsahuje ještě cyklus until, jehož syntaxe je opět standardní. PHP místo cyklu until má cyklus do-while, jehož syntaxe je: do <> příkaz; while (podmínka).
20
Další rozdílný „cyklus“ Ruby je metoda times. Ta opakuje příkazy mezi znaky { }. Syntaxe je následovná: <<počet>>.times {<
>}. V Ruby pro jednotlivé datové typy existuje metoda each a od ní odvozené metody. Každá se chová jinak v závislosti na zadaném datovém typu. Obdobný cyklus v PHP je zmíněný foreach.
5.7 Výrazy a operace 5.7.1 Logické operátory Oba jazyky používají shodné logické operátory.
5.7.2 Regulární výrazy Regulární výrazy jsou nativně jen součástí Ruby a je tedy možné je přímo použít jako součást syntaxe. PHP přímo s regulárními výrazy pracovat neumí a proto je nutné regulární výrazy předávat jako parametr funkcím, které s nimi pracují. Jsou tedy obsahem proměnné, nebo ohraničené uvozovkami. V Ruby jsou regulární výrazy uzavřené mezi lomítka. K seskupování znaků slouží jednoduché závorky. V obou jazycích lze použít tzv. univerzální zápis, který je prakticky shodný ve všech programovacích jazycích. V Ruby lze navíc použít zkrácený zápis, který má totožný význam (viz tabulka 6). Standardně Ruby používá tzv. PCRE (Perl-compatible regular expressions), které je možné použít i v PHP, ovšem jen pomocí funkcí začínající prefixem preg_. Použití těchto funkcí však musí být v PHP povoleno. (více viz http://cz2.php.net/pcre)
21
Tab. 6 Regulární výrazy Význam speciálního symbolu
PHP
Ruby
Číslo
[0-9]
\d nebo [0-9]
Cokoliv jiného než číslo
[^0-9]
\D nebo [^0-9]
Bílý znak
[ \t\n\r\v\0]
\s nebo [ \t\n\r\f]
Cokoli jiného než bílý znak
[^ \t\n\r\f]
\S nebo [^ \t\n\r\f]
Písmeno nebo číslo
[a-zA-Z0-9]
\w nebo [a-zA-Z0-9]
Cokoliv jiného než písmeno nebo číslo
[^a-zA-Z0-9]
\W nebo [^a-zA-Z0-9]
Začátek řetězce, negace
^
^
Konec řetězce
$
(autor) Vzhledem k tomu, že v Ruby je regulární výraz uzavřen mezi lomítka, nevyskytují se narozdíl od PHP v Ruby speciální znaky pro začátek a konec řetězce. Použití znaku ^ je v obou jazycích trochu odlišné, i když mají shodný význam. V PHP se prvotně používá jako začátek řetězce a jako negace výrazu. V Ruby tento znak lze také použít jako znak pro začátek řetězce, což se však příliš nepoužívá, a také jako negace výrazu. Oba jazyky také obsahují řadu metaznaků, které se zapisují v obou jazycích zcela shodně. (viz tab 7) Tab. 7 Metaznaky nejméně m, nejvíce n opakování předchozího
{m,n}
znaku nejméně žádné, nejvýše jedno opakování
? nebo {m,n}
předchozího znaku Žádný nebo libovolný počet opakování
*
předchozího znaku Jedno nebo více opakování předchozího
+
znaku Seskupení
()
nebo, logický operátor OR:
|
rozsah:
[]
(autor)
22
5.7.3 Matematické operace Většina metod pro základní matematické operace mají v obou jazycích stejný název. To se týká základních goniometrických i cyklometrických funkcí (sin, sinh, asin, asinh, tan, tanh, atan, atanh), logaritmů (log, log10), exponenciálních funkcí (exp) druhé odmocniny (sqrt), zjištění minima, maxima i běžného zaokrouhlení (min, max, round). Hodnotu Ludolfova čísla vrací v PHP metoda pi(), v Ruby je tato hodnota obsahem konstanty PI. V Ruby také najdeme konstantu s hodnotou Eulerova čísla. V PHP oproti Ruby nalezneme metody pro převod čísla z jedné číselné soustavy do jiné, dále metody na převod velikosti úhlu v radiánech na stupně a naopak. V Ruby podobné metody nenajdeme. Převod z číselných soustav je nutné řešit pomocí jiných metod. Například konverze desítkového čísla do šestnáctkového lze provést pomocí metody .to_s(16) a zpět pomocí obdobné metody .to_i(16), tzn. pomocí konverzní metody typů se zadáním základu. Obdobně lze číslo převést i do jiné soustavy. Ruby obsahuje oproti PHP navíc především funkce pro oříznutí desetinné části čísla, celočíselné dělení. V PHP se volí celočíselné nebo desetinné dělení automaticky. Celočíselné dělení lze vynutit pouze pokud explicitně dělíme dvě celá čísla. Kompletní výčet metod obsažených v jednotlivých jazycích zobrazuje tabulka 8. (viz příloha)
5.8 Síťové a databázové služby 5.8.1 Práce s FTP Pro práci s FTP mají oba jazyky poměrně mnoho odlišných metod (viz tabulka 9), na druhou stranu obsahují desítku obdobných metod, které se liší jen minimálně v názvu. Tyto metody mají v PHP oproti Ruby navíc prefix „ftp_“. Většinou se jedná o základní metody pro přechod mezi adresáři, připojení a odpojení od FTP serveru, vytvoření a přejmenování adresáře, zjištění velikosti adresáře a další (chdir, connect, login, delete, mdtm, mkdir, pwd, rename, rmdir, site, size, quit, get, put). Ruby oproti PHP navíc přímo obsahuje metody pro přenos souborů v binárním a textovém módu. V PHP je nutné mezi těmito módy manuálně přepínat. Na druhou 23
stranu PHP obsahuje metody pro přenos obsahu aktuálně otevřeného souboru do souboru na serveru a naopak, a také variantu těchto metod v neblokovém módu. Příkaz pro přechod do nadřazeného adresáře obsahuje jen PHP. Tab. 9 Metody pro práci s FTP PHP Přidělení místa pro nahrávaný souboru na server
Ftp_Alloc()
Přechod z aktuálního adresáře do nadřazeného
Ftp_Cdup()
Změna přístupových práv
Ftp_Chmod()
Zjištění zda je spojení ukončené
Ruby
.closed? .dir, .list
Spuštění programu / příkazu na FTP serveru
Ftp_Exec()
Stažení souboru v binárním módu
.getbinaryfile
Stažení souboru v textovém módu
.gettextfile
Nahrání souboru na server v binárním módu
.putbinaryfile
Nahrání souboru na server v textovém módu
Puttextfile
Vrácení data poslední změny souboru na serveru
.mtime
Stažení souboru a uložení do aktuálního otevřeného
Ftp_fget
souboru Nahrání souboru na server a uložení do aktuálního
Ftp_fput
otevřeného souboru Stažení souboru a uložení do aktuálního otevřeného
Ftp_nb_fget()
souboru v neblokovém módu Nahrání obsahu z aktuálně otevřeného souboru do
Ftp_nb_fput
souboru na serveru v neblokovém módu Stažení souboru v neblokovém módu
Ftp_nb_get()
Nahrání souboru na server v neblokovém módu
Ftp_nb_put()
Vypsání obsahu zadaného adresáře na serveru
Ftp_nlist()
Vypnutí pasivního módu
Ftp_Pasy()
Odeslání „raw“ příkazu na server
Ftp_Raw()
Vrácení detailního výpisu zadaného adresáře na
Ftp_RawList()
serveru Vrácení informací v poli o souborech v adresáři
.list, ls
Přepnutí spojení do binárního módu
.retrbinary
Přepnutí spojení do textového módu
.retrlines
24
Smazání adresáře na serveru
Ftp_RmDir()
.rmdir
Odeslání příkazu a vrácení odpovědi
.sendcmd
Nahrání souboru na server v binárním módu
.storbinary
Nahrání souboru na server v textovém módu
.storlines
Otevření bezpečného SSL spojení
Ftp_SSL_Conn()
(autor)
5.8.2 Práce s emailem PHP i Ruby obsahuje jedinou metodu, která slouží pro odeslání emailu ze skriptu. Je jím mail. Jejími parametry jsou všechny náležitosti emailové zprávy. První tři jsou povinné (adresát to, předmět subjekt, tělo zprávy message), další dvě nepovinné (další položky hlavičky headers – např. CC, BCC, a další parametry zprávy parameters). Metoda pro práci s emailem v Ruby má název mail. Ta umožňuje jak vytvoření nové emailové zprávy, tak otevření existující. Dále lze využít metodu body pro zpracování těla zprávy a header pro zpracování hlavičky zprávy.
5.8.3 Práce s databází PHP obsahuje zabudované metody pro práci s databázemi SQL. Tudíž je v PHP možné přímo používat příkazy pro nejrozšířenější databázové servery MySQL a PostgreSQL. Jediné co je nutné pomocí PHP obstarat je navázání a ukončení spojení. V současné době PHP přímo podporuje následující SQL servery: MS SQL, ODBC, Oracle, Abadas, Informix, Interbase. Ruby samo osobě neobsahuje metody pro práci s databázemi. Pro jednotlivé databázové sytémy je nutné doinstalovat patřičné moduly. Pro práci s MySQL v Ruby slouží modul s totožným názvem, tedy MySQL. Po jeho nainstalování je možné i v Ruby používat přímo příkazy a syntaxi MySQL. Druhý modul, který je pro Ruby k dispozici je DBI. Pomocí něj lze pracovat například jak s MySQL, tak s PostgreSQL.
25
5.9
Implementace
Ruby má dvě hlavní implementace – nejrozšířenější oficiální Ruby interpreter (MRI) a JRuby, což je implementace založená na Javě. Existuje ještě mnoho dalších méně známých. Pro PHP existuje mnoho alternativních implementací. Nejrozšířenější je implementace php.net, která je založená na virtuálním serveru implementovaného v programovacím jazyce C. Další implementací je Roadsend, která je založená na kompilaci zdrojového kódu PHP do samostatných binárních souborů. Existují dvě významné implementace založená na Javě 5 SE Virtual Machine – Quercus a Project Zero. Na platformě .NET je založená implementace Phalanger.
Operační systémy PHP lze provozovat na všech běžně používaných operačních systémech. Podobně i Ruby lze provozovat na všech rozšířených operačních systémech (Acorn RISC, Amiga, BeOS, DOS, Linux, Mac OS X, Maemo, MS Windows 95 – Vista, CE, Morph OS, OS/2, Open VMS, Syllable, Symbian OS, Blue Gene/L, Unix). Pro běžného programátora jsou oba jazyky dostupné pro prakticky libovolnou platformu.
Webhosting V oblasti využití programovacího jazyka, konkrétně jazyka pro tvorbu webových stránek, je nejdůležitější webhosting použitého jazyka. Je hodně těžké nalézt webhostingový server, který vůbec nenabízí v základní nabídce webhosting PHP. Ale i takové u nás v dnešní době existují (forpsi), ale jedná se o opravdovou výjimku mezi webhostingovými službami. Dokonce hosting PHP nabízí i poskytovatelé bezplatného prostoru pro umístění webových prezentací (např. Webzdarma.cz a pod.). Co se týče webhostingu Ruby, je situace o poznání horší. Prakticky jediným velkým webhostingovým serverem, který hosting Ruby, resp. frameworku Ruby on Rails nabízí je jen Banán.cz (cena za hosting s Ruby je 75kč za měsíc; cena platná k 1.12.2007). Novým poskytovatele, který nabízí hosting Ruby je Ruby-hosting.cz. Ten však Ruby poskytuje za více než dvakrát vyšší cenu než u Banán.cz. Další poskytovatelé hostingu Ruby on Rails jsou malé společnosti, nebo jednotlivci, kterých lze najít cca dvě desítky, 26
ale jejich ceny jsou vyšší než u větších společností (například Ruby-hosting.cz: 180Kč/měsíc, Anafora sro: 250Kč/měsíc, eDomov.com: 265Kč/měsíc; ceny platné k 1.12.2007). To ale pro většinu uživatelů, kteří již provozují jakékoliv webové prezentace a měli by zájem přejít na Ruby, by to znamenalo změnit společnost, u které svou prezentaci hostují.
5.10 Vývojové prostředí Pro PHP existuje řada bezplatných editorů. Nejvíce jich v současné době existuje pro operační systém MS Windows. Pro operační systémy Linux, Mac OS X je jich k dispozici cca o polovinu méně než pro MS Windows. Podobné množství editorů je k dispozici pro více platforem. Bezplatné editory pro PHP jsou například: Maguma Open Studio. Mezi komerční patří Zend Studio, NuSphere Ohled, Macromedia DreamWeaver (k dispozici pro Windows i Mac OS X). Mezi bezplatné editory pro PHP patří například: Mondrian, FreeRide. Mezi bezplatné editory pro oba programovací jazyky patří: Vim, Emasc, Elipse, jEdit, SciTE, NetBeans IDE. Komerční editory: Arachno PHP/Ruby IDE, Komodo IDE, UltraEdit, TextMate (pro Mac OS X), Zeus Editor (pro Windows), Visual Studio 2005.
27
6 Závěr Cílem této práce bylo srovnání dvou konkurenčních jazyků pro tvorbu webových aplikací a zjistit, zda výhodnější vytvářet webové aplikace pomoci velmi rozšířeného programovacího jazyka PHP, nebo u nás zatím poměrně neznámý ale ve světě také velmi rozšířený Ruby, který si postupně i u nás získává stále více uživatelů. Oba jazyky mají své klady i zápory. Z kapitoly 8.2 je patrné, že oblast využití jazyka PHP není zdaleka tak široká jako oblast použití Ruby, protože samotné PHP je již od svého vzniku koncipované pro tvorbu webových prezentací a webových aplikací spolupracujících s databázemi. Ruby umožňuje naprogramovat jak webové aplikace, tak i uživatelské prostředí, což posunuje oblast využití tohoto jazyka mnohem dále. Toho je možné dosáhnout pomocí metod, které jsou obsaženy již v základní verzi jazyka. Další rozšíření a podporu například pro širokou škálu databází nabízí rozšiřující knihovny, kterých je velké množství. PHP také obsahuje rozsáhlé knihovny funkcí pro zpracování textu, grafiky, práci se soubory a pro přístup k většině databázových serverů a většinu internetových protokolů. Ruby programátorovi umožňuje programovat interaktivně (kapitola 8.1), tedy okamžitě vidí jaké dopady mají změny v kódu, které právě provedl na výsledném projektu. V PHP je nutné upravovaný kód vždy znovu převést do výsledné html stránky, kterou lze zobrazit v prohlížeči a tak si ověřit vliv změn v kódu na výslednou webovou stránku. Tato interaktivita v Ruby může být v některých případech nežádoucí, protože programátor se stává závislý na interpretru, který stále kód překládá do výsledné podoby. Tento fakt má také za následek pomalejší překlad zdrojového kódu (interpretované jazyky jsou pomalejší než kompilované). Oba jazyky jsou skriptovací, ale mají odlišnou architekturu (kapitola 8.1). Ruby je plně objektově orientovaný, PHP se na rozdíl od Ruby vkládá přímo do HTML. Existuje ale také verze Ruby ERB, která se vkládá do HTML kódu podobně jako PHP. Přístup k objektově orientovanému programování se v PHP výrazně zlepšil až s verzí PHP 5.
28
Vzhledem k rozdílné architektuře obou jazyků se liší i jejich syntaxe, avšak i v ní nalezneme řadu společných vlastností. Například proměnné není nutné ani v jenom jazyce předem deklarovat. Rozdílem je jejich platnost, která je v Ruby implicitně lokální, což považuji za výhodu (kapitola 8.4). Hodnotu konstant lze libovolně v Ruby měnit, což není podle mého názoru příliš bezpečné (kapitola 8.4.4). Oba jazyky obsahují řadu podobných funkcí pro práci s poli (kapitola 8.4.1). Velkým rozdílem oproti jiným jazykům je zvláštní typ Hash v PHP, který je v jiných jazycích součástí typu pole a v PHP je nutné pro něj používat speciální metody. Řízení chodu programu (kapitola 8.6) i práce se soubory (kapitola 8.5.3) se v obou jazycích prakticky neliší. Pohodlnější metody pro práci s adresáři však nabízí Ruby. S regulárními výrazy se pracuje pohodlněji v Ruby, které s nimi umí pracovat nativně (kapitola 8.7.2) a má také možnost zkráceného zápisu delších běžně užívaných regulárních výrazů. V PHP se s regulárními výrazy musí pracovat pomocí speciálních metod a výrazy předávat jako obsah proměnných, nebo jako řetězce. PHP nabízí více operací pro převod mezi číselnými soustavami a podobně. V Ruby se podobná funkcionalita musí dosáhnout manuálně (kapitola 8.7.3) Pro práci s FTP i emailem disponují oba jazyky podobnou funkcionalitou. V PHP je možné bez dalších rozšíření přímo pracovat se základními databázemi, v Ruby je nutné použít rozšíření. V PHP najdeme mnoho metod, které nejsou v Ruby obsažené, to je však většinou z toho důvodu, že v objektově orientovaném programování podobné metody nejsou potřebné (stejné funkcionality lze dosáhnout díky využití vlastností objektově orientovaného programování). Lze však najít i metody, které jeden jazyk obsahuje a druhý ne. Těch však není příliš mnoho a podle mého názoru příliš neovlivní volbu jazyka. Funkcionalitu takových metod je nutné dosáhnout kombinací metod jiných. Implementace je v obou jazycích obdobná a oba programovací jazyky je možné provozovat na všech všeobecně rozšířených operačních systémech a to i na těch méně známých (kapitola 8.9). PHP lze provozovat na libovolné platformě, avšak počet operačních systémů, na kterých lze provozovat Ruby je dostatečně velký.
29
Závažným handicapem ruby v našem prostředí je nedostatek dokumentace v češtině (veškerá dokumentace je převážně jen v angličtině). Pro PHP existuje celá řada publikací i tutoriálů v češtině. Druhým závažným handicapem, který podle mého ještě více hraje ve prospěch PHP, je nabízený hosting. PHP je nabízeno zcela běžně, ale hosting v ČR pro Ruby nabízí jen jediný velký poskytovatel a jeho cena je vyšší než hosting PHP. Ostatní malí poskytovatelé hostingu Ruby jej nabízí také za výrazně vyšší ceny než PHP. Podle mého názoru Ruby sice nabízí programátorovi širší možnosti než PHP, ale pokud nemá dostatek financí a neumí dobře anglicky, je pro něj stále výhodnější používat PHP, které má stále mnohem větší podporu než Ruby. Pokud by u nás měly oba jazyky podobné podmínky jako v zahraničí, tedy srovnatelnou podporu, tak z uvedených srovnání jednoznačně vychází Ruby lépe, ale podle mého názoru pouze pro větší projekty. Pro menší projekty a pro běžné uživatele stále doporučuji použití PHP a to především kvůli široké podpoře a nízké ceně.
30
7 Seznam použitých zdrojů: BLUE, Lee. PHP vs Ruby, Practical Language Differences [online] poslední aktualizace 20.8.2007 [cit 15.10.2007], dostupné z WWW: FELD, Brad, PHP vs Ruby [online] poslední aktualizace 24.10.2007 [cit 15.10.2007] dostupné z WWW: GRIMMICH, Šimon, PHP – regulární výrazy [cit 15.11.2007] dostupné z WWW: GRUDL, David, Ruby on Rails? Děkuji, nechci [cit 19.10.2007] dostupné z WWW: HLADÍLEK, Jaromír. Ruby 2005 [cit 16.10.2007] dostupné z WWW: HLADÍLEK, Jaromír. Ruby tutoriál [online] [cit 16.10.2007] [dokument pdf] dostupné z WWW: HRADÍLEK, Jaromír, Ruby pro začátečníky – 6 (regulární výrazy) [online] poslední aktualizace 9.8.2006 [cit 15.11.2006] dostupné z WWW: KOSEK, Jiří, PHP – tvorba interaktivních webových aplikací. Praha: Grada Publishing 1999. 492s. ISBN 80-7169-373-1 LAHVIČKA, Jiří, PHP – práce s řetězci a PHP [online] poslední aktualizace 21.8.2006 [cit 15.11.2007] dostupné z WWW: MISCHOOK, Stefan, PHP vs. Ruby [online] poslední aktualizace 9.5.2006) (cit 19.10.2007] dostupné z WWW: MISCHOOK, Stefan, Will PHP kill Ruby? [online] poslední aktualizace 7.8.2006) (cit 19.10.2007] dostupné z WWW: MROZEK, Jakub, Ruby vs. PHP [online] poslední aktualizace 7.5.2007 [cit 18.10.2007] dostupné z WWW: 31
SILVERS, Derej. 7 reasons I switched back to PHP after 2 years on Rails [online] poslední aktualizace 22.9.2007 [cit 15.10.2007] dostupné z WWW: SNÍŽEK, Martin, K čemu je PHP? [online] poslední aktualizace 3.1.2006 [cit 16.10.2007] dostupné z WWW: SÝKORA, Pavel. Ruby v příkladech 27.10.2005 [cit 16.10.2007] dostupné z WWW: ŠRÁMEK, Dalibor. Ruby a OOP (objektově orientované programování) [online] poslední aktualizace 1.3.2002 [cit 16.10.2007] dostupné z WWW: ŠRÁMEK, Dalibor, Ruby: jen další skriptovací jazyk? [cit 19.10.2007] dostupné z WWW: ŠRÁMEK, Dalibor, Ruby z rychlíku [online] poslední aktualizace 4.2.2002 [cit 17.11.2007] dostupné z WWW: WRITER, Staff, PHP vs Java vs Ruby [online] poslední aktualizace 15.11.2006 [cit 18.10.2007] dostupné z WWW: Wikipedie, PHP [online] [cit 16.10.2007] dostupné z WWW: Wikipedie, Ruby [online] [cit 16.10.2007] dostupné z WWW: Wikipedia, PHP [online] [cit 16.10.2007] dostupné z WWW: Wikipedia, Ruby [online] [cit 16.10.2007] dostupné z WWW: ZAJÍC, Petr. PHP tutoriál [cit 16.10.2007] dostupné z WWW:
32
8 Přílohy Seznam příloh: Tabulka 3 Práce s řetězci (autor)................................................................................33 Tabulka 4 Práce s poli (autor) ....................................................................................35 Tabulka 5 Práce se soubory (autor)............................................................................38 Tabulka 8 Matematické a převodní operace (autor) ..................................................49
Tab. 3 Práce s řetězci Spojení řetězců
PHP
Ruby
.
+
Vycentrování řetěcze na daný počet znaků
.center
Zjištění délky řetězce
StrLen()
.length
Rozdělení řetězce do pole
Explode(), Split()
.split
Spojení obsahu pole a převedení do řetězce
Implode(), Join()
.join
Získání části řetězce
SubStr()
Odstranění bílých znaků zleva
LTrim()
.lstrip
Odstranění bílých znaků zprava
RTrim()
.rstrip
Odstranění prázdných znaků ze začátku a konce
Trim()
.strip
Chop()
.chop
řetězce Odstranění posledního znaku z řetězce Odstranění zadaného podřetězce z řetězce
.delete
Vrácení délky řetězce
StrLen()
Nahrazení podřetězce v řetězci jiným
Str_Replace()
.gsub
Nahrazení prvního výskytu podřetězce jiným
.sub
Nahrazení zdvojených znaků jednoduchými
.squeeze
Náhodné zamíchání znaků v řetězci
Str_Shuffle()
Univerzální nahrazení
StrTr()
Přidání podřetězce do řetězce
.tr .insert
Zjištění pozice podřetězce v řetězci
StrPos()
.index
Zjištění prvního výskytu podřetězce v řetězci
StrChr()
Porovnání dvou řetězců
StrCmp()
<==>, ==
Porovnání dvou řetězců bez ohledu na velikost
StrCaseCmp()
.casecmp
písmen
33
Zjištění poslední pozice podřetězce v řetězci
.rindex
Zjištění přítomnosti podřetězce v řetězci
.include?, .match
Zjištění zda je řetězec prázdný
.empty?
Spočítání počtu slov v řetězci
Str_Word_Count()
Obrácení řetězce
StrRev()
Porovnání podřetězců
SubStr_Compare()
Spočítání poču výkskytů podřetězce v řetězci
SubStr_Cout()
Spočítání hash řetězce
Crypt()
Spočítání mtd5 hashe řetězce
Mtd5()
Rozdělení řětězce do zadaného počtu slov
WordWrap()
.reverse .count
Převodní metody Převod řetězce na velká písmena
StrToUpper()
.upcase
Převod řetězce na malá písmena
StrToLower()
.downcase
Prohození velikosti písmen
.swapcase
Převod řetězce na tvar první písmeno velké,
.capitalize
ostatní malá Převod textu na datový typ integer
.to_i
Převod textu na datový typ float
.to_f
Převod znaku na hexadecimální hodnotu
Bin2Hex()
Vrácení znaku se zadanou ASCII hodnotou
Chr()
Převod ASCII hodnoty na znak
Ord()
Převod speciálních znaků HTML na entity
Html_Entity_Decode()
Převod některých předdefinovaných znaků na
HtmlSpecialChars()
html entity Převod čísla na měnu
Money_Format()
(autor)
34
Tab. 4: Práce s poli Popis funkce
PHP
Ruby
Vytvoření pole
array()
.[]
Vytvoření nového pole se zadanými prvky
array()
.new
Vytvoření pole se zadaným rozsahem hodnot
range()
Vytvoření nového pole z dvou jiných
array_combine()
Vytvoření pole hodnot a počtem jejich výskytů v poli
array_count_values()
Vytvoření pole z dvou polí tak, že první prvky pole
Compact()
Vytváření pole
budou klíči, prvky z druhého pole hodnotami Sloučení a setřídění více polí do jednoho, bez
.flatten
duplicitních prvků Operace s prvky pole Přidání prvků z jiného pole do pole
.concat
Vrácení prvku na zadané pozici
.fetch
Podle zadaného parametru vrátí pole se všemi znaky
array_change_key_
malými nebo velkými
case()
Rozdělení pole do řetězců
array_chunk()
Zjištění počtu prázdných prvků
.nitems
doplnění pole na zadanou délku
array_pad()
Smazání posledního prvku pole
array_pop()
.pop
Smazání zadaných hodnot z pole
.delete
Smazání zadaného prvku pole
.delete_at
Smazání prvků vyhovujících podmínce
.delete_if
Vymazání obsahu pole
.clear
Přidání prvků na konec pole
array_push()
Vybrání náhodného prvku z pole
array_rand()
Naplnění zadaných prvků pole hodnotami
array_fill()
Sloučení prvků pole do jednoho řetězce, se zadaným
Join, implode
.push
.join
oddělovačem Vrácení prvků na základě podmínky
.select
Odstranění prvního prvku z pole
array_shift()
.shift
Vrácení zadané části pole
array_slice()
.slice
Odstranění zadané části pole Odstranění a nahrazení zadané části pole
.slice! array_splice()
35
Odstranění duplicitních prvků v poli
array_unique()
.uniq
Přidání prvků na začátek pole
array_unshift()
.unshift
Vrácení prvků pole
array_values()
.values
Spočítání prvků pole
count()
.size, .lenght
Vrácení aktuálního prvku pole
current(), pos()
obrácení pořadí prvků v poli
array_reverse()
sečtení všech hodnot prvků pole
array_sum()
Odstranění prázdných prvků z pole Ověření zda se v poli vyskytuje zadaná hodnota
.reverse .compact
in_array()
Zaměnění řádků a sloupců v poli
.include? .transpose
„Zamíchání“ prvků pole
shuffle()
Zjištění počtu prvků v poli
sizeof()
Aplikování volané funkce prvky zadaných polí
array_map()
.map / .collect!
Aplikování uživatelské funkce na všechny prvky pole
array_walk()
Operace s klíči pole Prohození klíčů a hodnot pole
array_flip()
Vrácení všech klíčů pole
array_keys()
Zjištění zda zadaný klíč, nebo index je v poli
array_key_exists()
Práce s ukazatelem Posunutí ukazatele na předchozí prvek
prev()
Nastavení ukazatele pole na výchozí prvek
reset()
Nastavení ukazatele pole na poslední prvek
end()
Posunutí ukazatele na následující prvek
next()
Vyhledávání a filtrování pole Filtrování pole podle volané funkce
array_filter()
Vrácení prvního, nebo zadaného počtu prvních prvků
.first
pole Vrácení klíče prvního prvku, ve kterém se vyskytuje
.index
zadaný řetězec Nahrazení pole zadanými hodnotami jiného pole Vyhledání indexu prvku, obsahující zadaný řetězec Vypsání obsahu pole, ve kterém se vyskytuje zadaný
.replace array_search() .assoc
řetězec. Srovnává prvky pole Vypsání obsahu pole, ve kterém se vyskytuje zadaný
.rassoc
řetězec. Srovnává klíče pole
36
.split Třídění pole Setřídění pole sestupně se zachováním indexů
arsort()
Setřídění pole se zachováním indexů
asort()
Setřídění pole sestupně podle klíčů
krsort()
Setřídění pole podle klíčů
ksort()
Setřídění pole podle algoritmu „přirozeného třídění“
natcasesort()
bez ohledu na velikost písmen Setřídění pole podle algoritmu přirozeného třídění
natsort()
Setřídění pole sestupně
rsort()
Třídění pole podle zadaných parametrů
sort()
Setřídění pole podle podle uživetelem definované
uasort()
.sort
funkce se zachováním klíčů Setřídění pole podle podle klíčů uživetelem
uksort()
definované funkce Setřídění pole podle podle hodnot uživetelem
usort()
definované funkce Setřídění více polí, nebo vícerozměrného pole
array_multisort()
Logické a matematické operace s poli Sloučení (sečtení) dvou nebo více polí
array_merge()
Rekurzivní sloučení dvou nebo více polí
array_merge_recursive
+
() Rozdíl polí
array_diff()
-
Průnik polí
array_intersect()
&
Porovnání dvou polí
<=>
Zjištění shodnosti dvou polí
==
Zjištění zda dvě pole jsou shodné objekty
.eql?
Další operace s polem Vytvoření jediné hodnoty z pole, na základě volané
array_reduce()
funkce Zjištění zda zadané pole je zmražené
.frozen?
Zjištění zda jde o pole
Is_Array()
Import proměnné pole do sympolové tabulky
extract()
Zjištění prvku pole na který je nastaven ukazatel
key()
(autor)
37
Tab. 5 Práce se soubory PHP
Ruby
Orevření souboru
Fopen()
.open
Zavření souboru
Fclose()
.close
Přečtení zadaný počet znaků ze souboru
Fread()
.read
Přečtení jednoho řádku ze souboru
FGetS
.gets
Přečtení jednoho znaku ze souboru
FGetC
.getc
Přečtení jednoho řádku a odstranění všech HTML a
FGetS
PHP tagů Načtení celého souboru do pole
File
.readlines
Procházení souboru po řádcích
.each
Procházení souboru po znacích
.each_byte
Zjištění čísla aktuálního řádku
.lineno
Vložení zadaného textu do souboru
Fwrite()
.puts, .print, .printf
Kopírování
Copy()
Přesunutí souboru
move move
Přejmenování
Rename()
.rename
Odstranění
Unlink()
.unlink, .delete
Zjištění velikosti souboru
FileSize()
.size
Zjištění velikosti souboru
.FileSize()
.size
Zjištění typu souboru
FileType()
.ftype
Zjištění data vytvoření souboru
FileCtime()
Zjištění data poslední změny souboru
FileMtime()
.mtime
Zijštění data posledního přečtení souboru
FileATime()
.atime
Vrácení jména souboru z adresy
BaseName()
.basename
Vrácení adresářové části cesty
Dirname()
.dirname
Změna přístupových práv
ChMod
chmod
Změna vlastníka a skupiny souborů
.chown
Zjištění zda je obsah souborů shodný
compare
Zjištění zda je zadaný argument adresář
Is_Dir()
.directory?
Zjištění zda jde o soubor
Is_File()
.file?
Zjištění zda je argument metody spustitelný soubor
Is_Executeble()
.executable?
Zjištění zda zadaný soubor existuje
File_Exist()
.exist?
Zjištění skupiny uživatelé, které soubor patří
FileGroup()
38
Zjištění uživatele, kterému soubor patří
FileOwner()
Zjištění přístupových práv k souboru
FilePerms
.owned?
Převod cesty na absolutní
.expand_path
Porovnání cesty se zadaným řetězcem
.fnmatch
Zjištění zda se zadané názvy shodují
.identical?
Vytvoření adresářové cesty z více řetězců
.join
Vytvoření adresáře
MkDir()
Vytvoření nového souboru
makedirs() .new
Zjištění zda soubor lze číst
Is_Readable()
.readable?
Zjištění zda je soubor zapisovatelný
Is_Writeable
.wrireable?
(autor) Tab. 8 Matematické a převodní operace PHP Spočítá totéž co motoda exp - 1
Ruby
Expm1()
Spočítá chybovou funkci
.erf
Spočítá doplňkovou chybovou funkci
.erfc
Rozdělení zadaného čísla na celou a desetinnou
.frexp
část, uložení každé zvlášť do pole Celočíselné dělení
.div
Zbytek po celočíselném dělení
Fmod()
Maximální hodnota náhodného čísla po volání
GetRandMax()
.mod
rand Zjištění zda jde o konečné číslo
Is_finite()
Zjištění zda jde o nekonečné číslo
Is_infinite()
Zjištění zda jde o číslo
Is_nan()
Vrácení náhodné hodnoty v rozmezí 0,1
Icq_value()
Vrácení čísla*2x
.ldexp
Spočtení logaritmu 1+zadané číslo
Log1p()
Maximální hodnota, která může být vrácena po
Mt_GetRandMax()
volání mt_rand Vrácení náhodného čísla s použitím algoritmu
Mt_Rand
„Marsene Twister“ Zaokrouhlení desetinného čísla směrem dolů
Floor()
Spočítání zadané mocniny z čísla
Pow()
Vygenerování náhodného celého čísla
Rand()
Rand()
39
Oříznutí desetinné části čísla
.truncate
Převodní metody Převod čísla do zvolené číselné soustavy
Base_Convert()
Převod binárního čísla do desítkového
Bindec()
Zaokrouhlení desetinného čísla směrem nahoru
Ceil()
Převod desítkového čísla na binární
DecBin()
Převod desítkového čísla na hexadecimální
DecHex()
Převod desítkového čísla na osmičkové
DecOct()
Převod stupňů na radiány
Deg2Rad()
Prevod desítkového čísla na osmičkové
HexDec()
Prevod osmičkového čísla na desítkové
OctDec()
Prevod úhlu v radiánech na stupně
Rad2Deg()
(autor)
40