Kyiv Go Meetup maí 2018:

Fremstur: Hæ öll! Takk fyrir að koma hingað! Í dag eru tveir opinberir fyrirlesarar – Lesha og Vanya. Það verða tveir í viðbót ef við höfum tíma. Fyrsti fyrirlesarinn er Alexey Grachev, sem mun segja okkur frá GopherJS.
Alexey Grachev (hér eftir – AG): Ég er forritari hjá Go og skrifa vefþjónustur í Go. Stundum þarf ég að vinna með framendanum, stundum þarf ég að fikta í honum handvirkt. Mig langar að deila reynslu minni og rannsóknum á framendanum hjá Go.
Sagan er svona: fyrst skulum við ræða um hvers vegna við viljum keyra Go á framendanum, síðan munum við ræða hvernig við getum gert það. Það eru tveir möguleikar: Web Assembly og GopherJS. Við skulum skoða núverandi stöðu þessara lausna og hvað við getum gert.
Hvað er að framhliðinni?
Eru allir sammála um að allt sé í lagi með framhliðina?

Ekki nægar prófanir? Hægfara smíði? Vistkerfi? Gott.
Varðandi framhliðina, þá líkar mér tilvitnunin sem einn af framhliðarforriturunum sagði í bók sinni:

JavaScript hefur ekki týpukerfi. Nú mun ég benda á vandamálin sem ég hef rekist á í vinnunni minni og útskýra hvernig á að leysa þau.
Það er erfitt að kalla týpukerfi JavaScript týpukerfi — það eru strengir sem tákna gerð hlutarins, en þeir hafa í raun ekkert með týpur að gera. Þetta vandamál hefur verið leyst í TypeScript (viðbót fyrir JavaScript) og Flow (stöðugum týpuprófara fyrir JavaScript). Reyndar hefur notendaviðmótið þegar tekið á vandamálinu með lélegt týpukerfi JavaScript.

Það er ekkert staðlað bókasafn í vöfrum — það eru nokkrir innbyggðir hlutir og „töfra“-föll. En í JavaScript er ekkert staðlað bókasafn í sjálfu sér. Þetta vandamál var einu sinni leyst með jQuery (allir notuðu jQuery með öllum frumgerðum, hjálpartækjum og föllum sem þurfti til vinnu). Nú nota allir Lodash:

Tilbakaköllunarhelvíti. Ég held að allir hafi séð JavaScript kóða fyrir um fimm árum síðan og hann leit út eins og rugl af ótrúlega flóknum bakköllum. Nú hefur þetta vandamál verið leyst (með útgáfu ES-15 eða ES-16), loforð hafa verið bætt við JavaScript og allir geta andað aðeins léttar um stund.

Þangað til Promise Hell kom til sögunnar... Ég veit ekki hvernig notendaiðnaðurinn tekst að gera þetta, en þeir halda áfram að koma sér í einhverja undarlega klípu. Þeim tókst jafnvel að skapa helvíti með loforðum. Svo leystu þeir þetta vandamál með því að bæta við nýrri frumstæðu – async/await:

Ósamstillta vandamálið er leyst. Async/await er nokkuð vinsæl aðferð í ýmsum forritunarmálum. Python og fleiri nota þessa aðferð og hún er nokkuð góð. Vandamál leyst.
Hvaða vandamál er enn óleyst? Stöðugt vaxandi flækjustig ramma, vistkerfa og hugbúnaðar sjálfs.

- Setningafræði JavaScript er svolítið skrýtin. Við þekkjum öll vandamálin sem fylgja því að bæta við fylkjum og hlutum og öðrum sérkennilegum atriðum.
- JavaScript er margþætt. Þetta er sérstaklega mikilvægt núna, miðað við hið víðfeðma vistkerfi:
- allir skrifa á mismunandi hátt - sumir skrifa uppbyggilega, sumir skrifa hagnýtt, mismunandi forritarar skrifa á mismunandi hátt;
- úr mismunandi pökkum, mismunandi viðmið þegar þú notar mismunandi pakka;
- Það er margt „skemmtilegt“ við virkniforritun í Javascript - rambda bókasafnið birtist og nú getur enginn lesið forrit sem eru skrifuð í þessu bókasafni.
- Allt þetta hefur mikil áhrif á vistkerfið og það hefur vaxið ótrúlega mikið. Pakkarnir eru ósamhæfðir hver við annan: sumir nota loforð, aðrir nota async/await og sumir nota callbacks. Þeir eru líka skrifaðir í mismunandi líkönum!
- Þetta gerir verkefnið erfitt í viðhaldi. Það er erfitt að finna villu ef þú getur ekki lesið kóðann.
Hvað er vefsamsetning?
Hugrökku mennirnir hjá Mozilla Foundation og fjölda annarra fyrirtækja hafa fundið upp eitthvað sem kallast Web Assembly. Hvað er það?

- Þetta er vafrabundin sýndarvél sem styður tvíundarsnið.
- Tvöfaldur forrit komast þangað og eru keyrð nánast innfædd, sem þýðir að vafrinn þarf ekki að greina allan JavaScript kóðann í hvert skipti.
- Allir vafrar hafa lýst yfir stuðningi.
- Þar sem þetta er bætakóði er hægt að skrifa þýðanda fyrir hvaða tungumál sem er.
- Fjórir helstu vafrar eru þegar með stuðningi við Web Assembly.
- Við búumst við innbyggðum stuðningi í Go fljótlega. Þessi nýja arkitektúr hefur þegar verið bætt við: GOARCH=wasm GOOS=js (fljótlega). Svo vitað sé er hann ekki ennþá virkur, en það er yfirlýsing um að hann verði örugglega í Go.
Hvað á að gera núna?
Þó að við höfum ekki ennþá stuðning við Web Assembly, þá er til flutningsforrit sem kallast GopherJS.

- Go kóði er umbreytt í „hreint“ Javascript.
- Keyrir í öllum vöfrum – engir nýir eiginleikar eru studdir aðeins af nútíma vöfrum (það er Vanilla JS, sem keyrir á öllu).
- Það er stuðningur fyrir nánast allt sem Go býður upp á, þar á meðal goroutines og rásir ... allt sem við elskum og þekkjum svo vel.
- Næstum allt staðlaða bókasafnið er stutt, fyrir utan þá pakka sem ekki er skynsamlegt að styðja í vafranum: syscall, net-interop (það er net/http viðskiptavinur, en enginn netþjónn, og viðskiptavinurinn er hermdur með XMLHttpRequest). Í heildina er allt staðlaða bókasafnið aðgengilegt — hér er það í vafranum, og hér er Go stdlib sem við elskum.
- Hægt er að þýða allt vistkerfi Go pakkans, þar á meðal allar lausnir frá þriðja aðila (sniðmát o.s.frv.), með GopherJS og keyra í vafranum.
Það er mjög auðvelt að fá GopherJS — þetta er staðlað Go-pakki. Keyrðu bara goget og við höfum GopherJS skipunina til að smíða forritið:

Hér er smá halló heimur...

...Venjulegt Go forrit, venjulegt fmt pakki úr staðlaða bókasafninu og Binding Js til að fá aðgang að vafraviðmótinu. Println verður að lokum breytt í stjórnborðsskrá og vafrinn mun prenta "Halló jarðrottar!" Það er svona einfalt: smíðaðu GopherJS, keyrðu það í vafranum og það virkar!
Hvað er í boði núna? Bindingar

Það eru bindingar fyrir öll vinsæl JS ramma:
- JQuery;
- Angular.js;
- D3.js til að teikna gröf og vinna með stór gögn;
- React.js;
- VueJS;
- það er jafnvel stuðningur við Electron (sem þýðir að við getum nú þegar skrifað skrifborðsforrit í Electron);
- og það fyndnasta er WebGL (við getum búið til forrit með fullri grafík, þar á meðal leiki með þrívíddargrafík, tónlist og öllu því sem fylgir);
- og margar aðrar tengingar við öll vinsæl JavaScript ramma og bókasöfn.
Framework
- Það er þegar til veframmi sem er sérstaklega þróaður fyrir GopherJS og kallast Vecty. Hann er fullgildur hliðstæður React.js, en þróaður í Go, með sérkennum GopherJS.
- Það eru til veiðipokar (óvænt!). Ég fann tvo af þeim vinsælustu:
- Engó;
- Ebiten.
Ég skal sýna þér nokkur dæmi um hvernig þetta lítur út og hvað er nú þegar hægt að skrifa í Go:

Eða þessi valkostur (ég fann engan þrívíddar skotleik, en kannski er hann til):

Hvað legg ég til?
Forsíðuforritaiðnaðurinn er nú í slíku ástandi að öll þau forritunarmál sem áður höfðu verið að stríða JavaScript eru að ryðja sér til rúms. Nú mun allt þýtjast í Web Assemblies. Hvað þurfum við til að taka réttmætan sess okkar sem „gophers“ þar?

Go hefur hefðbundið verið skilgreint sem kerfisforritunarmál, með nánast engum notendaviðmótsbókasöfnum. Það eru nokkur, en þau eru hálf yfirgefin og hálf virk.
Og nú — frábært tækifæri til að búa til notendaviðmótsbókasöfn í Go sem keyra á GopherJS! Þú getur loksins skrifað þitt eigið rammaverk! Tíminn er kominn þegar þú getur skrifað rammaverk, og það verður eitt það fyrsta, verður tekið upp snemma og þú munt verða stjarna (ef það er gott rammaverk).
Fjöldi pakka sem þegar eru í boði í Go vistkerfinu er hægt að aðlaga að sérstillingum vafrans (til dæmis Template Engine). Þeir munu þegar virka og hægt er að búa til þægilegar umbúðir til að birta efni beint í vafranum. Auk þess gætirðu til dæmis búið til þjónustu sem getur birt sama efni á netþjóninum og á framendanum með sama kóðanum - rétt eins og framendaforritarar elska (bara núna í Go).
Þú getur skrifað leik! Bara til gamans…
Þetta er allt sem ég hef.

spurningar
Spurning (hér eftir nefnd Q): – Á ég að skrifa í Go eða Js?
AG: – Þú skrifar rútínur, rásir, uppbyggingu, innfellingar – allt í Go… Þú gerist áskrifandi að viðburði og sendir þar fall.
IN: – Svo ég skrifa í venjulegu JS?
AG: „Nei, þú ert að skrifa þetta í Go og tengjast við vafraforritaskilið (forritaskilið hefur ekki breyst). Þú getur skrifað þínar eigin bindingar til að taka á móti skilaboðum í rásinni — það er ekki svo erfitt.“
IN: - Hvað með farsíma?
AG: – Я точно видел: есть биндинги для патча Cordova, которые Js запускает. В React Native – не знаю; может, есть, а может, нет (не особо интересовался). Игровой движок N-go поддерживает и мобильные приложения – и iOs, и Android.
IN: – Spurning um Web Assembly. Það tekur meira og meira pláss, þrátt fyrir að vera þjappað og „zippað“... Mun þetta ekki enn frekar drepa framhliðarheiminn?
AG: „Web Assembly er tvíundarsnið og sjálfgefið getur tvíundarskrá ekki verið meira en texti í lokaútgáfunni... Þú ert að nota keyrslutímaskrána en það er eins og að nota hefðbundið JavaScript-bókasafn þegar það er ekki til, svo við notum eitthvað eins og Lodash. Ég veit ekki hversu mikið pláss Lodash tekur.“
IN: – Augljóslega styttri en keyrslutími…
AG: – Í „hreinu“ Javascript?
IN: - Já. Við þjöppum það áður en við sendum það...
AG: „En þetta er texti... Svo, megabæti virðist vera mikið, en það er það (þú hefur allan keyrslutímann). Svo skrifar þú viðskiptarökfræðina þína, sem mun auka tvíundarskrána þína um 1%. Hingað til sé ég ekki að þetta eyðileggi notendaviðmótið. Þar að auki mun Web Assembly keyra hraðar en JavaScript af þeirri augljósu ástæðu að það þarf ekki að greina það.“
IN: – Þetta er enn óljóst... Það er engin tilvísunarútfærsla af „Vasma“ (vefsamsetningu) til að fella endanlega dóm. Hugmyndalega séð, já: við skiljum öll að tvíundarútgáfa ætti að vera hraðari, en núverandi útfærsla af V8 er til dæmis mjög skilvirk.
AG: - Já.
IN: – Samantektin þar virkar mjög vel og það er ekki staðreynd að það verði mikill kostur.
AG: – Vefsamsetning er líka gerð af stóru strákunum.
IN: „Ég held að það sé enn erfitt að dæma um Web Assembly. Það hefur verið talað um það í mörg ár, en það eru fáir áþreifanlegir árangursþættir.“
AG: - Hugsanlega. Við sjáum til.
IN: „Við höfum engin vandamál í bakendanum ... Kannski ættum við að skilja þessi vandamál eftir í framendanum? Hvers vegna að hafa fyrir því?“
AG: – Við verðum að viðhalda starfsfólki í fremstu víglínu.

Nokkrar auglýsingar 🙂
Þakka þér fyrir að vera hjá okkur. Líkar þér við greinarnar okkar? Viltu sjá meira áhugavert efni? Styðjið okkur með því að leggja inn pöntun eða mæla með því við vini, , einstök hliðstæða upphafsþjóna, sem var fundið upp af okkur fyrir þig: (fáanlegt með RAID1 og RAID10, allt að 24 kjarna og allt að 40GB DDR4).
Dell R730xd 2x ódýrari í Equinix Tier IV gagnaveri í Amsterdam? Aðeins hér í Hollandi! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - frá $99! Lestu um
Heimild: www.habr.com
