allt
Företag
datavetenskap
design
utveckling
vår resa
Strategimönster
Tack! Din inlämning har mottagits!
Hoppsan! Något gick fel när du skickade in formuläret.
Tack! Din inlämning har mottagits!
Hoppsan! Något gick fel när du skickade in formuläret.
Pedro Rolo

februari 21, 2024

Min läsning

Introduktion till programmeringsspråket Elm

Jag har tittat på Elm-programmeringsspråket och Elm-ramverket. De är en typad funktionell programmeringsmetod till frontend som påverkar andra populära tekniker på ett något störande sätt. Den här artikeln är en uppskrivning om vad jag har räknat ut om Elm.

Denna artikel kommer att delas upp i två delar. I den här första delen kommer jag att fokusera på de funktioner som gör Elm till ett intressant alternativ till Javascript.

I den andra delen kommer jag att fokusera på det historiska perspektivet som gör Elm värt en titt; utarbeta språkets två huvuddrag: funktionell renhet och statisk typning; och slutligen, titta på vem som använder Elm i den verkliga världen.

blå pil till vänster
Imaginary Cloud-logotyp

Vad är Elm?

Elm är ett ramverk och typat funktionellt programmeringsspråk som syftar till front-end-utveckling. Det inspirerar sig i ett programmeringsspråk som heter Haskell för att få mer underhållbarhet till Javascript, men hålla sig så enkel och nära Javascript som möjligt. Ramverkets arkitektur liknar Redux, som faktiskt var starkt inspirerad i Elm.

blå pil till vänster
Imaginary Cloud-logotyp

1. Elm är lätt

Glöm vad du har hört om funktionell programmering. Snygga ord, konstiga idéer, dåligt verktyg.
- Evan Czaplicki, Elms skapare

Vid utformningen av språket har Elms författare valt att sätta användaren i centrum för sina designval. Om du tittar på hans”Låt oss vara mainstream”, du kommer att märka ett starkt fokus på vem som är användaren (Javascript-programmeraren) och vad han behöver, genom att använda den så kallade Användningsdriven design. Denna filosofi reducerar språkfunktionerna till det väsentliga och gör det ganska lätt att lära sig.

Vänliga felmeddelanden

[En] nyligen anställd mjukvarudesigner hade spridit ut källlistor på konferensbordet och försiktigt passerat en kristall som hängde från en lång kedja över källkoden. Då och då markerade designern en cirkel i rött på listan. Senare frågade en av mina kollegor designern vad han hade gjort i konferensrummet. Det nonchalanta svaret: ”Hitta buggarna i mitt program”.
Detta är en sann historia, det hände i mitten av 1980-talet när människor hade stora förhoppningar om dolda krafter i kristaller.
- MIT Press,
Introduktion till algoritmer, Arton tryck (1997)

Elms felmeddelanden är extremt vänliga. Å ena sidan kommer detta från det statiska typsystemet, som gör det möjligt för kompilatorn att tydligt känna till och ange skillnaderna mellan de typer av värden som förväntas och de som tillhandahålls till våra funktioner. Å andra sidan, eftersom det inte finns några typklasser, är typen av information som visas i felmeddelanden mycket jordnära:


Förutom denna atypiska tydlighet bestämde språkdesignern att felmeddelanden skulle prioriteras, och förutom att formellt ange vad som är fel med programmen ger kompilatorn också ”tips” om vad som kan ha varit programmerarens avsikter och ger förslag på möjliga korrigeringar, till exempel:


Inga typklasser

[Haskell är värdelös.]
Simon Peyton Jones, Stor bidragsgivare till utformningen av programmeringsspråket Haskell.

Det stämmer, det här är nej Haskell - Elms främsta inspirationskälla. Medan man följde den användningsdrivna designprocessen behövdes många av Haskells funktioner inte och lades därför inte till språket. Bland dem var det ökända typklasssystemet.

Det systemet skulle ta med sig allt det pretentiöst klingande matematiska ordförrådet som vanligtvis hörs bland Haskell-programmerare och göra Elm helt olämpligt för den ”vanliga Joe”.

Men behöver vi inte typklasser? De måste tjäna vilket syfte som helst! Varför behöver Haskell dem och Elm inte? - Tja, svaret bygger på problemdomänen som adresseras av vart och ett av dessa språk: Medan Haskell är ett allmänt programmeringsspråk, är Elm inte det. Å ena sidan är Elm helt enkelt ett frontend programmeringsspråk och kan utföra den uppgiften bra utan att tillgripa så mycket komplexitet. Å andra sidan hanteras en del av vad sådan komplexitet syftar till att hantera av och döljs i Elm-körtiden - som tar hand om att hantera biverkningar och mutation på ett domänspecifikt sätt.

blå pil till vänster
Imaginary Cloud-logotyp

2. Elm är säker

Vi har haft noll körtidsfel [...]. Vi har också haft färre buggar, till stor del för att Elms typsystem tvingar dig att modellera din domän mer noggrant. För att sammanfatta det, vår chef har gett mandat att all ny kod ska skrivas i Elm.
— Jeff Schomay, Front-end-specialist på Pivotal Tracker

Elms typsystem är mycket säkert och det finns två konsekvenser av dess design som är värda att notera:

  • Det finns inga körtidsfel
  • Det finns inga nollvärden
  • Kontrolluttalanden tvingas hantera alla möjligheter

Inga körtidsfel

Mitt mål var att se till att all användning av referenser skulle vara helt säker, med kontroll som utförs automatiskt av kompilatorn. Men jag kunde inte motstå frestelsen [...]
Tony Hoare, uppfinnare av nollreferensen

Medan andra programmeringsspråk hanterar fel som en del av språket med mycket specifika funktioner - vanligtvis kallade undantag eller fel - har Elm inga specifika primitiv för att utlösa fel eller hantera dem. Risken för fel modelleras snarare genom de typer av värden som returneras och hanteras av funktioner. Vissa parametriska typer kan användas för att förmedla information om fel, till exempel typerna Kanske; Resultat och Uppgift.

Den Kanske typ är den enklaste av dessa. Det definieras som:

Den en i detta uttryck kan ersättas med någon specifik typ, t.ex. ett värde av typ Kanske sträng kan antingen anta ett värde som Bara ”någon specifik sträng” eller Ingenting.

Således returnerar en funktion ett värde på - till exempel - Kanske sträng kan returnera ett värde Bara ”Jag är den returnerade strängen” när du lyckas eller returnerar Ingenting när man misslyckas. Programmeraren tvingas senare alltid välja vad han ska göra i båda fallen och språket tillåter inte programmet att kompilera om båda möjligheterna inte hanteras.

Ingen noll

Det är genom det tidigare visade tillvägagångssättet som språket undviker att ha ett nollvärde. Och därmed bli av med alla de vanliga undefined är inte en funktion fel. Om det kan uppstå ett fel kommer typen uttryckligen att förmedla denna information och kompilatorn tvingar detta fall att hanteras av programmeraren.

Alla möjligheter måste beaktas

Eftersom Elm är ett rent funktionellt språk är syftet med att utvärdera något att få ett värde från det. Således tvingar Elm utvecklaren att tillhandahålla ett returvärde för varje kontrolluttalande. Detta innebär att varje om uttalandet behöver en annars klausul och fall uttalanden måste hantera alla möjliga ingångsvärden.

Låt oss till exempel titta på en abstrakt datatyp TypningDisciplin som kan antas som värde Statisk; Dynamisk eller Gradvis:


och om vi hanterar något värde av denna typ som inmatning av en case-sats (en switch-sats), men glömmer att hantera en av möjligheterna:


kompilatorn kompilerar programmet:


Således när vi ändrar våra typer för att lägga till mer funktionalitet, blir vi meddelade av kompilatorn att det finns någon kod som behöver läggas till för att hantera en ny möjlighet.

blå pil till vänster
Imaginary Cloud-logotyp

3. Elm är kul

Du måste hitta det du älskar.
- Steve Jobs

Alm kort återkopplingsslinga och överskådlig syntax gör det till en mycket trevlig miljö att arbeta med. Låt oss ta en titt på hur dessa saker bidrar till Elms utvecklarglädje.

Kort återkopplingsslinga

Undvik framgång till varje pris.
Simon Peyton Jones, Stor bidragsgivare till utformningen av programmeringsspråket Haskell.

En intressant konsekvens av de tidigare beskrivna säkerhetsfunktionerna är hur de förkortar återkopplingsslingan. Programmeringsaktiviteten består vanligtvis av att iterera genom följande aktiviteter:

  • Tänker - tänker på koden att skriva
  • Skriva - skriv koden
  • Kompilera - fixa koden så att den kompileras
  • Testning - testa om koden gör vad den var tänkt

Det sista steget är ofta där utvecklarna tillbringar mest tid, och den här tiden spenderas antingen på att skriva automatiserade tester eller interagera med programmet för att bekräfta att det är korrekt. De flesta programmerare skulle säga att denna fas är den minst glada.

Elms säkerhet och brist på körtidsundantag överför en del av Testning fasinsats in i Kompilering fas. När du använder Elm kommer programmeraren att spendera lite mer tid på kompileringsfasen - interagera med kompilatorn tills programmet anses vara korrekt - och mycket mindre tid i testfasen, när det enda som kan misslyckas är om affärskraven är uppfyllda - och inte om programmet kraschar eller inte.

När du använder Elm kommer programmeraren att få feedback om sina misstag tidigare, utan att behöva spendera så mycket tid i den långa testfasen.

Oöverskådlig syntax

Elms syntax är inspirerad av Haskell och minimalistisk. Det finns bara två kontrolluttalanden; och väldigt få reserverade ord.

Mitten för denna syntax är funktionen. Om det mest använda syntaktiska inslaget i något strukturerat programmeringsspråk är funktionsåkallandet, varför använder de flesta språk i Algol-stil så många specialtecken för funktionsåkallande och definition?


För att skriva ovanstående definition och anrop var vi tvungna att skriva 8 specialtecken för funktionsdefinitionen:

och 4 på funktionsåkallandet:

Beroende på tangentbordets språk varierar antalet tryckta modifieringsknappar; irritation och för tidig repetitiv belastningsskada.

Elm rensar upp detta. Om funktionen är så viktig bör den enkelt skrivas och redigeras:


Som du ser behöver denna funktionsdefinition inga specialtecken. Typsignaturer är valfria och härleds automatiskt av kompilatorn, så att vi snabbt kan experimentera utan att behöva ange dem uttryckligen. Ändå är de användbara: ibland är det praktiskt att ha typsignaturen som vägledning när du skriver en mindre uppenbar kod, och de är ofta en användbar form av dokumentation. Således, i Elm, skrivs typsignaturer (valfritt) i en separat rad (vissa redaktörer genererar typsignaturen automatiskt när vi ber om det!) :


En annan egenskap som gör språket ganska roligt att använda är att varje funktion är curried och därmed kan tillämpas på en delmängd av dess argument, vilket returnerar en så kallad partiellt tillämpad funktion som bara väntar på de saknade argumenten. Således följande kod:


motsvarar följande Javascript-kod:


Den största fördelen med den här funktionen är att kod som använder högre ordningsfunktioner blir mycket ren:


Men om vi kedjar dessa operationer börjar vi få ett hav av kapslade parens typiska från a Läspa:


För att undvika detta problem tillhandahåller språket röroperatörerna (<| och |>). De tillåter kedjningsfunktionsapplikation med en syntax som liknar att tråda ett argument genom en pipeline av transformationer:


På liknande sätt; du kan också använda kompositionen (<<) eller omvänd sammansättning (>>) operatörer för att uttrycka detsamma utan att uttryckligen behöva hänvisa till argumentet som gängas:


Denna bekvämt kortfattade syntax, tillsammans med de fina felmeddelandena, gör Elm mycket lämplig för interaktiva experiment, både genom att använda REPL och genom att använda kompilatorn.

Trevligt verktyg

När du startar ett Elm-projekt får du omedelbart massor av funktionalitet direkt från lådan:

  • Ett renderingsramverk baserat på virtuell Dom (som Reagera)
  • En tillståndsbehållare (som Redux)
  • Den oföränderlighet som i JS vanligtvis uppnås genom att använda Immutable är en del av Elm-språkdefinitionen
  • Typkontroll - liknande - men starkare - än den du kan få genom att använda Flöde
  • En interaktiv utvecklingsmiljö som liknar den som tillhandahålls av Webpack, kallad Elmreaktor
  • En pakethanterare som heter elm-package

Och det är värt att utarbeta några andra verktyg:

Tidsresande felsökare

Detta är en av de saker Redux fick från att implementera Elm-arkitekturen. När vi utvecklar och provar ett program kan vi inspektera de åtgärder som utförs på det gränssnittet och gå fram och tillbaka i tid för att analysera programmets tillstånd vid varje ögonblick av dess körning.

I Redux är denna funktionalitet ganska ömtålig på grund av Javascripts tvingande natur, och för att klara det måste man använda Oföränderlig eller ett annat bibliotek för att undvika att direkt mutera programmets tillstånd. I Elm existerar detta problem helt enkelt inte, eftersom det inte finns något sådant som mutation på språknivå. Språkdesignen i sig skyddar oss från denna typ av problem och från behovet av att använda ytterligare bibliotek.

Online-redaktörer

Dessutom kan du fikla med språket direkt i webbläsaren - utan att behöva installera något. Följande är ett bra exempel på en webbplats som tillhandahåller live-redigeringsfunktionalitet:

  • Ellie, bra för att experimentera med mer än en fil och tillåta användning av ytterligare paket som inte hör hemma i språkets kärna.

Automatiskt påtvingad semantisk version

När du publicerar en ny paketversion kontrollerar Elm-verktyget om funktionerna som exporteras av våra moduler:

  • ändrade sina signaturer;
  • endast exporterade nya funktioner;
  • eller ändrade inte signaturerna för de exporterade funktionerna.

Enligt var och en av dessa möjligheter kommer ändringen att återspeglas på det automatiskt beräknade paketets versionsnummer, vilket gör det klart om ändringarna är stora förändringar; mindre ändringar eller buggfixar; och om det är säkert att uppgradera versionen av ett bibliotek som används.

blå pil till vänster
Imaginary Cloud-logotyp

Fortsätts

I del 2 - tillgänglig här - Jag kommer att prata om varför statisk typning och funktionell renhet ges, de nuvarande Javascripts ekosystemtrender. Jag kommer också att prata om vem som använder Elm och hur mogen den är. Håll dig uppdaterad, jag kommer att skriva om det nästa vecka.

Vid Imaginärt moln Vi har ett team av experter på mjukvaruutveckling. Om du tror att du kan behöva lite hjälp med ditt digitala projekt, skicka oss en rad här!

Ready for a UX Audit? Book a free call

Hittade den här artikeln användbar? Du kanske gillar dessa också!

blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
blå pil till vänster
Imaginary Cloud-logotyp
Pedro Rolo
Pedro Rolo

Rails utvecklare med 10+ års erfarenhet av olika tekniker. Jag är intresserad av funktionell programmering.

Läs fler inlägg av denna författare

Människor som läste det här inlägget tyckte också att dessa var intressanta:

pil vänster
pilen till höger
Dropdown caret icon