programmatūra · 5 min · 13.07.2026

QBE 1.3 panāk 63% no GCC ātruma un beidzot atbalsta Windows

QBE 1.3 CoreMark testā panāk 63% no komerciāla kompilatora ātruma — pirms šī laidiena rādītājs bija ap 40%. Ģenerētais kods paātrinājies tik daudz, ka Hare valodas testu komplekts nostrādā 1,7 sekundēs iepriekšējo 2,6 vietā. Tas ir lielākais QBE laidiens kopš 1.0: kodā pienācis ap 7000 jaunu rindu un aizvākts ap 1500.

QBE ir kompilatora aizmugure — tā daļa, kas no starpvalodas (IL) izveido mašīnkodu. Valodas autors raksta tikai priekšpusi, kas ražo QBE tekstuālo IL, un aizmugure to pārvērš asamblerā priekš amd64, arm64 un riscv64. Autors Kentēns Karbono to sāka ar mērķi sasniegt 70% no lielo kompilatoru veiktspējas ar 10% no to koda apjoma. LLVM aizmugure ir vairāki miljoni rindu; QBE joprojām tur zem desmit tūkstošiem. Uz tās balstās Hare sistēmvaloda, C11 kompilators cproc un Pascal kompilators Blaise.

Šablonu saskaņošanu tagad ģenerē no IL aprakstiem

Galvenā izmaiņa slēpjas instrukciju izvēlē. Aizmugurei jāatpazīst starpvalodas gabaliņi un jāizvēlas tiem piemērotākā mašīninstrukcija. Līdz 1.3 šī loģika bija rakstīta ar roku C valodā. Tagad to ražo jauns OCaml rīks mgen: tas nolasa lispveida IL šablonus komentāru blokos un uzģenerē tiem atbilstošo C kodu turpat zem bloka.

Algoritms aizgūts no Kena Tompsona Plan 9 C kompilatora numerācijas pieejas. Katram instrukciju DAG mezglam piesaista bitkopu, kas iezīmē, kuri šabloni sader; ar roku rakstītā loģika pēc tam izvēlas labāko variantu. Sarežģītākiem gadījumiem mgen uzģenerē baitkoda saskaņotāju, ko izpildlaikā interpretē funkcija runmatch(). Ģenerētais C ir uzrakstīts tā, lai izskatītos kā pārējais QBE kods — nevis kā mašīnas izmests teksts.

Šis paņēmiens ļāva pievienot vairākas optimizācijas, ko iepriekš ar roku uzturēt būtu bijis grūti. Rolands Patersons-Džonss iestrādāja GVN/GCM (globālo vērtību numerāciju un koda kustību), ciklu optimizācijas, zaru izslēgšanu un vadības grafa vienkāršošanu. Šīs optimizācijas kopā izskaidro lēcienu CoreMark rādītājā. Iekļautās funkcijas (inlining) QBE apzināti neieviesa — tas sabojātu straumēto pa vienai funkcijai kompilācijas modeli, uz kura balstās visa QBE uzbūve. Aizmugure apstrādā vienu funkciju un aizmirst to, pirms ķeras pie nākamās, tāpēc atmiņas patēriņš paliek zems arī lieliem failiem.

Windows atbalsts pēc gadiem

Skots Greiems pievienoja amd64 Windows ABI — līdz šim QBE mērķēja tikai uz Unix saimi. To ieslēdz ar karodziņu -t amd64_win, izvade ir AT&T sintaksē un saderīga ar mingw asambleriem. Autors pats komentēja, ka pieņēmis šo devumu, neraugoties uz garajiem mainīgo nosaukumiem un daudzajiem komentāriem, kas QBE stilam nav raksturīgi.

Kentēns iežēlojās par mani un ļāva augšuplādēt amd64_win ar maniem garajiem mainīgo nosaukumiem un pļāpīgajiem komentāriem.

Laidiens ienes arī pozīciju neatkarīgu kodu (PIC): ar extern karodziņu IL var aprakstīt dinamiskas konstantes, netiešu piekļuvi globālajiem simboliem un būvēt koplietojamos objektus uz vairumu mērķa platformu. Kopā ar Windows atbalstu tas paplašina, kur QBE reāli var izmantot ārpus akadēmiskiem eksperimentiem.

Kods, kas atbaida līdzautorus

QBE reputācija ir divējāda. Uz Hacker News izstrādātāji slavē, ka pastāv vienkārša aizmugure ārpus GCC un LLVM, bet sūdzas par pašu kodu. Viens komentētājs to nosauca par tik blīvu un skopu, ka arhitektūra ir laba, taču daudzo mainīgo deklarācijas vienā rindā un komentāru trūkums attur no līdzdalības. Pats mgen daļēji risina šo problēmu — instrukciju saskaņošanas loģika vairs nav jāraksta ar roku.

Veiktspējā QBE joprojām atpaliek no nobriedušām aizmugurēm. 63% no GCC ar -O2 ir labs rezultāts tik mazam projektam, bet MIR ģenerē kodu ātrāk, jo izmanto iekļaušanu, un daži salīdzinājumi IR aizmugurei piešķir labāku izvadi. Atšķirība nāk no apzinātām izvēlēm: nav iekļaušanas, vienkāršs reģistru sadalītājs. Uzbūvē kļūdu te nav. Atkļūdošanas informācijas atbalsts joprojām ir vājš, tāpēc QBE biežāk izmanto valodu prototipiem nekā ražošanas kompilatoros.

Kam tas noder

Ja raksti savu valodu un negribi ievilkt LLVM ar visu tā apjomu un būves laiku, QBE dod IL, kas izlasāms cilvēkam, un aizmuguri, ko var izlasīt nedēļas nogalē. 1.3 pievieno Windows, PIC un jūtami ātrāku izvadi, tāpēc slieksnis izmantot to reālam rīkam ir kļuvis zemāks. Hare komanda gan Windows atbalstu neizmantos — projekts principiāli mērķē tikai uz Linux un BSD.

Vienlaikus jāsaprot robežas. Bez atkļūdošanas simbolu ģenerēšanas grūti taisīt kompilatoru, kura izvadi lietotājs atkļūdos ar gdb. Reģistru sadalītājs ir vienkāršs, tāpēc karstās cilpās GCC un LLVM joprojām aizsteidzas priekšā. QBE nemēģina ar tiem sacensties — tā mērķis ir dot pietiekami labu kodu ar tik mazu koda bāzi, ka viens cilvēks to spēj saprast pilnībā. 1.3 šo līdzsvaru pavirza par soli tuvāk lietojamībai reālos projektos.

Pilnu izmaiņu sarakstu un IL aprakstu var lasīt oficiālajās laidiena piezīmēs, kur autors soli pa solim izskaidro arī mgen saskaņošanas algoritmu.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie