Jeg er i overkant lett å distrahere, så behovet for å designe et tannhjul til den nye 3D-printeren har nå resultert i at jeg har kommet i skade for å begå et aldri så lite statisk typet og interpreterende språk. Det er ikke et spesielt elegant, nyskapende eller esoterisk språk. Det vil neppe bli omtalt på noen konferanser. Det er rimelig ubrukelig til alle praktiske formål.

Men,…

Det har kontrollstrukturer, loops, funksjoner, et lite typesystem, basic I/O, operatorer og uttrykksevaluering.

Formålet med å lage dette var å, en gang for alle, bli komfortabel nok med GNU Bison, til at jeg kunne lage noe annet.  Jeg har lekt med andre parser-generatorer tidligere, men det har som regel endt i blindveier eller stygge grisehack der vakre syntaks-trær istedet burde vært dyrket fram.

Jeg føler at jeg har lært ganske mye gjennom implementasjonen av dette, til tross for at jeg kun har produsert noen hundrede kodelinjer over noen få kvelder.

La meg understreke at dette ikke er fanboy-/-rockstar-hot materie. Dette er pensum. Jeg burde lært det på skolen, men jeg var dessverre i overkant lett å distrahere den gangen også.

Jeg har lenge lekt med ideen om et språk, skreddersydd for å kunne generere visse typer organiske objekter, tidligere kun for visualisering, men nå for 3D-printing. Jeg er fullstendig klar over at man uten problem kan programmere dette på tradisjonelt vis, eller til nød lage seg en liten DSL under et mer tradisjonelt språk, men hva er morsomt med det ?

Å designe et fullverdig programmeringsspråk er en relativt heftig materie, og opplevelsen man får ved å gi seg i kast med noe marginalt mer komplekst enn en enkel kalkulator kan minne ganske mye om å svømme i en ikke-newtonsk væske. Tar du i litt for mye  så blir du sittende bom fast. Tar du i litt for lite, så synker du til bunns. En akkurat passe porsjon av mindfulness må til. Forvent en lavere knotting-til-“hmm…”-ratio enn du kanskje er vant til.

Men,…

I likhet med kjemi, så trenger man heldigvis ikke kunne hele pensum for å ha det moro. Man trenger bare kunne nok til at man nesten havner på akutten.

Jeg ble overrasket over hvor lite kode som faktisk skulle til for å spesifisere et enkelt språk og deretter implementere en parser med tilhørende interpreter for det (Når jeg tenker etter, så trenger du faktisk ikke implementere en interpreter for å implementere et en interpreter, men de kan vi komme tilbake til senere)

Å kjøre programmer skrevet i sitt eget språk er et geek-rush fullt på høyde med å forbedre meat-space med 3D-printing.

Dere aner kanskje hvor det bærer. Jeg er i ferd med å legge hodet på blokka og er svanger med et nytt epos. Jeg skal forsøke å holde det rimelig plattform og kompilator-agnostisk, men sluttproduktet kan nok inneholde spor av Qt og C++11.

For 3D-printerprosjektet sin del, så håper jeg at jeg klarer å avslutte denne serien før jeg begynner å leke med tanken på å emitte kode til CILJava bytecodeLLVM IR eller en eller annen udda mikrokontroller.

For å komme i mål, så var det nødvendig å dra fram Drageboka mi [1] fra 1986, lese manualer og tutorials [2][3] samt oppsøke  Stack Overflow litt hyppigere enn vanlig. Det beste A-Å-eksempelet jeg har sett så langt er faktisk en av samplene til boost::spirit, men jeg har valgt å ikke bruke det som utgangspunkt, siden boost-gjengen åpenbart befinner seg på ei grein over meg i evolusjonstreet. De har også rappet alt tankegodset fra yacc, bare gjørt det enda litt hæsligere å implementere. Boost makes my head hurt – really, really bad. Merkelig nok, så blir jeg warm & fuzzy all over når jeg tenker på generics i C#, men templakåtskap i C++ resulterer gjerne i kuldegysninger og akutt higen etter sterke psykofarmaka.

Bortsett fra nevnte spirit-eksempel, så er det tynt med gode eksempler der ute. Det meste er gammelt C-ræl. Mye må derfor suges fra egen pupp eller utledes fra kommentarfeltene til “Hvordan i hule?”-poster på StackOverflow. Det kan bety en av to ting:

  1. Det er litt vanskelig.
  2. Det er veldig, veldig enkelt. Faktisk så banalt at normalt oppegående utviklere ikke vil nedverdige seg, eller risikere å besudle nett-tilstedeværelsen sin ved å skrive om det.

Jeg håper på “1”, frykter vel kanskje “2” , men er heldigvis såpass gammel at jeg egentlig gir blanke. Hvis en av leserne finner det nyttig, så er det verdt å dumme seg litt ut for min del.

[1] “Compilers Principles, Tehniques and Tools”, Aho, Seti, Ullman. Addison-Wesley, 1986 (Vurder kanskje en litt nyere versjon enn min ;))

[2] “Lex & Yacc Tutorial”, Tom Niemann

[3] “Lex & Yacc”, Levine, Mason, Brown. O’Reilly