Nowoczesny język w dobie AI
Języki Nowoczesne
Język nowoczesny oznacza język, który oferuje wyższą produktywność, stabilność, bezpieczeństwo i łatwość utrzymania w porównaniu z językami przeszłości. Języki te aktywnie wprowadzają najnowsze techniki i koncepcje, dostarczając programistom bardziej wydajne i bezpieczne narzędzia programistyczne. Reprezentatywne języki nowoczesne to Java, Rust, Python, TypeScript i inne, charakteryzujące się następującymi cechami.
1. Projektowanie Zorientowane Obiektowo ( OOP )
Większość języków nowoczesnych została zaprojektowana w oparciu o koncepcje obiektowości. Programowanie obiektowe wspiera zasady takie jak enkapsulacja, dziedziczenie i polimorfizm, a zarządzanie złożonymi systemami poprzez dzielenie ich na mniejsze jednostki obiektowe czyni strukturę programu przejrzystą i elastyczną. Jest to szczególnie efektywne w kontroli kosztów rozwoju i nakładów pracy podczas tworzenia oprogramowania na dużą skalę, a także w ograniczaniu problemów, które mogą wystąpić podczas utrzymania.
2. Syntactic Sugar i Wyrażenia
Języki nowoczesne oferują różnorodny syntactic sugar i składnię opartą na wyrażeniach w celu zwiększenia czytelności kodu i produktywności programistów. Funkcje takie jak operator trójargumentowy, wyrażenia lambda i pattern matching redukują boilerplate code, czynią kod bardziej przewidywalnym i zwiększają produktywność programisty.
3. System Modułów
Języki nowoczesne umożliwiają zarządzanie programami poprzez dzielenie ich na wiele jednostek za pomocą systemu modułów. Ułatwia to ponowne wykorzystanie kodu i zarządzanie zależnościami, a także czyni utrzymanie łatwiejszym nawet przy wzroście skali projektu. Reprezentatywne przykłady to Maven/Gradle dla Javy, Cargo dla Rusta, npm/yarn dla TypeScriptu i inne.
4. Język Pośredni i Maszyna Wirtualna
Języki nowoczesne wprowadzają język pośredni i maszynę wirtualną w celu zapewnienia niezależności od platformy, optymalizacji wydajności i bezpieczeństwa. Reprezentatywne przykłady to JVM, LLVM, WASM, GraalVM i inne.
Programowanie w Erze AI i Ograniczenia Języków Nowoczesnych
Języki nowoczesne powstały przy założeniu, że większość kodu jest pisana przez ludzi. Naturalnie celem języków nowoczesnych jest redukcja powtarzalnych zadań, zwiększenie produktywności oraz efektywne implementowanie dużego oprogramowania poprzez struktury umożliwiające współpracę programistów. Jednak w erze AI założenie to stopniowo się rozpada. Narzędzia oparte na AI, takie jak Copilot, Cody i inne, automatyzują znaczną część pisania kodu, a ilość kodu, którą może wyprodukować jeden programista, wzrasta wykładniczo. W rezultacie cechy języków nowoczesnych, które w przeszłości były postrzegane jako zalety, stopniowo przekształcają się w przestarzałe wady.
Projektowanie Zorientowane Obiektowo
AI potrafi szybko i dokładnie analizować struktury, w których wszystkie informacje są jawnie określone w jednej funkcji lub module. Z drugiej strony, w miarę wzrostu contextu, zwiększa się zakres wnioskowania, co obniża produktywność i dokładność AI. Kod napisany w OOP rozprasza logikę na wiele obiektów zamiast zarządzać nią w jednym miejscu, co w rezultacie wymaga od AI większego contextu. Rozważmy poniższy kod.
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}
W powyższym kodzie, aby AI mogła dowiedzieć się, co faktycznie robi metoda speak(), musi powtarzać następujące wnioskowania:
- Jaką konkretną klasą jest instancja animal?
- Gdzie zdefiniowana jest metoda speak() nadpisana w tej klasie?
- Gdzie znajdują się definicje klas Dog i Cat, i jakie jest ich wewnętrzne działanie?
- Czy istnieje możliwość, że klasy Dog i Cat zostaną nadpisane w innych klasach?
Takie informacje nie są zgromadzone w jednym pliku czy jednej funkcji, a można je zrozumieć tylko śledząc relacje między plikami klas i strukturę dziedziczenia. Co więcej, elementy decydowane w runtime, takie jak reflection lub dynamic loading, są dla AI jak black box, co czyni ich analizę praktycznie niemożliwą.
Syntactic Sugar i Wyrażenia
AI preferuje jawne działania od niejawnych i woli łączyć proste struktury w celu uzyskania jednej poprawnej odpowiedzi, niż używać złożonych struktur. W przeciwieństwie do tego, syntactic sugar pozwala na różnorodne wyrażenia, podczas gdy ich wewnętrzne działanie jest często takie samo lub podobne. AI musi uczyć się znaczenia tych różnorodnych wyrażeń jedno po drugim, i może mieć trudności z ustaleniem priorytetu, którą składnię zarekomendować w określonej sytuacji.
Język Pośredni i Maszyna Wirtualna
AI uczy się głównie na podstawie source code. Z drugiej strony, język pośredni (bytecode) traci znaczenie nazw zmiennych i innych elementów podczas procesu kompilacji, a maszyna wirtualna musi go ponownie interpretować w execution time. Jest to zadanie bardzo trudne do zrozumienia lub przekształcenia przez AI. Na przykład, konwersja z TypeScriptu na Go jest dla AI możliwa, ale konwersja bytecode V8 engine na bytecode JVM lub język maszynowy jest praktycznie niemożliwa.
Prawdziwy Język Nowoczesny Ery AI
Powyższe treści pozwalają nam zrozumieć, że cechy języków nowoczesnych są w rzeczywistości przestarzałymi elementami nieodpowiednimi dla ery AI. Jaki zatem język może stać się najbardziej odpowiednim językiem nowoczesnym ery AI? Wskazówkę można znaleźć w elementach, które języki nowoczesne w przeszłości odrzucały. Język nowoczesny ery AI powinien:
- Posiadać jawną składnię i naturalny przepływ.
- Odrzucać nadmierne struktury OOP na rzecz płaskiej i prostej struktury.
- Zamiast niepotrzebnego syntactic sugar lub niejawnych wzorców, tworzyć wiele funkcji wyłącznie przy użyciu ograniczonej liczby podstawowych słów kluczowych.
- Posiadać prosty i przewidywalny build system, a nie złożony.
Językiem, który najbardziej spełnia te kryteria, jest Golang. Język Go został zaprojektowany tak, aby umożliwiać implementację większości praktycznych funkcji przy użyciu minimalnej liczby kluczowych słów kluczowych i prostych kombinacji składni, a także rygorystycznie wyklucza niepotrzebne abstrakcje i niejawne działania. Jest to struktura korzystna nie tylko dla programistów, ale także dla AI w interpretowaniu i generowaniu kodu.
Cechy Go, takie jak przewidywalna i płaska struktura, jawny przepływ i spójna składnia, w przeciwieństwie do istniejących języków nowoczesnych zaprojektowanych z myślą o programistach-ludziach, lepiej pasują do środowiska programistycznego, w którym AI aktywnie uczestniczy. Konserwatywna filozofia projektowania Go, która kiedyś była postrzegana jako przestarzała, w erze AI okazuje się być najbardziej zaawansowanym wyborem.