Sydd kod

Trådad kod  är ett av sätten att implementera en mellanliggande virtuell maskin vid tolkning av programmeringsspråk (tillsammans med bytecode ). Ibland påträffas termen tvärbunden kod också i litteraturen .

Huvudrepresentationen av programmet när man använder gängad kod är en rad subrutinanrop . Implementeringen av den gängade koden, hur dessa samtal lagras kan vara annorlunda. Denna kod kan bearbetas av en tolk (som har blivit känd som en adresstolk ), eller det kan vara en enkel sekvens av maskininstruktioner som anropar en subrutin. En uppsättning grundläggande subrutiner för en virtuell maskin som använder gängad kod implementeras som subrutiner skrivna i vanlig maskinkod .

Trådad kod är mest känd som en teknik som används vid implementeringen av Forth . Det användes dock även vid implementeringen av programmeringsspråket B (föregångare till C ). Det används också ibland i implementeringen av BASIC , COBOL och andra programmeringsspråk.

Trådade kodfunktioner

Den sydda koden är relativt kompakt jämfört med maskinkoden. Denna fördel kommer till priset av en viss avmattning. Däremot spelar en synergistisk effekt in här  - ibland är en kompakt kod mindre och märkbart snabbare än en vanlig, icke-trådad kod [1] . Ett program som är tillräckligt litet för att få plats helt i RAM-minnet kommer att köras snabbare än ett program som använder virtuellt minne, vilket innebär personsökning från hårddisken. På samma sätt kommer ett program som passar helt och hållet i processorns cache att köras snabbare .

Typer av sydd kod

Subrutinkod

Denna typ av gängad kod skiljer sig i princip inte från maskinkod . Detta är en sekvens av anrop till redan kompilerade subrutiner.

Programmet ser ut så här:

callSub1; callSub2; ringSub3;


Direktsydd kod

Denna kod erhålls från subrutinen om samtal att ringa tas bort från koden. Endast adresser till subrutiner finns kvar i kodens brödtext. Anrop av subrutiner utförs med den enklaste adresstolken, som upptar flera maskininstruktioner (i vissa processorarkitekturer, en).

samtalstolk; AdrSub1; AdrSub2; ... adrEXIT; ... ... Tolk: maskinkod, NÄSTA ... Sub...: maskinkod, NÄSTA ... EXIT: maskinkod, NÄSTA

I rak gängad kod börjar varje definition (t.ex. Sub) med maskinkod. Tolken måste lagra det tidigare värdet på instruktionsräknaren i returstacken (detta är inte PC, eller IP, utan en annan som rör sig genom Forth-koden), och göra dess returadress aktuell. Den kommer nu att bli den nya pekaren till Forth-koden. Vissa Intel x86 -versioner använder SI-registret. Vid läsning av data på en indirekt adress i detta register ändras dess värde automatiskt.

NEXT är sekvensen som används istället för retur. Om vi ​​slutför Sub1, så kommer NEXT till Forth-instruktionsräknaren, ändrar den till kodstorleken, och i nästa steg är den första maskininstruktionen från Sub2 redan exekverad. Övergångshastigheten är inte sämre än för ett par retur-anropskommandon. Men NÄSTA övergång i en specialiserad processor kan utföras som en enda instruktion.

EXIT - återställer programräknarens tidigare värde och hoppar till motsvarande adress.

Indirekt gängad kod

Den skiljer sig från den direktgängade koden genom att kodens kropp inte börjar med ett anrop till tolken, utan med adressen där tolken finns.

Addr Tolk; AdrSub1; AdrSub2; ... adrEXIT; ... ... Tolk: Maskinkodadress, maskinkod, NÄSTA ... Sub...: Maskinkod adress, maskinkod, NÄSTA ... EXIT: Maskinkod adress, maskinkod, NÄSTA

Upprullad sydd kod

Kan till exempel användas för att minska storleken på koden när den är av kritisk betydelse. Det kan vara både direkt och indirekt. Istället för direkta adresser till subrutiner och koder använder den deras veck, som generellt sett är kortare än dessa adresser. Med 2-byte-koder kan du använda ett adressutrymme långt över 64 kilobyte.

Så om vi vet att koden och data är justerade i förhållande till storleken på något segment (till exempel 16 byte), kan vi använda den fysiska adressen dividerad med 16 som den vikta adressen.

I vissa fall kan en adresstabell användas för vikning. Den sammanfogade koden är adressen för adressen i tabellen. Tolken läser denna kod från tabellen och hoppar till lämplig adress.

Bytekod kan ses som ett specialfall av vikt kod med en adresstabell.

Anteckningar

  1. Hastigheten för olika tolktekniker V2

Litteratur och referenser