Nedá mi to a stále se musím zeptat - proč to neřeší přímo jazyk? Proč jazyk vzniklý relativně pozdě nemá Unicode už v jazyce? A proč to musí řešit "spousty" knihoven, když už to dávno mohl jednou provždy vyřešit sám jazyk?
A kvůli tomu má celý svět trpět? Prostě já považuji jazyk bez Unicode v jazyce za nedodělaný a s významným mínusem. Je sice hezké, že článek se snaží obhájit to, že je to vlastně ok, ale je to jen political corectness tvrzení, česky z nouze ctnost.
Protože je to blbost? :-) Vezměte si třeba Common Lisp. Ten standard, pravda, vznikal dlouho (Common Lisp byl jako první objektový jazyk standardizován v roce 1994 ;-)), ale první kniha (tzv. CLtL 1) vyšla v roce 1984. Tehdy o nějakém Unicode nebylo ani vidu, ani slechu. Nicméně CL počítal s tím, že třebas i různé počítače mohou používat různé znakové sady a kódování, třeba EBCDIC (některé stroje nemají ani ASCII!) a tak. Takže je definován typ BASE-CHAR plus mechanismy pro zavedení prakticky čehokoli. Takže pozdější implementace přejaly Unicode víceméně stejným způsobem jako jakoukoli jinou znakovou sadu, se kterou se byly nuceny poprat.
Ano a Céčko dodnes počítá se situací, že by byte nemusel mít 8 bitů, když jsme u toho třeba. Ale to jsme v počítačovém pravěku - a uznejte, že Lisp vznikl o chlopek před Ruby i mnoha dalšími jazyky, a že v době vzniku Ruby už Unicode jelo na plné pecky.
Čistě logicky je naprosto zbytečné, aby jazyk obsahoval třeba čísla jako součást jazyka. Je to naprosto zbytečné, operaci s čísly jdou nasimulovat pomocí knihovny jako práci s řetězci, ve kterých Ty čísla zapisujete. Je naprosto zbytečné, aby třeba Ruby mělo čísla a práci s čísly přímo v jazyce.
No, když to umí pracovat s (například) utf-8 řetězci, tak to není vůbec špatné. Takhle to má standardně celé GNOME, takže odpadá konvertování do UTF-16 (Java, Python). Nefunguje krájení řetězců a upcase, ale to zas tak často potřeba není, a řešení externí knihovnou je snesitelné.
Ja se to nesnasim obhajit, pouze konstatuji, ze kdyz unicode potrebujete, mate pomerne slusnou moznost. Co se tyce nepodpory jazyka, o tom bude rec priste. Ruby 1.9.1 unicode podporovat ma, jak jsem se ostatne jiz nekolikrat zminil.
Stejne jako neexistuje dokonala zenska, tak neexistuje ani dokonaly programovaci jazyk.
Osobne se mi ruby velmi libi, ale ta podpora unicode, na kterou jsem zvykly z pythonu mi proste chybi.
Ale naopak kdyz zas delam v pythonu, tak si rikam ze by se hodili nektere vychytavky z ruby.
Ty jazyky se porad vyviji a v ruby2 ma byt snad nativni podpora unicode, stejne jak jako python2.6 ma nektere kontrukty, ktere drivejsi python nemel i kdyz v ruby byly bezne.
To je dokonaly programovaci jazyk? i s dokonalym vyvojovym prostredim?
- jinom pripojis mikrofon a reknes "vytvor program na predpoved pocasi",
on odpovi "Pracuji .... hotovo .... ulozeno do ...."
- nebo rovnou cte myslenky a nemusis na nej ani mluvit?;)
To sice ne, ale má dokonalého autora. :-) Ten jako by četl myšlenky v tom směru, co programátor ve Scheme může potřebovat. :-) Každý jazyk by povinně měl mít kvalitní základní knihovnu kombinátorů a funkcí vyššího řádu a tenhle ji má. ;-)
Ruby je asi tak stejně starý jazyk jako PHP a taky je na tom s podporou Unicode podobně :-) I když samozřejmě PHP bude mít Unicode dřív (otázka je v jaké podobě, vyvojáři PHP jsou experti v tom zvrzat co jde - no flame please).
Že to jazyk neřeší je smůla, ale asi takhle - pro drtivou většinu vývojářů platí Ruby = Ruby on Rails. A pochybuji že by se našel jediný, který by Rails opustil kvůli potřebě psát navíc .chars :-)
Jenže PHP nevznikl jako jazyk, byla to jen sada podpůrných skriptů pro weby, která se čistě náhodou rozrostla svojí popularitou a používaností do současného stavu. Je jasné, že PHP prostě nikdo moc nepromýšlel, je to něco co přerostlo věškerá očekávání.
Ale Ruby měl být promyšlený jazyk, a jako takový nepodporu Unicode považuji za zhůvěřilost. Dnes kam kouknu, i na hodně staré jazyky, tak Unicode přímo v jazyce podporují. Podporuje to C++, podporuje to Java, podporuje to C#, podporuje to leccos.
Tohle se dá říct o čemkoliv, Ruby bylo většinu své existence taky jenom zábavou pro pár Japonců, než to David Heinemeier Hansson použil pro Rails. Vzato kol a kolem éra popularity Ruby (která v ČR vlastně ani nezačala a je otázkou, jestli vůbec bude) je mnohem kratší, než éra popularity PHP.
Ale jak jsem psal - neomlouvám absenci Unicode přímo v jazyku, jenom to nepovažuju za zhůvěřilost. Workaround existuje (a velice kvalitní), takže se dál můžu věnovat vývoji webů v mém oblíbeném frameworku. Můj pohled na to je čistě pragmatický: plusy převažují, s mínusy se musím nějak smířit :-)
1) Ruby bylo OD ZAČÁTKU stvořeno jako programovací jazyk.
2) PHP bylo NA ZAČÁTKU stvořeno jen jako pomocná sada skriptů pro vyřešení webových stránek.
Tudíž u PHP lze celkem pochopit, proč je kde je, protože za tím nestála snaha stvořit programovací jazyk a lepilo se co se dalo. Ale Matz od začátku zamýšlel stvořit programovací jazyk - objektový (jak píše "genuine object-oriented"), s výjimkami, garbage collectorem a iterátory. Tudíž prostě nechápu nepromyšlenost jazyka, pokud je to od začátku navrhnováno jako jazyk - a nedořešenost řetězců v absenci Unicode prostě beru za velmi velmi výrazný nedostatek.
Já absenci Unicode považuji za výrazný nedostatek. Tím samozřejmě neříkám, že by všichni měli Ruby odepsat, ale to byl třeba kdysi důvod, proč jsem odmítl v Ruby pracovat, řešení na základě emulace v UTF-8 (což je dobrý vstupně výstupní formát, ale nikoli na zpracování řetězců uvnitř programu) nepovažuji za nic jiného, než dočasné nouzové řešení, stejně tak jako emulace knihovnou.
Samozřejmě neexistuje žádný programovací jazyk, který by nějaké mínusy neměl. Jen je hloupé vědomě ty mínusy zavádět už od počátku do jazyka. Jinak samozřejmě používejte Ruby ostošest, má spoustu pěkných vlastností.
Možná bych to celé zkrátil, kdybych odpověděl na tu otázku "Proč se škrábat levou rukou za pravým uchem?" - "Protože nám to nevadí". A vlastně nebýt tvého příspěvku, tak mě ani nenapadne nad tím přemýšlet :-)
Jako sled bajtů v UTF-8, stejně jako v Javě je to sled shortintů v UTF-16, ne? ;-) A nad tím už jsou knihovny, a ty jsou na jazyku (kde _jazyk_ považujeme za _gramatiku_) poměrně nezávislé, řekl bych.
Původní myšlenka Javy byla mít sled znaků - a s tím také řetězce implementovala. Ale Javovská třída java.lang.String ví, že se jedná o Unicode řetězec, je to přímá součást jazyka, a ví o jednotlivých znacích. A že je to součást jazyka lze doložit tím, že Java umí literály typu Unicode string, umí dělat optimalizaci nad stringy jako součást jazyka, které naprosto přesahují běžný arzenál tříd a podporuje operace, které s jinými třídami, ani knihovnami nenaprogramujete.
Ruby když pracuje s řetězci, tak jazyk sám NEVÍ, kde má jednotlivé znaky, musí mu to naznačit programátor. Tudíž Ruby práci s Unicode řetězci jen imituje, ale nic o nich samotný jazyk neví.
1) Ruby nepotřebuje rozumnět interpretaci datových typů. Ostatně v Ruby jednoduše udělate nové datové typy, jejichž interpretaci jazyk ani nemůže mít, jelikož si ji vymyslíte. Interpretace je ponechána na metodách, které s daty objektu zacházejí. Této vlastnosti se říká jak? ... Správně - zapouzdření.
2) Pokud je mi známo, tak v ruby neexistuje třída, kterou byste nemohl plně přepsat (ať už v ruby samotném nebo jako binární knihovnu). Pokud jazyk takové "nadtřídy" obsahuje, ptám se logicky, co je to za nadvlastnosti, k čemu je daná nadtřída používá a proč k nim nemám přístup já jako programátor.
Jak víte, ve kterém jazyce programuji? Já to nikde nezvěřejňuji. Navíc za svých 18 let praxe jsem těch jazyků zažil podstatně víc. Každý jazyk, i plně objektový potřebuje literály základních datových typů.
Nebavím se o různém kódování, bavím se o literálu, který reprezentuje Unicode řetězec, jazyk o něm jasně bude vědět, že je to Unicode řetězec a bude s ním jako takovým zacházet.
Jinak přestávám reagovat - jsou tu rozumnější lidé, kteří vědí, že Unicode řetězce do jazyka patří - a že absence těchto v jazyku je obrovské mínus. Nemám nic proti Ruby, je to dobrý jazyk, ale klidně přiznám, že jako takový má tuhle chybu. Tečka. Howgh.
Ale jistě, že se bavíme o různém kódování. Pokud chápete "žluťoučký" v unicode a v latin2 nebo cp1250 jako jiné texty, tak je něco špatně. To snad chápate číslo v hexa literálu jako jiné číslo než jeho implicitní dekadický zápis? V jazyku, který není plně objektový musí určitě interpretaci do určité míry zajistit jazyk sám, ale v Ruby toto zajišťují metody samotných objektů.
Být rozumný znamená pro vás chápat potřebu Unicode literálu? Kdo to nechápe není rozumný? Hmm.
Ještě bych chtěl dodat, že mým cílem tu není dokazovat, že C++ je lepší jazyk, než Ruby - to pouze pan Martin zvolil útočný tón a zaútočil.
Jediné, co tu píšu je, že dnes nechápu jazyk bez podpory Unicode přímo v jazyce. A už vůbec nechápu snahu tuhle koncepci obhájit. Mě kdyby v mém oblíbeném programovacím jazyce (záměrně nepíšu který to je, protože to je pro tuto diskusi nepodstatné) chyběly v jazyce Unicode řetězce, tak se nehádám a rovnou to označím za hrubou chybu jazyka.
V RoR pouzivam kniznicu ActiveSupport::Multibyte pre podporu UTF-8 avsak pokial viem aj ona ma niekolko zadrhelov. Napriklad tusim, ze nepodporuje regularne vyrazy v kodovani UTF-8, to znamena, ze ak chcem porovnavat nejake retazce v tomto kodovani, tak jednoducho neuspejem. Vedel by mi niekto povedat, ci je nejakym sposobom mozne dosiahnut aj podporu UTF-8 v regularnych vyrazoch?