Syet kode

Gevindkode  er en af ​​måderne at implementere en mellemliggende virtuel maskine ved fortolkning af programmeringssprog (sammen med bytekode ). Lejlighedsvis støder man også på udtrykket tværbundet kode i litteraturen .

Hovedrepræsentationen af ​​programmet, når du bruger trådet kode, er en række subrutineopkald . Implementeringen af ​​den trådede kode, måden disse opkald gemmes på, kan være anderledes. Denne kode kan behandles af en fortolker (som er blevet kendt som en adressefortolker ), eller det kan være en simpel sekvens af maskininstruktioner, der kalder en underrutine. Nogle sæt grundlæggende underrutiner af en virtuel maskine, der bruger trådet kode, er implementeret som underrutiner skrevet i almindelig maskinkode .

Gevindkode er mest kendt som en teknik, der bruges i implementeringen af ​​Forth . Det blev dog også brugt i implementeringen af ​​B -programmeringssproget (forløber for C ). Det bruges også nogle gange i implementeringen af ​​BASIC , COBOL og andre programmeringssprog.

Kodefunktioner med gevind

Den syede kode er forholdsvis kompakt i forhold til maskinkoden. Denne fordel kommer på bekostning af en vis afmatning. Men her spiller en synergistisk effekt ind  - nogle gange er en kompakt kode mindre og mærkbart hurtigere end en almindelig kode uden gevind [1] . Et program, der er lille nok til at passe helt i RAM, vil køre hurtigere end et program, der bruger virtuel hukommelse, som involverer personsøgning fra harddisken. På samme måde vil et program, der passer helt ind i processorens cache , køre hurtigere .

Typer af syet kode

Subrutinekode

Denne form for gevindkode er i det væsentlige ikke forskellig fra maskinkode . Dette er en sekvens af opkald til allerede kompilerede underrutiner.

Programmet ser således ud:

callSub1; callSub2; ringSub3;


Direkte syet kode

Denne kode hentes fra subrutinen, hvis opkald til opkald fjernes fra koden. Kun adresser på underrutiner forbliver i kodens brødtekst. Kaldning af subrutiner udføres ved hjælp af den enkleste adressefortolker, som optager flere maskininstruktioner (i nogle processorarkitekturer en).

kalde tolk; AdrSub1; AdrSub2; ... adrEXIT; ... ... Tolk: maskinkode, NÆSTE ... Under...: maskinkode, NÆSTE ... EXIT: maskinkode, NÆSTE

I lige gevindkode begynder enhver definition (f.eks. Sub) med maskinkode. Tolken skal gemme den tidligere værdi af instruktionstælleren i returstakken (dette er ikke PC eller IP, men en anden, der bevæger sig gennem Forth-koden), og gøre dens returadresse aktuel. Det bliver nu den nye pegepind til Forth-koden. Nogle Intel x86 -versioner bruger SI-registret. Når data læses på en indirekte adresse i dette register, ændres værdien automatisk.

NEXT er den sekvens, der bruges i stedet for retur. Hvis vi fuldfører Sub1, så får NEXT adgang til Forth instruktionstælleren, ændrer den til kodestørrelsen, og i næste trin er den første maskininstruktion fra Sub2 allerede udført. Overgangshastigheden er ikke værre end for et par tilbagekaldskommandoer. Men den NÆSTE overgang i en specialiseret processor kan udføres som en enkelt instruktion.

EXIT - gendanner den tidligere værdi af programtælleren og hopper til den tilsvarende adresse.

Indirekte gevindkode

Den adskiller sig fra den direkte trådede kode ved, at kodens brødtekst ikke begynder med et opkald til tolken, men med den adresse, hvor tolken befinder sig.

AdrInterpretator; AdrSub1; AdrSub2; ... adrEXIT; ... ... Tolk: Maskinkodeadresse, maskinkode, NÆSTE ... Under...: Maskinkodeadresse, maskinkode, NÆSTE ... EXIT: Maskinkodeadresse, maskinkode, NÆSTE

Oprullet syet kode

Kan fx bruges til at reducere størrelsen af ​​koden, når den er af kritisk betydning. Det kan være både direkte og indirekte. I stedet for direkte adresser på underrutiner og koder, bruger den deres folder, som generelt set er kortere end disse adresser. Ved hjælp af 2-byte-koder kan du bruge et adresserum på langt over 64 kilobyte.

Så hvis vi ved, at koden og dataene er justeret i forhold til størrelsen af ​​et segment (for eksempel 16 bytes), kan vi bruge den fysiske adresse divideret med 16 som den foldede adresse.

I nogle tilfælde kan en adressetabel bruges til at folde. Den syede kode er adressen for adressen i tabellen. Tolken læser denne kode fra tabellen og hopper til den relevante adresse.

Bytekode kan opfattes som et særligt tilfælde af foldet kode med en adressetabel.

Noter

  1. Hastighed for forskellige tolkeudsendelsesteknikker V2

Litteratur og referencer