GoSuda

Sammenligning av språkdesign i LLM-baserte kodegenereringsmiljøer: abstraksjonskostnader og Gos eksplisitthet

By Rabbit Princess views ...

Moderne språk

Moderne språk refererer til språk som tilbyr høyere produktivitet, stabilitet, sikkerhet og vedlikeholdbarhet sammenlignet med tidligere språk. Disse språkene tar aktivt i bruk moderne teknikker og konsepter og gir utviklere mer effektive og trygge utviklingsverktøy. Representative moderne språk inkluderer Java, Rust, Python og TypeScript, og de har følgende kjennetegn.

1. Objektorientert design (OOP)

Moderne språk er i stor grad bygget på objektorienterte konsepter. Objektorientering støtter prinsipper som innkapsling, arv og polymorfisme, og ved å dele et komplekst system inn i mindre objektenheter gjør den programstrukturen klar og fleksibel. Dette er særlig effektivt i storskala programvareutvikling, der det bidrar til å kontrollere utviklingskostnader og innsats og reduserer problemer som kan oppstå under vedlikehold.

2. Syntaktisk sukker og uttrykksbasert syntaks

Moderne språk tilbyr en rekke former for syntaktisk sukker og uttrykksbasert syntaks for å øke kodens lesbarhet og utviklingsproduktiviteten. Funksjoner som den ternære operatoren, lambdauttrykk og mønstergjenkjenning reduserer standardkode (boilerplate), gjør koden mer forutsigbar og øker utviklerens produktivitet.

3. Modulsystem

Moderne språk gjør det mulig å dele et program inn i flere enheter gjennom et modulsystem. Dette letter gjenbruk av kode og avhengighetshåndtering og gjør vedlikehold enklere selv når prosjektet vokser i omfang. Typiske eksempler er Maven/Gradle for Java, Cargo for Rust og npm/yarn for TypeScript.

4. Mellomliggende språk og virtuelle maskiner

Moderne språk tar i bruk mellomliggende språk og virtuelle maskiner for å oppnå plattformuavhengighet, ytelsesoptimalisering og sikkerhet. Typiske eksempler er JVM, LLVM, WASM og GraalVM.

Utvikling i KI-tiden og begrensningene ved moderne språk

Moderne språk oppstod under forutsetningen at mennesker skriver størstedelen av koden. Naturlig nok er formålet med moderne språk å redusere repetitivt arbeid, øke produktiviteten og gjennom strukturer som gjør det mulig for utviklere å samarbeide, implementere store programvarer på en effektiv måte. Likevel er denne forutsetningen i KI-tiden gradvis i ferd med å bryte sammen. KI-baserte verktøy som Copilot og Cody automatiserer en stor del av kodeskrivingen, og mengden kode en enkelt utvikler kan produsere øker kraftig. Som følge av dette endrer kjennetegn ved moderne språk, som tidligere ble oppfattet som fordeler, seg gradvis til foreldede ulemper.

Objektorientert design

KI kan raskt og nøyaktig analysere strukturer der all informasjon er eksplisitt angitt innenfor en enkelt funksjon eller modul. Derimot synker produktiviteten og nøyaktigheten til KI etter hvert som konteksten øker, fordi antall intervaller som må utledes vokser. Kode skrevet med OOP fordeler logikken over flere objekter i stedet for å samle den på ett sted, noe som resulterer i at KI må ha mer kontekst. Se på koden nedenfor.

 1public class AnimalHandler {
 2    public void handle(Animal animal) {
 3        animal.speak();
 4    }
 5}
 6
 7public class Main {
 8    public static void main(String[] args) {
 9        AnimalHandler handler = new AnimalHandler();
10
11        Animal a1 = new Dog();
12        Animal a2 = new Cat();
13        Animal a3 = new Horse();
14
15        handler.handle(a1);
16        handler.handle(a2);
17        handler.handle(a3);
18    }
19}

I koden ovenfor må KI gjenta følgende slutninger for å finne ut hvilken handling speak()-metoden faktisk utfører:

  1. Hvilken konkret klasse er animal en instans av?
  2. Hvor er den overstyrte speak()-metoden for denne klassen definert?
  3. Hvor er klassedefinisjonene for Dog og Cat, og hva er deres interne atferd?
  4. Finnes det en mulighet for at Dog- og Cat-klassene overstyres i andre klasser?

Denne informasjonen er ikke samlet i én fil eller én funksjon, men må forfølges gjennom relasjonene mellom klassefilene og arvestrukturen for å kunne forstås. Dessuten er elementer som bestemmes ved kjøretid, som refleksjon eller dynamisk lasting, for KI nesten som en svart boks, og analyse er i praksis umulig.

Syntaktisk sukker og uttrykksbasert syntaks

KI foretrekker eksplisitt atferd fremfor implisitt atferd, og den foretrekker å kombinere enkle strukturer for å lage ett entydig svar fremfor å ta i bruk komplekse strukturer. Syntaktisk sukker derimot tillater mange ulike uttrykksformer, men den underliggende atferden er ofte identisk eller lik. KI må lære betydningen av alle disse ulike uttrykksformene enkeltvis, og det kan bli vanskelig å avgjøre hvilken syntaks som bør anbefales i en bestemt situasjon.

Mellomliggende språk og virtuelle maskiner

KI lærer for det meste ut fra kildekode. Mellomliggende språk (bytecode) fjerner derimot betydninger som variabelnavn under kompileringen, og den virtuelle maskinen må tolke dem på nytt ved kjøring. Dette er en oppgave som er svært vanskelig for KI å forstå eller transformere. For eksempel er det mulig for KI å oversette fra TypeScript til Go, men å oversette bytecode fra V8-motoren til JVM-bytecode eller maskinkode er i praksis nesten umulig.

Det virkelig moderne språket i KI-tiden

Med utgangspunkt i det ovenstående ser vi at kjennetegnene ved moderne språk i realiteten er foreldede elementer som ikke passer til KI-tiden. Hvilket språk kan da bli det best egnede moderne språket i KI-tiden? Svaret kan hentes fra elementene som tidligere moderne språk forkastet. Et moderne språk for KI-tiden bør

  1. ha eksplisitt syntaks og en naturlig flyt.
  2. bryte med overdreven OOP-struktur og ha en flat og enkel struktur.
  3. heller enn unødvendig syntaktisk sukker eller implisitte mønstre, lage ulike funksjoner med et begrenset sett grunnleggende nøkkelord.
  4. ha et enkelt og forutsigbart byggesystem i stedet for et komplekst byggesystem.

Språket som best oppfyller disse kriteriene er Golang. Go er designet slik at en stor del av de praktisk nyttige funksjonene kan implementeres med bare et minimalt sett kjernesøkeord og en enkel kombinasjon av syntaks, og det utelukker systematisk unødvendig abstraksjon og implisitt atferd. Dette er en struktur som er gunstig både for utviklere og for KI når den skal tolke og generere kode.

Go-språkets egenskaper, med en forutsigbar og flat struktur, en eksplisitt flyt og en konsistent syntaks, passer bedre til utviklingsmiljøer der KI deltar aktivt, enn eksisterende moderne språk som er designet med utgangspunkt i mennesklige utviklere. Språkets konservative designfilosofi, som en gang ble ansett som foreldet, blir dermed i KI-tiden det mest fremtidsrettede valget.