Virsraksts, piemēram, “sešpadsmit mākslīgā intelekta aģenti izveidoja C kompilatoru”, izklausās vai nu pēc burvju trika, vai zinātniskās fantastikas sižeta sākuma. Patiesībā tas ir kaut kas interesantāks: ieskats tajā, kā mainās programmatūras inženierija, kad mākslīgā intelekta modeli var uztvert nevis kā sarunu partneri, bet gan kā…darbaspēks— daļēji neatkarīgu aģentu kopums, kas var plānot, sadalīt uzdevumus, rakstīt kodu, pārskatīt viens otru un atkārtot.
Šajā ierakstā ir sīkāk aprakstīts, kas ir C kompilators, kas nepieciešams tā izveidei, kā praksē izskatās “vairāku aģentu” darbs un kāda veida projektus šīs sistēmas, visticamāk, atvieglos (un kuri no tiem spītīgi paliks sarežģīti).
Kas ir kompilators, vienkāršoti izsakoties?
Kompilators ir programma, kas tulko jūsu rakstīto kodu (aavota valoda) formā, ko dators var izpildīt (amērķa valoda, bieži vien mašīnkods). Taču “tulkojums” ir nepietiekami novērtēts. Ražošanas kompilatoram ir arī:
- Noraidīt nederīgas programmas(un paskaidrojiet, kāpēc, ideālā gadījumā ar noderīgiem kļūdu ziņojumiem).
- Ieviest valodas noteikumus(tipi, darbības joma, atmiņas modeļa noteikumi, nedefinēti uzvedības ierobežojumi).
- Optimizētkodu, lai tas darbotos ātri un izmantotu mazāk atmiņas.
- Mērķējiet uz vairākiem centrālajiem procesoriem un operētājsistēmām(x86‑64, ARM64, RISC‑V; Linux, macOS, Windows; iegultās mērķsistēmas).
- Integrēt ar rīku ķēdēm: saistītāji, asembleri, atkļūdotāji, būvēšanas sistēmas.
Noderīgs mentālais modelis ir tāds, ka kompilators nav viena lieta, bet gan cauruļvads:
- Leksings: pārvērst varoņus par žetoniem.
- Parsēšana: pārvērst tokenus strukturētā sintakses kokā.
- Semantiskā analīze: atrisināt nosaukumus, tipus un noteikumus, kas nav redzami tikai no sintakses.
- Starpposma pārstāvība (IR): pārveidot programmu “kompilatoram draudzīgā” formā.
- Optimizācijauzlabot IR.
- Koda ģenerēšana: izstarot mašīnkodu (vai citu mērķa valodu).
Tas ir “mācību grāmatas” skatījums. Inženierijas skatījums pievieno būvēšanas veiktspēju, reproducējamību, drošības pastiprināšanu, diagnostiku un bezgalīgo reālās pasaules kodu bāzu realitāti, izmantojot visus valodas aspektus.
Kāpēc C ir nežēlīgs mērķis
ĒkaaKompilatora izveide ir sarežģīta.CKompilators ir īpaša veida cietais disks, jo C satur:
- Liela “asu malu” virsma (rādītāji, manuāla atmiņas pārvaldība).
- Ilga kompilatora atkarīgas uzvedības vēsture.
- Specifikācija, kas pilna arnedefinēta uzvedība— gadījumi, kad valoda apzināti nenorāda, kas notiek.
Nedefinēta uzvedība nav tikai akadēmiska. Tā ir vienošanās: kompilatoram ir atļauts pieņemt, ka nedefinēta uzvedība nekad nenotiek, kas ļauj veikt optimizācijas, bet arī rada kļūdas, ja reāls kods to nejauši aktivizē.
Maiņstrāvas kompilators, kas irnedaudz nepareizinav “lielākoties labs”; tas var ģenerēt nedaudz nepareizus bināros failus, kas neizdodas tikai noteiktos optimizācijas līmeņos, noteiktos procesoros vai ar noteiktām ievades vērtībām. Tāpēc kompilatoru testēšana ir tik intensīva: ir nepieciešami plaši testēšanas komplekti, izplūdināta analīze, diferenciālā testēšana pret zināmiem kompilatoriem (piemēram, GCC/Clang) un reālās pasaules būvēšanas pārklājums.
Ko tad nozīmē, ka "sešpadsmit aģenti" to uzbūvēja?
Galvenā ideja nav tā, ka viens modelis kļuva viedāks vienas nakts laikā. Tā ir tā, ka darbplūsma kļuva strukturētāka.
Vairāku aģentu iestatīšana parasti izskatās šādi:
- Aplānotājs/vadītājs aģentssadala projektu moduļos un atskaites punktos.
- Ieviesēju aģentirakstīt kodu konkrētām apakšsistēmām (lekseram, parsētājam, IR, koda ģenerēšanai, testiem).
- Recenzentu aģentikritizēt dizainus un pārbaudīt, vai nav loģikas nepilnību.
- Atesta/pūkaina vielaizveido testa gadījumus un meklē kļūmes.
- Adokumentācijas aģentsraksta lietošanas dokumentāciju un piemērus.
Ja kādreiz esat strādājis pie kompilatora projekta, tam vajadzētu šķist pazīstamam — tas atspoguļo to, kā strādā cilvēku komandas. Izmaiņas ir tādas, ka varat acumirklī piesaistīt “komandas biedrus”, un viņi ir gatavi bez noguruma veikt atkārtotu darbu.
Taču nejauciet to ar garantētu kvalitāti. Daudzaģentu sistēmas joprojām var:
- Izveidot kodu, kasizskatās ticamibet ir nepareizi.
- Nepalaidiet garām malas gadījumus.
- “Iestrēgt” lokālajā optimā (dizaistā, kas kompilējas, bet to nevar paplašināt).
- Pārmērīga pielāgošana testu komplektam (testu nokārtošana, nepareizi implementējot valodu).
Ko šī pieeja piedāvā, irparalēlismsuniterācijas ātrumsJa cilvēku komandai pirmā apakšsistēmas prototipa izveide varētu aizņemt nedēļu, daudzaģentu iestatījumos vienas dienas laikā varētu tikt izveidoti vairāki alternatīvi prototipi — tad jūs izvēlaties labāko virzienu.
Īstais pagrieziena punkts: integrācija, nevis paaudze
Lielākā daļa cilvēku iztēlojas mākslīgā intelekta kodēšanas progresu kā "spēju uzrakstīt vairāk koda rindiņu". Kompilatoriem koda rindiņas nav sašaurinājums. Sašaurinājums irintegrācija:
- Vai leksers un parsētājs vienojas par tokenizācijas noteikumiem?
- Vai semantiskās pārbaudes rada konsekventas, noderīgas kļūdas?
- Vai IR saglabā ievades programmas semantiku?
- Vai optimizācijas saglabā uzvedību neskartu pāri nenoteiktām uzvedības robežām?
- Vai tas var kompilēt lielas reālās pasaules koda bāzes, neiztērējot taimautu vai neiztērējot daudz atmiņas?
Daudzaģentu komanda, kas spēj saglabāt šīs daļas saskaņotas, dara kaut ko kvalitatīvi atšķirīgu no modeļa, kas var ģenerēt glītu parsētāja fragmentu.
Kā noteikt, vai kompilators ir “īsts”?
Ir daži lakmusa testi, kas atšķir “glītu demonstrāciju” no “kompilatora, kuram var uzticēties darbā”:
- PašapkalpošanāsVai kompilators var pats sevi kompilēt?
- C standarta atbilstībaVai tas iztur zināmus testu komplektus?
- Diferenciālā testēšanaVai rezultāti atbilst GCC/Clang milzīgos nejaušinātos testa komplektos?
- Atkļūdošanas iespējamībaVai tas var ģenerēt simbolus un sadarboties ar atkļūdotājiem?
- Mērķa platumsVai tas atbalsta vairāk nekā vienu centrālo procesoru/platformu?
Daudzi agrīnie kompilatori vēsturē bija “īsti” ilgi pirms tie kļuva par ražošanas klases kompilatoriem, tāpēc ir pamatoti saukt jaunu kompilatoru par īstu, pat ja tas vēl nav gatavs kodola būvēšanai. Taču attālums no “var kompilēt mazas C programmas” līdz “ir drošs ražošanas videi” ir milzīgs.
Kāpēc tas ir svarīgi, pat ja jūs nekad neizmantojat šo kompilatoru
Interesanta sekas nav tā, ka “mākslīgais intelekts aizstāja kompilatoru inženierus”. Tā ir tā, kakompilatora inženierijakļūst par pieejamāku mērķi eksperimentiem.
Vēsturiski kompilatora darbam ir augsta aktivācijas enerģija:
- Jums ir nepieciešamas padziļinātas zināšanas par valodas dizainu un semantiku.
- Jums ir nepieciešams daudz atbalsta elementu: parsētāji, IR infrastruktūra, testēšanas instalācijas.
- Tev vajag laiku.
Ja daudzaģentu rīki var ģenerēt un uzturēt lielu daļu no šiem sastatnēm, tad vairāk cilvēku var izpētīt:
- Nišas valodas (konkrētai jomai raksturīgas valodas, iegultās skriptvalodas).
- Alternatīvas kompilatoru arhitektūras.
- Drošības un verifikācijas rīki (piemēram, kompilatori ar iebūvētu sanitizāciju).
- Rīki ap kompilatoriem: kļūdu automātiskie minimizētāji, testu gadījumu ģeneratori, regresijas sistēmas.
Tas ir līdzīgi tam, kas notika, kad tīmekļa ietvari nobrieda: jūs pārtraucāt rakstīt neapstrādātus ligzdu serverus un sākāt komponēt augstāka līmeņa daļas. Tas neizslēdza serveru inženieriju; tas to mainīja.
Slēptās izmaksas: uzticēšanās un izcelsme
Viens no iemesliem, kāpēc kompilatori ir jutīgi, ir tas, ka tie atrodas programmatūras steka pamatā. Ja neuzticaties savam kompilatoram, neuzticaties arī savam binārajam failam. Tas rada divus tūlītējus jautājumus mākslīgā intelekta atbalstītiem kompilatoru projektiem:
- IzcelsmeKas ir kuru daļu autors? Kura modeļa autors? Kādi pamudinājumi? Kādas cilvēku veiktas pārskatīšanas?
- DrošībaKā jūs nodrošināt, ka nejauši (vai apdraudētas atkarības dēļ) nerodas neuzkrītošas aizmugurējās durvis vai ievainojamības?
Pastāv arī klasiskā "uzticēšanās" problēma: kompilators, kompilējot pats, var ievietot izvades datos ļaunprātīgu uzvedību. Mūsdienu rīku ķēdes to mazina ar tādām metodēm kā dažādas dubultkompilācijas un reproducējamas versijas, un mākslīgā intelekta ģenerēts kods, visticamāk, palielinās spiedienu plašāk ieviest šīs prakses.
Kādas daudzaģentu kodēšanas prasmes, visticamāk, būs labas nākotnē?
Daudzaģentu sistēmas izceļas, ja:
- Darbu var sadalīt moduļos.
- Ir skaidras saskarnes.
- Ir ātra atgriezeniskā saite (testi, etaloni, fuzzeri).
Kompilatori pārsteidzoši labi iederas: tie ir modulāri, saskarnes vadīti un testējami.
Nākamais vilnis, visticamāk, izskatīsies šādi:
- Aģenta vadīta pārnešana“Atbalsts ARM64 Windows” kļūst par strukturētu uzdevumu sēriju.
- Automatizētas diagnostikas uzlabošana: ģenerēt un validēt labākus kļūdu ziņojumus.
- Fuzzer + fiksatora cilpas: aģenti, kas ģenerē neveiksmīgas programmas, samazina to skaitu un piedāvā ielāpus.
- IR izpēte: alternatīvu optimizācijas gājienu ģenerēšana un pareizības/veiktspējas mērīšana.
Ko tas daraneļauns (vēl)
Tas nenozīmē:
- Katru lielu programmatūras sistēmu var izveidot, "izveidojot aģentus".
- Specifikācijas darbu var izlaist.
- Jūs varat ignorēt testus.
- Drošība un apkope ir atrisināta.
Kompilators ir lielisks demonstrācijas mērķis, jo pareizību var izmērīt un projekts ir ierobežots. Patiesi cietās programmatūras problēmas bieži vien ir neierobežotas: nekārtīgas prasības, lietotāja pieredzes kompromisi, garastes integrācijas un cilvēku koordinācija.
Apakšējā līnija
Mākslīgā intelekta aģentu komandas izveide, kas izveido funkcionējošu C kompilatoru, ir nozīmīgs pagrieziena punkts — nevis tāpēc, ka kompilatori pēkšņi ir kļuvuši vienkārši, bet gan tāpēc, ka tas demonstrē darbplūsmas maiņu:Mākslīgais intelekts kā koordinēta inženieru komandanevis vienas automātiskās pabeigšanas smadzenes. Garais skrejceļš joprojām ir uzticēšanās, testēšana un integrācija ar reālās pasaules rīku ķēdēm, taču virziens ir skaidrs: vairāk programmatūras tiks veidota, organizējot sistēmas, ne tikai rakstot kodu.