read

Brunost: Et nynorsk programmeringsspråk

Jeg har alltid vært fascinert av esoteriske programmeringsspråk. Et eksempel på dette er Chef, der koden er en matoppskrift.

Eller hva med Rockstar, der koden er skrevet i 80-talls rocketekster?

Og nå har vi Brunost!

Test(Kode-blokker på nettsider støtter ikke Brunost enda, så derfor er koden skjermbilder)

Brunost er et nynorsk og funksjonelt språk der typene er nesten like løse som løfter fra politikere.

Men hvorfor?

For en stund tilbake kom jeg over denne Wikipedia-siden, som har en hel haug med språk som ikke er på engelsk, og det var denne som først ga meg ideen om et norsk programmeringsspråk.

Først vurderte jeg å bruke samisk… men jeg kan ikke samisk… og motivasjonen min for å lære meg samisk bare for å lage et programmeringsspråk var heller lav.

Bokmål virket kjedelig, for det er det jeg skriver til det daglige, så da ble det ✨nynorsk✨.

Skal det være nynorsk, så skal det være nynorsk

En av de første ideene for språket er at alt må være nynorsk.
Ikke bare syntaksen, men også variabler og funksjoner. Alt må sjekkes mot en nynorsk ordbok! Og skriver man noe som ikke er nynorsk, vel… da feiler applikasjonen.

Dette er kanskje den største utfordringen med å skrive Brunost-kode i dag: Hvis ordene du bruker ikke finnes i ordboka, feiler applikasjonen:

Vil du lage en applikasjon som kalkulerer “BMI”? Hvis du har en funksjon som heter “kalkulerBMI”, vil den feile. Hvorfor? BMI er ikke i den nynorske ordboka!

Dette er et system jeg har planer om å utvide slik at strenger, uansett om de kommer fra en database, er skrevet av brukeren eller fra en fil, også må inneholde nynorsk.

I Brunost er nynorsk et krav.

Zig + WebAssembly: fordi hvorfor ikke

Når man lager et interpretert programmeringsspråk, så kan man bruke så å si alle andre språk og bygge på. Jeg tenkte at det var en grei sjanse til å prøve ut et nytt språk: Zig.

Zig er et språk som prøver å være en utfordrer til C (og til dels C++). Med andre ord er det et språk som er ganske “low-level”, og jeg hadde nok spart meg for mye hodebry om jeg hadde skrevet dette i noe litt mer “high-level”. Men samtidig, hvorfor ikke? Skal man først gjøre noe, kan man jo prøve å lære litt samtidig.

En av tingene som er flott med Zig, er at Zig gjør det veldig enkelt og krosskompilerer til forskjellige targets. Fra ganske tidlig av hadde jeg støtte for Mac (både Intel og ARM) samt Windows og Linux. 

Zig gjorde det også lett å få interpreteren til å kjøre i nettleseren som en WebAssembly-deployement. Det viktigste var å ordne noen detaljer rundt input/output for terminal-modulen og sette compilers target til “wasm32”.

Under et par timers arbeid kjørte Brunost i nettleseren!

Kort språkoversikt

Det er allerede en del støtte i språket for det meste man kan trenge:

  • If-then-else

  • Loops

  • Lese og skrive til terminalen

  • Brukerdefinerte moduler

  • Immutable verdier

  • Try-catch

Variabler og mutabilitet

Brunost har et ganske eksplisitt forhold til mutabilitet, og har lignende støtte for endring av variabler som Kotlins "var" og "val".

Bruker man nøkkelordet "fast" så kan man ikke endre på det i etterkant.

Men bruker man nøkkelordet "endreleg" så kan man fint endre verdien:

Hvis du prøver å endre noe som er fast så vil programmet kaste en feilmelding.

Kontrollflyt: viss, ellers, medan

Er det noe de fleste språk trenger så er det loops og if-statements, og Brunost er intet unntak!

Conditionals

De fleste språk forsøker å kommunisere så mye som mulig med så lite tekst som mulig.

Ikke i Brunost.

I Brunost ønsker vi å nyte nynorsk. Derfor har vi nøkkelord som "viss" og "gjer". Vi har sjekker som sier i intuitiv nynorsk "erStørreEnn" og "erSameSom":

(Ja, jeg vet at kommentarene er på Engelsk. Dette er uakseptabelt og i fremtiden så vil jeg sjekke kommentarer mot ordboka!)
Løkker

I Brunost så har vi også løkker (loops). Vi har to av dem faktisk!

Vi har en klassisk "foreach" løkke:

Og vi har en "while" løkke:


Game of Life

En av måtene å demonstrere at et programmeringsspråk er Turing Complete er å implementere Conway’s Game of Life. Og selvfølgelig er Brunost Turing Complete, så her har vi 120 linjer Brunost kode som harmonisk simulerer game of life:

Hele koden kan du lese her.

Om du vil ha flere eksempler, som FizzBuzz og Fibonacci, så finner du dem i “examples” mappen på GitHub.

Brunost: Neste steg for IT-Noreg?

Forhåpentligvis ikke, men det betyr ikke at vi ikke kan fortsette å ha det litt gøy med språket likevel.

Jeg har lyst til å videreutvikle språket til et nivå at det kan hoste enkle nettsider. Ikke at noen burde lage nettsider i Brunost, men det ville vært gøy å ha en Brunost side dedikert til Brunost språket skrevet i Brunost.

Det er også noen flere mindre funksjonaliteter jeg ønsker å legge til, som HashMaps, et bibliotek for å lese og skrive filer, noe binary-støtte, samt FFI støtte slik at Brunost kode kan kalle andre språk.

Ellers så er jeg nøgd med at Brunost forblir et “esolang”.

Om du har noen tanker om noe som ville vært gøyalt å se i Brunost så gjerne ta turen over til GitHub og kom med noen forslag!

Vil du lese mer om brunost? Ta turen innom min personlige hjemmeside, hvor jeg går mer i detalj og deler flere kodeksempler!

Kategorier : programmering, IT og teknologi

Nylige innlegg

Aktuelt fra bspoke

link
read

Digitalisering av et viktig verktøy

15.07.2021