Blog: Swift: Apples nye programmeringssprog

Sammen med den nye version af MacOS X “Yosemite” og IOS8 har Apple også lanceret et nyt programmeringssprog Swift, der betragtes om en efterfølger til Objective C som hovedsproget til at skrive applikationer til både MacOS og IOS.

Jeg har set på beskrivelsen af sproget, og synes egentlig, at det ser fornuftigt ud. Der er f.eks. lånt mange elementer fra funktionsprogrammeringssprog: Anonyme funktioner (closures), tupler, sum-typer med parametre og pattern-matching (enumerates), option-typer, delvis typeinferens og polymorfi (generics).

Ligesom C# har Swift både structs og klasser, og igen ligesom i C# er structs værdityper, mens klasser er referencetyper. Det betyder, at der ikke er behov for spildopsamling (garbage collection) til structs, da de kopieres ved paramereroverførsel og -retur, så man kan nedlægge lokale kopier, når en funktion forlades. Klasser har til gengæld behov for spildopsamling, og her har Apple truffet det lidt usædvanlige valg at bruge reference counting, som dels ikke er specielt effektiv og dels ikke kan håndtere cykliske strukturer. Det sidste kan dog håndteres med weak references, men det lægger en byrde over på programmøren. Man bør derfor nok undgå cykliske strukturer, med mindre det er strengt nødvendigt. Reference counting er dog lidt nemmere at distribuere over flere CPUer med lokalt lager end tracing collectors såsom mark-sweep og copying collection.

Noget andet Swift har lånt fra funktionssprog er let-erklæringer. En let-erklæring definerer en variabel, der ikke kan gives en ny værdi senere, altså en immutable variabel.

Swift har også protocols, som svarer til interfaces i Java og C#, signaturer i SML og til typeklasser i Haskell. De bruges blandt andet til at pålægge type constraints til typeparametre, sådan at man kan specificere, at en instans af en typeparameter skal overholde en protokol. Man kan endvidere pålægge ækvivalenskrav til elementer af to forskellige typeparametre. Hvis for eksempel den ene typeparameter overholder en protokol, hvori der indgår en elementtype og den anden typeparameter overholder en protokol, der definerer en nøgletype, kan man erklære at elementtypen og nøgletypen skal være den samme, uden at specificere præcis, hvilken type dette er. Det svarer til sharing constraints i Standard MLs signaturer. I protokoller kan funktioner på værdityper såsom structs per default ikke ændre i denne værdi, men man kan eksplicit erklære funktionen mutable, så den kan.

Alt i alt ser sproget fornuftigt ud, selv om jeg stadig savner f.eks. den mere komplette typeinferens, man får i funktionelle sprog som for eksempel ML, Haskell og F#. Og Swift er endnu et eksempel på, at de ideer, der blev introduceret med funktionssprog som ML, breder sig ud i andre programmeringssprog. Eller som en (jeg husker ikke hvem) engang sagde: “Over time, any language will evolve to look more and more like ML”.

Posted in computer.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>