Kyiv Go Meetup Květen 2018:

Moderátor: – Ahoj všichni! Děkuji, že jste přišli! Dnes máme dva oficiální řečníky – Ljoša a Vaňa. Budou ještě dva, pokud bude čas. Prvním řečníkem je Alexej Gračev, ten nám poví o GopherJS.
Alexej Gračev (dále – AG): – Jsem Go vývojář a píšu webové služby v Go. Někdy se musím zabývat front-endem, někdy se tam musím dostat i fyzicky. Chci se podělit o své zkušenosti a výzkum Go na front-endu.
Legenda je taková: nejprve si promluvíme o tom, proč chceme spouštět Go na front-endu, poté si řekneme, jak to lze udělat. Existují dvě cesty – Web Assembly a GopherJS. Podíváme se, v jakém stavu jsou tato řešení a co se dá dělat.
Co je špatně s front-endem?
Jsou všichni pro, že je s front-endem vše v pořádku?

Málo testů? Pomalu se staví? Ekosystém? Dobře.
Pokud jde o front-end, líbí se mi citát, který řekl jeden z front-end vývojářů ve své knize:

V Javascriptu není typový systém. Teď budu zmiňovat problémy, se kterými jsem se setkal během své práce, a vysvětlím, jak je řeší.
Těžko lze vůbec nazvat systém typů v Javascriptu – jsou tam řetězce, které reprezentují typ objektu, ale ve skutečnosti to s typy nemá nic společného. Tento problém vyřešilo TypeScript (rozšíření nad Javascript) a Flow (statický kontrolor typů v Javascriptu). Vlastně už front-end dospěl k řešení problému špatného typového systému v Javascriptu.

Standardní knihovna v prohlížeči jako taková neexistuje – existují nějaké vestavěné objekty a "magické" funkce v prohlížečích. Ale v Javascriptu jako takovém standardní knihovna chybí. Tento problém byl kdysi řešen jQuery (všichni používali jQuery se všemi prototypy, pomocníky, funkcemi, které jsou potřeba pro práci). Dnes už většina používá Lodash:

Callback hell. Myslím, že všichni viděli kód v Javascriptu někde před 5 lety, a vypadal jako "nudle" z neuvěřitelného spletence callbacků. Teď už je tento problém vyřešen (s vydáním ES-15 nebo ES-16), do Javascriptu byly přidány promisy (promises) a všem se na chvíli ulevilo.

Pokoji nepřišlo Promice hell... Nevím, jak to front-end průmysl zvládá, ale pořád se dostává do nějakých podivných situací. Dokázali vytvořit hell i na "promisech". Pak tento problém vyřešili přidáním nového primitiva – async/await:

S asynchronností je problém vyřešen. Async/await – je dost populární primitiv v různých jazycích. V Pythonu a dalších takový přístup existuje – je dost dobrý. Problém byl vyřešen.
Jaký problém nebyl vyřešen? Růst komplexity frameworků v geometrické řadě, složitost ekosystému a samotných programů.

- Syntaxe JavaScriptu je poněkud zvláštní. Všichni víme o problémech se sčítáním pole a objektu a dalších vypečenostech.
- JavaScript je multiparadigmatický. V současnosti je to zvlášť aktuální systém, když je ekosystém velmi rozsáhlý:
- všichni píší v různých stylech – někteří píší strukturovaně, někteří funkčně, různí vývojáři píší různě;
- z různých balíčků (packages) vyplývají různé paradigmata, když používáte různé balíčky;
- je spousta "zábavy" s funkcionálním programováním v JavaScriptu – vznikla knihovna Ramda a teď nikdo nemůže číst programy napsané v této knihovně.
- To vše má velký dopad na ekosystém a ten se neuvěřitelně rozrostl. Balíčky jsou navzájem nekompatibilní: někdo používá promisy, někdo async/await, někdo callbacky. Ještě se píše v různých paradigmatech!
- To vede k tomu, že projekt je obtížné udržovat. Je těžké najít chybu, pokud nemůžete přečíst kód.
Co je to Web Assembly?
Odvážní lidé z Mozilla Foundation a několika dalších společností vymysleli něco, co se nazývá Web Assembly. Co to je?

- Je to vestavěný virtuální stroj v prohlížeči, který podporuje binární formát.
- Binární programy se tam dostávají a vykonávají se téměř nativně, což znamená, že prohlížeči není nutné pokaždé analyzovat celý "chaos" javascriptového kódu.
- Všechny prohlížeče oznámily podporu.
- Protože je to bajtkód, lze napsat kompilátor pro jakýkoli jazyk.
- Čtyři hlavní prohlížeče už přicházejí s podporou Web Assembly.
- Brzy očekáváme nativní podporu v Go. Tato nová architektura již byla přidána: GOARCH=wasm GOOS=js (brzy). Zatím, jak chápu, není funkční, ale je oznámeno, že to určitě bude v Go.
Co dělat nyní? GopherJS
Dokud nemáme podporu Web Assembly, existuje takový transpiler jako GopherJS.

- Kód na Go se transpilu na "čistý" JavaScript.
- Běží ve všech prohlížečích – neobsahuje nové funkce, které podporují pouze moderní prohlížeče (je to Vanilla JS, který běží na čemkoli).
- Existuje podpora téměř všeho, co je v Go, včetně gorutin a kanálů… – vše, co máme tak rádi a co známe.
- Téměř celá standardní knihovna je podporována, s výjimkou těch balíčků, jejichž podpora v prohlížeči nedává smysl: syscall, net interakce (existuje net/http klient, ale není server, a klient je emulován přes XMLHttpRequest). Celkově je celá standardní knihovna dostupná – tady je v prohlížeči, tady je stdlib Go, kterou máme rádi.
- Celý ekosystém balíčků v Go, všechna externí řešení (šablonování a další) lze zkompilovat pomocí GopherJS a spustit je v prohlížeči.
Získání GopherJS je velmi snadné – je to běžný Go balíček. Uděláme go get a máme příkaz GopherJS, abychom postavili aplikaci:

Tady je takový malý hello world…

…Obvyklý Go program, běžný balíček fmt ze standardní knihovny a Binding Js, abychom měli přístup k API prohlížeče. Println bude nakonec převeden na console log a prohlížeč napíše "Ahoj gophers"! Tak snadné: děláme GopherJS build – spouštíme v prohlížeči – vše funguje!
Co je v tuto chvíli k dispozici? Bindings

Existují bindinky pro všechny populární js frameworky:
- JQuery;
- Angular.js;
- D3.js pro vytváření grafů a práci s velkými daty;
- React.js;
- VueJS;
- dokonce je podpora Electronu (to znamená, že můžeme nyní psát desktopové aplikace na "Electronu");
- a to nejzábavnější – to je WebGL (můžeme vytvářet polygrafické aplikace, včetně her s 3D grafikou, hudbou a všemi vychytávkami);
- a mnoho dalších bindingů ke všem populárním javascriptovým frameworkům a knihovnám.
Framework
- Existuje již webový framework speciálně vyvinutý pro GopherJS – Vecty. Je to plnohodnotná alternativa k React.js, ale vyvinutá na Go, se specifikací GopherJS.
- Existují herní enginy (náhodou!). Našel jsem dva nejpopulárnější:
- Engo;
- Ebiten.
Ukážu pár příkladů, jak to vypadá a co již nyní lze na Go napsat:

Nebo taková varianta (3D střílečku jsem nenašel, ale možná existuje):

Co nabízím?
Právě nyní je průmysl front-endu v takovém stavu, že se do něj nyní vrhnou všechny jazyky, které předtím plakaly nad Javascriptem. Teď se všechny budou kompilovat do „Web Assembly“. Co potřebujeme, abychom zaujali důstojné místo jako „gofeři“?

V Go tradičně platí, že se jedná o systémový programovací jazyk, a prakticky neexistují žádné knihovny pro práci s uživatelským rozhraním. Něco existuje, ale je to napůl opuštěné a napůl nefunkční.
A tady se naskýtá dobrá příležitost vytvořit UI knihovny v Go, které poběží na GopherJS! Konečně můžete napsat svůj vlastní framework! Nastal čas, kdy můžete vytvořit framework, a bude jedním z prvních, získá brzkou adaptaci a vy se stanete hvězdou (pokud to bude dobrý framework).
Můžete adaptovat spoustu různých balíčků, které už existují v ekosystému Go, na specifika prohlížeče (například šablonovací engine). Ty už stejně fungují, můžete udělat pohodlné obalové funkce, aby bylo možné snadno renderovat obsah přímo v prohlížeči. Plus, můžete vytvořit například službu, která umí renderovat to samé na serveru i na frontendu s využitím stejného kódu – přesně jak to mají rádi frontendoví vývojáři (jen nyní v Go).
Můžete napsat hru! Just for fun...
To je vše.

Otázky
Otázka (dále – O): – Píšu v Go nebo v Js?
AG: – Píšeš v Go rutiny, kanály, struktury, embedding – všechno… Přihlašuješ se na událost, předáváš tam funkci.
Otázka: – Takže píšu ve "skutečném" Js?
AG: – Ne, píšeš jakoby v Go a připojuješ se k API prohlížeče (API se přitom nezměnilo). Můžeš napsat své obalové funkce, aby zprávy chodily do kanálu – to není těžké.
Otázka: – Co mobil?
AG: – Určitě jsem viděl: existují bindingy pro patch Cordova, které Js spouští. V React Native – nevím; možná existují, ale také nemusí (není to moc zajímavé). Herní engine N-go podporuje také mobilní aplikace – jak iOS, tak Android.
Otázka: – Otázka ohledně Web Assembly. Místo zabírá stále více, a to i přes kompresi, "zipovanost"... Nezabijeme tímto způsobem svět frontendu ještě více?
AG: – Web Assembly je binární formát, a binární formát jako takový nemůže být v finálním releasu větší než text... Tlačí vás runtime, ale to je totéž, co zátěž standardní Javascriptové knihovny, když ji nemáte, proto používáme něco jako Lodash. Nevím, kolik místa Lodash zabírá.
Otázka: – Opraveně méně, než runtime...
AG: – Na "čistém" Javascriptu?
Otázka: – Ano. My ho komprimujeme před tím, než ho posíláme...
AG: – Ale to je text… Obecně, megabajt – to je jako dost, ale to je – vše (máš celý runtime). Pak napíšeš svou obchodní logiku, která zvýší tvůj binary o 1 %. Zatím nevidím, že by to zabíjelo frontend. Tím spíš Web Assembly bude běžet rychleji než Javascript z očividného důvodu – nemusí se parsinovati.
Otázka: – Zatím sporný bod… Ještě neexistuje žádná standardní implementace „Vasmy“ (Web Assembly), abychom mohli jednoznačně soudit. Konceptuálně – ano: všichni chápeme, že binary by měl být rychlejší, ale současná implementace stejného V8 je velmi efektivní.
AG: – Ano.
Otázka: – Kompilace tam opravdu funguje velmi skvěle a není jisté, že bude velká výhoda.
AG: – Web Assembly také dělají velcí frajeři.
Otázka: – Zatím se mi zdá, že je těžké soudit o Web Assembly. Už kolik let se o tom mluví, a skutečných dosažení, které bys mohl osahat, je málo.
AG: – Možná. Uvidíme.
Otázka: – Nemáme problémy na backendu… Možná tyto problémy nechat na frontendu? Proč tam zasahovat?
AG: – Musíme udržovat tým frontendových vývojářů.

Malá reklama 🙂
Děkujeme, že s námi zůstáváte. Líbí se vám naše články? Chcete vidět více zajímavých materiálů? Podpořte nás objednávkou nebo doporučením známým, , unikátní alternativa entry-level serverů, kterou jsme pro vás vymysleli: (k dispozici varianty s RAID1 a RAID10, až 24 jader a až 40GB DDR4).
Dell R730xd je dvakrát levnější v datovém centru Equinix Tier IV v Amsterdamu? Jen u nás v Nizozemsku! Dell R420 — 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — od 99 $! Čtěte o tom
Zdroj: habr.com
