Norske studenter bak JavaScript-nyhet: «Helt utrolig mulighet!»

Studenter ved Universitetet i Bergen har jobbet tett med utviklere fra Google og Mozilla om ny funksjonalitet i ECMAScript/JavaScript.

Førsteamanuensis ved UiB, Mikhail Barash (foran), har veiledet studentene som jobbet med Upsert-prosjektet. Fra venstre: Mikhail Barash, Sune Lianes, Jonas Haukenes, Lauritz Angeltveit, Vetle Larsen
Publisert

– Det har vært en helt utrolig mulighet å få være med på, og endte med å være så mye mer enn jeg forventet da jeg startet prosjektet, forteller Jonas Haukenes, masterstudent ved UiB, til kode24.

Sammen med flere andre studenter har han vært involvert i design og implementering av helt ny funksjonalitet som snart kommer i JavaScript: Map.prototype.getOrInsert (tidligere kalt upsert).

Prosjektet har vært en del av "Project in Informatics"-kurset ved UiB, og studentene har hatt mentorer fra Google og Mozilla med underveis. 

  • Kort oppsummert så skal getOrInsert gjøre det enklere å håndtere det å oppdatere verdier i en Map eller WeakMap når du ikke er sikker på om en bestemt nøkkel (key) eksisterer fra før i Map-en. 
  • Dette kan i dag håndteres ved å først sjekke om nøkkelen eksisterer, og deretter legge til eller oppdatere avhengig av resultatet. 
  • Den nye getOrInsert-metoden vil gjøre dette enklere ved å returnere verdien assosisert med en nøkkel hvis nøkkelen allerede eksisterer. Hvis ikke vil den legge den til, som i dette eksempelet:
Bruk av getOrInsert forenkler håndtering av standardverdier, siden den ikke vil overskrive eksisterende verdier.

I tillegg til getOrInsert-prosjektet har en annen gruppe studenter ved UiB jobbet sammen med en Google-utvikler hvor de implementerte deler av TC39s Temporal-forslag i Boa, en JavaScript-motor skrevet i Rust.

– Selv om dette kanskje ikke er godt kjent, så er det viktige her at Boas implementasjon av Temporal vil bli gjenbrukt i Google Chromes V8-motor. Shane Carr fra Google har gjort en veldig god jobb med mentoring av studentene, og kom til og med til Bergen for å gi et krasjkurs i Rust, som er språket Boa er skrevet i, sier Mihail Barash, førsteamanuensis ved UiB, til kode24.

    Blir en del av JavaScript

Upsert-forslaget er nå på trinn 3 i TC39, som betyr at designet er ferdig og at det anbefales å legge det til i nettleserne. 

Snart vil altså funksjonalitet Haukenes og hans medstudenter har laget kunne bli brukt av millioner av webutviklere verden over:

– Det har gitt meg utrolig lyst til å fortsette å bidra til JavaScript og webmotorer, sier Haukenes, og legger til at prosjektet har gitt han et unikt innblikk i prosessen bak JavaScript – og mulighet til å møte de som jobber med JavaScript til daglig.

💡 ECMAScript og TC39

    TC39

  • Ny funksjonalitet i ECMAScript har gått igjennom trinn 0-4 hos TC39, komitéen som behandler nye forslag til endringer i språket. 
  • Alt som er med i ECMAScript 2025 har nådd trinn 4 og har blitt en del av den offisielle standarden. 

Hvordan bidra

  • Alle kan bidra til JavaScript. Alt av TC39s arbeid gjøres i offentlige repoer på GitHub her, og alle forslag (i hvert fall etter trinn 1) har et repo der hvem som helst kan åpne issues eller delta i diskusjoner. 
  • Det er også mulig å delta i TC39 Discourse Group, spesielt om man har en idé til ny funksjonalitet. Da kan du se om du får noen delegater i TC39-komitéen til å støtte idéen og være villig til å presentere idéen for komitéen. 
  • Du kan også bidra direkte til implementasjoner, som SpiderMonkey for Firefox. Da følger du vanlig praksis for bidrag til åpen kildekode, som du kan lese om her.
  • Du kan bidra til Test262, som er den offisielle test-suiten til ECMAScript. Dette kan være en fin måte å bli involvert i JavaScript på..

Ville gi ekte utfordringer

Mihail Barash har vært veileder for studentene på Upsert-prosjektet, i tillegg til at han sitter i TC39-komiteen som jobber med standardisering av ECMAScript – standarden JavaScript bygger på. 

– Vi har hatt et samarbeid med JavaScript-komitéen i flere år allerede. Flere TC39-delegater har besøkt UiB og gitt gjesteforelesninger, sier Barash.

Ett av målene med prosjektet har vært å gi studenter mer erfaring med ekte åpen kildekodeprosjekter.

– En av de tingene som er svært vanskelig å gi studenter i et universitetsmiljø, er eksempler fra virkeligheten. Forelesninger dekker som regel ganske enkle eksempler, og selv store gruppeprosjekter kan i beste fall være “realistiske”, men ikke “industrielt ekte”. Jeg ønsket å se om studentene kunne bidra til et ekte prosjekt fra næringslivet, sier Barash.

– Jeg er veldig glad for hvor vellykket det ble.

En av de tingene som er svært vanskelig å gi studenter i et universitetsmiljø, er eksempler fra virkeligheten.

To forslag, tre studier

Barash forteller at det ble gjennomført to case-studier for upsert-forslaget:

  • SpiderMonkey med mentorstøtte 
  • V8 uten mentorstøtte
  • SpiderMonkey er Mozillas JavaScript- og WebAssembly-motor som brukes i blant annet Firefox, mens V8 er Googles åpen kildekodemotor som brukes i Chromium-baserte nettlesere og i Node.js. 

– Vi snakker om store og komplekse kodebaser. Hvor vanskelig er det for mindre erfarne utviklere å navigere i disse?

– Når man implementerer en JavaScript-funksjon, går mesteparten av arbeidet faktisk ut på å lese og forstå spesifikasjonsteksten grundig. Den er skrevet i et slags pseudo-kode-aktig engelsk, omtrent 15–20 kodelinjer per metode, sier Barash.

Han forteller at en av grunnene til at dette ikke er en triviell oppgave, er at ECMAScript-spesifikasjonen er skrevet med en spesiell notasjon som tar tid å mestre, spesielt for nykommere. I tillegg hender det overraskende ofte at faktiske implementasjoner skiller seg fra spesifikasjonen, siden spesifikasjonen legger vekt på korrekthet, mens implementasjoner også optimaliseres for ytelse.

– En annen utfordring er at det er vanskelig å lære seg å navigere i en kodebase så stor som Firefox. Men her har Firefox noen glimrende verktøy som er til hjelp. Ett av disse verktøyene heter Searchfox, som er spesielt laget for å søke gjennom hele Firefox-kodebasen, sier Barash

💡 prosessen

 SpiderMonkey-implementasjonen:

  • SpiderMonkey bruker såkalt "self-hosted" JavaScript. Det betyr at deler av motoren selv er skrevet i JavaScript – og ikke bare C++, som resten av motoren er skrevet i.
  • Self-hosted JavaScript ligner vanlig JavaScript, og lot studentene finne lignende kode som de kunne la seg inspirere av ved å søke i kodebasen med SearchFox-verktøyet.
  • Etter at første implementasjon av getOrInsert var skrevet i self-hosted JavaScript, ble koden skrevet om til C++ for bedre ytelse. 

 V8-implementasjonen

  • I V8 brukes det et domenespesifikt språk (DSL) kalt Torque, som har en TypeScript-lignende syntaks. Torque transpileres til et annet språk, CSA (Code Stub Assembler), og C++.

Morsomt og lærerikt

Før Jonas Haukenes ble involvert i upsert-prosjektet, hadde han i hovedsak programmert i forbindelse med studentprosjekter eller konkurranseprogrammering på universitetet. 

– Så dette var noe jeg ikke hadde så mye erfaring med fra før, i hvert fall ikke på dette nivået, sier Haukenes.

Jonas Haukenes.

– Hvordan jobbet dere med prosjektet?

– Vi jobbet hovedsakelig alene med prosjektet, og så hadde vi ukentlige møter med en veileder fra Mozilla hvor vi snakket om fremdriften, mulige endringer på forslaget, og om vi hadde møtt på noen utfordringer vi ikke klarte å løse på egen hånd. 

Siden målet med prosjektet var å skrive en guide som man kan følge uten nødvendigvis å ha en veileder fra Mozilla, så var det viktig for studentene å få frem mange av problemene de møtte på og hvordan de løste disse på egen hånd. Derfor har studentene også publisert en guide til hvordan upsert/getOrInsert fungerer her: bldl.github.io/upsert-tutorial

Det morsomste jeg føler jeg har lært er hvordan språk som C++ brukes på et industrielt nivå, hvor sikkerhet og ytelse er helt avgjørende.

– Hva har du lært?

– Jeg har lært alt fra hvordan man setter seg inn i og finner frem i gigantiske kodebaser, til hvordan man bruker Git på et prosjekt hvor det kommer inn titals patcher hver dag. Men det morsomste jeg føler jeg har lært er hvordan språk som C++ brukes på et industrielt nivå hvor sikkerhet og ytelse er helt avgjørende.

SpiderMonkey-implementasjonen av getOrInsert ble skrevet om fra self-hosted JavaScript til C++ for bedre ytelse.

Det vanskeligste var å skrive implementasjonen til Google Chromes V8. 

– Her hadde jeg mye mindre tilgang til veiledning enn med SpiderMonkey. Og siden V8 tar i bruk flere DSL-er (Domain Specific Language) så krevde det en del innsats for å finne ut hvordan man skal bruke alle disse sammen, sier Haukenes.

Må overbevise erfarne utviklere

Mikhail Barash forteller at studentene har laget en første implementering av upsert-forslaget, og deretter samarbeidet med Mozilla-utvikleren Daniel Minor om å redesigne deler av det. 

Denne oppgaven innebærer langt mer ansvar, ettersom forslagsstillerne – altså studentene i dette tilfellet – må begrunne designvalgene sine.

– Dette må gi mening for de andre medlemmene av komiteen – hvor de fleste er svært erfarne utviklere og eksperter på design av programmeringsspråk. Etter at redesignet fikk positiv tilbakemelding fra komiteen, implementerte de forslaget på nytt. 

Og så måtte de reimplementere alt sammen nok en gang – denne gangen for å optimalisere ytelsen. 

– Dette er så nært industripraksis man kan komme – og vi klarte å skape denne erfaringen i en universitetskurs.

Imponert over studentene

– Hvordan synes du studentene klarte seg?

– Vi ved UiB er svært begeistret for resultatene studentene våre har vist i løpet av prosjektet. Det er virkelig flott å se studenter bidra til en så stor og viktig kodebase.

Han vil også berømme Haukenes for den krevende V8-implementeringen:

– Han laget en implementering av funksjonen i Google Chromes V8-motor. Jonas fikk ingen veiledning fra Google-ingeniører, og Google var heller ikke involvert på noen måte, så Jonas måtte selv sette seg inn i de tekniske detaljene i V8-motoren.

Nå ønsker Barash å dele erfaringene sine med andre universiteter over hele verden, og er glad for at det ser ut til å være vilje til å involvere studenter og til å skaffe mentorer for studenter.

– Web-plattformen trenger fremtidige vedlikeholdere og folk som kan implementere løsninger, og dette er en perfekt måte å forbererede den neste generasjonen på, avslutter han.

I juni fortalte Mikhail Barash og studentene om prosjektet i en presentasjon på Web Engines Hackfest, som du kan se under. 

Der får du også detaljene om hvordan ny funksjonalitet legges inn i JavaScript i praksis – samt mer informasjon om norske studenters bidrag til Temporal: 

Powered by Labrador CMS