Razvoj uz AI

Zašto AI agenti pišu kvalitetnu Javu

ai-agents · java

Kada AI agent piše sve veći dio vašeg koda, pitanje jezika se mijenja. Najbolji jezik za agenta nije samo onaj koji vi volite pisati. To je i onaj koji model pouzdano generiše, onaj koji najbrže signalizira da je generisani kod pogrešan i onaj koji se najjeftinije izvršava kada ga agent pokreće u petlji. Na iznenađenje mnogih, Java stoji dobro po sva tri osnova.

Kod napisan jednom, a radi decenijama

Model piše kod na kakvom je treniran. Javin trening-materijal je trideset godina javnog koda, specifikacija, knjiga i odgovorenih pitanja, a veliki dio toga pisan je prema standardima, dokumentovanim i verzionisanim interfejsima samog JDK-a, Jakarta EE-a i MicroProfilea. Pisanje spram standarda je najsigurnije, jer se standardi ne mijenjaju često. Zahvaljujući Javinoj kompatibilnosti sa prethodnim verzijama, kod napisan 2012. obično radi na najnovijoj verziji Jave, ako je razvijan prema standardnom API-ju. Isto vrijedi i u enterprise svijetu. Veliki projekti pisani spram standardnih API-ja poput MicroProfilea skoro pa sigurno nemaju problem sa nadogradnjom ili imaju potrebu za minimalnom migracijom. Čuveni izuzetak je preimenovanje paketa javax u jakarta, jedno preimenovanje u četvrt stoljeća, i upravo taj razmak je poenta.

Ekosistemi koji svoje API-je iznova izmišljaju svake druge godine treniraju iste modele na materijalu koji protivrječi sam sebi. Odatle dolaze halucinirane metode i importi. Model je vidio četiri nekompatibilne generacije istog poziva i miješa ih. Java je tu u boljoj poziciji. Uz malo ograničenje, na primjer instrukcije agentu da piše kod spram MicroProfilea, dobijate kvalitetan kod koji se kompajlira i radi. Trening-materijal se slaže sam sa sobom, i zato LLM voli Javu.

Ta bliskost radi u oba smjera. Kada model čita EE kod pisan spram standarda, dosta brže i uz manje korištenog konteksta razumije kod, pa tako i potrebne izmjene može da napravi kvalitetnije i na pravom mjestu.

Kako pokrenuti jedan Java fajl bez build alata?

Jedan Java fajl pokreće se direktno launcherom java, bez build alata i bez postavljanja projekta, a s Javom 25 i bez deklaracije klase. Agent koji napiše alat mora ga i pokrenuti i provjeriti, a ceremonija je cijena te petlje. Minimalan program je fajl, a ne klasa:

void main() {
    IO.println("Hello Bosnian JUG");
}

Sačuvajte ga kao welcome.java i pokrenite direktno iz izvornog koda. Nema koraka kompajliranja koji biste vidjeli:

$ java welcome.java
Hello Bosnian JUG

Mogućnost se zove compact source files and instance main methods, u previewu od Jave 21 i finalna u Javi 25 kao JEP 512. Uz module import deklaracije (JEP 511) skraćuje se i blok importa. Jedna linija, import module java.base, stavlja na raspolaganje kolekcije, streamove, fajlove i regularne izraze, a HTTP klijent stiže s još jednom linijom.

Evo provjere dostupnosti, posla koji obično ide Bashu ili Pythonu. Jedan fajl bez dodatnih biblioteka i bez builda:

import module java.base;
import module java.net.http;

void main(String... args) {
    var client = HttpClient.newHttpClient();
    for (var url : args) {
        var started = System.nanoTime();
        try {
            var response = client.send(
                HttpRequest.newBuilder(URI.create(url)).build(),
                HttpResponse.BodyHandlers.discarding());
            var ms = (System.nanoTime() - started) / 1_000_000;
            IO.println(response.statusCode() + "  " + ms + " ms  " + url);
        } catch (Exception e) {
            IO.println("DOWN  " + url);
        }
    }
}

Sačuvajte kao check.java i pokrenite istom komandom kao prethodni primjer:

$ java check.java https://jug.ba https://example.com
200  450 ms  https://jug.ba
200  403 ms  https://example.com

Bash je dobra opcija, naročito za manje skripte, i nenadmašan za jednolinijske komande. Skripta iznad je otprilike granica na kojoj Bash prestaje biti blag. Kako skripte postaju kompleksnije, Java ih čini čitljivijim i robusnijim, a takav kod može pregledati i dosta više developera nego napredni Bash.

Za agenta je ovo jedna od najjeftinijih mogućih petlji. Generiši fajl, pokreni fajl. Nema build fajla koji bi agent mogao halucinirati, nema biblioteka koje treba razriješiti i nema konflikata verzija koje treba objašnjavati.

Kada skripta preraste java.base, postoji korak prije build alata. JBang pokreće istu vrstu jednog fajla i rješava biblioteke deklarisane u komentaru na njegovom vrhu, što agentu odgovara iz istog razloga kao i obični launcher. Cijeli program ostaje jedan fajl koji se može generisati, sa bibliotekama.

Ovo zahtijeva JDK 25. Između Jave 21 i 24 mogućnost postoji samo kao preview, iza preview flagova.

Od skripti do servisa

Ista svojstva prenose se u enterprise kod. Kažite agentu da napravi endpoint spram standardnog API-ja i dobit ćete, na primjer, ovakav resurs:

@Path("subscriptions")
@ApplicationScoped
public class SubscriptionsResource {

    @Inject
    SubscriptionCreator creator;

    @Inject
    SubscriptionFinder finder;

    @GET
    @Path("{email}")
    public Response subscription(@PathParam("email") String email) {
        return this.finder
                .subscription(email)
                .map(Responses::ok)
                .orElseGet(Responses::noContent);
    }

    @POST
    public Response subscribe(Subscription subscription) {
        var result = this.creator.subscribe(subscription);
        return switch (result) {
            case Created created -> Responses.created(created);
            case AlreadyExists exists -> Responses.conflict(exists);
            case Invalid invalid -> Responses.invalid(invalid);
        };
    }
}

Brže je i zelenije

Agenti pokreću kod u petljama, a na toj skali cijena izvršavanja je stvaran novac. Najpoznatija mjerenja, prvi put objavljena u Pereira et al. na SLE 2017 i proširena u žurnalskoj verziji 2021, rangiraju 27 jezika po energiji, vremenu i memoriji na Computer Language Benchmarks Game. Evo dijela tabele koji je bitan, normalizovano na C, s memorijom normalizovanom na Pascal kao najštedljiviji jezik studije, i rangom svake vrijednosti među 27 jezika:

Energija, vrijeme i memorija po jeziku, normalizovano na C (memorija na Pascal), rang među 27 jezika u zagradama. Podaci su iz Pereira et al., 2021.

JezikEnergijaVrijemeMemorija
C1.00 (1)1.00 (1)1.17 (3)
Rust1.03 (2)1.04 (2)1.54 (7)
C++1.34 (3)1.56 (3)1.34 (5)
Java1.98 (5)1.89 (5)6.01 (22)
C#3.14 (13)3.14 (10)2.85 (14)
Go3.23 (14)2.83 (7)1.05 (2)
JavaScript4.45 (17)6.52 (16)4.59 (20)
Python75.88 (26)71.90 (26)2.80 (12)

Po energiji i vremenu Java sjedi uz C, C++ i Rust, faktor 38 ispred Pythona po oba mjerila. Ponovljena analiza iz 2024. sliku je dodatno izoštrila, dvaput u Javinu korist. Utvrdila je da je potrošnja energije direktno proporcionalna vremenu izvršavanja bez obzira na jezik, pa je brz jezik ujedno i štedljiv. I Javine brojke svela je na JIT zagrijavanje u kratkotrajnim benchmarkovima, mjerni artefakt, a ne svojstvo jezika, s razmakom prema C-u koji se u ustaljenom stanju znatno smanjuje.

Memorija je Javina slaba kolona, 6.01 u toj tabeli, i to je ujedno mjesto gdje su podaci najviše ostarjeli. Java 25 donosi kompaktna zaglavlja objekata (JEP 519), danas jedan flag, a od JDK 27 default, koja svakom objektu smanjuju zaglavlje s dvanaest na osam bajtova. A gdje dominiraju memorija i pokretanje, GraalVM native image kompajlira program unaprijed u binarni fajl. Binarni fajl kreće u milisekundama i čuva dio rezidentne memorije JVM-a, zbog čega ga runtimeovi poput Quarkusa i Helidona nude kao build target.

Gdje Python i dalje pobjeđuje

Zatražite od agenta skriptu bez imenovanja jezika i obično dobijete Python. Za mnoge alate Python biblioteka već postoji i u širokoj je upotrebi, a u svijetu mašinskog učenja to je podrazumijevani jezik.

Međutim, isti agent koji je napisao Python alat može ga na zahtjev portati i u Javu. Tabela iznad pokazuje šta se time dobija. Ovakvo portanje je nekada bilo rijedak sporedni projekat koji rijetko ko finansira, a sada je postalo instrukcija za agenta i review koda.

Zadajte cilj jednom

Trideset godina javnog Java koda nosi idiome svake ere, pa agentu kažite koje da koristi. Skill navodi cilj, Javu 25 ili 21, i šta se smije a šta ne, bilo da su to recordi, streamovi umjesto petlji ili konvencije imenovanja. Napišite skill jednom i svaka iduća instrukcija agentu vezana za kodiranje će ga slijediti. Isti je to mehanizam kao vodič za stil koji smo zapakovali kao agent skill, usmjeren na kod umjesto na prozu.

Java 25 je LTS, pa može da se koristi s posebnom dozom sigurnosti, jer će alati napisani da rade sa Javom 25 raditi dugi niz godina. Java iz godine u godinu postaje sve bolja, a posebno u oblastima koje su ranije imenovane kao problemi, poput ceremonije, pokretanja i memorije.

JUG.ba je Java korisnička grupa Bosne i Hercegovine, počinjemo u jesen 2026. Prijavite se na listu čekanja da vas obavijestimo na vrijeme.

← Svi tekstovi