Javascript je velké zlo počítačového světa. Na tohle téma je ale spousta úvah jinde. Mě přijde na tomhle článku vtipné vyjádření "dělat z Javascriptu něco, co není". Vždyť na tom jsou postaveny všechny JS frameworky a MooTools zvlášť. Jeho základem je dodání syntaxe pro vytváření "opravdových" tříd, ve smyslu typovosti, dědičnosti aj. Je to celé na hlavu postavené: jazyk, jehož podstatou je pouze převádění identifikátorů na hodnoty, dostává dodatečné syntaktické prvky run-time. Nic proti MooTools, používal jsem ho a jsem s ním spokojen, ale nedávejme Javascriptu větší úlohu, než kterou zvládne, to za něj žádný framework nevyřeší. Je to dobré na nějaké pozlátko a odesílání Ajaxových requestů, s byznys logikou ale pryč z prohlížeče. GMail je hezký, ale zkuste si prohlédnout kód, na to mám své duševní zdraví moc rád.
Ano, obvykle jsou to uvahy od lidi, kteri nevi o co bezi. JS je skvely jazyk, podle me jeden z nejlepsich mainstreamovych jazyku. Co se tyce meho vyjadreni, samozrejme vim, ze MooTools vyrazne meni objektovy model JS, to ostatne zminuji. Myslim to tak, ze jQuery je spis takove nejake DSL, ktere si vsechno dela po svem, podle me divne ...
Chapu, ze se Ti byznys logika v prohlizeci nelibi, podle me je ale mozna budoucnost prave takova. Slysel jsi nekdy o SproutCore? Tak to je presne o tom. Rozdhodne JS, byt drive zatracovany, je jazykem (pritomnosti) a hlavne budoucnosti webu.
Kod Gmailu se mi nelibil, to ale neznamena, ze se to neda napsat hezky
ze je Javascript "skvely jazyk" tvrdi predevsim lide, kteri se jim profesne zabyvaji (treba az tak, ze je to jejich "jediny" jazyk) a IMHO neni moc moudre toto jejich tvrzeni nekriticky prejimat a takto o Javascriptu basnit
protoze pokud znas Ruby, nemuzes toto s vaznou tvari tvrdit - hlavne kdyz porovnas objektove modely obou techto jazyku. A i kdybys neporovnaval s Ruby..., co treba zpusob, jakym je v javascriptu implementovana dedicnost (ona tedy implementovana neni, takze se resi pomoci vice ci mene osklivych hacku)?
Ja si ale vazne myslim, ze je JS skvely, to neni prejaty nazor. Samozrejme JS ma sve problemy nektere i velmi zavazne. Ale to ma kazdy jazyk vcetne Ruby (rikam to dost nerad, ale je to tak)
V Javascripte dedicnost implementovana je. Nie je to vsak class-based dedicnost(ruby..), ale prototype-based http://en.wikipedia.org/wiki/Prototype-based_programming Rozne frameworky sa snazia simulovat class-based dedicnost, na ktoru je zvyknutych viac programatorov.
Vasu odpoved je mozne v prvom odseku obratit a prehodit slovicka Javascript a Ruby;)
Kazdemu vyhovuje nieco ine, mna tiez Javascript zo zaciatku pekne stval, ale zvykol som si. Ma totiz oproti inym jazykom, ktore pouzivam, niekolko zvlastnosti.
ano, mel jsem napsat, ze k l a s i c k a (tj. class-based) dedicnost neni implementovana. Nicmene s prototypal dedicnosti je tolik problemu (viz treba D. Crockford a jeho Javascript - The Good Parts; hlavne nepritomnost private properties a metod v objektovem modelu) plus implementace dedicnosti berouci v potaz 'private access' je tak oskliva a 'neergonomicka' (nemluve o dalsich implementacich), ze IMHO neni mozne javascriptovou prototypal a 'klasickou' class-based dedicnost stavit na roven. Ta javascriptova je proste osklivy hack a prave kvuli tomu se nektere frameworky snazi implementovat klasicky objektovy model, a prave kvuli tomu klasicky objektovy model implementuje i ECMAScript 4.
ja byl nejdrive javascriptem zhnusem, druha faze byla nadseni (po precteni Javascript - The Definitive Guide), a ted mam spise rekneme pragmaticky vztah k tomuto jazyku. Tzn. inklinuju k pouziti frameworku, ktery za me resi vsechny problemy javascriptu, vcetne nekompatibilnich implementaci v jednotlivych prohlizecich (presneji receno, problem se sabotovanim javascriptu Internet Explorerem).
na stranu druhou, i diky javascriptu jsem pochopil, jak funguji closures, ze funkce mohou byt 'first class objects' a jak je to uzitecne (a take jake problemy to zpusobuje, viz treba binding), a za to jsem mu docela vdecny...
"ano, mel jsem napsat, ze k l a s i c k a (tj. class-based) dedicnost neni implementovana. Nicmene s prototypal dedicnosti je tolik problemu (viz treba D. Crockford a jeho Javascript - The Good Parts; hlavne nepritomnost private properties a metod v objektovem modelu) plus implementace dedicnosti berouci v potaz 'private access' je tak oskliva a 'neergonomicka' (nemluve o dalsich implementacich), ze IMHO neni mozne javascriptovou prototypal a 'klasickou' class-based dedicnost stavit na roven. Ta javascriptova je proste osklivy hack a prave kvuli tomu se nektere frameworky snazi implementovat klasicky objektovy model, a prave kvuli tomu klasicky objektovy model implementuje i ECMAScript 4."
Žvaníte hovadiny. Podívejte se na Self-93, řekněte, že to je "ošklivý hack" a "neergonomické" a já se urazím. Ten model je geniálně jednoduchý a přitom nesmírně flexibilní. (JavaScript má ale bohužel Cčkoidní syntaxi, která toho hodně kazí.) Proto se možná taky v mainstreamu neujal, pojídači kávových koláčů by se cítili ztracení a to by se managorům nelíbilo. Jestli potřebujete vodit za ručičku, držte se maminky Javy.
celou dobu je rec o javascriptu - kontext je snad jasny kazdemu. Navic pisu o 'dedicnosti berouci v potaz private access' (a jak Self resi privatni 'sloty', jestli vubec, si ted bohuzel nevzpominam). Ovsem jestli chcete rypat, tak prosim :)
pojidaci kavovych kolacku jsou ze skoly 'odkojeni' ceckem a c++, takze pak prirozene sahaji po jave, ktera jim prijde 'intuitivnejsi' (pripadne jim rovnou zacinaji cpat javu).
"a jak Self resi privatni 'sloty', jestli vubec, si ted bohuzel nevzpominam"
Neřeší, protože v plně reflexivním systému nic takového jako "privátní" ve skutečnosti neexistuje (ani v Javě), takže nemá smysl si na to hrát. A co by to vůbec technicky přineslo? To už mi přijdou užitečnější packages ve stylu Common Lispu, těmi se aspoň dají řešit třeba konflikty identifikátorů, a metody a funkce neurčené k "veřejné spotřebě" mohou ukrýt celkem citlivě, aniž by tak činily násilně (a přesto neúčinně, jak názorně ukazuje Java). A ještě v něčem si rejpnu:
"' a jak je to uzitecne (a take jake problemy to zpusobuje, viz treba binding), "
...a jaké problémy konkrétně? S closures a lexikálním scopingem žádné problémy nejsou už nějakých třicet let, od doby, co Guy Steele a Gerald Sussman publikovali Lambda Papers, kde celé téma systematicky rozpitvali kousek po kousku. Leda že by JavaScript měl ohledně těchto věcí nějaká specifika, která ale můžou být způsobena nanejvýš špatnou implementací nebo snahou o "invenci" (ostudným příkladem snahy o "invenci" je třeba paskvil jménem newLISP), ale se samotnými koncepty asi těžko. S těmi mohou mít problémy nanejvýš programátoři-lidé.
tim bindingem je mysleno na co 'this' ukazuje za behu programu - tedy this uvnitr definice funkce, a ten problem nastava, pokud takovou funkci predavam jako argument jinemu kodu (resp. referenci na ni), tak na co pak to 'this' ukazuje - takovou funkci je nejdrive nutno navazat na ten spravny objekt, na ktery pak 'this' ukazuje (takze z funkce je stava metoda, ktera ma pres 'this' pristup k ostatnim metodam a instance promennym objektu). Jinak 'this' ukazuje na globalni objekt, kterym je window. (ukazuje nikoliv ve smyslu ceckovskeho pointeru, ale reference)
to je problem, ktery prave resi javascritove frameworky, ktere rozsiruji prototype
cili nebyl myslen binding ve smyslu lexikalniho scope, tak jak je pouzivan treba v Ruby (kdy je napriklad treba, aby si promenne pouzite v sablone udrzely binding na scope, ve kterem byly inicializovany)
doufam, ze jsem to napsal srozumitelne (cesky to moc neumim)
Self moc neznam, ale s tou reflexivnosti to dava docela smysl (viz treba i metoda instance_variable_set v Ruby)
Kod gmailu je tak spraseny z dovodu generovania z javovskeho kodu prevodnikom, ktory je dielom googlu. JS frameworky a smer vyvoju jazyka pridavaju vacsinou iba metody pre lepsiu a efektivnejsiu pracu s gui(DOM, atd.), ktore je aj pre tenkeho klienta rozhodujuce. V diskusii uz spomenute Array.each je jednoriadkova zalezitost, ktora pokial je to nativna funkcia je rozhodne rychlejsie spracovana ako funkcia s rovnakou funkcnostou v JS alebo v najekom frameworku, kde je aj tak implementovana v JS.
tak gmail je zrovna spatnej priklad - je napsanej v jave a pak se z toho teprve vygeneruje javascript + html (GWT), tudiz ten hnusnej psycho kod je chtenej vysledek ;)
Problem javascript-u su ludia, ktori to nadrbu vsade a bez JS stranka proste nepojde, ani sa len neukaze homepage. Ano existuju pripady, ked JS ma odpostatnenie, ale ako sem-tam narazim na niektore stranky, tak mi to skor pripde, ze autor bol rad ze to nejako splacal v JS a bol rad, ze sa mu ta stranka nejak preloadne, alebo sa nacita nejaky frame.
ktory nam s hrdostou nasadali v praci, ale ked sa do toho systemu prihlasim, tak to vygeneruje asi 10 (slovom desat) redirectov, kym to konecne kdesi skonci na homepage..
mam skor pocit ze JS skor zlaka ludi robit skarede veci
Ale když se to vezme kolem a kolem, není to vlastně jedno? JS je turingovsky kompletní programovací jazyk a pokud v něčem nevyhovuje (každý projekt má jiné požadavky a lidé rádi pro konkrétní problémy vybírají konkrétní tooly), není problém v něm napsat interpreter nebo i překladač (do rozumného bytekódu) něčeho lepšího.
Sice to povede ke zpomalení běhu, na druhou stranu to může zmenšit množství přenášeného kódu. Prostě JS je v oblasti prohlížečů základ, na kterém se dá stavět více způsoby: buď ho používat přímo, nechat si ulehčit práci pomocí nějakého "sexy" frameworku :-), nebo použít další vrstvu ve formě jiného programovacího jazyka.
Musim rict, ze na argument "turingovsky kompletni" jsem docela alergicky. Taky bychom mohli programovat v assemlberu, taky je turingovsky kompletni, ale kdo to dneska dela ;) ? Jinak JS mi prijde jako velmi prijemny jazyk, ale to uz jsem tady rikal ...
on taky i prijemny je :) kazdy dobry programator musi vedet ze js je na skriptovani ve webrobseri jak delany. az na ten divny objektovy model(dedeni od prototypu), ale proto ze je tak zvlastny tak je zaujimavy :)