GoSuda

Språkdesign i LLM-baserade kodgenereringsmiljöer: en jämförelse av abstraktionskostnader och Gos explicithet

By Rabbit Princess views ...

Moderna språk

Moderna språk avser språk som, jämfört med tidigare språk, erbjuder högre produktivitet, stabilitet, säkerhet och underhållbarhet. Dessa språk införlivar aktivt de senaste tekniker och begrepp och erbjuder utvecklare mer effektiva och säkra utvecklingsverktyg. Bland de representativa moderna språken finns Java, Rust, Python, TypeScript m.fl., och dessa uppvisar följande egenskaper.

1. Objektorienterad design ( OOP )

Moderna språk är till största delen utformade utifrån objektorienterade begrepp. Objektorientering stöder principer såsom inkapsling, arv och polymorfism, och genom att dela upp komplexa system i mindre objekt för hantering gör den programmets struktur tydlig och flexibel. Detta är särskilt effektivt vid storskalig programvaruutveckling, där det bidrar till att kontrollera utvecklingskostnader och insatser samt att minska de problem som kan uppstå vid underhåll.

2. Syntaktiskt socker och uttrycksbaserad syntax

Moderna språk tillhandahåller olika former av syntaktiskt socker och uttrycksbaserad syntax för att öka kodens läsbarhet och utvecklingsproduktiviteten. Funktioner såsom villkorsoperatorn, lambdauttryck och mönstermatchning minskar mängden standardkod (boilerplate), gör koden förutsägbar och förbättrar utvecklarens produktivitet.

3. Modulsystem

Moderna språk gör det möjligt att dela upp och hantera program i flera enheter genom ett modulsystem. Detta underlättar kodåteranvändning och beroendehantering och gör underhållet enklare även när projektets omfattning växer. Typiska exempel är Maven/Gradle för Java, Cargo för Rust och npm/yarn för TypeScript.

4. Mellanspråk och virtuella maskiner

Moderna språk inför mellanspråk och virtuella maskiner för plattformsoberoende, prestandaoptimering och säkerhet. Representativa exempel är JVM, LLVM, WASM och GraalVM.

Utveckling i AI-eran och begränsningarna hos moderna språk

Moderna språk uppstod under förutsättningen att människor skriver majoriteten av koden. Naturligt nog är syftet med moderna språk att minska repetitivt arbete, höja produktiviteten och, genom strukturer som möjliggör samarbete mellan utvecklare, implementera storskaliga programvaror på ett effektivt sätt. Men i AI-eran håller denna förutsättning successivt på att brytas ned. AI-baserade verktyg som Copilot och Cody automatiserar en stor del av kodskrivandet, och mängden kod som en enskild utvecklare kan producera ökar kraftigt. Till följd av detta förvandlas de egenskaper hos moderna språk som tidigare upplevdes som fördelar gradvis till föråldrade nackdelar.

Objektorienterad design

AI kan snabbt och korrekt analysera en struktur där all information är explicit i en enda funktion eller modul. Däremot minskar AI:s produktivitet och noggrannhet när kontexten växer, eftersom mängden att sluta sig till ökar. Kod skriven med OOP distribuerar logiken över flera objekt i stället för att hantera den på ett enda ställe, vilket i slutändan kräver mer kontext av AI. Betrakta koden nedan.

 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 ovan måste AI upprepa följande slutledningar för att avgöra vilket beteende speak() faktiskt får:

  1. Vilken konkret klass är animal en instans av?
  2. Var är den i den klassen överskrivna metoden speak() definierad?
  3. Var finns definitionerna av klasserna Dog och Cat, och vad är deras beteende internt?
  4. Finns det någon möjlighet att klasserna Dog och Cat överskrivs i andra klasser?

Denna information samlas inte i en och samma fil eller funktion, utan måste förstås genom att följa relationerna och arvsstrukturen mellan klassfiler. Dessutom är element som bestäms vid körtid, såsom reflektion eller dynamisk laddning, för AI i praktiken en svart låda, och analys är därför i realiteten omöjlig.

Syntaktiskt socker och uttrycksbaserad syntax

AI föredrar explicita beteenden framför implicita, och hellre kombinerar enkla strukturer för att skapa ett enda korrekt svar än att använda komplexa strukturer. Syntaktiskt socker tillåter däremot många olika uttryck, men deras interna beteende är ofta identiskt eller liknande. AI måste lära sig betydelsen av dessa olika uttryck ett för ett och kan få svårt att bedöma vilken syntax som bör rekommenderas i en given situation.

Mellanspråk och virtuella maskiner

AI tränas huvudsakligen på källkod. Mellanspråk (bytecode) å andra sidan avlägsnar under kompileringen betydelser såsom variabelnamn, och den virtuella maskinen måste tolka om dem vid körning. Detta är en uppgift som AI har mycket svårt att förstå eller transformera. Till exempel är en översättning från TypeScript till Go möjlig för AI, men att omvandla bytecode från V8-motorn till JVM:ens bytecode eller maskinkod är praktiskt taget omöjligt.

Det verkliga moderna språket i AI-eran

Genom ovanstående framgår att de egenskaper som utmärker moderna språk i praktiken är föråldrade element som inte passar AI-eran. Vilket språk kan då bli det mest lämpliga moderna språket för AI-eran? Svaret kan hämtas från de element som tidigare moderna språk förkastade. Ett modernt språk för AI-eran bör

  1. ha explicit syntax och en naturlig flödesstruktur.
  2. lämna den övermässiga OOP-strukturen och ha en plan och enkel struktur.
  3. snarare än onödigt syntaktiskt socker eller implicita mönster, skapa flera funktioner med endast ett begränsat antal grundläggande nyckelord.
  4. ha ett enkelt och förutsägbart byggsystem snarare än ett komplicerat sådant.

Det språk som bäst uppfyller dessa kriterier är Golang. Go är utformat så att det med endast ett minimalt antal kärnnyckelord och en enkel kombination av syntax kan implementera merparten av praktiskt användbara funktioner, och det utesluter konsekvent onödig abstraktion och implicit beteende. Detta är en struktur som gynnar både utvecklare och AI vid tolkning och generering av kod.

Go:s egenskaper, som eftersträvar en förutsägbar och plan struktur, explicit flöde och konsekvent syntax, passar bättre i en utvecklingsmiljö där AI aktivt deltar, till skillnad från de befintliga moderna språk som utformats utifrån människan som utvecklare. Go:s konservativa designfilosofi, som en gång ansågs föråldrad, blir i AI-eran i stället det mest framsynta valet.