Magyar English

Miért építek olyan CPU-t, ami natívan futtatja a .NET-et

A picoJava elbukott. A Jazelle elbukott. Íme, miért nem fog a CLI-CPU.
2026. április 15. · Hocza József Szabolcs

A kérdés

Mi lenne, ha a C# kódod közvetlenül a szilíciumon futna, JIT nélkül, interpreter nélkül, futtatókörnyezet nélkül? Mi lenne, ha maga a CPU értené a .NET bytecode-ot — minden ldc.i4-et, minden call-t, minden stloc-ot — natív utasításkészletként?

Ez nem gondolatkísérlet. Pontosan ezt építem az elmúlt hónapokban, és a referencia-implementáció már kész: 48 opkód, 259+ sikeres teszt, működő linker, CLI futtatóeszköz, és egy Verilog ALU modul 41 zöld cocotb teszttel. A projekt neve CLI-CPU, és teljes egészében nyílt forráskódú, CERN-OHL-S v2 licenc alatt.

De mielőtt elmagyaráznám, mi a CLI-CPU, hadd meséljek arról, miért bukott el minden korábbi próbálkozás — és miért más ez most.

A bytecode-hardver kísértetei

1997-ben a Sun Microsystems kiadta a picoJava-t — egy processzort, ami képes volt Java bytecode-ot közvetlenül hardverben végrehajtani. Az ötlet meggyőző volt: hagyjuk ki az interpretálás és a JIT-fordítás többletköltségét, futtassuk a Java-t natív sebességgel. A Sun két iterációt épített (picoJava-I és picoJava-II), licencelte a dizájnt, és várta, hogy a világ átvegye.

A világ nem vette át. 2001-re a HotSpot JIT-fordítója már a legtöbb terheléstípuson túlteljesítette a picoJava-t. A hardveres bytecode-végrehajtás nem tudott lépést tartani egy szoftveres JIT-tel, ami képes volt specializálni, inline-olni és a program tényleges futási viselkedésére optimalizálni. A Sun csendben kivezette az architektúrát.

Az ARM más megközelítést próbált a Jazelle DBX-szel (2001): egy dedikált bytecode-CPU helyett egy speciális végrehajtási módot adott a meglévő ARM magokhoz, ami hardveres gyorsítással tudott Java bytecode-ot értelmezni. A Jazelle okos volt — összetett opkódoknál visszaesett szoftverre, és csak a gyakoriakat gyorsította hardverből. Több százmillió ARM9-es és ARM11-es chipben szállították.

És mégis, a Jazelle is elbukott. Amikor az ARM bevezette a Thumb-2-t, majd később az egyre kifinomultabb soron-kívüli (out-of-order) pipeline-nal rendelkező Cortex-A sorozatot, a JIT-megközelítés (Dalvik, majd ART az Androidon) egyértelműen nyert. A Jazelle-t elavultnak nyilvánították, majd gyakorlatilag elhagyták. Az utolsó ARM architektúra, ami tartalmazta, az ARMv7 volt. Az ARMv8 (AArch64) teljes egészében elhagyta.

A tanulság egyértelműnek tűnt: az általános célú hardveren futó szoftveres JIT mindig legyőzi a dedikált bytecode-hardvert. A JIT alkalmazkodik; a szilícium nem. Ügy lezárva.

Csakhogy ez a tanulság téves. Pontosabban: hiányos. A picoJava és a Jazelle nem azért bukott el, mert a bytecode-hardver rossz ötlet — hanem azért, mert rossz tengely mentén versenyeztek.

Rossz verseny

Mind a picoJava, mind a Jazelle az általános célú CPU-kat próbálta legyőzni egymagos teljesítményben. Ez mindig vesztes csata volt. Egy modern, soron-kívüli végrehajtású CPU kifinomult JIT-fordítóval képes kódútvonalakat specializálni, hívásokat devirtualizálni, holt kódot eliminálni, és több ezer mikroarchitekturális trükköt alkalmazni, amivel egy egyszerű bytecode-pipeline nem veheti fel a versenyt. A JIT látja a futásidejű viselkedést; a hardver csak a statikus utasításokat.

De az egymagos teljesítmény már évek óta nem a legfontosabb mérőszám. A Dennard-skálázás 2006 körül véget ért. Az órajelek beálltak. Felütötte a fejét a teljesítmény-fal. Az egész ipar a többmagos irányba fordult, és azóta is küzd a következményekkel.

A probléma az, hogy a hagyományos értelemben vett többmagos feldolgozás — osztott memória, gyorsítótár-koherencia, mutex-zárak — nem skálázódik. Magok hozzáadása egy osztott memóriájú rendszerhez legjobb esetben Amdahl-törvényt követ, legrosszabb esetben katasztrofális versengéshez vezet. A MESI protokoll (és leszármazottai), ami a magok közötti gyorsítótár-koherenciát biztosítja, egyre abszurdabb hányadát emészti fel a chipterületnek, az energiabudgetnek és a tervezési komplexitásnak, ahogy nő a magok száma. Az Intel mesh összekötése szerver chipeken, az AMD Infinity Fabric, az Apple rendszerszintű gyorsítótára — ezek mind hősi mérnöki erőfeszítések egy alapvető architekturális hiba elfedésére: az osztott, módosítható állapot nem skálázódik.

Itt lép be a CLI-CPU — nem gyorsabb egymagos bytecode-processzorként, hanem alapvetően más architektúraként.

Shared-nothing: az egyetlen út előre

A CLI-CPU-ban nincs osztott memória. Pont. Minden mag saját privát SRAM-mal rendelkezik — kód, adat és verem — és semmilyen más mag nem férhet hozzá. Ez nem szoftveres konvenció; ez a szilícium fizikai tulajdonsága. Nincsenek buszvonalak, amelyek az egyik mag memóriáját a másikéhoz kötnék.

A magok kizárólag hardveres mailbox FIFO-kon keresztül kommunikálnak. Egy mag egy 32 bites üzenetet ír a kimenő mailbox-ába; a hardver kézbesíti a célmag bejövő mailbox-ába. A küldő mag nem blokkolódik. A fogadó mag felébredl alvásból, amikor üzenet érkezik, feldolgozza, és visszaalszik. Ez az actor modell szilíciumban.

„A jelenlegi szoftverrendszerek alapvetően hibás modellekre épülnek. Olyan hardver kell, ahol minden mag egy actor."
— Joe Armstrong, az Erlang megalkotója, 2014

Ennek a tervezési döntésnek mélyreható következményei vannak:

Ez szoftverben nem új ötlet. Az Erlang 1986 óta csinálja. Az Akka (2009) és az Akka.NET (2014) elhozta a JVM-re és a .NET ökoszisztémába. Az Orleans (2015) a mainstream C# fejlesztők számára is elérhetővé tette. Az actor modell éles környezetben, hatalmas léptékben bizonyított — WhatsApp (Erlang), Discord (Elixir), Microsoft Azure (Orleans), és számtalan más rendszer.

De mindezek hagyományos, osztott memóriájú hardveren futnak, ami azt jelenti, hogy a futtatókörnyezetnek szoftveres absztrakciókkal kell szimulálnia az üzenet-izolációt — szálkészletek, mailbox-sorok, GC-terhelés, ütemező-költség. A CLI-CPU ezt az egész réteget eltávolítja. A hardver maga a futtatókörnyezet.

Miért most?

A picoJava 1997-ben egyetlen feltétellel sem rendelkezett, ami ehhez a megközelítéshez szükséges. 2026-ban mindegyik adott:

Mit építettünk eddig

A CLI-CPU nem whitepaper. Nem „vízió dokumentum" a jövőbeli lehetőségekről szóló kézlegyintéssel. Működő kód, tesztelt kód, és — egyre inkább — működő hardver leírás.

Az F1.5 fázis kész. Ez magában foglalja:

A teljes kódbázis — szimulátor, linker, futtatóeszköz, tesztek, Verilog, cocotb, dokumentáció — nyílt forráskódú a GitHubon.

A Cognitive Fabric One vízió

A célchip — Cognitive Fabric One — a Sky130 technológiára tervezett, hozzávetőleg 15 mm² területen:

Cognitive Fabric One Tipikus RISC-V SoC
Magok 6 Rich + 16 Nano + 1 Secure 4-8 homogén
Memória modell Privát SRAM magonként, nincs osztott memória Osztott L1/L2 gyorsítótár-hierarchia
Magok közti komm. Hardveres mailbox FIFO-k (OPI busz) Osztott memória + gyorsítótár-koherencia
Koherencia-költség Nulla Jelentős (MESI/könyvtáralapú)
Skálázási viselkedés Lineáris a magszámmal Szublineáris (Amdahl-törvény)
Üresjárati fogyasztás Közel nulla (alvás mailbox-ig) Jelentős (gyorsítótár, koherencia-logika)
Biztonsági izoláció Fizikai (nincs osztott memória) Szoftveres (TrustZone, TEE)
ISA CIL (verem, kompakt) RISC-V (regiszter, szélesebb kódolás)
I/O USB 1.1 FS, UART, SPI, GPIO Változó

A Rich core-ok a felügyeleti logikát, összetett domain kódot, GC-kezelt objektumokat, lebegőpontos műveleteket és kivételkezelést végzik — a teljes ECMA-335 CIL utasításkészlettel (~220 opkód). A Nano core-ok apróak (~10k standard cella egyenként) és a CIL-T0 egész szám részhalmazát futtatják — ideálisak dolgozókhoz, neuronokhoz, szűrőkhöz, egyszerű aktorokhoz. A Secure Core egy megerősített Rich core kriptográfiai gyorsítással, TRNG-vel és PUF-fal — az egész fabric bizalmi horgonypontja.

Ez a heterogén kialakítás hasonló az ARM big.LITTLE-höz vagy az Apple P-core + E-core megoldásához, de a .NET világra alkalmazva. Egy C# fejlesztő [RunsOn(CoreType.Nano)] vagy [RunsOn(CoreType.Rich)] attribútummal jelöli az osztályait, és egy Roslyn forrásgenerátor fordítási időben ellenőrzi, hogy a Nano-ra célzott kód a CIL-T0 részhalmazon belül marad.

Biztonság: dizájn szintjén immunis

Az elmúlt évtized minden jelentős CPU-sebezhetősége — Spectre, Meltdown, L1 Terminal Fault, Rowhammer, Retbleed, Inception — három dolog egyikét használja ki: spekulatív végrehajtás, osztott gyorsítótár vagy osztott memória. A CLI-CPU-ban ezek egyike sincs.

Ezen felül a CIL végrehajtási modell hardveresen kényszerített típusbiztonságot és vezérlésfolyam-integritást biztosít. Minden memória-hozzáférés hardverben határellenőrzött. Minden metódushívás a deklarált szignatúra alapján verifikált. A verem-túlcsordulás és -alulcsordulás hardveres trap-et generál. ROP és JOP támadások lehetetlenek, mert a hardver kikényszeríti, hogy a végrehajtás csak érvényes metódus-belépési pontokra ugorhat.

Ez nem utólag rácsapott biztonság. Ez a biztonság mint a szilícium fizikai tulajdonsága. Nem lehet körbefoltozni, és nem lehet körbe kihasználni.

Mi jön ezután

A következő mérföldkövek az ütemtervben:

A teljes projekt — hardver, szoftver, dokumentáció — nyílt forráskódú és az is marad, CERN-OHL-S v2 licenc alatt.

// csatlakozz az úthoz

A CLI-CPU nyílt forráskódú. A szimulátor ma is fut. A szilícium-útvonal finanszírozott és megtervezett. Ha hiszel benne, hogy a számítástechnika jövője sok kis mag, amelyek üzeneteken keresztül kommunikálnak — nem kevesebb nagy mag, amelyek az osztott memórián marakodnak — akkor ez a projekt neked szól.