Anders Hejlsberg: Typescript-compiler giver Javascript-udviklere mere intelligente værktøjer

19. april 2017 kl. 05:115
Anders Hejlsberg: Typescript-compiler giver Javascript-udviklere mere intelligente værktøjer
Illustration: Jesper Stein Sandal.
Selv hvis man ikke vil bruge klasser eller faste typer, så giver compileren til Typescript mulighed for at hjælpe Javascript-udviklere, mens de skriver koden, fortæller Anders Hejlsberg.
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

Typescript er én af de nye stjerner blandt programmeringssprog, og det skyldes måske, at sproget reelt handler om at hjælpe udviklere med at skrive applikationer i et andet, og endnu mere populært programmeringssprog: Javascript.

»Vi havde et hold hos Microsoft, som arbejdede på Outlook Web Access. De skrev først programmet i C#, og så oversatte de det til Javascript. Dét var gnisten, der satte det i gang for mig,« fortæller Anders Hejlsberg, som er technical fellow hos Microsoft og de seneste seks år har arbejdet på Typescript.

Anders Hejlsberg har hos Microsoft tidligere blandt andet stået bag C# og Roslyn-compileren - og før det skabt Turbo Pascal og Delphi hos Borland - så værktøjer til at hjælpe udviklere med at skrive kode har været en del af hans arbejde i mere end tre årtier med udvikling af programmeringssprog og compilere.

Version2 fangede Anders Hejlsberg til et interview i forbindelse med Microsofts Tech Summit i København.

Artiklen fortsætter efter annoncen

Typescript er altså ikke skabt for at konkurrere med Javascript, men snarere som et værktøj for dem, der skriver store applikationer i Javascript.

Javascript er det ægte cross-platform sprog

Javascript blev oprindeligt skabt som et alternativ eller supplement til Java-appletter i browseren. I begyndelsen blev det brugt til små scripts, men efterhånden voksede de til flere tusinde kodelinjer.

»Man kan med nogen ret sige, at Javascript er det eneste cross-platform-sprog, der tæller i dag. Men Javascript var beregnet til maksimalt et par hundrede kodelinjer. Nu ser vi applikationer på flere tusinde, hvis ikke ligefrem hundredetusindevis af kodelinjer. Det er virkelig imponerende, hvad der kan lade sig gøre i Javascript i dag,« siger Anders Hejlsberg.

De små scripts betød, at det ikke var noget problem, at udvikleren ikke på forhånd skulle definere en type, når en variabel blev deklareret. Udvikleren var i stand til at overskue sin kode og vidste, om en variabel eksempelvis pegede på et array eller et heltal.

Artiklen fortsætter efter annoncen

Kode på tusindvis af linjer, hvor variable skal sendes til funktioner, udvikleren måske ikke selv har skrevet, giver problemer. I udviklingsværktøjerne til sprog, hvor der er mulighed for typefasthed, kan værktøjet hjælpe udvikleren med advarsler om mismatch mellem typer. Det er ikke helt så nemt i et sprog som Javascript, og det er visionen for Typescript, at udvikleren skal hjælpes.

»Hvis alt, du skal skrive, er 10 linjers kode, så er det ok, at du ikke bruger typer. Men jo større din kode er, jo vigtigere er det at dokumentere, hvad din kode gør. Og der kan et typesystem være en lifesaver,« siger Anders Hejlsberg.

Typescript er et 'super set' af Javascript. Det vil sige, at Javascript - eller helt præcist de forskellige versioner af ECMAScript, som i daglig tale bliver til dét, der implementeres som Javascript i browserne - er en ægte delmængde af Typescript.

Typer er stadig valgfrie i Typescript, fordi almindelig Javascript også er gyldig Typescript-kode, men ved at angive typer kan udvikleren fortælle compileren, hvad intentionen med koden er. Compileren kan bruge typeangivelsen til at kontrollere, om en variabel anvendes korrekt gennem hele kodeforløbet.

Typegæt i Javascript

Javascript bruger ingen compiler. Det er et script-sprog, som først tjekkes, når man kører scriptet. Med Typescript-compileren kan man tjekke for en række af de fejl, som ellers først ville blive opdaget ved kørslen. Men takket være den nære tilknytning mellem Typescript og Javascript, så kan Typescript-compileren også hjælpe med at tjekke Javascript uden faste typer.

»Vi kan lave et bedste bud på et typetjek, som kan hjælpe meget. Det er et konservativt tjek, hvor vi kun fortæller dig, hvis vi er sikre på et problem. Men det kan hjælpe med at fange fejl og give mulighed for lettere at lave refaktorering af koden,« forklarer Anders Hejlsberg.

Analyse af, hvordan koden vil opføre sig under kørsel, er en central del i Roslyn-compileren, som Anders Hejlsberg har stået i spidsen for at udvikle hos Microsoft.

»I gamle dage, når du byggede en compiler, og sådan som det stadig står i lærebøgerne, så kom du noget kildekode ind i den ene ende og fik noget ny kode ud i den anden. Det var sort magi, hvad der foregik inde i mellem. Det har ændret sig meget. Nu er compileren en service til sproget, som giver intelligensen bag kodeforslag. Når du trykker 'foo.', så kommer der få millisekunder senere forslag til, hvad der kan stå efter punktummet. Der ville den klassiske compiler ikke have en chance,« forklarer Anders Hejlsberg.

Roslyn-compileren er én af den nye type compilere, som kan arbejde mere trinvist og være med til at understøtte processen, mens man skriver sin kode. Compileren kan fortolke på den ufærdige kode og forsøge at komme med et kvalificeret gæt på, hvordan en stump af koden skal forholde sig til resten.

Artiklen fortsætter efter annoncen

Det kan bruges til at fange fejl, men det kan også gøre det mere sikkert, hvis man eksempelvis vil lave navnet om på en funktion eller en variabel, fordi compileren forstår, hvor og hvordan den bruges gennem koden.

Og selvom man kun skriver i den delmængde af Typescript, som er Javascript, så kan compileren give en hånd, som kan gøre udvikleren mere effektiv.

Kan spænde over kløften til gamle versioner

Javascript kan i dag anvendes både til klassiske webapplikationer i browseren, men også via eksempelvis Node.js til serverdelen af webapplikationer, og med frameworks som React Native eller Electron er det muligt at bruge Javascript til mobil- og desktop-applikationer.

»Javascript er mest knyttet til frontend, men det har utrolig spændvidde. Hvis der for fem år siden var nogen, der havde sagt til mig: 'Anders, om fem år vil du skrive compilere og IDE'er i Javascript', så havde jeg sagt 'den er god med dig',« siger Anders Hejlsberg.

Takket være væsentlige forbedringer i Javascript-motorerne er det blevet muligt at skrive mere komplekse programmer med god ydelse i forhold til, hvordan det så ud for bare ti år siden.

En af udfordringerne ved Javascript er dog, at udviklingen inden for, hvad man gerne vil med sproget, ikke nødvendigvis svarer til, hvad man kan i praksis.

»Der er en kløft. Når vi taler om 'state of the art Javascript', så mener vi lige nu ECMAScript 2016. Men det er ikke, hvad du kan forvente at kunne køre på nettet,« forklarer Anders Hejlsberg.

Brugerne kan sidde med ældre browsere eller enheder, hvor den nyeste version ikke er implementeret. I stedet for at lave forskellige versioner af koden til forskellige browsere, så kan man kode i Typescript og så vælge at transpile til den ønskede udgave af ECMAScript.

I princippet er der ikke noget, de ældre udgaver ikke understøtter, det kræver blot noget mere kode, og det kan compileren hjælpe med. Dermed kan man skrive sin applikation i den nyeste version af Javascript og udnytte de nye muligheder, men oversætte til en version, der er kompatibel med brugernes virkelighed.

Værktøjer frem for features

Typescript oversætter til Javascript-kode, og selvom Javascript ikke som sådan understøtter klasser, så kan man skrive en klasse i Typescript, sådan som man ville forvente, hvis Javascript var et typisk objektorienteret sprog med klasser og nedarvning.

»Når du skriver en klasse i Typescript, så bliver den oversat til en funktion i Javascript,« forklarer Anders Hejlsberg.

  1. // Eksempel på objektorienteret programmering i Typescript
  2.  
  3. class Captain {
  4. fullname: string; // Type-deklaration
  5. constructor(public firstname, public middleinitial, public lastname) {
  6. this.fullname = firstname + " " + middleinitial + " " + lastname;
  7. }
  8. }
  9.  
  10. interface Person {
  11. firstname: string;
  12. lastname: string;
  13. }
  14.  
  15. function greeter(person: Person) {
  16. return "Hello, " + person.firstname + " " + person.lastname;
  17. }
  18.  
  19. var user = new Captain("James", "T.", "Kirk");

Ovenstående eksempel bygger på denne tutorial fra Typescript-hjemmesiden.

Det er blot ét eksempel på, hvordan Typescript bag kulissen kan tilføje funktioner til Javascript, men uden at ødelægge kompatibiliteten på tværs af platforme, som er Javascripts store styrke.

Et andet hyppigt problem i Javascript, som Typescript-holdet har forsøgt at løse, er null-pointer-fejl, som typisk resulterer i en 'undefined'-fejl. I Javascript er null og undefined som regel gyldige værdier, og det gør det let at komme til at returnere undefined, når en egentlig værdi forventes.

»Vi har sagt, at der i Typescript 2.0 ikke kan være noget, der er null eller undefined, medmindre du har sagt, at det også kan være en gyldig værdi med 'union'. Når du så bruger en compiler til at angribe null-fejl, så forstår compileren flowet i din kode og ved, hvornår noget må være null. Det bliver meget sværere at begå fejl, når du har nogen til at kigge dig over skulderen,« siger Anders Hejlsberg, som også har forklaret nærmere i denne video.

Tanken er ikke at ændre i Javascript eller erstatte de frameworks som eksempelvis JQuery, der bygger på Javascript, men snarere at give Javascript-udviklerne to ting, som Javascript i sig selv nok ikke får.

»Vi ser det som vores fokus at bygge et typesystem og udviklerværktøjer til Javascript - men vi er ikke frameworks-branchen, og vi vil heller ikke lave nye sprogfeatures. Der ser vi i stedet på at bidrage til udviklingen af ECMAScript, hvor vi for eksempel har foreslået async / await til den næste version,« fortæller Anders Hejlsberg.

5 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Tophistorier

Debatten
Vær med til at skabe en god debat ved at følge vores debatregler.

For at deltage i debatten skal du have en profil med adgang til at læse artiklen. eller opret en bruger.
settingsDebatvisning
5
20. april 2017 kl. 10:15
The other side of the coin

The problem with JavaScript is not that it is a dynamically typed prototype based object-oriented language without classes. That is actually JavaScript’s strength. The problem is that it is a poorly designed language, filled with many hidden land mines awaiting the unsuspecting developer.

https://walkercoderanger.com/blog/2014/02/typescript-isnt-the-answer/

TS er med til at få JS til at ligne andre nutidige programmeringssprog hvilket nok virker for nogle. Men efter at have set på adskillige tusind linjer Angular 1 kode der skal genskrives - helst i TS - for at kunne anvendes under Angular 2 - i sig selv et moving target - er det lidt svært at have meget varme følelser for TS.

4
20. april 2017 kl. 10:13
Jeg er meget glad for TypeScript

Når man som jeg i årtier har levet med typestærke, objektorienterede programmeringssprog, er JavaScript ganske væmmeligt.

Jeg har nu i et par år arbejdet med TypeScript (sammen med JQuery og Bootstrap), og det er en ganske dejlig oplevelse. Nu har jeg pludselig et »rigtigt« programmeringssprog at kode webklienter i.

Det kræver dog nogen disciplin ikke at forfalde til JavaScript-lignende konstruktioner. Man kan i TypeScript godt snyde typekontrollen ved at angive at en variable er af type "Any".

3
20. april 2017 kl. 10:05
Re: Millioner af linjer

Fred være med folk der gerne vil have stærkere typer. Til det ser TypeScript ud til at være bedst. Personligt kan jeg godt lide babel for den holder sig til standarden så det er mere fremtidssikret og koden bliver mulig at køre i browsere uden transpiling på et tidspunkt. Jeg vil kalde det en skrøne at de stærkere typer i TypeScript er det der skal til for at vedligeholde store applikationer. Fair nok at nogle programmører virkelig godt kan li dem, men de er altså ikke et must. Det gælder slet ikke for backend og node.js hvor modularisering og det at gøre som resten af OSS folket er det der virker. Og i frontend er det "svære" at de forskellige frameworks hele tiden bliver major versioned. Eller helt udfaset og erstattet med noget nyt og bedre. Der hjælper stærkere typer desværre ikke.

2
20. april 2017 kl. 08:30
Re: Millioner af linjer

Der er ikke mange der skriver ren vanilla javascript mere og der er massere af alternativer til Typescript.

Men med Typescript får du alt det du nævner plus type-support og ES7 features såsom decorators.

I mine øjne er Typescript den mest gennemførte løsning til store frontend applikationer og det faktum at selv Google har valgt at omfavne det med Angular vidner også derom.

Typescript = ES6 + ES7 + typer

1
20. april 2017 kl. 00:01
Millioner af linjer

Vi har haft javascript applikationer på flere millioner af linjer af JavaScript i tre-fire år nu. Det virker fint når du modulariserer og tester din kode godt. ES6 er lækkert. Det kan fx babel compileren give dig i browseren. På serveren giver den seneste node.js version nærmest det hele out of the box. Incl. Spread operators og async/await