Модерният език на епохата на AI
Модерен език
Модерен език означава език, който предлага по-висока производителност, стабилност, сигурност и поддръжка в сравнение с по-старите езици. Тези езици активно въвеждат най-новите техники и концепции, предоставяйки на разработчиците по-ефективни и сигурни инструменти за разработка. Типични модерни езици включват Java, Rust, Python, TypeScript и др., които се характеризират със следното:
1. Обектно-ориентиран дизайн ( OOP )
Повечето модерни езици са проектирани на базата на концепцията за обектно-ориентираност. Обектно-ориентираният подход поддържа принципи като капсулиране, наследяване и полиморфизъм, като прави структурата на програмата ясна и гъвкава, управлявайки сложни системи чрез разделянето им на малки единици – обекти. Това е особено ефективно за контролиране на разходите и трудоемкостта при разработка на мащабен софтуер, както и за намаляване на потенциалните проблеми при поддръжка.
2. Синтактичен захар и изрази
Модерните езици предлагат разнообразие от синтактичен захар и синтаксис, базиран на изрази, за да повишат четимостта на кода и производителността на разработката. Функции като тернарен оператор, ламбда изрази и съпоставяне на шаблони (pattern matching) намаляват Boilerplate кода, правят кода по-предвидим и подобряват производителността на разработчика.
3. Модулна система
Модерните езици позволяват управлението на програми чрез разделянето им на множество единици чрез модулна система. Това улеснява повторната употреба на кода и управлението на зависимостите, като прави поддръжката по-лесна, дори когато проектът се разраства. Типични примери включват Maven/Gradle за Java, Cargo за Rust, npm/yarn за TypeScript и др.
4. Междинен език и виртуална машина
Модерните езици въвеждат междинен език и виртуална машина за постигане на независимост от платформата, оптимизация на производителността и сигурност. Типични примери включват JVM, LLVM, WASM, GraalVM и др.
Разработката в ерата на AI и ограниченията на модерните езици
Модерните езици възникнаха при предположението, че хората пишат по-голямата част от кода. Естествено, целта на модерните езици е да намалят повтарящата се работа, да повишат производителността и да реализират ефективно мащабен софтуер чрез структура, която позволява сътрудничество между разработчиците. Въпреки това, в ерата на AI тази предпоставка постепенно се руши. Инструменти, базирани на AI, като Copilot, Cody и други, автоматизират голяма част от писането на код, а количеството код, което един разработчик може да произведе, нараства експоненциално. Вследствие на това, характеристиките на модерните езици, които преди се възприемаха като предимства, постепенно се превръщат в остарели недостатъци.
Обектно-ориентиран дизайн
AI може бързо и точно да анализира структура, в която цялата информация е изрично посочена в рамките на една функция или модул. Обратно, когато контекстът се увеличава, се увеличава и обхватът за извод, което намалява производителността и точността на AI. Кодът, написан с OOP, разпределя логиката в множество обекти, вместо да я управлява на едно място, което в крайна сметка изисква повече контекст за AI. Нека разгледаме кода по-долу.
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(), AI трябва многократно да прави следните изводи:
- Кой конкретен клас е инстанция на animal?
- Къде е дефиниран методът speak(), който е презаписан в този клас?
- Къде са дефинициите на класовете Dog и Cat и какво е вътрешното им поведение?
- Има ли възможност класовете Dog и Cat да бъдат презаписани от други класове?
Тази информация не е събрана в един файл или една функция, а може да бъде разбрана само чрез проследяване на връзките и структурата на наследяване между файловете на класовете. Освен това, елементи, които се решават по време на изпълнение, като Reflection или динамично зареждане, са като черна кутия за AI и на практика са невъзможни за анализ.
Синтактичен захар и изрази
AI предпочита изрични действия пред имплицитни, и предпочита да комбинира прости структури, за да създаде един правилен отговор, отколкото да използва сложни структури. Обратно, синтактичният захар позволява различни изрази, като вътрешното им поведение често е идентично или сходно. AI трябва да научи значението на всеки от тези разнообразни изрази поотделно, което може да затрудни преценката на приоритета кой синтаксис да препоръча в определена ситуация.
Междинен език и виртуална машина
AI се обучава предимно въз основа на изходния код. От друга страна, от междинния език (bytecode) се премахва семантиката на имената на променливите по време на компилация и той трябва да бъде реинтерпретиран от виртуалната машина по време на изпълнение. Това е задача, която е много трудна за разбиране или преобразуване от AI. Например, за AI е възможно преобразуването от TypeScript към Go, но преобразуването на байткода на V8 engine в байткод на JVM или машинен код е на практика невъзможно.
Истинският модерен език в ерата на AI
Чрез горното съдържание можем да видим, че характеристиките на модерните езици всъщност са остарели елементи, които не са подходящи за ерата на AI. Тогава кой език може да бъде най-подходящият модерен език за ерата на AI? Можем да получим насоки от елементите, които предишните модерни езици са отхвърляли. Модерният език в ерата на AI трябва:
- Да има изричен синтаксис и естествен поток.
- Да се отклони от прекомерната OOP структура и да има плоска и проста структура.
- Да създава множество функции само с ограничен набор от основни ключови думи, вместо с ненужен синтактичен захар или имплицитни шаблони.
- Да има проста и предвидима система за изграждане, а не сложна.
Езикът, който най-добре отговаря на тези критерии, е Golang. Езикът Go е проектиран така, че да позволява реализирането на по-голямата част от практическите функции само с минимален набор от основни ключови думи и проста комбинация от синтаксис, като същевременно стриктно избягва ненужната абстракция и имплицитното поведение. Това е структура, която е благоприятна не само за разработчиците, но и за AI при интерпретирането и генерирането на код.
Тази характеристика на Go, която се стреми към предвидима и плоска структура, изричен поток и последователен синтаксис, е по-подходяща за среда за разработка, в която AI участва активно, за разлика от съществуващите модерни езици, които са проектирани с фокус върху човека разработчик. Консервативната философия на дизайна на Go, която някога е била смятана за остаряла, в ерата на AI се оказва най-напредничавият избор.