GoSuda

Vergleich von Sprachdesigns in LLM-gestützten Codegenerierungsumgebungen: Abstraktionskosten und die Explizitheit von Go

By Rabbit Princess views ...

Moderne Sprachen

Moderne Sprachen bezeichnet Sprachen, die im Vergleich zu früheren Sprachen eine höhere Produktivität, Stabilität, Sicherheit und Wartbarkeit bieten. Diese Sprachen integrieren aktiv aktuelle Techniken und Konzepte und stellen Entwicklern effizientere und sicherere Entwicklungswerkzeuge zur Verfügung. Zu den repräsentativen modernen Sprachen zählen Java, Rust, Python, TypeScript und andere, die folgende Merkmale aufweisen.

1. Objektorientiertes Design ( OOP )

Moderne Sprachen sind größtenteils auf Grundlage objektorientierter Konzepte entworfen. Die Objektorientierung unterstützt Prinzipien wie Kapselung, Vererbung und Polymorphie und gliedert komplexe Systeme in kleinere Objekteinheiten, wodurch die Struktur eines Programms klar und flexibel wird. Dies ist insbesondere bei der Entwicklung großer Softwaresysteme wirksam, um Entwicklungskosten und Aufwand zu steuern und Probleme zu verringern, die bei der Wartung auftreten können.

2. Syntaktischer Zucker und Ausdrucksformen

Moderne Sprachen bieten zur Steigerung der Lesbarkeit des Codes und der Entwicklungsproduktivität vielfältigen syntaktischen Zucker sowie auf Ausdrücken basierende Syntax. Funktionen wie der ternäre Operator, Lambda-Ausdrücke und Pattern Matching reduzieren Boilerplate-Code, machen Code vorhersagbar und steigern die Produktivität der Entwickler.

3. Modulsystem

Moderne Sprachen ermöglichen es, Programme durch ein Modulsystem in mehrere Einheiten zu unterteilen und zu verwalten. Dies erleichtert die Wiederverwendbarkeit von Code und die Verwaltung von Abhängigkeiten und macht die Wartung auch bei wachsender Projektgröße unkompliziert. Repräsentative Beispiele sind Maven/Gradle für Java, Cargo für Rust und npm/yarn für TypeScript.

4. Zwischensprachen und virtuelle Maschinen

Moderne Sprachen setzen zur Gewährleistung von Plattformunabhängigkeit, Leistungsoptimierung und Sicherheit auf Zwischensprachen und virtuelle Maschinen. Repräsentative Beispiele sind JVM, LLVM, WASM und GraalVM.

Entwicklung im KI-Zeitalter und die Grenzen moderner Sprachen

Moderne Sprachen entstanden unter der Prämisse, dass Menschen den größten Teil des Codes schreiben. Folglich besteht das Ziel moderner Sprachen darin, wiederkehrende Arbeiten zu reduzieren, die Produktivität zu steigern und durch Strukturen, die die Zusammenarbeit von Entwicklern ermöglichen, große Softwaresysteme effektiv umzusetzen. Im KI-Zeitalter gerät diese Prämisse jedoch zunehmend ins Wanken. KI-basierte Werkzeuge wie Copilot oder Cody automatisieren einen großen Teil der Codeerstellung, und die Menge an Code, die ein einzelner Entwickler erzeugen kann, nimmt sprunghaft zu. Dadurch werden Merkmale moderner Sprachen, die früher als Vorteile galten, zunehmend zu veralteten Nachteilen.

Objektorientiertes Design

KI kann Strukturen, in denen sämtliche Informationen innerhalb einer einzelnen Funktion oder eines einzelnen Moduls explizit vorliegen, schnell und präzise analysieren. Mit wachsendem Kontext steigt jedoch der Bereich, der erschlossen werden muss, weshalb Produktivität und Genauigkeit der KI sinken. In OOP-basiertem Code wird die Logik nicht an einer Stelle verwaltet, sondern auf mehrere Objekte verteilt, was im Ergebnis mehr Kontext für die KI erforderlich macht. Betrachten wir den folgenden Code.

 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}

Im obigen Code muss die KI, um zu erkennen, welche Operation speak() tatsächlich ausführt, folgende Schlussfolgerungen wiederholt ziehen

  1. Welcher konkreten Klasse gehört die Instanz animal an?
  2. Wo ist die in dieser Klasse überschriebene Methode speak() definiert?
  3. Wo sind die Definitionen der Klassen Dog und Cat zu finden, und welches Verhalten besitzen sie intern?
  4. Besteht die Möglichkeit, dass die Klassen Dog und Cat in anderen Klassen überschrieben werden?

Diese Informationen befinden sich nicht in einer einzigen Datei oder Funktion, sondern können nur verstanden werden, indem man den Beziehungen zwischen den Klassendateien und der Vererbungsstruktur folgt. Darüber hinaus sind zur Laufzeit bestimmte Elemente wie Reflection oder dynamisches Laden für die KI wie eine Blackbox, sodass eine Analyse faktisch unmöglich ist.

Syntaktischer Zucker und Ausdrucksformen

KI bevorzugt explizites statt implizites Verhalten und zieht es vor, einfache Strukturen zu kombinieren, um eine eindeutige Lösung zu erzeugen, statt komplexe Strukturen zu übernehmen. Syntaktischer Zucker hingegen erlaubt vielfältige Ausdrucksweisen, deren interne Funktionsweise jedoch häufig identisch oder ähnlich ist. KI muss die Bedeutung dieser verschiedenen Ausdrucksweisen einzeln erlernen und es kann schwierig werden, zu bestimmen, welche Syntax in einer bestimmten Situation vorrangig empfohlen werden sollte.

Zwischensprachen und virtuelle Maschinen

KI wird überwiegend auf Grundlage von Quellcode trainiert. Zwischensprachen (Bytecode) hingegen verlieren während der Kompilierung Bedeutungsinformationen wie Variablennamen, und die virtuelle Maschine muss sie zur Laufzeit neu interpretieren. Dies ist für KI außerordentlich schwer zu verstehen oder zu transformieren. Beispielsweise ist eine Umwandlung von TypeScript nach Go für KI möglich, die Umwandlung von Bytecode der V8-Engine in Bytecode der JVM oder in Maschinencode hingegen praktisch nahezu unmöglich.

Die wahrhaft moderne Sprache im KI-Zeitalter

Aus den obigen Ausführungen wird deutlich, dass die Merkmale moderner Sprachen im Grunde veraltete Elemente für das KI-Zeitalter darstellen. Welche Sprache könnte also die für das KI-Zeitalter am besten geeignete moderne Sprache sein? Hinweise darauf lassen sich aus den Elementen gewinnen, die frühere moderne Sprachen ausgeschlossen haben. Eine moderne Sprache für das KI-Zeitalter sollte

  1. eine explizite Syntax und einen natürlichen Ablauf besitzen.
  2. sich von übermäßiger OOP-Struktur lösen und eine flache, einfache Struktur aufweisen.
  3. statt unnötigem syntaktischem Zucker oder impliziten Mustern mit einer begrenzten Menge grundlegender Schlüsselwörter vielfältige Funktionen realisieren.
  4. kein komplexes Build-System, sondern ein einfaches und vorhersagbares Build-System besitzen.

Die Sprache, die diesen Kriterien am besten entspricht, ist Golang. Die Sprache Go wurde so entworfen, dass sich mit einem Minimum an Kernschlüsselwörtern und einer einfachen Kombination syntaktischer Elemente der größte Teil praktisch relevanter Funktionen umsetzen lässt, und sie verzichtet konsequent auf unnötige Abstraktionen und implizites Verhalten. Dies ist sowohl für Entwickler als auch für die KI vorteilhaft, wenn Code interpretiert und erzeugt wird.

Die Eigenschaften von Go, das auf vorhersagbare und flache Strukturen, explizite Abläufe und eine konsistente Syntax setzt, passen daher im Vergleich zu bestehenden modernen Sprachen, die auf den menschlichen Entwickler ausgerichtet sind, deutlich besser zu Entwicklungsumgebungen, in denen KI aktiv mitwirkt. Die konservative Entwurfsphilosophie von Go, die einst als veraltet galt, erweist sich im KI-Zeitalter somit gewissermaßen als die fortschrittlichste Wahl.