Antraštė, pavyzdžiui, „šešiolika dirbtinio intelekto agentų sukūrė C kompiliatorių“, skamba kaip magiškas triukas arba mokslinės fantastikos siužeto pradžia. Iš tikrųjų tai yra kai kas įdomesnio: žvilgsnis į tai, kaip keičiasi programinės įrangos inžinerija, kai dirbtinio intelekto modelį galima traktuoti ne kaip pokalbių partnerį, o kaip...darbo jėga– pusiau nepriklausomų agentų rinkinys, galintis planuoti, dalytis užduotimis, rašyti kodą, peržiūrėti vienas kitą ir iteruoti.
Šiame įraše analizuojama, kas yra C kompiliatorius, ko reikia jam sukurti, kaip praktiškai atrodo „daugiaagentis“ darbas ir kokius projektus šios sistemos greičiausiai palengvins (ir kuriuos iš jų atkakliai teks atlikti).
Kas yra kompiliatorius, paprastai tariant?
Kompiliatorius yra programa, kuri verčia jūsų parašytą kodą (pvz.šaltinio kalba) į formą, kurią kompiuteris gali vykdyti (atikslinė kalba, dažnai mašininis kodas). Tačiau „vertimas“ yra per mažai pasakyta. Gamybos kompiliatorius taip pat turi:
- Atmesti netinkamas programas(ir paaiškinkite, kodėl, geriausia pateikdami naudingus klaidų pranešimus).
- Įgyvendinti kalbos taisykles(tipai, apimtis, atminties modelio taisyklės, neapibrėžti elgesio apribojimai).
- Optimizuotikodą, kad jis veiktų greitai ir naudotų mažiau atminties.
- Taikyti į kelis procesorius ir operacines sistemas(x86‑64, ARM64, RISC‑V; „Linux“, „macOS“, „Windows“; įterptosios paskirties sistemos).
- Integruoti su įrankių grandinėmis: susiejikliai, asembleriai, derinimo programos, kompiliavimo sistemos.
Naudingas mentalinis modelis yra tas, kad kompiliatorius yra ne vienas dalykas, o konvejeris:
- Leksingas: paverskite veikėjus žetonais.
- Analizė: paverskite žetonus struktūrizuotu sintaksės medžiu.
- Semantinė analizė: išspręsti pavadinimus, tipus ir taisykles, kurie nėra matomi vien iš sintaksės.
- Tarpinis atstovavimas (IR): transformuoti programą į „kompiliatoriui patogią“ formą.
- Optimizavimas: pagerinti IR.
- Kodo generavimas: skleisti mašininį kodą (arba kitą tikslinę kalbą).
Tai „vadovėlinis“ požiūris. Inžinerinis požiūris prideda našumą, atkuriamumą, saugumo stiprinimą, diagnostiką ir begalinę realaus pasaulio kodų bazių realybę, naudojant kiekvieną kalbos kampelį.
Kodėl C yra žiaurus taikinys
PastatasaKompiliatorius yra sudėtingas. SukurtiCKompiliatorius yra ypatinga sudėtingumo rūšis, nes C kalboje yra:
- Didelis „aštrių briaunų“ paviršius (rodyklės, rankinis atminties valdymas).
- Ilga kompiliatoriaus priklausomo elgesio istorija.
- Specifikacija, pilnaneapibrėžtas elgesys— atvejai, kai kalba sąmoningai nenurodo, kas vyksta.
Neapibrėžtas elgesys nėra vien akademinis. Tai sutartis: kompiliatorius gali manyti, kad neapibrėžtas elgesys niekada nevyksta, o tai leidžia optimizuoti, bet kartu sukuria spąstų, kai tikras kodas netyčia jį suaktyvina.
AC kompiliatorius, kuris yrašiek tiek neteisinganėra „dažniausiai geras“; jis gali generuoti šiek tiek neteisingus dvejetainius failus, kurie neveikia tik esant tam tikriems optimizavimo lygiams, tam tikriems procesoriams arba tam tikroms įvesties reikšmėms. Štai kodėl kompiliatorių testavimas yra toks intensyvus: reikia daugybės programų rinkinių, supaprastinimo, diferencialinio testavimo su žinomais kompiliatoriais (pvz., GCC/Clang) ir realaus pasaulio kompiliavimo aprėpties.
Taigi, ką reiškia, kad „šešiolika agentų“ jį pastatė?
Pagrindinė idėja ne ta, kad vienas modelis per naktį tapo išmanesnis. Tai ta, kad darbo eiga tapo labiau struktūrizuota.
Kelių agentų sąranka paprastai atrodo taip:
- Aplanuotojas / vadybininkas agentassuskirsto projektą į modulius ir etapus.
- Įgyvendinimo agentairašyti kodą konkrečioms posistemėms (lekseriui, analizatoriui, IR, kodo generavimui, testams).
- Recenzentų agentaikritikuoti projektus ir patikrinti, ar nėra loginių spragų.
- Abandymo / pūkelių agentaskuria testus ir ieško klaidų.
- Adokumentacijos agentasrašo naudojimo dokumentus ir pavyzdžius.
Jei kada nors dirbote su kompiliatoriaus projektu, tai turėtų atrodyti pažįstama – tai atspindi, kaip veikia žmonių komandos. Skirtumas tas, kad galite akimirksniu pasitelkti „komandos draugus“, ir jie nori sunkiai dirbti pasikartojantį darbą be nuovargio.
Tačiau nepainiokite to su garantuota kokybe. Daugiagentės sistemos vis tiek gali:
- Sukurkite kodą, kurisatrodo įtikinamaibet yra neteisus.
- Praleisti kraštutinius atvejus.
- „Užstrigkite“ vietinėje optimoje (projekte, kuris kompiliuojasi, bet negali būti išplėstas).
- Per didelis pritaikymas testų rinkiniui (testų išlaikymas netinkamai įdiegus kalbą).
Ką siūlo šis metodasparalelizmasiriteracijos greitisJei žmonių komandai pirmajam posistemės prototipui sukurti prireiktų savaitės, tai daugiaagentė sistema per dieną galėtų sukurti kelis alternatyvius prototipus – tuomet jūs pasirenkate geriausią kryptį.
Tikrasis etapas: integracija, o ne generavimas
Dauguma žmonių įsivaizduoja dirbtinio intelekto kodavimo pažangą kaip „galinčią parašyti daugiau kodo eilučių“. Kompiliatoriams kodo eilutės nėra kliūtis. Kliūtis yraintegracija:
- Ar lekseris ir analizatorius sutaria dėl tokenizavimo taisyklių?
- Ar semantiniai patikrinimai sukuria nuoseklias, veiksmingus klaidas?
- Ar IR išsaugo įvesties programos semantiką?
- Ar optimizavimas išsaugo elgseną nepakitusią per neapibrėžtas elgsenos ribas?
- Ar jis gali sukompiliuoti dideles realaus pasaulio kodų bazes nesugadindamas laiko limito ir neišeikvodamas atminties?
Daugiafunkcinė komanda, galinti išlaikyti šias dalis darnias, daro kažką kokybiškai kitokio nei modelis, galintis sugeneruoti tvarkingą analizatoriaus fragmentą.
Kaip sužinoti, ar kompiliatorius yra „tikras“
Yra keletas lakmuso testelių, kurie skiria „tvarkingą demonstracinę versiją“ nuo „kompiliatoriaus, kuriuo galite pasitikėti darbe“:
- Savarankiškas talpinimasAr kompiliatorius gali pats save kompiliuoti?
- C standarto atitiktisAr jis praeina žinomus testų rinkinius?
- Diferencinis testavimasAr rezultatai atitinka GCC/Clang dideliuose atsitiktinių imčių testų rinkiniuose?
- Derinimo galimybėsAr jis gali generuoti simbolius ir bendradarbiauti su derinimo programomis?
- Tikslinis plotisAr jis palaiko daugiau nei vieną procesorių / platformą?
Daugelis ankstyvųjų kompiliatorių istorijoje buvo „tikri“ dar gerokai prieš tai, kai tapo gamybinės klasės, todėl naują kompiliatorių galima vadinti tikru, net jei jis dar nėra paruoštas branduolio kompiliavimui. Tačiau atstumas nuo „gali kompiliuoti mažas C programas“ iki „yra saugus gamybinei aplinkai“ yra milžiniškas.
Kodėl tai svarbu, net jei niekada nenaudojate to kompiliatoriaus
Įdomi išvada yra ne ta, kad „DI pakeitė kompiliatorių inžinierius“. Bet tai, kadkompiliatoriaus inžinerijatampa prieinamesniu eksperimentų taikiniu.
Istoriškai kompiliatoriaus darbas turi didelę aktyvacijos energiją:
- Jums reikia gilių kalbos dizaino ir semantikos žinių.
- Jums reikia daug pastolių: analizatorių, IR infrastruktūros, bandymų laidai.
- Tau reikia laiko.
Jei daugiaagentės priemonės gali sugeneruoti ir palaikyti didelę dalį šių pastolių, daugiau žmonių gali ištirti:
- Nišinės kalbos (konkrečioms sritims skirtos kalbos, įterptųjų scenarijų kalbos).
- Alternatyvios kompiliatorių architektūros.
- Saugos ir tikrinimo įrankiai (pvz., kompiliatoriai su integruotu valymu).
- Kompiliatorių įrankiai: automatiniai klaidų minimizatoriai, testų atvejų generatoriai, regresinės sistemos.
Tai panašu į tai, kas nutiko, kai subrendo žiniatinklio sistemos: nustojote rašyti neapdorotus lizdų serverius ir pradėjote kurti aukštesnio lygio dalis. Tai nepanaikino vidinės inžinerijos; ji ją pakeitė.
Paslėptos išlaidos: patikimumas ir kilmė
Viena iš priežasčių, kodėl kompiliatoriai yra jautrūs, yra ta, kad jie yra programinės įrangos pagrindas. Jei nepasitikite savo kompiliatoriumi, nepasitikite ir dvejetainiu failu. Tai iškelia du neatidėliotinus klausimus dirbtinio intelekto padedamiems kompiliatorių projektams:
- KilmėKas parašė kurias dalis? Kokį modelį? Kokie raginimai? Kokios žmonių peržiūros buvo atliktos?
- SaugumasKaip užtikrinate, kad nebūtų atsitiktinai (arba dėl pažeistos priklausomybės) atsiradusių subtilių užpakalinių durų ar pažeidžiamumų?
Taip pat yra klasikinė „pasitikėjimo pasitikėjimu“ problema: kompiliatorius, pats kompiliuodamas, gali įterpti kenkėjišką elgseną į išvesties duomenis. Šiuolaikinės įrankių grandinės šią problemą išsprendžia naudodamos tokias technikas kaip įvairus dvigubas kompiliavimas ir atkuriamos versijos, o dirbtinio intelekto generuojamas kodas greičiausiai padidins spaudimą plačiau taikyti šią praktiką.
Kokiose daugiaagentio kodavimo srityse greičiausiai bus gerai toliau
Daugiafunkcinės sistemos puikiai veikia, kai:
- Darbą galima suskirstyti į modulius.
- Yra aiškios sąsajos.
- Yra greitas grįžtamasis ryšys (testai, lyginamieji testai, patikros).
Kompiliatoriai puikiai tinka: jie yra moduliniai, valdomi sąsajos ir testuojami.
Kita banga greičiausiai atrodys taip:
- Agentų valdomas perkėlimas„ARM64 Windows palaikymas“ tampa struktūrizuotų užduočių seka.
- Automatinės diagnostikos patobulinimas: generuoti ir patvirtinti geresnius klaidų pranešimus.
- Pūkuotuko + fiksatoriaus kilposagentai, kurie generuoja neveikiančias programas, jas sumažina ir siūlo pataisymus.
- IR tyrinėjimas: alternatyvių optimizavimo etapų generavimas ir teisingumo / našumo matavimas.
Ką tai daronereiškia (kol kas)
Tai nereiškia:
- Kiekviena didelė programinės įrangos sistema gali būti sukurta „sukuriant agentus“.
- Specifikacijos darbą galite praleisti.
- Galite ignoruoti testus.
- Saugumas ir priežiūra yra išspręsti.
Kompiliatorius yra puikus demonstracinis taikinys, nes teisingumą galima išmatuoti, o projektas yra ribotas. Tikrosios techninės programinės įrangos problemos dažnai yra neribotos: netvarkingi reikalavimai, UX kompromisai, ilgos integracijos ir žmonių koordinavimas.
Esmė
Dirbtinio intelekto agentų komanda, sukurianti veikiantį C kompiliatorių, yra reikšmingas etapas – ne todėl, kad kompiliatoriai staiga tapo paprasti, o todėl, kad tai rodo darbo eigos pokytį:Dirbtinis intelektas kaip koordinuota inžinierių komandao ne vienos automatinio užbaigimo smegenys. Ilgas kelias išlieka pasitikėjimas, testavimas ir integracija su realaus pasaulio įrankių grandinėmis, tačiau kryptis aiški: daugiau programinės įrangos bus kuriama derinant sistemas, o ne tik rašant kodą.