Kera in delo nižanja

Prevajanje: Zgodba o prevajalniku o neuglednem delu med čistim grafom in pravim strojem: deterministično nižanje, lastništvo ciljne platforme in dokazi, da...

Kera in delo nižanja

Poročilo o napaki, ki ni bila napaka

Zgodba se običajno začne s številko, ki je skoraj pravilna. Ne povsem napačna. Ne pokvarjena tako, da bi nadzorna plošča postala rdeča. Skoraj pravilna na drag način: vrsta napake, zaradi katere ena ekipa izda izdelek, druga okleva, revizor pa se sprašuje, zakaj se je odgovor spremenil, ko se je isti model preselil z enega računalnika na drugega.

Ena izvedba teče na x86 strežniku in ustvari vrednost. Naslednja izvedba teče na ARM prenosniku in ustvari vrednost, ki je dovolj blizu, da predstavitev deluje. GPU pot je hitrejša, vendar zaokroža skozi izračun drugače. FPGA pot je privlačna zaradi časovne uskladitve, a nenadoma ima programska ekipa pogovor o strojni opremi. Vsak lahko pojasni majhen del razlike. Nihče ne obvladuje celotne poti od izvorne kode do rezultata.

To je prostor, za katerega je zasnovan Kera. Ne ideja modela, ne marketinški diapozitiv, ne članek o prihodnjem prevajalniku, temveč prevajalsko delo, ki se začne, ko ekipa reče, da mora isti izračun teči na različnih računalnikih in še vedno pomeniti isto stvar. Ta obveza potrebuje lastnika. Obljuba prevajalnika ni, da je prevajanje elegantno. Obljuba je, da se prevajanje obravnava kot delo.

Prevajanje je del prevajalnika, kjer lepa namera jezika postane navodila, ki jih ciljna naprava lahko izvede. Je tudi mesto, kjer nejasne trditve postanejo vidne. Če naj bi bil rezultat bit za bit enak na CPU, GPU, FPGA in WebAssembly, potem si prevajalnik ne more privoščiti, da bi odmahnil z roko ob razlikah med ciljnimi napravami. Nositi mora dovolj strukture, da se odloči, kaj se lahko spremeni in kaj se ne sme spremeniti. Poznati mora pomnilniške prostore, učinke, opkode, prenos podatkov, omejitve ciljnih naprav in potrdila, ki dokazujejo, da sta dve izvedbi isti izračun.

Mamljiva različica zgodbe je, da bi to imenovali plast prenosljivosti. To je premalo. Prenosljivost pomeni, da program teče drugje. Kera cilja na težjo trditev: program je predstavljen kot graf z vsebinskim naslavljanjem, preveden v .keg artefakt, preveden navzdol za več zaledij in še vedno ustvari isti odgovor. Kuhinja se spremeni. Recept se ne.

Sredina, ki je nihče noče prodajati

Prvi pogovor z resnim kupcem se redko začne s sintakso. Začne se z zmešnjavo. Obstaja model, ki je pomemben. Obstaja simulacija, ki je bila nekoč raziskovalna in je postala operativna. Obstaja izračun tveganja, katerega rezultat se ne sme več razlikovati glede na računalnik. Obstaja robna namestitev, ki ne more nositi celotnega oblačnega izvajalnega okolja. Obstaja ekipa, ki želi pospeševalnik, a si ne more privoščiti prepisovanja vsakič, ko se pospeševalnik spremeni.

Večina orodij to prikaže kot težavo z uvajanjem. Izberite cilj, izvozite model, popravite izvajalno okolje, sprejmite nekaj odstopanj, nato napišite dokument, ki pojasnjuje izjeme. Dokument raste. Testna matrika raste. Število strokovnjakov raste. Sčasoma organizacija plača heterogenost dvakrat: enkrat, ko kupi strojno opremo, in drugič, ko poskuša dokazati, da je strojna oprema opravila isto delo.

Kera začne z nasprotnega konca. Stran Kera to imenuje statično tipiziran sistemski jezik z grafno naravnim, vsebinsko naslovljenim IR. Ta stavek je pomemben, ker graf ni dekorativna shema prevajalnika. Je izvedljivi objekt. Izvorna koda se prevede navzdol v usmerjene aciklične grafe operacij, shranjene kot .keg datoteke. Vsako vozlišče nosi definirano strukturo. Podvojeno delo je mogoče strukturno odpraviti. Isti graf je mogoče prevesti navzdol za CPU, GPU, FPGA in WASM, ne da bi vsako ciljno napravo obravnavali kot ločeno malo vesolje.

Zato se mora Kera obnašati kot resna prevajalniška infrastruktura in ne kot diagram. Neprijetna sredina je tam, kjer živi stranka. Tokenizacija mora ohranjati bajtne položaje. Razčlenjevanje mora napajati orodja in prevajanje. Preverjanje tipov mora zavrniti neujemanja oblik in robov, preden postanejo dogodki med izvajanjem. Preverjanje izposojanja mora razumeti lastništvo med gostiteljskim, napravnim, pripetim in enotnim pomnilnikom. Optimizacija mora biti ponovljiva. Serializacija mora organizaciji dati artefakt, ki ga lahko obdrži.

Nič od tega ni dramatičen naslov. Je veliko bolj uporabno kot naslov. Pomeni, da ima prevajalnik, ko se delovna obremenitev premakne iz razvoja v produkcijo ali z osnovne linije CPU na pot GPU, stabilno stvar za primerjavo: prstni odtis grafa. Če se prstni odtis ujema, je delo isto delo. To je skupna kontrolna točka, ki jo lahko razumejo inženir, kupec in revizor.

Graf je potrdilo, ne slika

Star način razlage programa je, da se pokaže izvorna koda in bralca prosi, naj zaupa prevajalniku. Stran Kera se vedno znova vrača k drugemu objektu: grafu. Vsaka operacija je vozlišče. Robovi izražajo odvisnosti. Graf ima vsebino. Vsebina ima zgoščeno vrednost. Zgoščena vrednost postane prstni odtis, ki potuje skozi gradnjo.

Graf je trajen objekt: izvorna koda, tipi, regije, zgoščene vrednosti in artefakt, ki potuje.

To je videti kot notranji mehanizem, dokler ne stojite ob ekipi za skladnost. Ekipa za skladnost ne želi vedeti, da ima ponudnik lepo arhitekturo prevajalnika. Želi vedeti, ali je izračun, odobren prejšnji mesec, izračun, ki se izvaja danes. Prstni odtis grafa je most med tema svetovoma. Ni posnetek zaslona prevajalnika. Je kompakten način, kako povedati: ta nabor operacij, ti tipi, ti vnosi, ti atributi, ta struktura odvisnosti.

Model vozlišč je namerno strog. Vozlišče je različica sheme, opcode, opisniki izhodov, zgoščene vrednosti vnosov in zemljevidi atributov, razporejeni v kanoničnem vrstnem redu. Bajti so zgoščeni s SHA3-256 pod predponami z ločenimi domenami, tako da zgoščene vrednosti vozlišč, regij in grafov živijo v ločenih imenskih prostorih. Če imata dve vozlišči isti opcode, vnose in atribute, imata isto zgoščeno vrednost. Vstavljanje dvojnika vrne obstoječi vnos. Odpravljanje skupnih podizrazov postane posledica predstavitve, ne junaški prehod, dodan pozneje.

To je vrsta podrobnosti, ki inženirski sistem spremeni v nekaj, na kar se ljudje lahko zanesejo. Kupec ne kupuje diagrama prevajalnika. Kupec kupuje manj sporov o tem, ali se je izračun spremenil. Razvijalec ne kupuje slogana o deterministični umetni inteligenci. Razvijalec kupuje format grafa, kjer lahko orodja preverijo, shranijo in uporabijo enakost. Datoteka .keg zato ni naknadna misel pri implementaciji. Je prenosljiv zapis dela.

Osem majhnih vrat, preden se pojavi cilj

Ko si ljudje predstavljajo prevajalnik, pogosto takoj pomislijo na zaključni del. Predstavljajo si trenutek, ko koda postane AVX, PTX, Verilog ali WASM. Ta trenutek je pomemben, a je šele pozno v zgodbi. Večina dela prevajalnika se je do takrat že zgodila, v tihih fazah, ki odločajo, ali je zaključnemu delu mogoče zaupati.

Zaključni del pride pozno. Večino zaupanja si prevajalnik prisluži prej, v majhnih fazah, ki ohranjajo pomen.

Kera se začne z leksikalnim analizatorjem, ki podpira UTF-8 in pretvori izvorno kodo v žetone s popolnim sledenjem stranskih podatkov in obnovo po napakah. To zveni kot podpora urejevalniku, in tudi je. Je pa tudi zanesljivost orodij. Če je ohranjen vsak položaj bajta, se lahko diagnoze, oblikovanje, ponovno razčlenjevanje in vedenje jezikovnega strežnika ujemajo s tem, kar je uporabnik dejansko napisal. Prevajalnik, ki zgodaj izgubi obliko izvorne kode, to izgubo plača povsod drugje.

Razčlenjevalnik temelji na dogodkih: rekurzivno spuščanje z razčlenjevanjem izrazov po Prattovi metodi oddaja dogodke Start, Token, Finish in Error, namesto da bi zgradil en sam abstraktni sintaktično drevo, ki bi si ga morali deliti vsi. Tok dogodkov neodvisno napaja graditelj drevesa, oblikovalnik in jezikovni strežnik. Zeleno drevo je brez izgub, saj ohranja žetone in stranske podatke. Graditelj grafa nato prehodi to drevo, vzdržuje razreševanje imen in ustvari vozlišče Region za vsako funkcijo.

Šele po tem izvorna koda postane graf, ki ga prevajalnik nosi s seboj. Strukturno preverjanje tipov preverja združljivost vzdolž robov operacij in omejitev oblik tenzorjev. Tipi se ujemajo le, kadar so njihovi kanonični razpršili enaki. Preverjevalnik lastništva uveljavlja enega lastnika na vrednost, brez vzporednih spremenljivih sklicev in pravila lastništva med pomnilniškimi prostori. Učinki se preverjajo glede skladnosti. Stranski učinki niso prepuščeni okusu ali dogovoru.

Upravitelj prehodov optimizacije nato opravi prepoznavno delo prevajalnika: konstantno zlaganje, odpravo skupnih podizrazov, odpravo mrtve kode, vgrajevanje, vektorizacijo in združevanje zank v zanki s fiksno točko. Pomemben stavek ni seznam prehodov. Pomembno je, kaj se zgodi po vsakem prehodu: preverjevalnik nespremenljivk grafa preverja skladnost razpršil in celovitost odvisnosti. Optimizacija sme graf izboljšati, ne pa ga narediti nerazumljivega.

Nazadnje generatorji kode, specifični za posamezno tarčo, oddajo izvorno kodo, PTX, Verilog ali WASM, optimizirani graf pa se serializira v datoteko .keg s tabelo razdelkov. Datoteka se začne s čarobnimi bajti KEG\0 in vsebuje razdelke za nize, tipe, atribute, vozlišča, regije in izvoze. To je pot, ki jo mora ekipa obvladati, preden lahko pošteno govori o tarčah.

Tarče niso nalepke na diapozitivu

Seznam tarč je lahko napisati, težko pa si ga zaslužiti. CPU, GPU, FPGA in WASM se lepo prilegajo v predstavitveni list. Spuščanje nanje je tam, kjer se skriva račun. Vsaka tarča ima svoje navade, prednosti in načine odpovedi. Prevajalnik, ki želi deterministično heterogeno izvajanje, teh navad ne more obravnavati kot tuj problem.

CPE, GPE, FPGA in WASM niso nalepke. So ciljni svetovi, ki jim mora isti graf ustrezati.

Na CPE Kera oddaja izvorno strojno kodo za x86-64 in ARM64, z RISC-V Vector v tehničnem listu. Pot x86 izbere SSE2, AVX2 ali AVX-512; pot ARM uporablja NEON; razporejevalnik registrov in razporejevalnik sta skupna. Trditev izdelka ni zgolj, da binarna datoteka obstaja. Trditev je, da so izbrana jedra SIMD, specifična za ciljno platformo, medtem ko graf ostaja isti izračun.

Na GPE izvorno gradivo imenuje generiranje PTX za CUDA in ROCm, pri čemer se tenzorska jedra uporabijo, kadar oblika jedra to omogoča. Ta zadnji stavek opravlja delo. Strojno pospeševanje ni čarobni prah. Oblika jedra bodisi ustreza poti tenzorskih jeder bodisi ne. Prevajalnik mora to pošteno razkriti, po potrebi premikati podatke med gostiteljem in napravo ter še vedno ohraniti prstni odtis grafa kot dokaz tega, kar se izvaja.

Na FPGA pot spuščanja postane pogovor o strojni opremi: sinteza Verilog, ocena virov, analiza časovnih razmerij in načrtovanje cevovodov za predvidljivo, ciklično natančno vedenje. To je vrsta ciljne platforme, kjer je nejasno razlaganje še posebej drago. Če kupec potrebuje trdi realni čas, mora površina prevajalnika govoriti v ciklih, virih in cevovodih, ne le o hitrosti. Zgodba Kera naredi FPGA zaledni del istega grafa namesto prepisa s strani druge ekipe.

Na WASM stran imenuje 128-bitni SIMD za robno in brskalniško uvajanje. To je pomembno, ker je rob pogosto kraj, kjer se realnost uvajanja sreča s čistostjo. Brskalnik, majhna naprava ali omejeno izvajalno okolje ne morejo vedno gostiti istega sklada kot strežnik. Pot spuščanja, ki temelji na grafu, daje ekipi način, kako prenesti isti izračun v to okolje, ne da bi rob postal drugi izdelek.

Determinizem mora preživeti uspeh

Determinizem je lahko obljubiti v majhni sobi. Težje postane, ko izdelek uspe. Pride več uporabnikov. Pojavi se več strojne opreme. Model se premakne z enega čipa na drugega. Testna osnova, napisana za eno okolje, mora pokriti drugo. Optimizacija, ki je videti nedolžna, spremeni vrstni red redukcije. Hitra pot se pojavi v enem izvajalnem okolju, v drugem pa ne.

Determinizem je zanka, ne slogan: zgradi, zaženi, primerjaj, popravi in ohrani graf stabilen.

Stran Kera determinizem predstavlja kot popolnoma enak bit za bitom na vseh platformah. To ni zgolj kozmetična trditev. Spreminja obveznosti izdelka. Primitivna aritmetika ima definirano semantiko natančnosti na vseh ciljnih platformah. Redukcije imajo definirana pravila razreševanja izenačenih rezultatov, tako da razporejanje in strojna oprema ne spremenita rezultata. Primitivi nevronskih mrež imajo deterministične implementacije na CPU, GPU, FPGA in WASM. Graf pomeni isto stvar ne glede na to, kje se izvaja.

Zato nedefinirano vedenje, prekinitve zaradi pomnilniškega zbiralnika in implicitni stranski učinki niso zgolj manjše jezikovne preference. So razpoke v izvedbeni površini. Stran Kera pravi: brez odvisnosti od LLVM, brez pomnilniškega zbiralnika, brez nedefiniranega vedenja. Eksplicitni tipi, eksplicitni učinki in lastništvo med pomnilniškimi prostori so nadzorni mehanizmi izdelka. Zmanjšujejo število mest, kjer se rezultat lahko spremeni, medtem ko vsi gledajo drugam.

Obstaja tudi človeška plat tega. Ko se vedenje krmilnika robotike spremeni med napravami, ko finančni potek dela zaokroži en cent drugače, ko znanstvenega rezultata recenzent ne more ponoviti ali ko se simulacija igre razlikuje med ciljnimi platformami, argument v resnici ni o teoriji prevajalnikov. Gre za institucionalno zaupanje. Potrošniško besedilo Kera uporablja preproste zgodbe, ker je osnovni problem preprosto občutiti: ista navodila, isti odgovor, na katerem koli računalniku, ki ga imaš.

To zaupanje mora preživeti pospeševanje. Če zmogljivost zahteva, da ekipe opustijo determinizem, je izdelek le premaknil tveganje. Kera poskuša ohraniti zmogljivost in determinizem v isti pogodbi, tako da graf postavi za enoto pomena in ciljno pot za enoto izvajanja.

Varnost je del prevajanja v nižjenivojsko kodo

Razprave o prevajalnikih pogosto izolirajo varnost kot delo v času izvajanja. Izvorno gradivo Kera tega ne počne. Govori o varnosti na podlagi zmogljivosti, o SecurityManager, o vratih, ki privzeto zavrnejo dostop, o PolicyBuilder, o seccomp BPF, o Linux imenskih prostorih in o nitno varnem revizijskem dnevniku, odpornem proti posegom, v medpomnilniku s fiksno kapaciteto. Te besede spadajo v inženirsko zgodbo, ker se prevajanje v nižjenivojsko kodo ne konča, ko so navodila izdana. Izdano delo mora še vedno teči z mejami.

Žetoni zmogljivosti se podelijo ob zagonu. Privilegirana dejanja zahtevajo eksplicitno zmogljivost. Pravila dostopa so razglašena vnaprej. Filter BPF omejuje sistemske klice. Izolacija z imenskimi prostori ločuje poglede procesa, priklopov in omrežja. Dogodki, pomembni za varnost, se zapišejo v revizijski dnevnik. Kratki stavek je: nič ni dovoljeno privzeto.

To je pomembno za heterogeno izvajanje, ker ciljne platforme ustvarjajo površine. Proces CPU, prenos GPU, pot FPGA, okolje brskalnika in porazdeljeno opravilo ne odpovedo na enake načine. Izdelek mora obdržati politiko pritrjeno na delo, ko se ta premika. Če graf pove, kaj izračun je, nadzorni mehanizmi izvajalnega okolja povedo, kaj izračun sme storiti.

Obstaja tudi operativni razlog, da se varnost vključi v zgodbo o prevajalniku. Ekipe ne želijo enega izdelka za prevajanje, drugega za politiko, tretjega za beleženje in četrtega za razlago, če šivi med njimi postanejo mesto, kjer se skrivajo incidenti. Stran Kera ne trdi, da rešuje vso varnost. Počne nekaj ožjega in bolj uporabnega: naredi dovoljenja eksplicitna in revidirana v izvajalnem okolju, ki ga hrani prevajalnik.

Porazdeljeno delo je še vedno prevajanje v nižjenivojsko kodo

Tehnični list imenuje porazdeljeno izvajanje, obročno allreduce in obnovitev po kontrolnih točkah. V drugem izdelku bi bile to morda marketinške postavke. V Kera spadajo v isto razpravo o prevajanju v nižjenivojsko kodo, ker vzporednost spremeni obliko izračuna. Podatkovna, modelna in cevovodna vzporednost niso le načini za večjo hitrost. So načini za razdelitev dela brez izgube pomena prvotnega grafa.

Če veliko opravilo teče na mnogih računalnikih in eno vozlišče odpove, obnovitev iz kontrolne točke ni udobje. Je del tega, da izračun postane operativen. Če se rezultati zanesljivo združujejo, je treba opredeliti semantiko združevanja. Če je graf naslovljen po vsebini, mora porazdeljena pot ohraniti identiteto grafa in ne izumiti druge resničnosti, ko opravilo zapusti en računalnik.

Tu postane razlaga izdelka jasna. Kera ni sintaksna plast s porazdeljenim dodatkom. Poskuša narediti izračun prenosljiv tako po obliki kot po strojni opremi: en program, en graf, več izvedbenih ciljev in zapis, ki ga je mogoče preveriti. Porazdeljeno izvajanje je še eno mesto, kjer mora spuščanje nositi izvedbeno pogodbo.

Spremeni se tudi zgodba o kadrih. Brez skupne poti prevajanja lahko napaka, ki se pojavi samo na eni platformi, zahteva ljudi, ki poznajo čip, orodno verigo in izvajalno okolje hkrati. Z enim grafom in skupno potjo je vprašanje ostrejše: ali se je graf spremenil, ali se je spremenila pot spuščanja ali pa je cilj kršil opredeljeno semantiko? Boljša vprašanja ne odpravijo trdega dela. Preprečijo, da bi se trdo delo širilo naključno.

Zakaj mora nekdo lastniti pot

Spuščanje ne more ostati brez lastnika, ko nosi rezultate, na katere se ljudje zanašajo. Graf, ki teče na CPU, GPU, FPGA in WASM, potrebuje več kot pametno predstavitev. Potrebuje dokumentacijo, diagnostiko, trditve o ciljih, vedenje urejevalnika, generiranje kode, varnostne nadzore, pogovore s podporo in način, kako kupcu natančno povedati, kaj se je spremenilo, ko se rezultat spremeni.

To ne pomeni, da je delo manj tehnično. Tehnično delo postane bolj zavezujoče. Kera je trenutno komercialni izdelek podjetja Dweve, ne odprtokodna izdaja: vse pravice pridržane, na voljo pod komercialno licenco, narejen na Nizozemskem in namenjen organizacijam, ki potrebujejo podprto pot grafa in ne le objavljeno. Če stran navaja Rust 2021, graf IR, lasten JIT, brez LLVM, CPU/GPU/FPGA/WASM, sledenje učinkom, lastništvo med pomnilniškimi prostori, varnost zmogljivosti, porazdeljeno izvajanje, vdelavo C in Python, poteke dela CLI, podporo urejevalnika in orodja LSP, to niso okrasne notranjosti. To so obveznosti, ki morajo preživeti vrednotenje z resničnimi obremenitvami.

List zmogljivosti je pri tem previden. Opisuje načrtovane cilje in pravi, da jih je treba preveriti glede na vašo obremenitev. Ta zadržanost je pomembna. Veliko bolj zdravo je kot pretvarjanje, da se vsaka številka merila uspešnosti prenaša. Sistem bi moral ekipam dati način za merjenje, pregledovanje in primerjavo v njihovem lastnem okolju, ne pa od njih zahtevati, da sprejmejo univerzalno zgodbo o hitrosti.

Nekdo mora lastniti to pot, ker vsak cilj poskuša narediti vir manj univerzalen. Kera je mesto, kjer te razlike med cilji postanejo eksplicitno delo prevajalnika namesto ljudskega izročila, ki se prenaša po poročilu o napaki.

Dan, ko graf postane pogodba

Predstavljajte si prvotno poročilo o napaki znova, vendar s Kero že v poteku dela. Finančna ekipa odobri izračun tveganja. Prstni odtis grafa se zabeleži. Prva namestitev teče na CPU. Kasneje se za analizo portfelja uvede pot GPU. Še kasneje se za oblikovanje cen z nižjo zakasnitvijo uporabi pot FPGA. Vprašanje na vsakem koraku ni, ali nova strojna oprema zveni impresivno. Vprašanje je, ali se spušča isti graf in ali ciljna semantika ohranja rezultat enak.

Pogovor se spremeni. Ekipa platforme lahko govori o razporejanju in stroških. Ekipa prevajalnika lahko govori o zaledjih. Ekipa za skladnost lahko govori o prstnem odtisu. Lastnik podjetja lahko vpraša, ali je premik strojne opreme operativna odločitev ali prepisovanje. Izdelek jim vsem da en predmet, na katerega lahko kažejo.

To je tiha vrednost IR-ja s hash naslavljanjem vsebine. Izvajanje na različnih platformah spremeni iz niza prepričljivih razlag v zapis. Graf postane potrdilo. Isti .keg lahko napaja vsak zaledni sistem. Organizaciji daje izhodišče, ki pripada izračunu in ne posameznemu stroju.

Noben prevajalnik ne more odpraviti potrebe po inženirski presoji. Ekipe morajo še vedno skrbno izbirati cilje, pošteno preizkušati delovne obremenitve, razumeti omejitve ciljev in se odločiti, katera področja zahtevajo popolno bitno enakost. Toda Kera lahko te odločitve naredi eksplicitne. Lahko prepreči, da bi selitev zaradi zmogljivosti po naključju postala pomenska selitev.

Lekcija o prevajanju v nižjenivojsko obliko

Kera je pomembna, ker težji del ni imeti pametne ideje o prevajanju v nižjenivojsko obliko. Težji del je prenesti to idejo skozi vsa dolgočasna mesta, kjer inženirstvo postane bodisi zanesljivo bodisi folklora: diagnostika, zelena drevesa, hash-i tipov, preverjanje izposojanja, optimizacija s fiksno točko, preverjanje invariant, serializacija .keg, generiranje zaledne kode, varnostna politika, revizijski dnevniki, podpora urejevalnikom in izvajanje, specifično za cilj.

Prevajanje v nižjenivojsko obliko je delo, ker vsak cilj poskuša vir narediti manj univerzalen. Deterministično inženirstvo prevajalnikov je disciplina, ki noče, da se to zgodi tiho. CPU želi vektorje. GPU želi jedra. FPGA želi cikle. WASM želi omejitve. Organizacija želi en odgovor. Naloga Kere je ohraniti pomen izračuna, hkrati pa vsakemu cilju dovoliti, da počne tisto, v čemer je dober.

To je inženirska oblika, ne papirnata abstrakcija. Ima kupca, način odpovedi, format datoteke, pot prevajalnika in operativne posledice. Obljuba ni, da strojna oprema postane preprosta. Obljuba je, da je kompleksnost predstavljena, prevedena v nižjenivojsko obliko, preverjena in lastniška.

Ko pride naslednja skoraj prava številka, se ekipi ni treba začeti s folkloro o tem, kateri stroj je kaj izvajal. Začeti bi morala z grafom. Ali se je prstni odtis ujemal? Kateri zaledni sistem je generiral kodo? Katere zmogljivosti so bile odobrene? Katera ciljna semantika je bila uporabljena? Kateri artefakt je bil shranjen? To so produktna vprašanja. Kera obstaja, ker so to tudi vprašanja prevajalnikov.