Edument

Comma: med 2020 i backspegeln

Ansvarig utvecklare för Comma, Jonathan Worthington, ger en tillbakablick och reflekterar över vilka förändringar och förbättringar som gjorts med Comma under 2020.

Comma, Eduments IDE för programmeringsspråket Raku, släpps varje månad till prenumeranter, och en gratisversion lanseras även varje kvartal. Comma förbättras för varje månad: det kommer nya funktioner, förbättringar av existerande funktionalitet, buggfixar och ibland finjusteringar för att följa med i utvecklingen av Raku som språk och dess ekosystem.

Som projektledare för Comma lägger jag det mesta av min tanketid för produkten på vad vi inte har levererat än och vad vi kan göra bättre för utvecklare inom Raku. Jag vill dock ta en stund till att se tillbaka på några av de enorma förbättringarna som gjordes i Comma under 2020.

Integrerad REPL

Om Rakudo-kompileraren startas utan man specificerar ett program som ska köras, går den in i REPL-läge (Read, Evaluate, Print, Loop), där det är möjligt att skriva Raku-kod och exekvera den. Variabler och funktioner som deklareras på föregående rader kommer att kommas ihåg och vara synliga.

Att kunna få åtkomst till REPL inifrån Comma efterfrågades ofta. Men att bara öppna ett terminalfönster och starta den inbyggda REPL-en i Rakudo hade inte gett den upplevelsen som vi ville kunna leverera. Istället byggde vi en lösning som är specifik för Comma. Resultatet blev integrerad REPL som erbjuder:

  • Smidig inmatning och redigering av flera rader
  • Historik över tidigare utvärderingar från sessionen, och som alla kan redigeras och köras på nytt
  • Highlighting av syntax
  • Automatisk komplettering (av builtins, symboler från använda moduler och symboler som deklarerats i REPL-sessionen)
  • Samma kodanalys i realtid och författarstöd som i resten av Comma

REPL finns i verktygsmenyn. När man arbetar med en modulfil finns det även en kontextmeny med ett "REPL-användning i denna modul"- alternativ som startar REPL i den modul som används. 

Förhandsgranskning av grammatik i realtid

Raku-grammatik, som används för att skriva parsrar, är en av de populäraste funktionerna i språket, och naturligtvis strävar vi efter att kunna tillhandahålla ett bra stöd för grammatikutveckling i Comma. 2020 lanserades ett verktyg för förhandsgranskning av grammatik i realtid. För många år sedan skrev jag en Raku-modul som heter Grammar::Tracer, och som dumpar vägarna som parsern tar och indikerar lyckade och misslyckade regelmatchningar. Jag skrev den primärt som ett proof of concept för Rakus metaobjektskapacitet – men den kom till att bli ett populärt verktyg för Raku-utvecklare som felsökte varför deras grammatik inte matchade.

Commas förhandsgranskning av grammatik i realtid är resultatet av en uppdatering av Grammar::Tracer inom ramen för en GUI-applikation som visar de vägar som tagits, naturligt mappat till en trädvy. Att vara i en GUI-applikation innebar dock en del nya möjligheter. När man t.ex. klickar på en regel så visas den del av inmatningen som matchades, medan dubbelklick på inmatningen synkar trädet under till den djupaste regeln – effektivt sett en token – som matchar texten. Genom att inte bara vara i ett GUI, utan även i ett IDE, blev det möjligt att lägga till en knapp för att även hoppa till källkoden för den valda regeln.

När grammatiken inte matchar visas de ouppnådda reglerna i rött. Den inmatade texten markeras för att visa området som aldrig matchades och – fram till den punkten – text som matchades, men sedan kastades bort på en högre nivå (till exempel för att en konstruktion var OK i starten, men sedan uppstod ett fel längs vägen).

Stöd för grammatik och reguljära uttryck

Förhandsgranskningen i realtid var inte det enda vi gjorde för Raku-utvecklare som använder grammatik. Vi förbättrade även navigering, kodförfattande och refaktorering av grammatik och reguljära uttryck.

När man skriver parsers är det vanligt att skriva en actionklass med metoder som matchar produktionsreglerna. Denna actionklass används normalt för att bygga upp en datastruktur. Vi gjorde det möjligt att flytta mellan en produktionsregel och dess actionmetod med ett snabbt kortkommando (Ctrl+Alt+Home som standard).

Förhållandet mellan actionmetod och regel går dock ännu djupare. Vi erbjuder även automatisk komplettering av captures i produktionsregeln, samt Go To Definition, vilket gör det enkelt att hoppa mellan användningen av en capture och dess definition i regeln. 

Reguljära uttryck och grammatik är kod, och kod tenderar att förändras över tid – vilket innebär att den måste refaktoreras. Vi har utvecklat en rad intentioner och refaktorer som kan hjälpa till med det. Vi kan till exempel ha använt positionella captures, men inser att vår kod skulle vara lättare att läsa om de var namngivna i stället.  En intention kan göra om en positionell capture till en namngiven, och uppdaterar dessutom användningarna automatiskt. På liknande sätt kan man göra om en icke-capturing grupp till en capturing – och om det är en ny positionell capture kan Comma omnummerera referenserna till efterföljande captures.

För Comma Complete-användare kan extraktrefaktorn – som tidigare användes till att extrahera ett uttryck till en variabeldeklaration eller ett uttryck eller statements i en sub eller metod – nu även användas till att extrahera en del av ett reguljärt uttryck eller regel till en ny namngiven regel.  Detta kan användas för att förvandla ett komplext reguljärt uttryck till en mer begriplig uppsättning namngivna uttryck som anropar varandra, eller för att extrahera en del av en grammatikregel för att kunna återanvända den. 

Fler kodanalyser

Comma analyserar kod som den är skriven. Jag gillar den här snabba feedbacken: den gör att jag upptäcker problem i koden direkt där jag är fokuserad. Det hade tagit en bra stund att gå igenom alla de nya analyserna för 2020, så jag tänkte välja ut ett par av dem.

En av mina favoriter är indikationen av oanvända lexikala variabler, parametrar, lexikala subrutiner, privata attribut och privata metoder. Dessa typer indikeras genom att namnen gråas ut. Den mest uppenbara tillämpningen av den här funktionen är upprensning av kod: Jag har redan öppnat moduler som jag skrev för flera månader eller år sedan i en nyligen publicerad version av Comma, och upptäckte döda variabeldeklarationer – rester från tidigare refaktorer – som jag helt enkelt kan kasta bort. 

Men jag tycker även att feedbacken är väldigt användbar när jag skriver ny kod. Varför är den här variabeln som jag skrev för en liten stund sedan fortfarande oanvänd? Jag kanske glömde vad jag skulle göra med den. Jag kanske använde en annan variabel två gånger av misstag. Den kanske inte behövdes i slutänden. På ett sätt är de saker jag inte använt än en indikation på den kod jag har kvar att skriva.

Naturligtvis kan Comma inte bara identifiera problemen, utan hjälper även till att lösa dem. Det finns alltså fixar som hör ihop med dessa intentioner. Den uppenbaraste är att radera det oanvända elementet. För subs är det dock möjligt att de är oanvända för att vi skriver en modul och tänkte exportera dem – men glömde bort att göra det, helt enkelt. Därför finns det även en fix att lägga till exportegenskaper. 

Comma har även börjat tillhandahålla information om föråldrade underrutiner och metoder – både i den nuvarande kodbasen, i externa moduler och i standardbiblioteket i Raku. Dessa visas i strikeout-stil via automatisk komplettering, i första hand så att de kan undvikas, men visas även på det sättet i redigeraren så att de kan upptäckas när man granskar befintlig kod.

Förbättrad upplevelse av kodförfattande

Comma försöker göra informationen vi kan behöva medan vi skriver kod så tillgänglig som möjligt. En liten, men egentligen ganska praktisk, förbättring inom detta område är parameterinformation som visas för den automatiska nya metoden, som i standardutförande mappar namngivna parametrar till offentliga attribut. Det innebär att vi kan se direkt hur vi kan initialisera objektet vi skapar utan att behöva gå in och titta på klassdefinitionen.

Rakus syntax har en rad olika Unicode- och meta-operatörer. Jag tycker att de är lättare att läsa, och när jag arbetar utifrån en algoritm som jag har hittat i en uppsats eller bok är det skönt att till exempel mängdsnittsoperatorn ser ut precis som matematisk notation. Ärligt talat, är jag dock ganska lat när det kommer till att sätta upp en inmatningsmetod för det och hålla koll på dem över de olika plattformarna jag arbetar i för tillfället. Som tur är kan Comma nu översätta mellan operatörer i Unicode och ASCII – antingen manuellt som en intention eller automatiskt efterhand som vi skriver. Det funkar även för termer som pi. 

Sist men inte minst är Commas kodformatering nu rejält mer konfigurerbar. Standardkodstilen är mer eller mindre så som jag vill se Rakukod. Medan mina val av kodstil självklart är de rätta, bestämde jag mig i ett storslaget ögonblick för att Comma skulle kunna tillgodose de som av någon anledning inte tycker som jag. I början av 2020 kunde vi därför lansera frukten av en rejäl mängd arbete som gör det möjligt att konfigurera kodstilen bra mycket mer än tidigare. Sätt igång och skräddarsy!


Bättre testkörning

För mig är automatiserade tester en väldigt viktig del av att skriva kod. Att kunna köra testerna direkt i Comma och se resultaten direkt har därför alltid varit användbart för mig. Även om jag inte tycker att det är nyttigt att bli besatt av att få 100 % täckning med tester, är det ändå användbar feedback. Därför är jag glad att det även finns täckningssupport i Comma Complete.

Med det sagt, finns det alltid rum för förbättringar, och det levererade vi under 2020. Istället för att bara kunna köra hela testsviten, är det nu möjligt att köra alla tester i projektet, tester i en viss katalog eller individuella testfiler. I alla dessa fall är det även möjligt att filtrera efter ord som ska visas i testfilnamnet. Vi har dessutom gjort det möjligt att ställa in miljövariabler för testkörningar (ett projekt jag arbetar i använder till exempel en miljövariabel för att avgöra om databastester ska köras eller inte). 

Sist men inte minst har vi även gjort det möjligt att köra enskilda test genom att högerklicka på filen i projektträdet och välja att köra den – utan att behöva skapa en körkonfiguration manuellt.

Stöd för Cromallar

Cro är det populäraste valet vid bygge av webbservicar och applikationer i Raku. Medan Cro i första hand riktade sig mot programmerare som bygger HTTP-API:er eller enstaka sidapplikationer, har det gradvis utökats med ett antal ytterligare funktioner – packade tillsammans i Cro::WebApp-modulen – som möjliggör byggande av webbapplikationer på serversidan. Det inkluderar en mallmotor.

Comma hade redan en rad funktioner för utvecklare som skapar Cro-applikationer, och under 2020 fick det dessutom support för Cro-mallar. Highlighting av syntax, automatisk komplettering, go to-deklaration och andra smarta funktioner som används när man skriver kod i Raku finns även för Cro-mallar. 

Vad kan vi förvänta oss under 2021?

Comma-prenumeranter kan även fortsättningsvis se fram emot att få nya utgåvor varje månad, medan de som använder gratisversionen Comma Community kommer att fortsätta få ett bättre verktyg en gång per kvartal. Precis som under 2020 kommer det att ske stora förändringar, men det kommer även att ligga fokus på de många smådetaljerna som bidrar till en smidigare och bekvämare utvecklingsupplevelse med Raku.

Med det sagt är de stora förändringarna vi planerar för 2021 bland andra:

  • Massor av förbättringar till profilern. Det här har vi redan börjat på, och januariutgåvan innehåller en ny vy för Moduler, vilken ger en bra översikt över vilka moduler som används mest. Snart kommer även information om allokeringar och garbage collection.
  • Heap snapshot-analys. Rakudo kan redan producera heap snapshots, men vi kommer att göra det möjligt att samla in och analysera dem inifrån Comma.
  • Bättre debugging. På sistone har vi get stöd åt en del förberedande arbete i MoarVM med målet att kunna tillhandahålla en rikare debuggingupplevelse i Comma.
  • Bättre stöd för arbete inom modulens ekosystem och kanske även integration av produktionsreleaser med fez.
  • Bättre stöd för Pod, Rakus dokumentationsspråk, inklusive bättre täckning av dess syntax och en förhandsgranskning i realtid.

Allt detta bör vara tillräckligt för att jag ska kunna skriva en liknande artikel som den här i början av 2022.


Av: Jonathan Worthington



JavaScript seem to be disabled in your browser.

You must have JavaScript enabled in your browser to utilize the functionality of this website.