Vláknitý kód je jedním ze způsobů, jak implementovat zprostředkující virtuální stroj při interpretaci programovacích jazyků (spolu s bytecode ). Občas se v literatuře setkáváme i s pojmem crosslinked code .
Hlavní reprezentací programu při použití vláknového kódu je pole volání podprogramů . Implementace vláknového kódu, způsob uložení těchto volání se může lišit. Tento kód může být zpracován tlumočníkem (který se stal známým jako tlumočník adres ), nebo to může být jednoduchá sekvence strojových instrukcí volajících podprogram. Některá sada základních podprogramů virtuálního stroje používající vláknový kód je implementována jako podprogramy napsané v běžném strojovém kódu .
Vláknitý kód je nejčastěji známý jako technika používaná při implementaci Forth . Byl však také použit při implementaci programovacího jazyka B (předchůdce C ). Někdy se také používá při implementaci BASIC , COBOL a dalších programovacích jazyků.
Šitý kód je oproti strojovému poměrně kompaktní. Tato výhoda přichází za cenu určitého zpomalení. Zde však vstupuje do hry synergický efekt – někdy je kompaktní kód menší a znatelně rychlejší než běžný nevláknový kód [1] . Program, který je dostatečně malý, aby se celý vešel do paměti RAM, poběží rychleji než program využívající virtuální paměť, která zahrnuje stránkování z pevného disku. Podobně program, který se zcela vejde do mezipaměti procesoru , poběží rychleji .
Tento druh vláknového kódu se v podstatě neliší od strojového kódu . Toto je sekvence volání již zkompilovaných podprogramů.
Program vypadá takto:
callSub1; callSub2; callSub3;
Tento kód se získá z podprogramu, pokud jsou z kódu odstraněna volání k volání. V těle kódu zůstávají pouze adresy podprogramů. Volání podprogramů se provádí pomocí nejjednoduššího překladače adres, který zabírá několik strojových instrukcí (v některých architekturách procesorů jednu).
tlumočník hovorů; AddrSub1; AddrSub2; ... addrEXIT; ... ... Interpret: strojový kód, NEXT ... Sub...: strojový kód, NEXT ... EXIT: strojový kód, NEXTV přímém vláknovém kódu začíná jakákoli definice (např. Sub) strojovým kódem. Interpret musí uložit do návratového zásobníku minulou hodnotu čítače instrukcí (toto není PC nebo IP, ale jiný, který se pohybuje přes Forth kód) a nastavit jeho návratovou adresu jako aktuální. Nyní se stane novým ukazatelem na kód Forth. Některé verze Intel x86 používají registr SI. Při čtení dat na nepřímé adrese v tomto registru se automaticky mění její hodnota.
NEXT je sekvence použitá místo návratu. Pokud dokončíme Sub1, pak NEXT přistoupí k čítači instrukcí Forth, změní jej na velikost kódu a v dalším kroku je již provedena první strojová instrukce z Sub2. Rychlost přechodu není o nic horší než u dvojice příkazů zpětného volání. Ale přechod NEXT ve specializovaném procesoru může být proveden jako jediná instrukce.
EXIT - obnoví předchozí hodnotu programového čítače a skočí na odpovídající adresu.
Od přímého vláknového kódu se liší tím, že tělo kódu nezačíná voláním interpretu, ale adresou, kde se interpret nachází.
AddrInterpretator; AddrSub1; AddrSub2; ... addrEXIT; ... ... Interpret: Adresa strojového kódu, strojový kód, NEXT ... Sub...: Adresa strojového kódu, strojový kód, NEXT ... EXIT: Adresa strojového kódu, strojový kód, NEXTMůže být například použit ke zmenšení velikosti kódu, když je kriticky důležitý. Může být jak přímý, tak nepřímý. Místo přímých adres podprogramů a kódů používá jejich záhyby, které jsou obecně kratší než tyto adresy. Pomocí 2bajtových kódů můžete využít adresní prostor výrazně přes 64 kB.
Pokud tedy víme, že kód a data jsou zarovnány vzhledem k velikosti nějakého segmentu (například 16 bajtů), můžeme jako složenou adresu použít fyzickou adresu dělenou 16.
V některých případech lze pro skládání použít adresní tabulku. Sešitý kód je pozice adresy v tabulce. Interpret přečte tento kód z tabulky a skočí na příslušnou adresu.
Bytecode lze chápat jako speciální případ složeného kódu s tabulkou adres.