GoSuda

Сравнение на езиковия дизайн в среда за генериране на код с LLM: цена на абстракцията и изрičността на Go

By Rabbit Princess views ...

Модерни езици

Модерните езици са езици, които в сравнение с езиците от миналото предлагат по-висока продуктивност, стабилност, сигурност и поддръжка. Тези езици активно въвеждат съвременни техники и концепции и предоставят на разработчиците по-ефективни и безопасни инструменти за разработка. Представителни модерни езици са Java, Rust, Python, TypeScript и други, които се отличават със следните характеристики.

1. Обектно-ориентиран дизайн ( OOP )

Модерните езици в по-голямата си част са проектирани на основата на обектно-ориентирани концепции. Обектно-ориентираният подход поддържа принципи като капсулация, наследяване и полиморфизъм и чрез разделяне на сложната система на малки обектни единици прави структурата на програмата ясна и гъвкава. Това е особено ефективно при разработка на мащабен софтуер, тъй като помага за контролиране на разходите и усилията за разработка и намалява проблемите, които могат да възникнат при поддръжката.

2. Синтактична захар и изрази

Модерните езици предоставят различни синтактични захари и граматика, основана на изрази, с цел повишаване на читаемостта на кода и продуктивността на разработката. Тернарният оператор, ламбда изразите, сравняването с шаблон (pattern matching) и подобни функции намаляват шаблонния код (boilerplate), правят кода предвидим и повишават продуктивността на разработчика.

3. Модулна система

Модерните езици чрез модулна система позволяват програмата да бъде разделена на множество единици и управлявана като такава. Това улеснява повторното използване на кода и управлението на зависимостите и прави поддръжката лесна дори когато мащабът на проекта нараства. Типични примери са Maven/Gradle за Java, Cargo за Rust и npm/yarn за TypeScript.

4. Междинен език и виртуални машини

Модерните езици въвеждат междинни езици и виртуални машини с цел независимост от платформата, оптимизация на производителността и сигурност. Типични примери са JVM, LLVM, WASM, GraalVM и други.

Разработката в ерата на ИИ и ограниченията на модерните езици

Модерните езици възникнаха при предпоставката, че по-голямата част от кода се пише от хора. Съответно целта на модерните езици е да намаляват повтарящата се работа, да повишават продуктивността и чрез структури, които позволяват сътрудничество между разработчиците, ефективно да реализират големи софтуерни системи. Въпреки това в ерата на ИИ тази предпоставка постепенно се разрушава. Инструменти, базирани на ИИ, като Copilot и Cody, автоматизират голяма част от писането на код, а количеството код, което един разработчик може да създаде, нараства неимоверно. В резултат на това характеристики на модерните езици, които преди са се възприемали като предимства, постепенно се превръщат в застарели недостатъци.

Обектно-ориентиран дизайн

ИИ може бързо и точно да анализира структури, в които цялата информация е изрично представена в една функция или модул. Напротив, с нарастването на контекста се увеличава и участъкът, който трябва да бъде изведен, поради което продуктивността и точността на ИИ намаляват. Кодът, написан в OOP стил, не управлява логиката на едно място, а я разпределя между множество обекти, което в крайна сметка изисква от ИИ по-голям контекст. Разгледайте следния код.

 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}

В горния код, за да определи какво всъщност прави методът speak(), ИИ трябва многократно да извършва следните изводи

  1. Инстанция на кой конкретен клас е animal?
  2. Къде е дефиниран overridden методът speak() в този клас?
  3. Къде са дефинициите на класовете Dog и Cat и какво е поведението им вътре?
  4. Няма ли вероятност класовете Dog и Cat да бъдат overridden в други класове?

Тази информация не се съдържа в един файл или една функция, а може да бъде разбрана само като се проследяват връзките между файловете с класове и йерархията на наследяване. Освен това елементи, които се определят по време на изпълнение, като рефлексия или динамично зареждане, са за ИИ като черна кутия и на практика анализът им е невъзможен.

Синтактична захар и изрази

ИИ предпочита явното поведение пред неявното и предпочита да комбинира прости структури за получаване на един правилен отговор, вместо да използва сложни структури. В контраст, синтактичната захар допуска различни записи, но вътрешното им поведение често е еднакво или подобно. ИИ трябва да научи значението на всички тези различни записи поотделно и може да му бъде трудно да определи приоритета кой синтаксис да препоръча в конкретна ситуация.

Междинен език и виртуални машини

ИИ се учи основно от изходния код. Междинният език (bytecode), от друга страна, при компилация губи семантиката на имената на променливите и други елементи и трябва да бъде реинтерпретиран от виртуалната машина по време на изпълнение. Това е задача, която е изключително трудна за разбиране или преобразуване от ИИ. Например преобразуването от TypeScript към Go е възможно за ИИ, но преобразуването на байткода на V8 engine към байткод на JVM или към машинен код е практически почти невъзможно.

Истинският модерен език за ерата на ИИ

От казаното дотук става ясно, че характеристиките на модерните езици всъщност са застарели елементи, неподходящи за ерата на ИИ. Какъв език би могъл да бъде най-подходящият модерен език за ерата на ИИ? Отговорът може да се потърси в елементите, които бившите модерни езици са отхвърляли. Модерният език за ерата на ИИ трябва:

  1. Да има явен синтаксис и естествен поток на изпълнение.
  2. Да се отдалечи от прекомерната OOP структура и да има плоска и проста структура.
  3. Вместо ненужна синтактична захар или неявни шаблони, да създава различни функции само с ограничен набор от базови ключови думи.
  4. Да има прост и предвидим билд процес, а не сложна система за изграждане.

Езикът, който най-добре отговаря на тези критерии, е Golang. Go е проектиран така, че с минимален набор от основни ключови думи и проста комбинация от синтаксис да може да реализира по-голямата част от практически необходимите функции, и напълно изключва ненужните абстракции и неявното поведение. Това е структура, която е благоприятна както за разработчиците, така и за ИИ при интерпретиране и генериране на код.

Предвидимата и плоска структура, явният поток и последователният синтаксис, към които се стреми Go, го правят по-подходящ за среда на разработка, в която ИИ участва активно, за разлика от съвременните езици, проектирани според човешкия разработчик. Консервативната философия на дизайна на Go, която някога се смяташе за остаряла, всъщност в ерата на ИИ се оказва най-напредналият избор.