Hlavní navigace

AttoWPU: český avantgardní procesor a programovací jazyk

24. 5. 2011
Doba čtení: 9 minut

Sdílet

Pojmy jako CPU a GPU zná každý čtenář Roota. Co ale pojem WPU – Weird Processing Unit? Neznáte? WPU může být jakýkoliv procesor, který je alespoň z části navržený podivným, nevídaným způsobem, což činí z programování pro tento procesor zajímavou výzvu. Představíme si zástupe WPU s názvem AttoWPU.

Chtěl bych vám představit jeden osobní nekomerční projekt (jsem ještě student čtvrtého ročníku střední školy), na kterém nějakou dobu pracuji, snad i někoho zaujal a získal nějakou odezvu u technicky zaměřeného čtenářstva.

V podstatě se jedná o nový typ procesorové jednotky, nazvaný WPU, který se snaží o netradiční, nekonvenční a kreativní přístup k návrhu architektury a programování z několika důvodů: dát programátorům (geekům) zajímavou hračku, se kterou by si mohli hrát, podpořit myšlení o standardech a konvencích (a tento konkrétní procesor podporuje i optimalizování programu).

Je tak možné jejich lepší pochopení představením něčeho, co tyto konvence striktně nesleduje a pokouší se k věcem přistupovat netradičním způsobem, který nemusí být vždy přímo užitečný a někdy i čistě hravý a snažící se do jisté míry spojit uměleckou kreativitu s technologií. To v konečném důsledku může vést k dalším nápadům a inovacím, které by se i daly uplatnit v praxi. Plánuji hned několik takových procesorů a programovacích jazyků. První z nich je AttoWPU, který už je ve stavu, kdy funguje (prozatím virtuálně, ačkoli není úplně kompletní, později bude i HW pomocí FPGA) a může být prezentován a zkoušen. Nejedná se o nejlepší a nejoriginálnější WPU, ale je to začátek.

Vývojové nástroje jsou k dispozici i pro Linux ve formě binárních spustitelných souborů v tar.gz archivu, takže si s tím musíte poradit sami (emulátor závisí na Qt4 knihovnách), navíc vše není ještě dokonale odladěné, ale funguje to. Pokud byste chtěli vytvořit balíček pro svůj oblíbený systém (distribuci), nebudu mít samozřejmě nic proti.

Rád bych uvítal různé připomínky, dojmy, dotazy, bugy (protože je to stále vyvíjené, tak je jich ale dost a o řadě vím) v podstatě jakoukoliv odezvu, i pokud si vyzkoušíte napsat nějaký kód, tak ho klidně ukažte.

Kde nalézt další informace

Balíček obsahuje

  • anglickou a českou dokumentaci v PDF
  • překladač („kompilátor“) pro jazyk AttoASM, Windows, Linux, konzolová aplikace
  • emulátor procesoru AttoWPU, Windows, Linux, GUI (Qt)
  • logické schéma procesoru v PDF
  • ukázkové zdrojové kódy v jazyce AttoASM
  • hru Pong napsanou v jazyce AttoASM

Jedná se o experimentální procesor AttoWPU ze série WPU (Weird Processing Unit), který se snaží o netradiční a zajímavý přístup k architektuře procesoru, zpracování strojového kódu a samotnému programování: součástí je i programovací jazyk AttoASM (attoassembler) a CustASM (custom assembler) a s tím související překladače („kompilátory“), a také emulátor, ve kterém si můžete vytvořené programy vyzkoušet. V plánu je i VHDL popis pro FPGA pro hardwarovou realizaci.

Changelog

(verze 0.8.01)

  • kód starající se o emulaci AttoWPU nyní běží v samostatném vlákně – o něco rychlejší (zvláště u multijádrových procesorů), přesnější časování.
  • maximální/neli­mitovaná rychlost emulace nyní funguje, stačí kliknout na Max, či přetáhnout posuvník úplně doprava
  • LED diody a přepínače jsou nyní grafické, namísto radio a checkboxů, takže vypadají lépe
  • zachytávání kláves je nyní zcela globální pro celou aplikaci, nezáleží který prvek má keyboard focus
  • opraveno padání při zavření dialogu pro načtení zdrojového souboru
  • malá aktualizace ve specifikaci ve způsobu ovládání speakeru
  • dostupná je česká verze dokumentace, počítejte ale s tím, že nebude aktualizována tak často, jako anglická

(verze 0.8.02)

  • k dispozici binárky pro Linux
  • aktualizován attoassembler kód v emulátoru, což řeší některé pády při překladu zdrojových kódů

Co je to WPU?

Určitě znáte alespoň pojmy CPU a GPU – procesorové jednotky s určitým účelem. CPU (central processing unit) je univerzální procesor schopný zpracovat jakýkoliv typ programu, avšak na rozdíl od specializovaných jednotek řadu operací nezvládá dostatečně rychle, takže kupříkladu u grafických operací přijde na řadu GPU. Tento procesor je navržen speciálně pro rychlé zpracování grafických operací, ale nic moc jiného neumí (ačkoli s unified shadery je to už na pováženou, ale to je mimo pointu). Důležité je, že každý z těchto typů procesorových jednotek má svoji vlastní filozofii a účel, tedy něco, co je činí typickými. Čím jsou tedy typické WPU?

WPU znamená Weird Processing Unit (podivná procesorová jednotka) a takové podivné a praštěné jméno už samo o sobě implikuje, co WPU je: jedná se v podstatě o procesorovou jednotku, která je nějakým způsobem podivná – liší se od běžných konvencí. WPU může být jakýkoliv procesor, který je alespoň z části navržený podivným, nevídaným způsobem, což činí programování pro tento procesor zajímavou výzvou. Nemusí mít žádný čistě praktický účel a většinou ani mít nebude. Jedná se spíše o způsob „hej, zkusme tohle a uvidíme, co to udělá“ – čistě experimentální, praštěný a podivný pro zábavu a zvědavost.

To znamená, že WPU je v podstatě jakýkoliv procesor, který se snaží jít za hranice konvencí běžných procesorů. WPU se snaží být více či méně originální a přicházet s novými a zajímavými koncepty, které pomohou stimulovat mysl programátorů netradičním designem a obvykle i netradičním programováním. Mohou být dokonce do jisté míry považovány za druh umění, něco jako „avantgardní procesory“.

Co je to AttoWPU?

Zatímco WPU je obecný termín pro jakoukoliv procesorovou jednotku (splňující filozofii WPU), AttoWPU je specifický WPU a nejenom to: jedná se o první WPU, vytvořený jako začátek série těchto experimentálních procesorů. Rozhodně se nejedná o nejlepší z nich (už plánuji nějaké mnohem lepší), ale je to začátek.

AttoWPU je inspirován mikrokódem normálních procesorů a v podstatě staví na myšlence, že můžeme procesory rozdělit na dvě logické části: výpočetní část (provádí všechny výpočty a operace) a řídící část (dekóduje instrukce a říká výpočetním částem co mají dělat). AttoWPU má řídící část zredukovanou na absurdní minimum a vyžaduje od programátora, aby v podstatě vytvořil kód, který bude řídit funkci procesoru použitím tří elementárních instrukcí (attoinstrukcí), každá z nich mění vždy pouze jediný bit. Co se týče výpočetních jednotek, těch má AttoWPU hodně a odvádějí poměrně dost práce za programátora, čímž je programování jednodušší (jestli to chcete ještě více hardcore, počkejte na zeptoWPU).

To vám v podstatě umožňuje vytvořit konvenční (nebo taky ne) software použitím attoassembleru (programovací jazyk na ještě nižší úrovni než assembler), což je v podstatě forma extrémního/hardcore programování, ale také vám umožňuje pomocí attoassembleru definovat funkci procesoru a nechat jej zpracovávat program na vyšší úrovni s vašimi vlastními instrukcemi, jednoduše řečeno, v podstatě se jedná o procesor, jehož funkci a instrukční sadu si musíte sami naprogramovat. S tím souvisí taky zajímavá vlastnost: neboť je paměť attokódu zapisovatelná, je teoreticky možné vytvořit sebemodifikující procesor.

Další činností spojenou s programováním AttoWPU je optimalizace kódu a komprese kódu. Strojový kód AttoWPU nabízí obrovský prostor pro optimalizaci (menší a rychlejší kód, což jsou do jisté míry v podstatě stejné parametry) a kompresi (hodně redudance), takže si můžete otestovat, jak dobří programátoři jste v různých komplikovaných úkolech a budoucích soutěžích.

Ve zkratce: AttoWPU má AttoJádro, které je schopné zpracovávat pouze elementární instrukce, nazvané attoinstrukce. AttoWPU má jednu 64bitovou sběrnici, která je rozdělena na čtyři logické sběrnice: adresní, řídící, datovou a Quick aJump sběrnici. Každá attoinstrukce mění vždy pouze jediný bit této sběrnice. K těmto sběrnicím jsou paralelně připojeny různé jednotky (výpočetní jednotky), takže programátor musí využít těchto sběrnic k ovládání jednotek a výměně dat mezi jednotkami. AttoJádro je pouze schopno měnit jeden bit na jedné z logických sběrnic v každém cyklu, vše ostatní (i (ne)podmíněné skoky) musí být provedeny použitím jednotek. Pro lepší pochopení doporučuji soubor Schematics.pdf v archivu, který je ke stažení výše.

Co to je AttoASM?

AttoASM je programovací jazyk sloužící k vytvoření attokódu – strojového kódu, který je zpracován attojádrem AttoWPU. Umožňuje vytvořit attokód (strojový kód) zapsáním jednotlivých attoinstrukcí, ale nabízí i způsoby, jak programování zjednodušit a odstranit opakující se zdrojový kód. Totéž ale nemůžeme říct o strojovém kódu, takže pokud budete chtít optimalizovat výsledný strojový kód, zdrojový kód bude zřejmě složitější. Přece jenom se jedná o extrémní/hardcore programování. Budete potřebovat „kompilátor“ (attoassembler – tak se správně nazývá překladač) k převedení zdrojového kódu na attokód (strojový kód).

Co je to CustASM?

Protože lze vytvořit attokód, který bude v podstatě definovat procesor – bude dekódovat instrukce a provádět příslušné akce, můžete vytvořit prakticky libovolnou instrukční sadu (na vyšší úrovni než jsou attoinstrukce, nebo taky ne, klidně si napište attokód, který bude zpracovávat attokód), budete potřebovat nástroj, který vytvoří příslušný strojový kód ze zdrojového kódu s vašimi vlastními mnemotechnickými symboly.

Pro pohodlí, abyste nemuseli sami psát svůj překladač, nebo nějaký hledat, je k dispozici i programovací jazyk CustASM a příslušný překladač (custassembler). Tento jazyk symbolických adres vám v podstatě umožňuje jednoduše nadefinovat své vlastní mnemotechnické zkratky, včetně uspořádání a počtu argumentů a příslušný strojový kód. Custassembler poté použije tyto definice při překladu strojového kódu.

Custassembler prozatím není k dispozici ke stažení, ale brzy bude.

Jak si to můžu vyzkoušet?

Aby si mohl kdokoliv vyzkoušet AttoWPU a programování pro něj, je k dispozici i grafický emulátor spolu s překladačem (emulátor má však vestavěný překladač, takže stačí načíst zdrojový kód a on se postará o překlad). Samozřejmě byste si měli přečíst dokumentaci a podívat se na ukázkové zdrojové kódy (brzy jich bude více a lépe komentovaných).

Doporučuji zejména Pong.att, což je v podstatě hra Pong napsaná čistě v AttoAssemebleru (AttoASM) a poměrně hojně komentovaná (ono to ani jinak nejde).

Jaký je stav projektu?

Projekt je momentálně ve fázi alfa, takže stále podléhá značnému vývoji, takže očekávávejte bugy, problémy a nedodělané funkce. Naštěstí je procesor, překladač i emulátor funkční a kompletní do té míry, že si jej lze rozumně vyzkoušet a prezentovat jej a základní myšlenka konceptu zůstává neměnná.

Momentálně věnuji čas i dalšímu WPU ze série, o kterém však zatím víc neprozradím. Byl bych rád za nějakou odezvu, tak neváhejte, zkoušejte, experimentujte, programujte a komentujte. Sledujte také oficiální web attowpu.solirax­.org.

ict ve školství 24

Ukázka zdrojového kódu – hra Pong v jazyce AttoASM

Klasická hra Pong se stala první hrou napsanou v jazyce AttoASM pro AttoWPU, ovládá se pomocí W a S (levé pádlo) a E a D (pravé pádlo). Dokazuje funkčnost jazyka AttoASM, překladače, architektury AttoWPU i emulátoru. Kompletní zdrojový kód. Hra je přiložena i v balíčku, který stáhnete výše.

Další ukázka – Hello World

Klasická aplikace Hello World v jazyce AttoASM se dvěma kuriozitami: je složitější než Helloworld v jazyce Brainfuck a zároveň je možné níže uvedený kód optimalizovat – troufnete si?

/* Hello World in AttoASM by Frooxius, slightly optimized, 5/20/2011, www.attowpu.solirax.org */

EXE { CTRL+7(2) ! }     // execute command

ADDR+4 [01H, 4]     // attocode memory
CTRL+3 [01H, 4]     // write new address
DATA [TEXT]
EXE

DATA+24 1(8)    // prepare for data exchange

LOOP:

// cleanup after jump
CTRL+7 0
ADDR+4 [05H, 4]     // out register
CTRL+3 [00H, 4]     // stop the output
EXE

// Write the character
ADDR+4 [01H, 4]     // attocode memory
CTRL+3 [03H, 4]     // output addressed data
EXE

ADDR+4 [0BH, 4]     // address text display
CTRL+3 [03H, 4]     // write character and increment address
EXE

// Maintain the loop if end of string wasn't reached yet

ADDR+4 [01H, 4]     // address attocode memory
CTRL+3 [07H, 4]     // move to the next element
EXE

ADDR+4 [02H, 4]     // address TEMP register
CTRL+3 [03H, 4]     // write value without mask from the databus
EXE

ADDR+4 [01H, 4]     // attocode memory
CTRL+3 [00H, 4]     // stop data output
EXE

ADDR+4 [04H, 4]     // address ALU
CTRL [29H, 7]       // ZeroSet
DATA [ENDLOOP]
EXE
CTRL [2AH, 7]       // NotZeroSet
DATA [LOOP]
EXE

CTRL 000    // clear three MSB

DATA+24 1(8)    // prepare for data exchange

ADDR+4 [05H, 4]     // OUT register
CTRL+3 [01H, 4]     // output its contents
EXE

ADDR+4 [00H, 4] // aPC
CTRL+3 [01H, 4] // write new address from the databus
EXE

ENDLOOP:

// cleanup after jump
CTRL+7 0
ADDR+4 [05H, 4]     // out register
CTRL+3 [00H, 4]     // stop the output
EXE

// infinite loop to stop the program from executing following (nonexistent - gibberish) code
AJMP [INFLOOP, 15]
INFLOOP:
AJMP+15(2) !

text:
"Hello world!" $00

Autor článku