Et sip Elixir

IMG_0052

Sidste år var jeg afsted på GotoCPH14, og skrev om det her på qed.dk. En af de ting der vakte min nysgerrighed var Elixir.

Så efter konferencen besluttede jeg at det var noget jeg måtte lære. Følgende er mere en gennemgang af hvorfor jeg synes Elixir er interessant, hvilke features der måske vil få dig som læser til også at undersøge Elixir nærmere. Skulle det ske vil jeg anbefale at man kikker på Elixirs getting started guide som det første, der finder man en glimrende guide til hvordan man kommer i gang, og gennemgang af alle sprogets kerne-features. Selv kastede jeg mig efterfølgende over Pragmatic  Programmers Elixir bog for at blive endnu klogere. Bestemt en bog jeg kan anbefale.

Den ultra-korte introduktion er, at det er et funktionelt sprog der kører på Erlangs VM, og understøtter brug af super-letvægts tråde der er fri for (undskyld jeg bander) “shared mutable state”. (se et simpelt “hej Elixir” nedenfor)

iex(1)>IO.puts "hej Elixir"
hej Elixir
:ok
iex(2)>

Den første ting der gør Elixir interessant er José Valim, skaberen af sproget. Man fornemmer tydeligt at han har studeret mange sprog, og skabt en vision for Elixir. Hele sproget og universet omkring virker enkelt og gennemtænkt, man behøver ikke have studeret sproget i årevis for at dykke ned i “sovsen” og det er relativt nemt forstå hvad der forgår.

Det første interessante valg José har taget er at vælge Erlangs VM som platform og Erlang som værtssprog. Erlang er kendt for at have utroligt letvægts tråde, og kan håndtere tusinder på samme tid uden at få den mindste sved på panden. Desuden er der de kraftfulde OTP biblioteker, der indeholder værktøjer til nemmere at konstruerer pålidelige fejltolerante applikationer. Selv hvis man ikke finder Erlang og Elixir interessant  bør man studere filosofien bag OTP, og kan der på det varmeste anbefale Joe Amstrongs afhandling Making reliable distributed systems in the presence of software errors

Det lyder måske lidt halv akademisk, men det er faktisk særdeles interessant læsning.

Erlang har flere features og er i sig selv en interessant platform, men vil mene at Elixir har en fladere indlæring-kurve, samt andre features Erlang ikke har, med andre ord synes jeg man får en del mere for sin investerede tid hvis man satser den på Elixir, at man så med tiden nok bør lære sig lidt Erlang også hvis man for alvor kaster sig over at bruge Elixir er så en anden sag.

Der er som nævnt flere ting værd at fremhæve ved Elixir, i det følgende vil jeg uddybe nogle enkelte.

Elixir som moderne sprog, kommer naturligvis med fuld support for UTF-8, og tilmed er strenge repræsenteret som binær data, der blandt andet betyder at noget så simpelt som længden af en streng er korrekt, hvilket andre sprog der også understøtter UTF-8 har problemer med. Som de skriver i deres “getting started guide”, “Elixir passes all the tests showcased in the article “The string type is broken”

Den næste ting, jeg synes er værd at fremhæve, og et tydeligt tegn på at Elixir har lært fra andre nyere sprog er brug af såkaldte “Protocols”. En sprog-konstruktion der løser det, måske knap så kendte og usexede Expression Problem“ (se in simple definition af en protokol i Elixir nedenfor)

defprotocol Blank do
  @doc "Returns true if data is considered blank/empty"
  def blank?(data)
end

Protocols, minder en lille smule om det man i Java kalder et interface, med den lille fikse forskel at man ikke behøver, at beslutte sig for hvilke protocols fx en klasse eller objekt skal implementere når man skriver koden, som man jo gør med et interface. Det kan derimod kobles til uafhængigt og altså også uden problemer bruges på konstruktioner man ikke selv har skrevet. Vil ikke afvise at jeg i mit forsøg på at være kortfattet har forvirret mere end godt er, så igen vil jeg henvise til Elixirs beskrivelse af protocols, som indeholder uddybelse af eksemplet med protokollen “Blank”.

defimpl Blank, for: Integer do
  def blank?(_), do: false
end

En vigtig del af, hvor nemt et sprog er at bruge og hvor produktiv man kan være, er hvilke værktøjer der følger med. Her mærker man at udvikling og integrering af værktøjer har været på dagsorden fra starten, og derfor en uadskillelig del af hvad Elixir er. Specielt hentyder jeg til Mix, Hex, Doc. Der henholdsvis er medfølgede bygge-værktøj, pakke-manager, og understøttelse for i koden placeret dokumentation, hvor man blandt andet kan indlejre små eksempler, som kan valideres sammen med andre unit test, man selvfølgelig har hakket sammen.

Elixir er nærmest et fad af kirsebær plukket fra det store programmeringssprogstræ, af yderligere kendte koncepter. Elixir har plukket kan nævnes Makroer, der er lige så kraftfulde som dem man ser i LISP familien. Lazy lists, immutable datastruktur samt unix lignede “pipes”. “|>” (se eksempel)

iex(2)> odd? = &(rem(&1, 2) != 0)
#Function<6.90072148/1 in :erl_eval.expr/5>
iex(3)>  1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
7500000000

Min korte gennemgang kan måske give det indtryk, at der er tale om en rodebunke af smarte ting, men det er faktisk lige det modsatte, det er et elegant sprog og mit indtryk er at man kan være særdeles produktiv. Der er et voksende fællesskab og antal af biblioteker af meget høj kvalitet.

Senest er Phoenix, et web framework, gået i luften.

Det er bestemt mit håb at dette skriv, gør nogen nysgerrig efter at lære lidt Elixir, eller blevet inspireret sådan på en meta-agtig måde, til selv at finde finurlige teknologier at grave sig ned i. Har ihvertfald selv et håb om at jeg også på dette års http://gotocon.com/cph-2015 finder noget jeg får lyst til at lære, og allerhelst noget der gør jeg kan lave bedre software.

5 comments for “Et sip Elixir

  1. Tak for et rigtig godt indlæg om Elixir!

    Jeg er selv ligeså begejstret for sproget som dig, og for en udvikler som mig, der har en forkærlighed for både Rubys æstetik og for mulighederne med veludviklede, funktionelle programmeringssprog, udgør Elixir en elegant og slagkraftig kombination, som jeg forventer vil være en fast del af min værktøjskasse i de næste mange år.

  2. Er Elixirs protocols fuldstændig lig Clojures? Jeg har ikke brugt sidstnævnte selv, og ikke læst nok om dem til at gennemskue det.

    Jeg synes også at Elixir er spændende 🙂 Jeg kunne godt tænke mig at vide præcist hvad det er, der gør Elixirs (og Erlangs) processes et bedre alternativ i nogle situationer end “normale” tråde – det håber jeg på at få svar på til et meetup 🙂

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *