GoSuda

Srovnání návrhu jazyků v prostředí generování kódu pomocí LLM: náklady abstrakce a explicitnost jazyka Go

By Rabbit Princess views ...

Moderní jazyky

Moderní jazyk je jazyk, který ve srovnání s dřívějšími jazyky poskytuje vyšší produktivitu, stabilitu, bezpečnost a udržovatelnost. Tyto jazyky aktivně přejímají nejnovější techniky a koncepty a vývojářům nabízejí efektivnější a bezpečnější vývojové nástroje. Mezi reprezentativní moderní jazyky patří Java, Rust, Python, TypeScript a další, které mají následující rysy.

1. Objektově orientovaný návrh ( OOP )

Moderní jazyky jsou z velké části navrženy na základě objektově orientovaných konceptů. Objektová orientace podporuje principy zapouzdření, dědičnosti a polymorfismu a rozdělením složitého systému na menší objekty, které se spravují samostatně, vytváří přehlednou a flexibilní strukturu programu. To je zvlášť účinné při rozsáhlém vývoji softwaru, kde pomáhá kontrolovat náklady a úsilí vývoje a snižovat problémy, které mohou nastat při údržbě.

2. Syntaktický cukr a výrazové konstrukce

Moderní jazyky nabízejí různé syntaktické cukry a syntaxi založenou na výrazech, jejichž cílem je zvýšit čitelnost kódu a produktivitu vývoje. Funkce jako ternární operátor, lambda výrazy a pattern matching snižují množství opakujícího se kódu (boilerplate), činí kód předvídatelnějším a zvyšují produktivitu vývojářů.

3. Modulový systém

Moderní jazyky prostřednictvím modulového systému umožňují rozdělit program do více celků a spravovat je odděleně. To usnadňuje znovupoužitelnost kódu a správu závislostí a zajišťuje, že údržba zůstává snadná i při rostoucí velikosti projektu. Typickými příklady jsou Maven/Gradle v jazyce Java, Cargo v jazyce Rust a npm/yarn v jazyce TypeScript.

4. Mezijazyky a virtuální stroje

Moderní jazyky zavádějí mezijazyky a virtuální stroje za účelem nezávislosti na platformě, optimalizace výkonu a zvýšení bezpečnosti. Mezi typické příklady patří JVM, LLVM, WASM a GraalVM.

Vývoj v éře AI a omezení moderních jazyků

Moderní jazyky vznikly na předpokladu, že většinu kódu píše člověk. Přirozeně tedy cílem moderních jazyků je omezit opakující se práci, zvýšit produktivitu a prostřednictvím struktur umožňujících spolupráci vývojářů efektivně realizovat rozsáhlý software. Tento předpoklad se však v éře AI postupně rozpadá. Nástroje založené na AI, jako jsou Copilot a Cody, automatizují velkou část psaní kódu a množství kódu, které může jeden vývojář vytvořit, se výrazně zvyšuje. V důsledku toho se rysy moderních jazyků, které byly dříve vnímány jako přednosti, postupně proměňují v zastaralé nedostatky.

Objektově orientovaný návrh

AI dokáže rychle a přesně analyzovat strukturu, v níž jsou všechny informace uvedeny v rámci jedné funkce nebo modulu. Naopak s rostoucím kontextem se zvyšuje počet úseků, které je třeba odvozovat, a proto klesá produktivita a přesnost AI. Kód napsaný v OOP nespravuje logiku na jednom místě, nýbrž ji rozptyluje mezi více objektů, což výsledně vyžaduje od AI větší kontext. Podívejme se na následující kód.

 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}

V uvedeném kódu musí AI opakovaně provádět následující úvahy, aby zjistila, jakou činnost metoda speak() ve skutečnosti vykonává:

  1. Jaké konkrétní třídy je instancí animal?
  2. Kde je definována metoda speak() přepsaná v této třídě?
  3. Kde jsou definice tříd Dog a Cat a jaké je jejich chování uvnitř?
  4. Neexistuje možnost, že třídy Dog a Cat budou přepsány v jiných třídách?

Tyto informace se nenacházejí v jednom souboru ani v jedné funkci, nýbrž je třeba sledovat vztahy mezi soubory tříd a strukturu dědičnosti. Navíc prvky, které se určují za běhu, jako jsou reflexe nebo dynamické načítání, představují z pohledu AI černou skříňku, takže jejich analýza je prakticky nemožná.

Syntaktický cukr a výrazové konstrukce

AI dává přednost explicitnímu chování před implicitním a raději skládá jednoduché struktury do jednoho správného řešení, než aby používala složité konstrukce. Syntaktický cukr naproti tomu umožňuje různé způsoby zápisu, ale jeho vnitřní chování je často stejné nebo podobné. AI se musí naučit význam těchto různých zápisů jeden po druhém a může být obtížné určit, které syntaktické konstrukce má v dané situaci doporučit a jaké mají mít priority.

Mezijazyky a virtuální stroje

AI se většinou učí na základě zdrojového kódu. Naproti tomu mezijazyk (bytecode) při kompilaci ztrácí významové informace, jako jsou názvy proměnných, a musí být za běhu znovu interpretován virtuálním strojem. Pro AI je tak porozumění nebo převod takového kódu velmi obtížný úkol. Například převod z TypeScriptu do Go je pro AI možný, zatímco převod bytecodu enginu V8 do bytecodu JVM nebo do strojového kódu je prakticky téměř nemožný.

Skutečný moderní jazyk pro éru AI

Na základě výše uvedeného lze vidět, že rysy moderních jazyků jsou ve skutečnosti zastaralými prvky, které se pro éru AI nehodí. Který jazyk se tedy může stát nejvhodnějším moderním jazykem pro éru AI? Odpověď lze odvodit z prvků, které dřívější moderní jazyky odmítaly. Moderní jazyk pro éru AI by měl:

  1. Mít explicitní syntaxi a přirozený tok programu.
  2. Opustit nadměrnou strukturu OOP a mít plochou a jednoduchou strukturu.
  3. Místo zbytečného syntaktického cukru nebo implicitních vzorů vytvářet různé funkce pouze z omezeného množství základních klíčových slov.
  4. Mít jednoduchý a předvídatelný buildovací systém namísto složitého.

Jazykem, který těmto kritériím nejlépe odpovídá, je Golang. Jazyk Go byl navržen tak, aby s minimem základních klíčových slov a jednoduchou kombinací syntaxe bylo možné implementovat většinu praktických funkcí, a důsledně vylučuje zbytečné abstrakce a implicitní chování. To je výhodné nejen pro vývojáře, ale také pro AI, která kód interpretuje a generuje.

Takto předvídatelná a plochá struktura, explicitní tok a konzistentní syntaxe, k nimž Go směřuje, se na rozdíl od dřívějších moderních jazyků navržených pro lidské vývojáře lépe hodí do vývojového prostředí, v němž se aktivně podílí AI. Konzervativní konstrukční filozofie jazyka Go, která byla kdysi považována za zastaralou, se tak v éře AI ukazuje jako nejpokročilejší volba.