Kyiv Go Meetup 2018. gada maijs:

Vadītājs: – Sveiki visiem! Paldies, ka esat šeit! Šodien mums ir divi oficiāli runātāji – Leša un Vania. Vēl būs divi, ja paliks laiks. Pirmais runātājs – Aleksejs Gračevs, viņš pastāstīs par GopherJS.
Aleksejs Gračevs (turpmāk – AG): – Esmu Go izstrādātājs un rakstu tīmekļa pakalpojumus, izmantojot Go. Reizēm nākas saskarties ar frontend, dažreiz ir jākļūst par daļu no tā. Vēlos pastāstīt par savu pieredzi un pētījumiem Go jomā frontendā.
Leģenda tāda: vispirms parunāsim, kāpēc mēs gribam palaist Go frontendā, tad parunāsim, kā to var izdarīt. Ir divi ceļi – Web Assembly un GopherJS. Apskatīsim, kādā stāvoklī atrodas šie risinājumi un ko no tiem var darīt.
Kas nav kārtībā ar frontend?
Vai visi piekrīt, ka ar frontend viss ir kārtībā?

Maza testu skaita? Lēna salikšana? Ekosistēma? Labi.
Par frontend man patīk citāts, ko teica viens no frontend izstrādātājiem savā grāmatā:

Javascript nav tipu sistēmas. Tagad es nosaukšu problēmas, ar kurām esmu saskāries savā darbā, un paskaidrošu, kā tās tiek risinātas.
Tīpu sistēmu vispār grūti nosaukt par tipu sistēmu Javascript – tur ir virknes, kas apzīmē objekta tipu, bet tas patiesībā nav saistīts ar tipiem. Šī problēma ir atrisināta TypeScript (paplašinājums Javascript) un Flow (statiskā tipu pārbaude Javascript). Patiesībā frontend jau ir atrisinājis sliktās tipu sistēmas problēmu Javascript.

Standarta bibliotēkas pārlūkprogrammā kā tādas nav – ir daži iebūvēti objekti un „maģiskās” funkcijas pārlūkprogrammās. Bet Javascript kā tāds standartbibliotēkas nav. Šī problēma tika atrisināta ar jQuery (visi izmantoja jQuery ar visām prototipiem, palīgiem, funkcijām, kas nepieciešamas darbam). Tagad visi izmantot Lodash:

Callback hell. Domāju, visi ir redzējuši Javascript kodu pirms 5 gadiem, un tas izskatījās pēc „nūdeļu” no neticama kolbežu savijuma. Tagad šī problēma ir atrisināta (ar ES-15 vai ES-16 iznākšanu), pievienoja Javascript solījumus (promises) un visiem uz brīdi kļuva vieglāk elpot.

Kamēr nepienāca Promice hell… Nezinu, kā frontend industrija to izdod, bet viņi vienmēr iebrauc kādās dīvainās nelaimēs. Viņi pat „solījumos” ir izveidojuši hell. Pēc tam šo problēmu atrisināja, pievienojot jaunu primitivu – async/await:

Ar asinkronitāti problēma ir atrisināta. Async/await ir diezgan populārs primitivs dažādās valodās. 'Python' un citās ir šāds pieejas veids – tas ir diezgan labs. Problēma ir atrisināta.
Kāda problēma nav atrisināta? Strauji pieaugošā sarežģītība ietvaros, ekosistēmas sarežģītība un paša programmatūra.

- JavaScript sintakse ir nedaudz dīvaina. Mēs visi zinām problēmas ar masīvu un objekta saskaitīšanu, kā arī citas jautrības.
- JavaScript ir multiplusparadigmu valoda. Šobrīd tas ir īpaši aktuāli, jo ekosistēma ir ļoti liela:
- visi raksta dažādos stilus – kāds raksta strukturēti, kāds raksta funkcionāli, dažādi izstrādātāji raksta atšķirīgi;
- no dažādiem pakotnēm (packages) nāk dažādas paradigmas, kad izmantojat dažādas pakas;
- ļoti daudz 'izpriecas' ar funkcionālo programmēšanu JavaScript – parādījusies bibliotēka Ramda un tagad neviens nevar izlasīt programmās, kas rakstītas šajā bibliotēkā.
- Tas viss ievieš lielu ietekmi uz ekosistēmu, un tā ir neticami paplašinājusies. Pakas nav savietojamas: kāds - uz promisēm, kāds - uz async/await, kāds - uz atgriezeniskajiem izsaukumiem. Vēl raksta dažādās paradigmas!
- Tas noved pie tā, ka projektu ir grūti uzturēt. Grūti atrast kļūdu, ja tu nevari izlasīt kodu.
Kas ir Web Assembly?
Drosmīgie puiši no Mozilla Foundation un dažu citu uzņēmumu izdomāja tādu lietu kā Web Assembly. Kas tas ir?

- Tas ir iebūvēta pārlūka virtuālā mašīna, kas atbalsta bināro formātu.
- Binārās programmas tiek iekļautas, tās izpildās gandrīz dabiski, tas nozīmē, ka pārlūkam nav jāparsē katru reizi visa 'nūdeles' javascript koda.
- Visi pārlūki ir paziņojuši par atbalstu.
- Tā kā tas ir bait-kods, var uzrakstīt kompilatoru jebkurai valodai.
- Četri galvenie pārlūki jau nāk ar Web Assembly atbalstu.
- Drīz mēs gaidām natīvo atbalstu Go. Šāda jauna arhitektūra jau ir pievienota: GOARCH=wasm GOOS=js (drīz). Līdz šim, cik es saprotu, tā nav funkcionāla, taču ir apgalvojums, ka tas noteikti būs Go.
Ko darīt tagad? GopherJS
Kamēr mums vēl nav Web Assembly atbalsta, ir tāds transpajleris kā GopherJS.

- Kods Go tiek pārvērsts 'tīrā' Javascript.
- Tas darbojas visos pārlūkos – tur nav jaunu funkciju, kas tiek atbalstītas tikai mūsdienu pārlūkos (tas ir Vanilla JS, kas darbojas visās ierīcēs).
- Ir ir atbalsts gandrīz visam, kas ir Go, tostarp korutinām un kanāliem… – viss, ko mēs mīlam un zinām.
- Gandrīz visa standarta bibliotēka tiek atbalstīta, izņemot tos pakotnes, kuras nav jēgas atbalstīt pārlūkā: syscall, tīkla mijiedarbības (ir net/http klients, bet nav servera, un klients tiek emulēts ar XMLHttpRequest). Kopumā visa standarta bibliotēka ir pieejama – lūk, tā ir pārlūkā, lūk, Go standarta bibliotēka, kuru mēs mīlam.
- Visa Go pakotņu ekosistēma, visas trešo pušu risinājums (veidnes utt.) var tikt kompilēti ar GopherJS un palaisti pārlūkā.
Gūt GopherJS ir ļoti viegli – tas ir parasts Go pakotne. Mēs darām go get, un mums ir GopherJS komanda, lai izveidotu lietojumprogrammu:

Šāds mazs hello world…

…Parasta Go programma, parasta fmt standarta bibliotēkas pakotne un JavaScript saistītājs, lai vērsētos pie pārlūka API. Println beigās tiks pārvērsts par konsoles ierakstu, un pārlūks uzrakstīs “Hello gophers”! Tik viegli: darām GopherJS build – palaižam pārlūkā – viss darbojas!
Kas ir pieejams šobrīd? Saistītāji

Ir saistītāji visiem populāriem js ietvariem:
- JQuery;
- Angular.js;
- D3.js datu vizualizācijai un lielo datu apstrādei;
- React.js;
- VueJS;
- pat ir atbalsts Electron (tātad jau tagad varam rakstīt galddatoru lietojumprogrammas uz "Electron");
- un smieklīgi – tas ir WebGL (varam veidot pilnīgi grafiskas aplikācijas, tostarp spēles ar 3D grafiku, mūziku un visām iespējām);
- un ļoti daudz citu saistītāju visiem populāriem javascript ietvariem un bibliotēkām.
Ietvars
- Ir jau izstrādāts speciāli GopherJS tīmekļa ietvars – Vecty. Tas ir pilntiesīgs React.js analogs, bet izstrādāts uz Go, ar GopherJS specifiku.
- Ir spēļu ietvari (negaidīti!). Es atradu divus populārākos:
- Engo;
- Ebiten.
Parādīšu pāris piemērus, kā tas izskatās un ko jau tagad var rakstīt uz Go:

Vai arī šāds variants (3D šāvēju neatradu, bet varbūt tas ir):

Ko es piedāvāju?
Šobrīd priekšējā izstrāde ir tādā stāvoklī, ka tur drīz steigsies visi valodas, kas līdz šim raudāja par Javascript. Tagad visi tiks kompilēti uz "Web Assembly". Ko mums vajag, lai tur ieņemtu cienīgu vietu kā "gofers"?

Go tradicionāli tiek uzskatīts par sistēmu programmēšanas valodu, un praktiski nav nekādu bibliotēku darbam ar UI. Ir kaut kas, bet tas ir daļēji pamests un daļēji nefunkcionāls.
Un lūk – lieliska iespēja izveidot UI bibliotēkas Go valodā, kuras darbosies uz GopherJS! Beidzot var uzrakstīt savu ietvaru! Ir pienācis tas laiks, kad var uzrakstīt ietvaru, un tas būs viens no pirmajiem, iegūs agrīnu adaptāciju, un jūs būsiet zvaigzne (ja tas būs labs ietvars).
Var pielāgot daudzus dažādus pakotnes, kas jau ir Go ekosistēmā, pārejot uz pārlūkprogrammas specifiku (piemēram, šablonu dzinēju). Tie jau darbojas, var izveidot ērtas apvijas, lai viegli renderētu saturu tieši pārlūkprogrammā. Turklāt var izveidot, piemēram, servisu, kas var renderēt to pašu gan serverī, gan frontendā, izmantojot to pašu kodu – visu tā, kā mīl frontend attīstītāji (tikai tagad uz Go).
Var uzrakstīt spēli! Tāpēc, ka tas ir jautri…
Man viss.

Jautājumi
Jautājums (tālāk – J): – Es rakstu uz Go vai uz Js?
AG: – Tu raksti uz Go rutīnām, kanāliem, struktūrām, iekļaušanu – visu… Tu paraksties uz notikumu, nodod tur funkciju.
J: – Tātad es rakstu uz „tīra” Js?
AG: – Nē, tu raksti it kā uz Go un pieslēdzies pārlūkprogrammas API (API šajā gadījumā nav mainījies). Vari uzrakstīt savas apvijas, lai kanālā nonāktu ziņas – tas taču nav sarežģīti.
J: – Ko par mobilajām lietotnēm?
AG: – Es noteikti redzēju: ir saistījumi Cordova pārlaišanai, ko Js izpilda. Par React Native – nezinu; varbūt ir, varbūt nav (ne pārāk interesējos). Spēļu dzinējs N-go atbalsta arī mobilās lietotnes – gan iOS, gan Android.
J: – Jautājums par Web Assembly. Vietas kļūst aizvien vairāk, neskatoties uz sasprindzinājumu, „saspiestību”… Vai mēs tādējādi vēl vairāk nenogalināsim frontend pasauli?
AG: – Web Assembly – tas ir binārais formāts, un binārajā pēc noklusējuma gala izlaidumā nedrīkst būt vairāk par tekstu… Tevi vilina runtime, bet tas ir tas pats, kas iekļaut standarta Javascript bibliotēku, kad tās nav, tādēļ mēs izmantojam kaut ko līdzīgu Lodash. Nezinu, cik daudz Lodash aizņem.
J: – Acīmredzami mazāk nekā runtime...
AG: – Uz „tīrā” Javascript?
J: – Jā. Mēs taču to saspiežam pirms nosūtīšanas…
AG: – Bet tas ir teksts... Pavisam, megabaits – tas ir kaut kas, bet tas ir viss (tevis viss runtime ir). Tālāk tu raksti savu biznesa loģiku, kas palielinās tavu binary par 1 %. Pašlaik es neredzu, ka tas nogalinātu frontend. Turklāt Web Assembly darbosies ātrāk nekā Javascript acīmredzama iemesla dēļ – to nevajag parsēt.
J: – Pag, strīdīgs brīdis... Vēl nav kādas etalona realizācijas «Vasmā» (Web Assembly), lai varētu viennozīmīgi spriest. Konceptuāli – jā: mēs visi saprotam, ka binary būs ātrāks, bet pašreizējā V8 realizācija ir ļoti efektīva.
AG: – Jā.
J: – Kompilācija tur strādā tiešām ļoti labi, un nav noteikti, ka būs liels ieguvums.
AG: – Web Assembly arī lielie džeki strādā.
J: – Pag, man šķiet, vēl grūti spriest par Web Assembly. Jau cik gadi iet sarunas, bet reālu sasniegumu, ko varētu saprast, ir maz.
AG: – Iespējams. Redzēsim.
J: – Mums nav problēmu backend... Varbūt atstāt šīs problēmas frontendā? Kāpēc iejaukties tur?
AG: – Ir jānotur štats frontendēru.

Mazliet reklāmas 🙂
Paldies, ka paliekat ar mums. Vai jums patīk mūsu raksti? Vēlaties redzēt vairāk interesantus materiālus? Atbalstiet mūs, veicot pasūtījumu vai ieteicot draugiem, , unikāls ieejas līmeņa serveru analogs, kuru mēs izstrādājām jums: (pieejami varianti ar RAID1 un RAID10, līdz 24 kodoliem un līdz 40GB DDR4).
Dell R730xd divas reizes lētāk datu centrā Equinix Tier IV Amsterdamā? Tikai pie mums Nīderlandē! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — no $99! Lasiet par to
Avots: habr.com
