GoSuda

Porovnanie jazykového dizajnu v prostredí generovania kódu pomocou LLM: náklady abstrakcie a explicitnosť jazyka Go

By Rabbit Princess views ...

Moderné jazyky

Moderné jazyky označujú jazyky, ktoré v porovnaní s jazykmi minulosti poskytujú vyššiu produktivitu, stabilitu, bezpečnosť a udržiavateľnosť. Tieto jazyky aktívne zavádzajú moderné techniky a koncepty a vývojárom poskytujú efektívnejšie a bezpečnejšie vývojové nástroje. Medzi reprezentatívne moderné jazyky patria Java, Rust, Python, TypeScript a ďalšie, ktoré majú nasledujúce charakteristiky.

1. Objektovo orientovaný návrh ( OOP )

Moderné jazyky sú väčšinou navrhnuté na základe konceptov objektovo orientovaného programovania. Objektovo orientovaný prístup podporuje princípy ako zapuzdrenie, dedičnosť a polymorfizmus a rozdelením komplexného systému na objekty menších celkov umožňuje prehľadnú a flexibilnú štruktúru programu. Je to obzvlášť účinné pri rozsiahlom vývoji softvéru, kde pomáha kontrolovať náklady a úsilie vynaložené na vývoj a znižuje problémy, ktoré môžu vzniknúť pri údržbe.

2. Syntaktický cukor a výrazové konštrukcie

Moderné jazyky poskytujú rôzne syntaktické cukríky a syntax založenú na výrazoch s cieľom zvýšiť čitateľnosť kódu a produktivitu vývoja. Funkcie ako ternárny operátor, lambda výrazy a pattern matching znižujú množstvo opakujúceho sa štandardného kódu, robia kód predvídateľnejším a zvyšujú produktivitu vývojárov.

3. Modulový systém

Moderné jazyky prostredníctvom modulového systému umožňujú rozdeliť program na viacero celkov a spravovať ich. To uľahčuje znovupoužiteľnosť kódu a správu závislostí a aj pri rastúcom rozsahu projektu udržiava údržbu jednoduchú. Reprezentatívnymi príkladmi sú Maven/Gradle v jazyku Java, Cargo v jazyku Rust a npm/yarn v jazyku TypeScript.

4. Medziľahlé jazyky a virtuálne stroje

Moderné jazyky zavádzajú medziľahlé jazyky a virtuálne stroje s cieľom dosiahnuť nezávislosť od platformy, optimalizáciu výkonu a bezpečnosť. Reprezentatívnymi príkladmi sú JVM, LLVM, WASM, GraalVM a ďalšie.

Vývoj v ére AI a obmedzenia moderných jazykov

Moderné jazyky vznikli na predpoklade, že väčšinu kódu píše človek. Prirodzene, cieľom moderných jazykov je znižovať opakujúce sa úlohy, zvyšovať produktivitu a prostredníctvom štruktúr umožňujúcich spoluprácu vývojárov efektívne realizovať rozsiahly softvér. Tento predpoklad sa však v ére AI postupne rozpadá. Nástroje založené na AI, ako sú Copilot, Cody a podobné, automatizujú veľkú časť písania kódu a množstvo kódu, ktoré môže vyprodukovať jeden vývojár, výrazne rastie. Preto sa charakteristiky moderných jazykov, ktoré boli kedysi vnímané ako výhody, postupne menia na zastarané nevýhody.

Objektovo orientovaný návrh

AI dokáže rýchlo a presne analyzovať štruktúry, v ktorých sú všetky informácie uvedené v jednej funkcii alebo module. Naproti tomu, so zvyšujúcim sa kontextom rastie priestor, ktorý treba inferovať, a preto sa produktivita a presnosť AI znižujú. Kód napísaný v OOP rozdeľuje logiku do viacerých objektov namiesto toho, aby ju spravoval na jednom mieste, čo má za následok, že AI potrebuje väčší kontext. Pozrite sa na nasledujúci 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}

Na to, aby AI zistila, aká operácia sa v skutočnosti vykoná v metóde speak(), musí opakovane vykonávať nasledujúce úvahy

  1. Inštanciou ktorej konkrétnej triedy je animal?
  2. Kde je v tejto triede definovaná prepísaná metóda speak()?
  3. Kde sa nachádzajú definície tried Dog a Cat a aké je ich správanie vnútri?
  4. Nie je možné, že triedy Dog a Cat budú prepísané v iných triedach?

Tieto informácie nie sú sústredené v jednom súbore ani v jednej funkcii, ale je ich možné pochopiť iba sledovaním vzťahov medzi súbormi tried a štruktúry dedičnosti. Navyše prvky, ktoré sa určujú za behu, ako reflexia alebo dynamické načítavanie, sú pre AI akoby čiernou skrinkou, a preto je ich analýza prakticky nemožná.

Syntaktický cukor a výrazové konštrukcie

AI uprednostňuje explicitné správanie pred implicitným a namiesto skladania zložitých štruktúr uprednostňuje kombinovanie jednoduchých štruktúr na vytvorenie jedinej správnej odpovede. Naopak, syntaktický cukor povoľuje rôzne vyjadrenia, pričom ich vnútorné správanie je často rovnaké alebo podobné. AI musí jednotlivo naučiť význam týchto rôznych vyjadrení a môže mať ťažkosti určiť prioritu, ktorú syntax odporučiť v konkrétnej situácii.

Medziľahlé jazyky a virtuálne stroje

AI sa väčšinou učí na základe zdrojového kódu. Naproti tomu medziľahlý jazyk (bytecode) pri kompilácii stráca významové informácie, ako sú názvy premenných, a v čase vykonávania ho musí virtuálny stroj znovu interpretovať. Pre AI je to úloha, ktorú je mimoriadne ťažké pochopiť alebo transformovať. Napríklad AI dokáže previesť kód z TypeScriptu do Go, avšak previesť bytecode enginu V8 do bytecodu JVM alebo do strojového kódu je prakticky takmer nemožné.

Skutočný moderný jazyk éry AI

Na základe uvedeného môžeme vidieť, že charakteristiky moderných jazykov sú v skutočnosti zastaralými prvkami, ktoré nie sú vhodné pre éru AI. Ktorý jazyk sa teda môže stať najvhodnejším moderným jazykom pre éru AI? Môžeme to odvodiť z prvkov, ktoré minulé moderné jazyky odmietali. Moderný jazyk éry AI by mal

  1. mať explicitnú syntax a prirodzený tok.
  2. vymaniť sa z nadmernej štruktúry OOP a mať plochú a jednoduchú štruktúru.
  3. namiesto nepotrebného syntaktického cukru alebo implicitných vzorov vytvárať funkcie pomocou obmedzeného množstva základných kľúčových slov.
  4. mať jednoduchý a predvídateľný build systém namiesto zložitého build systému.

Jazykom, ktorý najlepšie spĺňa tieto kritériá, je Golang. Jazyk Go bol navrhnutý tak, aby sa s minimom základných kľúčových slov a jednoduchou kombináciou syntaxe dala implementovať väčšina praktických funkcií, a dôsledne vylučuje nepotrebné abstrakcie a implicitné správanie. Táto štruktúra je výhodná nielen pre vývojárov, ale aj pre AI pri interpretácii a generovaní kódu.

Vlastnosti jazyka Go, ktorý smeruje k predvídateľnej a plochej štruktúre, explicitnému toku a konzistentnej syntaxi, sa na rozdiel od existujúcich moderných jazykov navrhnutých s ohľadom na ľudského vývojára lepšie hodia do vývojového prostredia, kde sa aktívne podieľa AI. Konzervatívna filozofia návrhu jazyka Go, ktorá bola kedysi považovaná za zastaranú, sa v ére AI naopak stáva najprogresívnejšou voľbou.