CoffeeScript JavaScript, který se dá číst. I psát. Jan Bednařík @janbednarik
Co nás čeká 1. Proč říci JavaScriptu ne 2. JavaScript > CoffeeScript 3. CoffeeScript podrobněji 4. Tajemství designu programovacích jazyků
Temná historie JavaScriptu JavaScript vznikl v roce 1995 během války prohlížečů (Browser Wars) Netscape chtěl vytvořit skriptovací jazyk pro neprogramátory Brendan Eich navrhnul a implementoval JavaScript během 10 ti dnů neřízený rozvoj jazyka (Netscape VS Microsoft) pomalá implementace standardů v prohlížečích pomalý vývoj prohlížečů a "nekonečná" zpětná kompatibilita žádné vývojové a debugovací nástroje (FireBug 1.0 v roce 2006)
JavaScript a uživatelé JavaScript = vyskakovací okna Od roku 2004 umí blokovat vyskakovací okna už i Internet Explorer.
> 10 + "10"; "1010" JavaScript a programátoři > var nic = null; > nic + "A"; "nulla" Sčítáme hrušky a jablka To bylo jasné že to není 20! LOL?
JavaScript a programátoři > var formatujdisk = false; Rovná se? > if (formatujdisk = true) console.log("formátuji!"); Formátuji! > formatujdisk true Hej! Tam patří dvě rovnítka ==
JavaScript a programátoři > 10 == "10"; true Tak tedy == Tak ne asi... když se to dá sčítat, tak se to musí rovnat... > 10 === "10"; false Počkej! V JavaScriptu piš jedině === Takové jednoduché řešení problému? Bohužel ne...
JavaScript a programátoři > var foo = []; > foo === true; false > foo == true; false > if (foo) { console.log("true jak bič!"); } else { console.log("false, co si čekal?"); } True jak bič! Publikum: Potlesk! Publikum: Potlesk! Publikum: Teď můžete brečet...
JavaScript a programátoři Napíšeme si funkci, která vrátí true, pokud je v řetězeci číslo. > var isnumber = function(s) { var result = parseint(s); // pokusíme se převést string na číslo return typeof result === "number"; // true pokud je výsledek typu number } > isnumber("100"); true > isnumber("javascript"); true > parseint("javascript"); NaN // znamená Not A Number > typeof NaN; "number"??? WTF!?
JavaScript a programátoři A: "To by stačilo." B: "Mám ještě pár příkladů..." A: "Není třeba, s JavaScriptem už nechci mít nic společného!" B: "Ale budeš mít. JavaScript je JEDINÝ rozšířený skriptovací jazyk pro internetové prohlížeče."
Shrnutí JavaScript je nedomyšlený paskvil, se kterým není radno si začínat. JavaScript je JEDINÝ rozšířený skriptovací jazyk pro internetové prohlížeče. A ještě dlouho bude. Co s tím?
Preprocesory, knihovny, jazyky 40+ knihoven napsaných v JavaScriptu doplňujících JavaScript o OOP s klasickým třídami, statické typování, striktní režimy psaní kódu,... 80+ nástrojů pro převod kódu z jiných jazyků do JavaScriptu (C#, Java, Python, Lisp, Ruby, Perl, PHP, C, C++,...) 30+ nových jazyků kompilovaných do JavaScriptu (CoffeeScript, TypeScript, LiveScript, Dart,...) desítky dalších nástrojů, jako třeba virtuální stroje a interprety jiných jazyků, více na altjs.org Programuje ještě vůbec někdo v čistém JavaScriptu?
CoffeeScript nový jazyk kompilovaný do JavaScriptu kompilátor napsaný v JavaScriptu 100% kompatibilita s JavaScriptem (kód, knihovny, atd.) snaží se programátorům jednoduchou formou poskytnout to dobré z JavaScriptu čitelná syntaxe inspirovaná jazyky Python a Ruby zásadní úspora kódu oproti ekvivalentnímu kódu v JavaScriptu nejpopulárnější z nástrojů řešících problémy JavaScriptu 10. nejpopulárnější jazyk na GitHubu CoffeeScript.org
Jak rozjet CoffeeScript <script src="coffee-script.js"></script> 1. Interaktivně v prohlížeči Živě intepretuje soubory.coffee 2. Kompilátor a REPL (interaktivní konzole) npm install -g coffee-script Program coffee spouštěný z terminálu. 3. Pluginy pro editory Při uložení.coffee se automaticky kompiluje do.js
JavaScript > CoffeeScript Pryč se středníky var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; var foo = "Hello" if (foo === "Hello") { var bar = "World" alert(foo + " " + bar + "!") } else { alert(math.floor(math.random() * 11)) } JavaScript: (skoro) CoffeeScript: Nejsou třeba, protože nikdo nepíše celý skript na jeden řádek.
JavaScript > CoffeeScript Pryč s kudrlinkami var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; var foo = "Hello" if (foo === "Hello") var bar = "World" alert(foo + " " + bar + "!") else alert(math.floor(math.random() * 11)) JavaScript: (skoro) CoffeeScript: Pěkný kód je odsazený. Kudrlinky tak nemají smysl.
JavaScript > CoffeeScript Pryč se deklarací proměnných var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; foo = "Hello" if (foo === "Hello") bar = "World" alert(foo + " " + bar + "!") else alert(math.floor(math.random() * 11)) JavaScript: (skoro) CoffeeScript: Kompilátor sám pozná, co je proměnná. Všechny proměnné jsou definovány v lokálním jmenném prostoru.
JavaScript > CoffeeScript Pryč se zbytečnými závorkami var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; foo = "Hello" if foo === "Hello" bar = "World" alert foo + " " + bar + "!" else alert Math.floor Math.random() * 11 JavaScript: (skoro) CoffeeScript: Závorky nikdy ničemu nevadí, pokud nejste fandové Ruby syntaxe, klidně je piště kde chcete.
JavaScript > CoffeeScript Pryč s magickými rovnítky var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; foo = "Hello" if foo == "Hello" bar = "World" alert foo + " " + bar + "!" else alert Math.floor Math.random() * 11 JavaScript: (skoro) CoffeeScript: == se automaticky kompiluje do ===
JavaScript > CoffeeScript Pryč se sčítáním řetězců var foo = "Hello"; if (foo === "Hello") { var bar = "World"; alert(foo + " " + bar + "!"); } else { alert(math.floor(math.random() * 11)); }; foo = "Hello" if foo == "Hello" bar = "World" alert "#{foo} #{bar}!" else alert Math.floor Math.random() * 11 JavaScript: CoffeeScript: Hele, už je to CoffeeScript!
CoffeeScript
Funkce JavaScript: var sum = function(a, b) { return a + b; } CoffeeScript: sum = (a, b) -> a + b místo function napíšeme jen > return není třeba, funkce vždy vrátí hodnotu posledního výrazu
foo = (bar="hello", baz=null) -> null Funkce default argumenty
var message = { to: { name: "Honza", email: "honza@seznam.cz" }, text: "Nuda jak nechceš." }; message = to: name: "Honza" email: "honza@seznam.cz" text: "Nuda jak nechceš." Deklarace objektů JavaScript: CoffeeScript:
var numbers = [1, 2, 3]; var animals = [ "dog", "cat", "bat" ]; numbers = [1, 2, 3] animals = [ "dog" "cat" "bat" ] Deklarace polí JavaScript: CoffeeScript:
Operátory CoffeeScript: JavaScript: ==, is ===!=, isnt!== not! and && or true, yes, on true false, no, off false @, this this of in in (není v JS)
if if name == "Michal" console.log "Ahoj Michale" else console.log "Dobrý den" if foo is true then bar() else baz() sayhello() if greet is true mood = if monday then "bad" else "good" zkrácená forma jako přípona podmiňovací zápis
for JavaScript: for (var n=0; n<=10; n++) { console.log(n); }; CoffeeScript: for n in [0..10] console.log n
for JavaScript: var foo = ["a", "b", "c"]; for (var n=0; n<foo.length; n++) { console.log(foo[n]); }; foo = ["a", "b", "c"] for item in foo console.log item console.log item for item in foo CoffeeScript: řádkový zápis
List Comprehension map: bigchars = (item.touppercase() for item in ["a", "b", "c"]) filter: myanimals = ["spider", "cat", "snake"] dangerous = (animal for animal in myanimals when animal isnt "cat")
Třídy class Animal constructor: (@name) -> move: (meters) -> alert @name + " moved #{meters}m." class Snake extends Animal move: -> alert "Slithering..." super 5 class Horse extends Animal move: -> alert "Galloping..." super 45 sam = new Snake "Sammy the Python" tom = new Horse "Tommy the Palomino" sam.move() tom.move()
Tajemství designu programovacích jazyků
John McCarthy Lisp, 1958
Dennis Ritchie C, 1973
Bjarne Stroustrup C++, 1983
Guido van Rossum Python, 1991
James Gosling Java, 1995
Brendan Eich JavaScript, 1995
Teorie vlivu vousů na design programovacích jazyků
Anders Hejlsberg C#, 2001
Larry Wall Perl, 1987
The End