Pealkiri nagu „kuusteist tehisintellekti agenti ehitasid C-kompilaatori” kõlab kas nagu võlutrikk või ulmelise süžee algus. Tegelikkuses on see midagi huvitavamat: pilguheit sellele, kuidas tarkvaratehnika muutub, kui tehisintellekti mudelit saab käsitleda mitte vestluspartnerina, vaid kui…tööjõud— poolsõltumatute agentide kogum, mis saavad planeerida, ülesandeid jagada, koodi kirjutada, üksteist üle vaadata ja itereerida.
See postitus annab ülevaate, mis on C-kompilaator, mida selle loomiseks on vaja, milline „mitme agendi” töö praktikas välja näeb ja milliseid projekte need süsteemid tõenäoliselt lihtsamaks teevad (ja millised jäävad kangekaelselt keeruliseks).
Mis on kompilaator lihtsustatult öeldes?
Kompilaator on programm, mis tõlgib teie kirjutatud koodi (alähtekeel) arvuti poolt käivitatavasse vormingusse (asihtkeel, sageli masinkood). Kuid „tõlge” on pehmelt öeldud. Tootmiskeskkonna kompilaator peab ka:
- Keelduge sobimatutest programmidest(ja selgitage, miks, ideaalis koos kasulike veateadetega).
- Keelereeglite jõustamine(tüübid, ulatus, mälumudeli reeglid, määratlemata käitumispiirangud).
- Optimeerikoodi, et see töötaks kiiresti ja kasutaks vähem mälu.
- Sihi mitut protsessorit ja operatsioonisüsteemi(x86‑64, ARM64, RISC‑V; Linux, macOS, Windows; manustatud sihtmärgid).
- Integreeri tööriistakettidega: linkerid, assemblerid, silurid, ehitussüsteemid.
Kasulik mentaalne mudel on see, et kompilaator ei ole üks asi, vaid torujuhe:
- Lexing: muuda tegelased žetoonideks.
- Parsimine: muuda tokenid struktureeritud süntaksipuuks.
- Semantiline analüüs: lahendab nimesid, tüüpe ja reegleid, mis pole ainult süntaksi põhjal nähtavad.
- Vahepealne esindus (IR): teisendage programm kompilaatorisõbralikuks.
- Optimeerimine: parandage IR-i.
- Koodi genereerimine: kiirgab masinkoodi (või mõnda muud sihtkeelt).
See on „õpiku“ vaade. Insenerivaade lisab jõudluse, reprodutseeritavuse, turvalisuse tugevdamise, diagnostika ja lõputu reaalsete koodibaaside reaalsuse, kasutades keele iga nurka.
Miks C on jõhker sihtmärk
HooneaKompilaatori loomine on keeruline.CKompilaator on eriline raskesti ligipääsetav programm, kuna C sisaldab:
- Suur pind „teravaid servi” (osutid, käsitsi mäluhaldus).
- Kompilaatorist sõltuva käitumise pikk ajalugu.
- Spetsifikatsioon, mis on täismääratlemata käitumine— juhtumid, kus keeles tahtlikult ei täpsustata, mis juhtub.
Määratlemata käitumine pole ainult akadeemiline. See on leping: kompilaatoril on lubatud eeldada, et määratlemata käitumist kunagi ei esine, mis võimaldab optimeerimist – ja loob ka lõkse, kui päris kood selle kogemata käivitab.
AC kompilaator, mis onveidi valestiei ole „enamasti korras”; see võib genereerida peenelt ebatäpseid binaarfaile, mis ebaõnnestuvad ainult teatud optimeerimistasemetel, teatud protsessoritel või teatud sisendite korral. Seetõttu on kompilaatorite testimine nii intensiivne: vaja on laia valikut tarkvarapakette, hägustust, diferentsiaaltestimist tuntud kompilaatorite (nt GCC/Clang) vastu ja reaalse maailma ehituskatvust.
Mida see tähendab, et „kuusteist agenti” ehitasid ühe?
Põhiidee ei ole selles, et üks mudel üleöö targemaks muutus. Asi on selles, et töövoog muutus struktureeritumaks.
Mitme agendi seadistus näeb tavaliselt välja selline:
- Aplaneerija/halduri esindajajagab projekti mooduliteks ja verstapostideks.
- RakendajadKirjutada koodi kindlatele alamsüsteemidele (lekser, parser, IR, koodi genereerimine, testid).
- Retsensendi agendidkritiseeri kavandeid ja kontrolli loogikalünki.
- Atest-/hämaaineloob testjuhtumeid ja otsib tõrkeid.
- Adokumentatsiooniagentkirjutab kasutusdokumente ja näiteid.
Kui oled kunagi kompilaatoriprojekti kallal töötanud, peaks see tunduma tuttav – see peegeldab inimeste meeskondade tööpõhimõtet. Erinevus seisneb selles, et saad koheselt meeskonnakaaslasi tööle panna ja nad on valmis korduva tööga vaeva nägema ilma väsimuseta.
Kuid ärge ajage seda segamini garanteeritud kvaliteediga. Mitmeagentilised süsteemid saavad siiski:
- Loo kood, mistundub usutavaga on vale.
- Jäta servad vahele.
- Jääge kinni lokaalsesse optimasse (disain, mis kompileerub, aga mida ei saa laiendada).
- Ülesobitamine testikomplekti (testide läbimine ilma keelt korrektselt rakendamata).
See lähenemisviis pakub järgmist:paralleelsusjaiteratsiooni kiirusKui inimestest koosneval meeskonnal võib alamsüsteemi esimese prototüübi loomiseks kuluda nädal, siis mitme agendiga süsteem võib päevas toota mitu alternatiivset prototüüpi – seejärel valite parima suuna.
Tõeline verstapost: integratsioon, mitte genereerimine
Enamik inimesi kujutab tehisintellekti kodeerimise edenemist ette kui „võimalust kirjutada rohkem koodiridu“. Kompilaatorite jaoks ei ole koodiread pudelikaelaks. Pudelikael onintegratsioon:
- Kas lekser ja parser on tokeniseerimisreeglite osas ühel meelel?
- Kas semantilised kontrollid toovad kaasa järjepidevaid ja tegutsemist vajavaid vigu?
- Kas IR säilitab sisendprogrammi semantika?
- Kas optimeerimised säilitavad käitumise muutumatuna ka määratlemata käitumispiiride ületamisel?
- Kas see suudab kompileerida suuri reaalse maailma koodibaase ilma ajalõpu või mälu raiskamiseta?
Mitmeagentne meeskond, mis suudab need osad sidusana hoida, teeb midagi kvalitatiivselt erinevat võrreldes mudeliga, mis suudab genereerida korraliku parseri koodijupi.
Kuidas teha kindlaks, kas kompilaator on "päris"?
On mõned lakmuspaberid, mis eristavad „korralikku demot“ „tööks usaldusväärsest kompilaatorist“:
- IsehostimineKas kompilaator saab ennast ise kompileerida?
- C-standardile vastavusKas see läbib teadaolevaid testikomplekte?
- DiferentsiaaltestimineKas väljundid vastavad GCC/Clangile suurtes randomiseeritud testikomplektides?
- Silumisvõime: kas see saab luua sümboleid ja teha koostööd siluritega?
- Sihtmärgi ulatusKas see toetab rohkem kui ühte protsessorit/platvormi?
Paljud varased kompilaatorid ajaloos olid "päris" juba ammu enne, kui need tootmisklassi jõudsid – seega on õiglane nimetada uut kompilaatorit päris kompilaatoriks isegi siis, kui see pole veel kerneli ehitamiseks valmis. Kuid vahemaa "oskab kompileerida väikeseid C-programme" ja "on tootmiskeskkonnas ohutu" vahel on tohutu.
Miks see on oluline, isegi kui te seda kompilaatorit kunagi ei kasuta
Huvitav tagajärg ei ole see, et "tehisintellekt asendas kompilaatoriinsenerid". Vaid see, etkompilaatori inseneriteadusmuutub ligipääsetavamaks katseobjektiks.
Ajalooliselt on kompilaatori tööl kõrge aktivatsioonienergia:
- Teil on vaja sügavaid teadmisi keeledisaini ja semantika kohta.
- Teil on vaja palju tellinguid: parsereid, IR-infrastruktuuri, testimisrakmeid.
- Sa vajad aega.
Kui mitme agentiga tööriistad suudavad suure osa sellest tugistruktuurist genereerida ja hallata, saavad rohkem inimesi uurida järgmist:
- Nišikeeled (domeenispetsiifilised keeled, manussüsteemide skriptimiskeeled).
- Alternatiivsed kompilaatori arhitektuurid.
- Turvalisuse ja kontrollimise tööriistad (nt sisseehitatud puhastamisega kompilaatorid).
- Kompilaatorite ümber kasutatavad tööriistad: vigade automaatsed minimeerijad, testide generaatorid, regressioonisüsteemid.
See sarnaneb sellega, mis juhtus veebiraamistike küpsemaks saades: lõpetati toorserverite kirjutamine ja hakati looma kõrgema taseme osi. See ei kaotanud ära serveripoolset inseneritööd, vaid muutis seda.
Varjatud kulu: usaldus ja päritolu
Üks põhjus, miks kompilaatorid on tundlikud, on see, et nad asuvad tarkvarapaketi alustalas. Kui te ei usalda oma kompilaatorit, ei usalda te ka oma binaarfaili. See tekitab tehisintellektiga toetatud kompilaatoriprojektide jaoks kaks kohest küsimust:
- PäritoluKes millised osad autor on? Millise mudeli? Millised teemad esitati? Milliseid inimlikke ülevaateid tehti?
- TurvalisusKuidas tagada, et kogemata (või kahjustatud sõltuvuse tõttu) ei tekiks varjatud tagauksi või haavatavust?
Samuti on olemas klassikaline „usalduse usaldamise” probleem: kompilaator võib kompileerimise ajal väljunditesse pahatahtlikku käitumist lisada. Kaasaegsed tööriistaketid leevendavad seda selliste tehnikatega nagu mitmekesine topeltkompileerimine ja reprodutseeritavad järgud – ja tehisintellekti loodud kood suurendab tõenäoliselt survet nende tavade laiemaks kasutuselevõtuks.
Milles mitmeagentilise kodeerimise alal on tõenäoline, et see on järgmine hea?
Mitmeagentilised süsteemid säravad siis, kui:
- Töö saab jagada mooduliteks.
- Seal on selged liidesed.
- Saadaval on kiire tagasiside (testid, võrdlusnäitajad, hägustid).
Kompilaatorid sobivad üllatavalt hästi: need on modulaarsed, liidesepõhised ja testitavad.
Järgmine laine näeb tõenäoliselt välja selline:
- Agendipõhine portimine„ARM64 Windowsi tugi” muutub struktureeritud ülesannete seeriaks.
- Automatiseeritud diagnostika täiustamine: genereerida ja valideerida paremaid veateateid.
- Fuzzer + fiksaatori silmused: agendid, mis genereerivad vigaseid programme, minimeerivad neid ja pakuvad välja parandusi.
- IR-uuringalternatiivsete optimeerimisläbide genereerimine ja õigsuse/jõudluse mõõtmine.
Mida see teebmittekeskmine (veel)
See ei tähenda:
- Iga suurt tarkvarasüsteemi saab luua agentide "keeramise" teel.
- Spetsifikatsioonitöö võid vahele jätta.
- Teste saab ignoreerida.
- Turvalisus ja hooldatavus on lahendatud.
Kompilaator on suurepärane demoobjekt, sest korrektsust saab mõõta ja projekt on piiratud. Tõeliselt keerulised tarkvaraprobleemid on sageli piiritud: segased nõuded, kasutajakogemuse kompromissid, pikad integratsioonid ja inimlik koordinatsioon.
Lõpptulemus
Tehisintellekti agentide meeskonna loomine, mis loob toimiva C-kompilaatori, on oluline verstapost – mitte sellepärast, et kompilaatorid on järsku lihtsaks muutunud, vaid sellepärast, et see näitab töövoo muutust:Tehisintellekt kui koordineeritud insenerimeeskondmitte üksainus automaatselt täitva funktsiooniga aju. Pikk teekond jääb usalduse, testimise ja reaalsete tööriistakettidega integreerimise juurde, kuid suund on selge: rohkem tarkvara luuakse süsteemide orkestreerimise, mitte ainult koodi kirjutamise teel.