Přejít k navigační liště

Zdroják » JavaScript » Typické! O maďarské konferenci mloc.js a statickém typování při vývoji webových aplikací

Typické! O maďarské konferenci mloc.js a statickém typování při vývoji webových aplikací

To je tak typické! Ptáte se co? Že po mnoha letech alibistického ujišťování se, že statické typování v JavaScriptu není vlastně nutné, že lze vše pokrýt testy, se najednou jak houby po dešti rodí desítky projektů, jichž hlavním smyslem je přivést do vývoje webových aplikací statické typování. Záměrně píšu webové aplikace a ne javascriptové, protože to co se děje, už se netýká jen JavaScriptu.

Co to je statické typování?

Ti, co vědí, mohou odstavec přeskočit a pro ty, co nevědí, jen lehký úvod. Statické typování je to, čím se liší skriptování od programování. Bez typů je kód jen hloupou sadou příkazů, bez soudržnosti a vnitřní logiky. Bez typů vidí počítač náš program asi takhle:

function foo(a, b, c) {
  a.???
}

Co je to a? Je to metoda nebo hodnota? Můžu na tom volat co? Nevíme. Kód bez typů je pouze interpretovaný text. Proč na tom záleží? Chceme-li do HTML stránky přidat Lightbox, typy nejsou nutné. Přidám Lightbox, reloadnu prohlížeč, a hned vidím, jestli vše funguje nebo ne. To ovšem už neplatí pro autora Lightboxu. Ten by byl naopak moc rád, kdyby po každé změně nemusel celou svou miniappku ručně proklikávat.

Ano už to slyším: „Na co máme testy? V ideálním růžovo-poníkatém světě máme přeci vše krásně otestované.“ Ano máme. A teď mi ukaž svou poslední aplikaci, a projdeme si, jaké testy v ní jsou. Tohle je na samostatný článek (napíšu později), takže to uzavřu historkou. Zrovna minulý týden jsem se bavil s programátorem, který rok pracoval na projektu, co rok předtím psal jeden nejmenovaný, teoreticky velmi vzdělaný, OOP, TDD atd. purista a dogmatik. Nešlo o nic složitého, prostě backend pro ukládání pár modelů. Po roce a více vývoje v produkci skoro nepoužitelné. Spousta bugů, mizerný výkon, špatná architektura. Ale unit testů tam bylo nekonečně. Jen neodhalily žádnou skutečnou chybu. Prostě tam jen tak tlely a zdržovaly při refaktorování.

Testy jsou must have pro knihovny určené k dalšímu použití. Stabilizují API, poskytují dokumentaci k použití. Aplikace je málokdy určená ke znovupoužití. Psát aplikaci tak, aby se od začátku dalo testovat a skutečně testovalo vše, skoro nikdo neumí. Napsat, že metoda getUser vrací typ app.user.Model, a že name je typu string, umí každý. Je tedy zřejmé, že unit testy statické typování nenahradí.

Mloc.js

Prostory, ve kterých se velmi příjemně organizovaná konference konala.

m-loc.js konference

Tohle vše si uvědomila firma prezi.com, a rozhodla se uspořádat zajímavou konferenci zasvěcenou statickému typování pro vývoj webových aplikací. Já jsem byl pozván na krátký lightening talk. Na větší přednášku už nezbyl prostor, takže pokud se chystáte jet někam přednášet, raději svůj talk navrhněte co nejdříve. Hlavní produkt Prezi je napsán v technologii Flash, což je pomalu, ale jistě odumírající platforma. Proto se vývojáři Prezi rozhlížejí po alternativách. A že jich je, když se podíváte na program konference.

Naprostá většina přístupů se řídí stejným principem: Když už jeden staticky kompilovaný jazyk máme, proč bychom to nemohli udělat tak, aby se kompiloval i do JavaScriptu? Takže jsme viděli C#, Scalu, Haxe, Dart a další jazyky kompilované do JavaScriptu. Šmahem je všechny odsuzuji jako akademické, a jen málo použitelné leaky abstraction projekty. Tedy krom Dartu, který je od začátku pro web (nejen) zamýšlen. Pak také izraelský sharpkit.net mne ohromil svou pragmatičností a kvalitou, avšak obávám se, že s pozvolným příchodem www.typescriptlang.org, raison d’etre SharpKitu pomine.

Jmenuji se Daniel Steigerwald a pomáhám firmám i jednotlivcům s vývojem webových aplikací. Pořádám školení, která si můžete objednat na javascript-skoleni.cz. Pokud máte dotazy, napište mi.

Jaké projekty považuji za reálné a proč

O Google Closure Tools jsem se zmínil zde zmínil několikrát. Je to dnes jediná ready to production technologie. Což však už nemusí platit za rok.

Dart

Dart se kvapem vyvíjí. Ale má jeden problém. Není to JavaScript = neseženete na něj lidi. A to se hned tak nezmění. Kdybych měl vlastní firmu, s oddaným nefluktuačním týmem horlivým se učit nové věci, a nechtěl reuse existujícího javascriptového kódu, stál by Dart za zvážení.

TypeScript

TypeScript. Microsoft se probudil, a konečně vytvořil zajímavou a užitečnou technologii, která udeřila přesně hřebíček na hlavičku. Problém: Ohromná spousta již napsaného netypového kódu. Řešení: Dodat všem typy adhoc, viz. například github.com/borisyankov/DefinitelyTyped.

TypeScript není nový jazyk. Je to evoluční vylepšení JavaScriptu, se všemi jeho libůstkami. Přesně to, co svět potřeboval. Typy a progres směrem k ECMAScript 6, použitelné už dnes.

CoffeeScript

Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť typy nemá? Nemá, ale ve spojení s typovými anotacemi Closure Compileru, tedy tak jak ho já používám v github.com/Steida/este, typy má. A ve velmi blízké budoucnosti jej čekají příjemné novinky. CoffeeScript 2 je překvapivě na první pohled identický s CoffeeScriptem 1.x Ty podstatné změny se odehrály uvnitř. Jeremy Ashkenas, autor CoffeeScriptu jej navrhl… ne zcela ideálně architektonicky, což zapříčinilo ne zcela jednoduché rozšiřování jazyka. Proto vznikl CoffeeScript 2, který napsal a navrhnul spoluautor předchozí verze. Peníze získal přes kickstarter.com. A výsledek se velmi povedl. Lepší je vše. Error reporting, parsování, AST stromy, změny jazyka, spolehlivost a další.

Závěr

Dart je nový vesmír IMHO se šancí zabít Javu na Androidu. TypeScript je starý dobrý vesmír, který známe, mírný progres v mezích zákona s opravdu chytře přidaným statickým typováním. Něco, na co bych babičku znalou JavaScriptu dokázal přeučit. A CoffeeScript? Velmi si slibuji od projektu https://github.com/michaelficarra/coffee-of-my-dreams. Do toho se Michael pustí hned, jak dokončí přepis CoffeeScriptu, a bude to bomba. Jak tedy vidíte, pro každého něco, a tak to má být.

Komentáře

Subscribe
Upozornit na
guest
42 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Martin Kozák

„Statické typování je to, čím se liší skriptování od programování. Bez typů je kód jen hloupou sadou příkazů, bez soudržnosti a vnitřní logiky.“

Uff, to má být co? Já si vždycky myslel, že Zdroják je určen programátorům. Věta, že statické typování je to, co odlišuje skriptování od programování rozvinutá o hlubokomyslnou úvahu, že bez typů je kód sadou příkazů bez vnitřní logiky je pravděpodobně perlou tohoto měsíce na úrovni tvrzení, že motorista je pouze řidič automobilu protože motorkáři jezdí pouze na dvou kolech.

Jsem příznivcem toho, o čem autor píše a domnívám se, že typování je budoucnost JavaScriptu a tím i webu, ale autor je buď typový fanatik, nic o programování neví nebo se zbláznil.

Martin Hassman

Přidávám možnost, že jste třeba autorovi špatně (resp. nepřesně) porozuměl.

Martin Kozák

Máte pravdu. Bylo celkem pozdě v noci a dost mě to vyděsilo. Člověk POV v téhle úrovni přeci jen očekává spíše na soukromém blogu než na Zdrojáku.

Martin Hassman

Texty přinášející osobní názor vycházely na Zdrojáku odjakživa. Raději si zvykněte 8-)

blizz

1. „Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť typy nemá? Nemá, ale ve spojení s typovými anotacemi Closure Compileru, tedy tak jak ho já používám v github.com/Steida/este, typy má.“

JS( a dlasie jeho syntakticke nadstavby) predsa typy maju.

Je rozdiel medzi
2 + 2; // 4
„2“ + 2; // „22“

operator „+“ s kazdym typom pracuje odlisne.

2. skryptovat sa da velmi pekne aj v silne (a staticky) typovych jazykoch (ako trebars F#) podla autora, ale asi F# nema typy lebo ich explicitne nemusi anotovat.

BoneFlute

Rozdíl mezi výrazem silně typované, a staticky typované.
Když by to napsal (třeba) „Můj milovaný CoffeeScript. Jak se zde ocitl, vždyť staticky typovaný není? …“, tak by to prostě nebylo tak hezké vyjádření :-)

Martin Kozák

A snad ještě dodám: vnitřní logiku dává kódu leccos, ale typování to opravdu není. Naschvál, kolik lidí překvapí, že tím hlavním činitelem je v tomto procesu především programátor. S blbým kódem od neschopného autora testy neudělají vůbec nic i kdyby se jich upsal a s typy to je dost podobné. Velkých teoretiků, co produkují blbý kód je mimochodem docela dost. Nemluvě o tom, že nebýt dynamicky typovaných jazyků, museli bychom si je vymyslet protože nevznikly pro nic za nic. Psát webové aplikace v Javě (dosaďte si případně svůj oblíbený typový jazyk), nejspíš by se kupříkladu skoro nikdo nedoplatil. Ostatně typované jazyky vznikly zhusta mimo jiné proto, že kompiler potřeboval při tehdejší výkonosti techniky vědět s jakýmiže daty má tu čest.

A hádejme, co se dnes uvnitř kompilerů dynamicky typovaných jazyků děje. Ano, překvapivě si kompiler udržuje informaci o tom, jaký typ jaká proměnná obsahuje a případně provádí za programátora přetypování. On to totiž není bug, ale featura, ejhle! Třeba pro ty, kteří jsou schopni psát svůj kód dostatečně na úrovni na to, aby si mohli dovolit typy řešit jen v míře nejnezbytněji nutné.

Napsal jsem dost kódu v různých jazycích a obojí má své určení a své výhody a nevýhody. Pojímat tedy tuto problematiku tímto způsobem je mírně řečeno velmi nešťastné.

Milan Křepelka

No tak ty seš tak dost dobrej ******. Samozřejmě že typování je dobra věc. Automaticky předchází problémům, zmenšuje chybovost. Psát typovým jazykem bude vždy levnější než bastlem nazývaným Javascript.

Sergej

Absolutní absence typu je _právě_ to, co je výhodou JavaScriptu. Nemusím se starat o to, zda mám funkci co podporuje dané typy, nebo ne. Buď jsem blbej a pošlu tam něco, s čím si to neporadí, nebo to proběhne v naprostém pořádku. Nemusím „zbytečně“ pokaždé psát co chci za typ a ještě to rozkopírovat na 4 přetěžené funkce podle typu.

Daniel Steigerwald

Nejlepší je optional typing. Tam kde typy potřebuji, tam je mám. Tam kde ne, tam je nemám. Tenhle princip používá také Dart.
Closure Compiler umí type inference, takže třeba uvnitř metod typy není třeba definovat. Anotacema chráním jen api method. Rozkopírování také není nutné, alespoň v Closure. Stačí anotace @override, ta definice typů přebere.

Milan Křepelka

Vtipt je v tom, že v typově založených jazycích ani blbej být nemůžeš, tudíž tam ani nic nepošlel. Osobně obhájce bastlSkriptu nechápu. Osobně se chudákům co s tím ksindlem musí pracovat směju. A to se docela často koukám do zrcadla.

Daniel Steigerwald

Není to nejpřesnější vyjádření, souhlasím. O to v článku ale nešlo.

Ladislav Thon

> Dart se kvapem vyvíjí. Ale má jeden problém. Není to JavaScript = neseženete na něj lidi.

Dart není JavaScript, a proto na něj seženete lidi mnohem snáz. Dart se snadno naučí každý průměrný Javista, C#ista, PHPčkař, Rubyista, Pythonista, prostě každý, kdo měl kdy něco společného s nějakým civilizovaným objektovým jazykem založeným na třídách. JavaScript? Nenechte se vysmát.

Daniel Steigerwald

V zásadě souhlasím. Omlouvám se, že jsem myšlenku více nerozvinul, ale tlačil mne čas. Znát jazyk nestačí. Je třeba znát i knihovny, frameworky, celý ekosystém. Dart se zkušený programátor za pár dnů naučí. Ale překlopit všechny dosavadní nástroje, postupy, atd. už zabere více času. I když dnes máme Closure, Angular, Backbone, tak spousta lidí nezná ani to.

Tomas Novotny

Je to o mainstreamu a jednoduchosti použití. Situace je zatím taková, že Dart je možná parádní symfonie od Beethovena, ale většina si radši poslechne Madonnu (TypeScript).

Ladislav Thon

Situace je taková, že dneska spousta lidí používá GWT, Script# a podobné, a spousta jiných lidí si stýská po Flashi/Flexu. Ono se to možná lidem z JS světa nezdá, ale takových je fakt hodně. Dart je pro takovéhle lidi první volba.

Borek Bernard

Jako Flexista musím poznamenat, že Dart pro mě rozhodně první volba není :)

Daniel Steigerwald

A samozejmě nemám patent na rozum, a je dost možné, že za rok budu mluvit jinak. Jen blbec se nikdy nemýlí.

Ladislav Thon

Jasně že jo. Ale ten argument o ekosystému je skvělý — podle mne ovšem proti JavaScriptu. Včera nebo předevčírem jsem četl tenhle článek: http://www.ramen.io/post/46936028144/we-are-switching-to-dart-why Lidi od blossom.io tam vyjmenovávají, jaké JS technologie používají: CoffeeScript, Underscore, jQuery, Backbone, Brunch… Dobře, nejsou to Closure Tools ani Angular :-), ale je na tom dobře vidět, kolik věcí potřebujete v JS světě _extra_, které v Dartu dostanete automaticky. Rozumný jazyk, rozumná standardní knihovna, rozumná knihovna pro DOM, a spousta dalšího (balíčkovací systém, generátor dokumentace, relativně rozumné IDE), to všechno není třeba hledat. To dostanete hned, jak si stáhnete SDK.

Jenže historie nás učí, že worse is better, takže jak to doopravdy bude…

Velda

Vždyť v JavaScriptu taky můžete psát programy se statickým typováním… V JavaScriptu jen nejste nuce to dělat a to je rozdíl od kompilovaných jazyků. Jestli přece zavarujete var a = 5. Tak proměnná a je číslo. A pokus už s proměnnou budete dále pracovat jako s číslem, tak má stále stejný typ a tím je její typ statický. Porovnávat ji pak můžete pomocí operátorů !== a === čímž zabráníte přetypovávání a máte skoro výkon aplikace se statickými proměnnými… Jen jste program nepsal tak dlouho, protože jste všude nemusel opakovat ten typ.

Samozřejmě, že tohle je jenom nástin, co v JS jde, ale do větší šířky už to moc nejde, když mrknem třeba na string… :-) Ale tohle jednou bude umět JavaScript taky. :-)

satai

Tak to je vazne staticky typovy system jak noha.

Ostatne to, ze je potreba typy ve statickych typovych systemech stale opakovat je povera. Rozumnejsi jazyky (Scala, Haskell…) maji typovou inferenci. A polovinu toho, co je potreba napsat v kodu, za programatora napise IDE.
Predstava, ze se nepsanim typu nejaky cas usetril je naprosto zcestna. Kolik procent (promile?) casu travite tim, ze skutecne mlatite do klavesnice a pisete kod, co se pak objevi na produkci?

Martin Kozák

Nepsáním typu čas určitě neušetříme. Na druhou stranu, já za sebe tedy IDE psát svůj kód nenechávám. Stačí, že se občas musím hádat se svým okolím, nepotřebuji se tedy hádat ještě s tím, co mi má mou práci ulehčovat. Ale pravda, je to značně subjektivní.

satai

Asi bych mel problem pouzivat IDE, kteremu se neda (v rozumne mire) verit.

maras

Kolik jsi toho napsal solo a kolik v tymu???;-) BTW Vikendovky vynech…

Peto

Trochu mimo temy. Ale nemate info v akom stave je nativna podpora Dartu v Chromiu(Dartium)?

Ladislav Thon

Není a ještě nějakou dobu nebude. Osobně bych odhadoval, že dřív než bude Dart ve verzi 1.0, se v Chromiu Dart VM neobjeví. A 1.0 bude nejdřív letos v létě, možná později.

Radek Miček

Bohatší typový systém pomáhá zkracovat kód: Můžeme třeba přetěžovat funkce. Například následující funkce pro parsování readInt, readIntList, readBool můžeme pojmenovat jednoduše read a psát kratší sum . read (význam: rozparsuj seznam prvků a sečti je; tečka značí skládání funkcí) místo sum . readIntList (význam: rozparsuj seznam Intů a sečti je). Tohle v tzv. dynamicky typovaných jazycích nejde.

Ladislav Thon

Přetěžování je zlo. A samozřejmě existuje manuální dispatch, ale hádám, že o tom se ve vyšších kruzích nemluví ;-)

Radek Miček

IMO rozumně použité přetěžování zpřehlední kód. Např.: V různých třídách / strukturách / záznamech mohu mít vlastnosti / metody / pole se stejným jménem. V jedné třídě mohu mít metody se stejným jménem. Operátorem + mohu sčítat celá čísla, čísla v plovoucí řádové čárce nebo provádět zřetězení. Samozřejmě, přetěžování může komplikovat programovací jazyk, což pak může vyústit k překvapivému chování kompilátoru nebo programu.

Radek Miček

Nepochopím, že v dnešní době někdo vytvoří typový systém bez parametrického polymorfismu (tj. bez podpory generik). Tohle se netýká jenom TypeScriptu, dalším příkladem je Go.

Radek Miček

Aktuální verze TypeScriptu: 0.8.3. Odkazovaný blog je o připravované verzi 0.9. Z toho plyne, že máme zatím smůlu.

Aleš Roubíček

typescript.codeplex.com/SourceControl/list/changesets?branch=develop

Petr Prchal

Cau, pekne shrnuti, jelikoz jsem tam byl taky, dovolim si jen jednu poznamku:

Prezi to nema napsane ve Flashi, ale pouzivaji http://haxe.org/, akorat maji v soucasne dobe nejmocnejsi kompilator prave do Flashe…

Honza Marek

Pár řádků o statickém typování, pár řádků o nějaké konferenci, pak zmínka o CoffeeScriptu a TypeScriptu a na závěr pár řádků o nějaké technologii, co má šanci zabít Javu na Androidu, ale s JS nemá nic moc společného. O čem vlastně ten článek je?

Martin Hassman

Tak vyjmenoval jste to dobře 8-) Hlavní téma by měl být patrné z nadpisu.

Jiri Musil

Haxe je akademický, málo použitelný leaky abstraction projekt? Šmahem Vás odsuzuji jako ignoranta.

Martin Hassman

Jen dejte pozor, abyste se při tom honění vzájemně neušmažili. 8-)

LollaPalooza

Steigerwalde, Steigerwalde. Ty kluku filutový.

>> Dart se kvapem vyvíjí.

To nemyslíš vážně. Dart je mrtvě narozené dítě. Ani vevnitř Googlu nikdo nepoužívá Dart.

>> Problém [TypeScriptu]: Ohromná spousta již napsaného netypového kódu.

To nemyslíš vážně, filuto. Co má TypeScript společné se „spoustou již napsaného netypového kódu?“ To je, jako bys řekl před 18 lety, že problém Javy je, že spousta kódu je napsaná v Cobolu.

Daniel Steigerwald

ad Dart: Nejdřív platforma, potom aplikace v ní napsané. Obráceně to nejde. Na Dart už přecházejí firmy, např. zde http://news.dartlang.org/2013/04/why-blossom-is-switching-to-dart.html

ad TypeScript: Asi jste přehlédl fakt, že pomocí TypeScriptu a jeho type definitions lze přidat typy k již existujícímu kódu. V článku (který jste asi nečetl) je odkaz na seznam již existujících typových definic: https://github.com/borisyankov/DefinitelyTyped Jejich ranec.

Data

Představa o nahrazení JavaScriptu něčím jako Dart je šílená asi stejně, jako argumentovat tím, že už na něj přešla celá jedna firma :-D Megalomanské sklony Google už přinesly pár zajímavých projektů, tady se ale obávám, že zůstane u zbožného přání.

To ani nechtej vedet ...

cofeescript, typescript a dart moc lidi nepouziva a stale prevlada ciste jen javascript, takze kdyz se na projektu meni lidi tak radsi ho zacit psat v cistym JS nez v nejaky hovadine co nikdo neumi, nechce se ucit a rozhodne nema cas se do toho dostavat. A jen tak mimochodem … kompilovat Javascript ??? WTF ? PROC SAKRA ? Chcu to napsat v cemkoliv a hned pustit v prohlizeci … kor kdyz se jedna opravdu ciste jen o webovou aplikaci …

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.