nrk.no

JavaScript – verdens viktigste språk?

Kategorier: Internett & Webutvikling

foto av de tre anbefalte bøkene

alt
Hell is other browsers, respect the JavaScript! Foto: psd på Flickr, CC

JavaScript, eller ECMAScript som er det virkelige navnet, er programmeringsspråket mange utviklere har lært seg å hate. Men JavaScript er kanskje i ferd med å bli verdens viktigste programmeringsspråk hvis man ønsker å lage nettbaserte tjenester.

Begynnelsen

Brendan Eich sitter i en Barcelonastol og jobber på en mac
Brendan arbeidende ved Firefox' 5års bursdagsselskap. Foto: badubadu på Flickr, CC

JavaScript ble utviklet i 1995 av Brendan Eich – som i dag er CTO hos Mozilla – og puttet inn i Netscape Navigator 2.0. Opptakten var at Netscape ønsket seg et programmeringsspråk som kunne tilføre mer interaktivitet i nettleseren og Brendan fikk beskjed om at ledelsen ønsket noe som lignet på Apple’s HyperCard. I tenkeboksen lånte Brendan blant annet en god del i fra LISP / Scheme og i løpet av ti dager kom Brendan opp med en prototype-spesifikasjon på det som skulle bli JavaScript og ledelsen i Netscape likte det de så. Prototypen ble implementert rett inn i Netscape 2 og sendt ut til massene få uker etter. JavaScripts svangerskap og fødsel varte ikke mer enn en snau måned.

En så rask fødsel kommer ikke helt uten problemer. Som alle andre programmeringsspråk har JavaScript dårlige og gode sider. Men skreller man bort de virkelige dårlige sidene i JavaScript, sitter man faktisk igjen med et lite og pent språk. Det er også slik at de ting vi programmerere har mislikt med JavaScript i liten grad er problemer relatert til språket, men skyldes forskjeller mellom implementasjoner i nettlesere og ikke minst interaksjonen med det som kalles for Document Object Model (DOM). DOM er det en nettleser har konstruert etter at den har lest og parset et HTML-dokument og det er DOM JavaScript i stor grad gjør interaksjon mot.

Nettlesere har heller ikke før i den senere tid vært særlig flinke til å sørge for at hastighet på JavaScript har vært på topp. En treg eksekvering kombinert med forskjeller i implementasjoner mellom nettlesere førte nok dessverre til at mange puttet JavaScript i båsen for tullespråk for inntil bare noen år siden.

Stor utbredelse

Man kan diskutere frem og tilbake om hva som er bra og dårlig med et programmeringsspråk. Det kan man med JavaScript også. Realiteten er dog at JavaScript er ekstremt utbredt og det sprer seg enda mer. Nettleseren du leser dette i har garantert mulighet for å eksekvere JavaScript (jeg forventer en “jeg bruker Lynx” kommentar her), mobiltelefonen din har høyst sannsynlig en nettleser med JavaScript-støtte, leseplaten du kanskje eier likeså og nett-tilpassede TV’er med en JavaScript-motor i seg begynner å komme.

Titter man rundt seg skal man altså ikke lete lenge før man finner en JavaScript-implementasjon eller et JavaScript-API.

HTML5 og tilhørende søstre er kanskje mest nærliggende å se på først. Tar vi for oss HTML5-spesifikasjonen og skreller bort den biten som bare er ment for nettleserutviklere, bl.a tokenizing‘en, sitter vi igjen med et lite knippe nye semantiske elementer og en god dose med nye JavaScript-APIer. Audio, video og canvas er nye elementer i HTML5 med rike JavaScript APIer man kan programmere mot med JavaScript. Web Storage, GeoLocation, IndexedDB, WebSQL / Web Database, WebSockets, Drag and Drop, File API og Server-Sent Events er rene JavaScript-APIer som nå finnes eller kommer i nettleserne. Web Workers er et API for å hjelpe til med utførelsen av tyngre og mer tidkrevende JavaScript-operasjoner.

I tillegg har vi også Device APIer som skal gi JavaScript i nettleseren tilgang til hardware-ressurser på enheten den kjører på. Om ikke lenge vil JavaScript via disse APIene ha tilgang til blant annet kamera og USB-porter på enheten. At JavaScript får slik hardwaretilgang har vi faktisk allerede i dag; WebOS er et operativsystem der alle hardware-ressurser er tilgjengelig for JavaScript og alle programmer på enheten er skrevet i JavaScript. Palm har allerede rullet dette på et par av sine enheter og etter at Palm blei kjøpt av HP har HP jobbet hardt med å få WebOS inn i nye enheter de produserer. Googles Chromium OS bygges rundt samme tanke.

Raskere og raskere

Mozillas monitor hvor de konstant sammenligner ytelsen på sin egen JavaScript motor med Googles V8 og Safaris Nitro.

Hastigheten på eksekvering av JavaScript har også skutt drastisk i været de siste årene. Hard optimalisering av JavaScript-motorene samt innføring av teknikker som JIT-kompilere, der JavaScript kompileres til nativ kode, og hardwareakseleratorer har ført til at utførelsen av JavaScript-funksjoner begynner å komme på nivå med mange andre språk.

I fjor kom også ECMAScript 5-spesifikasjonen som blant annet vil fjerne noen av de virkelig dårlige tingene i JavaScript, samt gi oss en større sikkerhet ved kjøring av JavaScript.

Mer eller mindre alle nettleserleverandører jobber i dag uten tvil meget hardt for å forbedre sine JavaScript-motorer og dette har stor betydning for utbredelsen av språket. Men, det er ikke bare på nettlesersiden det skjer spennende ting på JavaScript-fronten:

JavaScript på serversiden

Kall det gjerne en hype eller et moteord, men det er verdt å ta en liten titt på NoSQL-bevegelsen som kom på banen for et par år siden. De fleste av oss programmerere er mer eller mindre godt kjent med relasjonsdatabasen for lagring av data og den har definitivt sin plass, dog er den ikke optimal til alt den heller. NoSQL-bevegelsen er et sekkebegrep på datalagringstjenere som tilnærmer seg det å lagre data på nye måter. Nå skal vi ikke i denne artikkelen gå inn i diskusjonen SQL versus NoSQL, men det er et par ting ved NoSQL-bevegelsen som er verdt å merke seg. For det første designes de aller fleste av disse nye tjenerne rundt at de skal tåle store mengder data, kunne skalere og tåle høy trafikk, pluss at det skal være enkelt å bruke dem for en utvikler. Rent teknisk sett tar mange av disse tjenerne lærdom av hva som ikke har fungert optimalt før og hva store systemer som f.eks. Google Søk gjør for å håndtere massive mengder trafikk.

Som et resultat av at ting skal være enkelt, kommer mange av disse NoSQL-systemene gjerne med REST APIer med JSON som databærer. JSON er lik JavaScripts objekt notasjon og man kan i mange tilfeller eksponere et slikt REST API direkte på nett uten at man trenger å programmere opp sitt eget i et annet språk. Disse REST APIene kan man da jobbe direkte mot i fra en nettleser via AJAX-kall.

Titter man nærmere på hvordan man setter opp spørringer i endel NoSQL-tjenere, vil man ofte finne at dette gjøres med JavaScript som ligger server side. CouchDB og MongoDB er kanskje de mest kjente NoSQL-tjenestene som er bygget på en slik lest.

JavaScript server side er ikke noen ny idé. Netscape lanserte allerede i 1996 en applikasjonstjener, Netscape Enterprise Server, der programmeringsspråket var JavaScript. Det er blant annet flere, nå større, norske nettsteder som kjørte på det i sin tid. Det var ikke noen stor suksess den gangen. Netscape gjorde endel katastrofale feil i implementasjonen av denne tjeneren som førte til at den blei treg og systemet skalerte veldig dårlig. Siden det har det vært flere forsøk på server side JavaScript, men de fleste har slitt med de samme problemene som Netscape hadde med sin server. Dette har kanskje også bidratt til å gi JavaScript ryktet som et tullespråk hos utviklere, men her har det heller ikke vært JavaScript sin feil at ting ikke har vært optimalt. Det har vært implementasjonens feil. Inntil nå nylig.

I fjor så node.js dagens lys. Node.js er en server side-implementasjon av Google Chrome’s JavaScript-motor V8. Node.js er designet for å håndtere store mengder trafikk og en stor mengde samtidige brukere og er (nesten) totalt fri for blokkerende I|O og muligheten for at dead-locks skal oppstå.

Node.js har fått mye oppmerksomhet det siste året pga dette, det kommer daglig nye moduler og verktøy til node.js og det bygges flere og flere tjenester på node.js. Yahoo har blant annet begynt å adoptere node.js i sine server side-tjenester.

Vi vil garantert se flere node.js-lignende tjenere i tiden som kommer. Node.js i seg selv er spennende, men det som er mer spennende er at vi begynner å få en situasjon der vi kan ha ett og samme språk å forholde oss til i nettleseren, på applikasjonstjener-laget og i datalagrings-laget. Det er en kraftig kombinasjon man ikke skal undervurdere.

JavaScripts forbannelse

JavaScripts fødsel var forhastet. Som med alle andre forhastede ting er ikke alt optimalt og hos JavaScript har dokumentasjon på språket vært et sårt punkt. JavaScript blei fort puttet i båsen som tullespråk av skolerte programmerere som allerede var vant med modne og vel dokumenterte språk. På den annen side blei JavaScript plukket opp av designere og mindre skolerte utviklere som begynte å tøye grensene for hva man kan gjøre i en nettleser. Dette har vært språkets suksess – og forbannelse. Resultatet av dette er veldig mye dårlig JavaScript kode og ikke minst dårlig dokumentasjon på språket. Gjør man et søk i Google på ordet JavaScript, skal man ikke lese lenge på sidene som kommer på topp før man finner regelrett feilaktig dokumentasjon og eksempler. Det læres også bort veldig mye dårlig praksis.

Et godt startpunkt både for å lære seg JavaScript og for å finne onlinedokumentasjon, er uten tvil Mozilla Developer Center’s seksjon om språket.

I bøkenes verden er det heller ikke særlig bedre, dessverre. Det finnes haugevis med bøker på JavaScript, men det er bare en liten håndfull av dem som er virkelig gode bøker om språket. Av de gode bøkene er det tre bøker jeg har lyst til å trekke frem:

foto av de tre anbefalte bøkene

Object-Oriented JavaScript

Dette er en fin start for å lære seg JavaScript fra bunnen av samt godt egnet hvis man kommer fra et annet objektorientert språk som f.eks JAVA. Det er forøvrig verdt å merke seg at JavaScript har ingenting til felles med JAVA annet enn at navnet. Boken som er på røfflig 320 sider er skrevet av Stoyan Stefanov og gitt ut på Packt Publishing. Den gir en grundig innføring i JavaScript. Denne boken får deg fra å kunne ingenting om JavaScript til et nivå der du programmerer JavaScript slik språket er ment å benyttes.

JavaScript: The Good Parts

JavaScript har gode og dårlige sider og etter å ha lært seg det grunnleggende i språket, blir det viktigste å få oversikt over hva som er godt og dårlig. Denne boken, som tikker inn på snaut 150 sider, er skrevet av Douglas Crockford og påpeker akkurat disse tingene. Essensiell kunnskap fra mammen som «oppfant» JSON.

JavaScript: The Definitive Guide

Dette er JavaScript-bibelen. Boken er en referanseguide til alt som har med JavaScript å gjøre. Den er på godt over 1000 sider og er ikke en bok du leser fra perm til perm, men den er et utrolig viktig oppslagsverk når du trenger å slå opp på noe i språket.

Utsiktene framover

På tross av en en forhastet fødsel, en broket fortid med dårlige implementasjoner og dårlig dokumentasjon, er JavaScript på god vei til å bli et svært viktig språk. Trenden er at nettlesere blir raskere, implementasjonen av JavaScript mellom nettlesere blir bedre og APIene JavaScript kan prate med blir flere. Vi har også fått solide implementasjoner av JavaScript på serversiden og i skrivende stund er JavaScript på god vei til å ta topp-plasseringen som mest brukte språk hos GitHub. Det skal bli spennende å se hvordan språket implementeres, utvikles og adopteres blant utviklere i tiden fremover.

15 kommentarer

  1. @Sveinung JavaScript Patterns står definitivt på må lese lista mi. Det er jo Stoyan Stefanov som har skrevet den også. Jeg var også ganske godt fornøyd med boken Pro JavaScript Design Patterns, men unnlot å ta med den på denne lista da den er litt for viderekommende (kanskje mat for en seinere artikkel…).

    Det er helt riktig at at JSON er lik JavaScript objekt notasjon og ikke JavaScript objekter i seg selv. Jeg fikser i artikkelen.

    @Jakob Takk takk!

    Svar på denne kommentaren

    • Hei Aleksander.

      Brendan ville i hovedsak implementere en Scheme «interpreter», men noen hoder hos Netscape ville ha et skriptingspråk som så mer kjent ut, type C/Java – så han tok syntax derifra, men implementerte et funksjonellt språk.

      Funksjoner er i JavaScript «first class»(kan brukes som verdier, parameter osv) og du har «closures» – jeg er ingen ekspert – men dette er vel i Common Lisp.

  2. Trond K. Pettersen

    Veldig bra artikkel! Dessverre havner JavaScript ofte i skyggen til tross for at det er en av de aller viktigste teknologiene i webapplikasjoner.

    Kan ikke annet enn å nikke.. Få utviklere kan JS godt, men har allikevel sterke meninger om hvor «dårlig» det er. Tvert imot!

    Heldigvis gjør moderne biblioteker som YUI3, jQuery, m.fl. det enklere for folk å se at språket kan være bra, selv om DOM og antallet ulike utviklingsmiljøer/x-browser kan være utfordrende for noen og enhver. Mye hype rundt node.js, men absolutt lovende!

    Vil i likhet med Martin Dahl trekke frem YUI Theater og ikke minst Crockford on JavaScript (yuiblog.com/crockford/) som gode ressurser. Bør sjekkes ut av alle som jobber i webmiljø. I bokbundet form kan også «High Performance JavaScript (Build Faster Web Application Interfaces)» av Nicholas C. Zakas nevnes.

    Ang. NoSQL så er det helt klart mye hype rundt dette, samtidig som det ikke er til å unngå at enkelte *giganter* har behov hvor RDBMS’er ikke strekker til. Yahoo!, twitter, m.fl. har så store mengder data at tradisjonelle databaser rett og slett ikke skalerer (select * from tweet?). For øvrig bygger Yahoo! for tiden om hele medie-plattformen sin — datalageret er her basert på NoSQL grid’er (developer.yahoo.com/blogs/ydn/posts/2010/11/ynews-an-inside-look-at-rebuilding/). Om alle «små» bør kaste SQL-databasen sin på sjøen av den grunn, er vel noe som kan diskuteres…

    Bra at det settes lys på JS også på NRKbeta! 🙂

    Svar på denne kommentaren

  3. @ Marit – Brygger på et par lignende saker / oppfølgingssaker som jeg håper å få ut 🙂

    @ Aleksander – Jeg er dessverre ikke noen stor LISP / Scheme ekspert, men Sveinung har igjen riktig. Crockford, som flere her allerede har nevnt i kommentarene, har en fin liten sak som illustrerer litt.

    @ Martin – Ja. De fleste YUI Theater videoene er høyst å anbefale.

    @ Trond – Takk takk. Ja. Det er mye hype rundt NoSQL, men jeg tror faktisk at vi vil se større bruk av NoSQL i endel mindre og middels prosjekter fremover. Særlig der ressursene er begrenset. Ved at man også i en god del NoSQL tjenere jobber med JS, gjør det at man får mindre språk å forholde seg til og det er en lukrativ tanke når ressursene er begrenset.

    Svar på denne kommentaren

  4. Trygve, bra oppsummering. Etter å ha lest hvordan node.js har jeg fundert på hvordan tykke klienter bruker JavaScript til plug-ins. Ta f.eks. Chrome Extensions. Pure javascript (og html, da). Med egne objekter og APIer som JS koden kan benytte seg av. Og hele XUL-bevegelsen: Firefox, firebird, sunbird osv. Og så har man alle firefox extensions skrevet; der er det også JavaScript som ruler.

    JavaScript der er jo naturlig enkelt fordi de kjører i en browser som medfører at browser-utviklerne kjenner det godt, og det treffer godt i markedet for slike utvidelser, og jeg tror XUL er en undervurdert teknologi.

    Uansett, så har jeg fundert på å lage en JavaScript plug-in til den tykke klienten vi lager på jobben. All JS kode kjøres da i GUI-tråden, og blir tilbudt asynkroner API’er for å gjøre alt fra å hente ned en URL til å poppe opp en dialog eller hva det nå måtte være…

    Callbacks rule!

    Svar på denne kommentaren

  5. @ Erik – Ja. Debuggere i browsere er ganske interessante da de faktisk er kodet i JavaScript. FireBug for FireFox og Dragonfly i Opera er fine eksempler på det. Dog; browseren må kjøre for at extensions skal kjøre.

    En ting jeg har likt lenge er W3C Widgets. Man koder applikasjonen sin med HTML, CSS og JavaScript, legger på en liten konfigurasjon også pakketerer man dette som en zip fil, men med filnavnet wgt. Vips, man har en applikasjon.

    Opera har veldig god støtte for W3C Widgets og ved å ha Opera installert kan W3C Widgets kjøre som standalone applikasjoner. De havner bl.a på startmenyen som helt vanlige programmer.

    Jeg lagde her for litt siden en liten «test» radio player basert på NRK sine radio strømmer på denne måten. Kildekoden til den er her.

    Svar på denne kommentaren

  6. Lenke og embedding – same-same but different?

    […] tredagersvarsel for NRK på Marienlyst hentet fra yr.no. Det er ikke et innlimt bilde, men en liten JavaScript-boks hvem som helst kan putte på nettsidene sine. Den vil til enhver tid vise oppdaterte værdata […]

    Svar på denne kommentaren

Legg igjen en kommentar til Jakob Vad Nielsen Avbryt svar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *. Les vår personvernserklæring for informasjon om hvilke data vi lagrer om deg som kommenterer.