Programuji hlavne v Perlu a souhlasim s tim, ze jeho navrh je dost hrozny (proste to neni jazyk, ktery by si clovek predstavil pod vetou "fakt dobre vymyslena vec", ale spis pod vetou "fakt silna vec"). Zkousel jsem take Python a i kdyz je cistsi, chybi mu sila nekterych Perlovskych konstrukci (zaroven ma nektere veci taky docela pres koleno). Jazyk, ktery mne opravdu uchvatil, ktery ma silu Perlu (spise vetsi) a ktery jsem si vysnil jiz pred nekolika lety je Ruby na adrese http://www.ruby-lang.org/.
Nechci se tady bavit o tom, co je lepsi a co je horsi - kazdy jazyk ma svoje vyhody a nevyhody a kazdy se hodi na neco jineho.
Uz je to davno, co jsem studoval dokumentaci, ale vzpominam si, ze mi vadily napriklad nasledujici veci (neberte to jako kritiku Pythonu, proti jinym jazykum je Python porad bomba):
- nektere datove typy nejsou ciste objekty (numerical, list, dictionary, string, ...) a clovek musi hledat funkce, ktere s nimi pracuji po vsech certech (stejne jako v Perlu)
- nema (nemel) class metody
- tuple a list maji prekryvajici se funkcnost (proc to neni reseno jednim typem???)
- prilis se mi nelibily moduly, ktere python obsahoval
Kdyz uz tu delam tu reklamu na Rubyho, tak se mrknete na
http://www.hypermetrics.com/ruby37.html a
http://www.rubycentral.com/book/ a taky stoji za to kouknout se do zdrojaku (slintal jsem blahem :). Taky si myslim, ze pro zpracovani textu je silnejsi nez Perl (ale o neco pomalejsi). Mrknete se na metody objektu String, Array, File a dalsich.
Musím se připojit: Ruby je skutečně geniální a potěší programátora/estéta.
Ještě reakce na pár dalších poznámek v komentářích: jen namátkou jsem zapátral a na http://www.xs4all.nl/~hipster/lib/ruby/httpd je zdroják web serveru v Ruby (už poměrně slušného).
Dále tady někdo psal, že PHP je hezký jazyk. Myslím, že PHP sice je hezké, ale s mírnou nadsázkou bych ho spíš označil za plný pytel knihoven než za jazyk.
Ja mam Python taky rad a mam pocit, ze jeho navrh je docela cisty a kdyz porovnam treba verzi 2.2 s 1.52, tak vidim, jak se Python rozviji. Konstrukce typu s/mrkev/petrzel/ jsou jiste silne, ale v jazycich pro vseobecne pouziti je nepotrebuji. Ruby me docela zajima, bylo by mozne o nem napsat nejaky clanek, kde byste jej porovnal treba s tim Pythonem?
Uvazoval jsem o tom, ale nejspis by to byla serie clanku pro uplne zacatecniky v programovani. Srovnavani by zbytecne popudilo spoustu lidi a melo by vliv pouze na ty, kteri jdou po kvalite misto kvantite (viz. napr prispevek o CPANu) - tech ani kolem Linuxu neni tolik, jak jsem si drive myslel. Kazdopadne by temto nekolika jedincum melo stacit precist si dokumenty na vyse uvedenych adresach :-).
To cim mluvis (cestina) je taky splacanina bez cistyho navrhu. Chtel bys radsi pouzivat nejakej krasnej cistej ortogonalni jazyk?
Programovaci jazyk neni (nema byt) jazyk vytvoreny pro pocitac, ale pro programatora. Tudiz by mel v ramci moznosti dovolovat aby se programator vyjadroval tak jak mysli. A ne nutit ho myslet jak jak je jedine mozne se vyjadrit. A prave proto, ze kazdy programator mysli trochu jinak tak Perl nabizi vdycky nekolik moznosti jak kod napsat. A nenuti ti tu jedinou spravnou.
A krom toho ... co vsechno ti sezere se da omezit. A to prave natolik jak si TY reknes. Jak kdosi rekl ... Bondage&discipline must be consensual, otherwise it's a rape.
Vypada to celkem nadejne. Uz soucasna stabilni verze perlu se da skompilovat s podporou "interpreter thread"u (coz na rozdil od predchozi implementace NEZPOMALUJE chod programu ktere je nepouziji!). Napriklad ActivePerl distribuce je podporuje.
Jsou sice zatim malinko "experimentalni", nektere moduly je nemaji rady vubec a nektere se musi ukecavat ale pouzit uz se daji. (viz http://jenda.krynicky.cz/iThreads.html )
Napsal jsem si napriklad skriptik na stahovani obrazku ze skupin na yahoogroups. 11 threadu a uz to jede ;-)
V 5.8 uz by mely byt mnohem stabilnejsi a postupne i ty dulezitejsi moduly budou upraveny aby byly threadsafe.
Hash neni pochopitelne implementovan B-stromem ale hash tabulkou. Pomoci hashovaci fce se klice mapuji pokud mozno rovnomerne na indexy tabulky. Pokud je index obsazen, uklada se v pripade Perlu klic do pripojene kapsy. Ty maji definovanou maximalni velikost a pokud nektera pretece, definuje se nova tabulka dvojnasobne velikosti a udaje se prekonvertuji. (Tim je resena dynamicka hash tabulka).
Pri hledani se pouzije tataz hashovaci fce, ktera vrati index kapsy. Z toho je patrne, proc se u hashe nelze ptat na predchozi nebo nasledujici klic z hlediska trideni.
Jeste jedna poznamka:
V patem priklade je trochu matouci poznamka "skalaar zustane nezmenen. Ma byt uvedena promenna $skalar, protoze i $a[3] je skalar (skalarni promenna). To mate.
K Billovi:
Co je komu do toho, ze nemas rad Perl. Ja treba nesnasim Billa a taky to nikde nevyrvavam. Nemel bys radeji navstivit svyho psychoanalytika?
Proc se na kazdy clanek o celeru ozve kupa lidi, ze maji radsi petrzel? Nemam nic proti PHP,Pythonu ani Ruby ale tento clanek snad byl o Perlu ne?
Perl je zajimavy tim, ze umoznuje psat i velmi obecne programy. Kolik je napr. jazyku, ktere dovoli ulozit do pole promenne ruznych typu i delek! To proto, ze v Perlu je pole polem odkazu, nikoliv hodnot. Pak ovsem dvojrozmerne pole musi byt psano jako pole poli a to ma vliv na syntaxi - kazdy index ma sve zavorky.A ti co nepremysleji, zacnou nadavat!
Perl prinesl do jazyku tolik novych napadu, kolik tu od Algolu nebylo. A ty ho preziji. Apropo - je Ruby prenositelne?
1) Moznost ulozit do pole cokoli nemusi byt vzdycky vyhoda. Pokud ma jazyk dobrou typovou kontrolu tak je to vyhoda (ne C(++) ani Java pouzitelny typove systemy nema!).
2) Dvrourozmerna pole se daji delat i takhle :
$arr{$i,$j} = $hodnota;
(Ve skutecnosti se jedna o hash indexovany $i.$;.$j)
Samozrejme v tomhle pripade si nekam musite ulozit maximalni indexy (klidne do toho sameho hashe) a prochazet ho prez
for(my $i=0;$i
Proc se na kazdy clanek o celeru ozve kupa lidi, ze maji radsi petrzel? Nemam nic proti PHP,Pythonu ani Ruby ale tento clanek snad byl o Perlu ne?
Perl je zajimavy tim, ze umoznuje psat i velmi obecne programy. Kolik je napr. jazyku, ktere dovoli ulozit do pole promenne ruznych typu i delek! To proto, ze v Perlu je pole polem odkazu, nikoliv hodnot. Pak ovsem dvojrozmerne pole musi byt psano jako pole poli a to ma vliv na syntaxi - kazdy index ma sve zavorky.A ti co nepremysleji, zacnou nadavat!
Perl prinesl do jazyku tolik novych napadu, kolik tu od Algolu nebylo. A ty ho preziji. Apropo - je Ruby prenositelne?
Nejen UNIX !!!
Existuje spousta modulu na administraci a ovladani programu ve Windows, muzete ovladat programy prez OLE i DDE, pouzivat COM objekty, dokonce vytvaret COM objekty, vytvaret services (skutecne, ne jen prez srvany.exe!), vytvaret ze skriptu exace ktere funguji i tam kde Perl neni nainstalovan atd. atp. ;-)
A prakticky vsechno zadara (krome vytvareni exacu a COMu).
Jenda
"Perl umožňuje vytvářet prakticky jakkoli velká pole a hashe" - me vzdycky lehnul, kdyz uz nemel fyzickou pamet, swap ho vubec nezajimal (ale je mozny, ze mam starou verzi:)) ale zatim mi staci.
Taky je skvely, jak jednoduse se da v perlu vytvorit program na tisk prvocisel (projdete si sami a jasejte nad jednoduchosti a silou perlu):
== perl -le '$_ = 1; (1 x $_) !~ /^(11+)\1+$/ && print while $_++' ==
at zije perl :-) muj prvni programovaci jazyk ktery jsem se naucil.... och ta nostalgie - PRAVE kvuli
tomu ze to po me nechtelo nic presne a presno to chapalo co ze to po nem chci... Ale stejne si ted uz jedu s use strict, ale takovydle silenosti nepouzivam
rad bych vedel co jto dela presne :-) kazda carka tady ty
podminko scitaci/odcitaci cyklujici zaroven tisknouci "ein radky" mi delaji trochu problem...
"rad bych vedel co jto dela presne" - taky jsem nad tim dlouho premyslel, ale kdyz jsem to pak pochopil, tak je to hrozne jednoduche. Funguje to tak, ze se vytvori retezec o X znacich (kde X je zkoumane cislo). Pak se zkusi v tomhle retezci znaku najit regularni vyraz /^(11+)\1+$/, kterej znamena "najit dva nebo vice znaku, to cele dva a vicekrat za sebou, v celem retezci" (prakticky A krat B znaku, kde A,B>=2) a pokud se tenhle vzor nenajde (cili neni slozeny z A krat B znaku), tak to cislo je prvocislo a vytiskne se:))
Hehe:))) No, je to jenom TIMTOWTDI (ja osobne to pisu takhle:)) Proc nevyuzit moznosti jazyka:)) Predstavte si umet Perl na soutez v programovani, kde jeden z ukolu je naprogramovat program, ktery zjisti, jestli zadane cislo je prvocilo (v rozumnych mezich samozrejme):
----
print "Zadej cislo: ";
$a=<>;chomp $a;$b="X" x $a;
print "Cislo $a " . ($b !~ /^(XX+)\1+$/)?"je":"neni") . " prvocislo\n";
----
Provuch co je Perlu do swapu? To je starost operacniho systemu!
Kazdopadni ... pokud mas tak velky hashe nebo pole, ze ti zacina swapovat disk tak je lepsi ten hash ulozit na disk prez nejakou DBM knihovnu. Treba DB_File (Berklery DB). Obvykle je to mnohem rychlejsi nez kdyz budes nutit system ktery nic netusi o tvych datech aby ukladal a nacital kusy pameti.
A jedina zmena v programu je v tom miste kde vyrabis ten hash/pole.
Pripajam sa k tym, co tvrdia ze nema zmysel porovnavat rozne jazyky. Kazdy jazyk je na nieco. Robim v Perli intenzivnejsie asi pol roka a vdaka nemu som poxopil aj niektore konstrukcie C a OOP. Samozrejme by som si trebars Perl nepustil k jadru, ale nepoznam nic lepsie na CGI, pracu s Reg. vyrazmi ci DB. Fantasticka na Perli je praca s modulmi atd. atd.
IMHO by bolo najlepsie, keby sa na strednych skolach prestal ucit Pascal (v sucasnosti dost pateticky) a zacal sa ucit Perl. Ako som napisal, prechod na C je potom jednoduchsi.