Tuesday 10 October 2017

Flytting Gjennomsnitt R Kode


Jeg vil gjerne legge til at dette ikke er tilfelle for andre språk enn R. Jeg vet at spørsmålet er løst og om R, men kanskje noen andre finner dette nyttig: Bortsett fra engineR (standard), blir alle biter utført i separate økter, så variablene kan ikke deles direkte. Hvis vi ønsker å benytte objekter opprettet i tidligere biter, må vi vanligvis skrive dem til filer (som bivirkninger). For bash-motoren kan vi bruke Sys. setenv () til å eksportere variabler fra R til bash (eksempel). En annen tilnærming er å bruke (eksperimentell) runr-pakken. Python Eksempel 2a): Python Eksempel 2b): Transkripsjonsmuseum for det bevegelige bildet Living Room Candidate neste århundre, Clinton, 1996 BILL CLINTON (voiceover): La meg si til deg at jeg er beæret over å ha fått muligheten til å stå opp for de vanlige amerikanernes verdier og interesser. TEKST: WELFARE REFORM, ARBEIDSFORSKRIFTER. MEDICARE, UTBILDNING BESKYTTET BILL CLINTON (voiceover): Min jobb som president er å ta vare på det amerikanske folket. Og jeg har gjort mitt beste for å ta vare på dette landet. TEKST: DEFEKSJONSNUT 60. SKATTER SKAL FOR 15 000 000 FAMILIER BILL KLINTON (voiceover): Vi er tryggere. Vi er sikrere, TEXT: DØDSTRAFT FOR DRUG KINGPINS BILL CLINTON (voiceover): Vi er mer velstående, TEKST: EN VIKTIG ØKONOMI: 10.000.000 NYE JOBS BILL CLINTON (voiceover): Men til slutt står det vi står for, TEXT: FOR FREMTIDEN. EXPAND FAMILY MEDICAL LEAVE BILL CLINTON (voiceover): Verdiene vi tar imot og tingene vi kjemper for, TEKST: FOR FREMTIDEN. BAN COP KILLER BULLETS BILL CLINTON (voiceover): Skal forme fremtiden TEKST: 1500 SKATKREDIT FOR COLLEGE TUITIONJOB TRAINING BILL CLINTON (voiceover): At vi alle vil leve med. TEKST: BESKYTT BARN FRA TOXISK AVFALLSBLAD (voiceover): Hvis vi holder ut våre hender i samarbeid, TEKST: KAPITAL GJENNOMRÅDE SKATTE KUT FOR HUS EIERER BILL CLINTON (voiceover): Men stå alltid opp for det vi vet er riktig, TEXT: BALANSER BUDGET FOR EN VIKTIG ØKONOMI BILL CLINTON (voiceover): Denne lands fremtid vil bli enda lysere enn den strålende fortiden. BILL CLINTON: Det er vårt ansvar å få det til å skje. TEKST: CLINTONGORE. BYGGE EN BRIDGE TIL 21ST CENTRET Neste århundre, ClintonGore 03996 General Committee, 1996 Fra Museum of the Moving Image, Living Room Kandidat: Presidential Campaign Commercials 1952-2012. livingroomcandidate. orgcommercials1996next århundre (åpnet 25 februar 2017). For å koble til eller videresende denne videoen via e-post, kopier og lim inn denne nettadressen: Takket være en robust økonomi og fravær av splittede utenrikspolitiske problemer i presidentvalget, likte Bill Clinton en relativt problemfri tur på vei til å bli den første demokrat siden Franklin Roosevelt ble valgt til en annen full sikt. Clintons seier representerte et imponerende politisk comeback. I 1994 hadde republikanene vunnet kontroll over begge husene. Med stor innflytelse hadde House Speaker Newt Gingrich forfalsket republikanernes kontrakt med Amerika, en konservativ lovgivningsagenda. Under intense budsjettkamp mellom president og kongress ble den føderale regjeringen stengt to ganger. Clinton klandret dette på republikanerne, som gjorde det mulig for ham å posisjonere seg i sentrum og skildre republikanerne som ekstremister. Clinton-kampanjen knytter gjentatte ganger sin motstander Bob Dole til Gingrich, mens han dirigerer vanlige årsaker som Family Leave Act, høyskolepoeng og et klassifiseringssystem for fjernsyn. Dole prøvde, uten stor suksess, å bruke karakterproblemet til sin fordel. Allikevel viste publikum liten interesse for Clinton-skandaler som Whitewater, Filegate og Travelgate, og påstander om kampanje-finansmisbruk. Bill Clinton for president Al Gore for visepresident Bygg en bro til det 21. århundre Bill Clintons annonser konsekvent assosiert Bob Dole med House Speaker Newt Gingrich. Grainy svart-hvitt opptak av Dole som stod ved siden av Gingrich utnyttet offentlighetens disenchantment med den republikanske ledede kongressen etter nedleggelsen av den føderale regjeringen. I motsetning til disse uhyggelige bildene skisserte fargerike og optimistiske montører Clintons prestasjoner i et bredt spekter av sosiale programmer. Disse annonsene tok æren for den robuste økonomien, og spilte også på frykten for at republikanernes angrep på stor regjering kan true programmer som offentligheten støttet, for eksempel sosial sikkerhet og utdanning. Andre annonser fokusert på mikro-problemer, for eksempel Clintons støtte for skoleuniformer og et TV-klassesystem. Ved å bruke uttrykket som beskytter våre verdier som et av deres slagord, var Clinton-kampanjen i stand til å gripe den politiske mainstream. Clintons støtte til dødsstraff og intensjon om å kutte velferd var blant de tradisjonelt konservative stillingene som ble hevdet i hans reklamefilmer. Fremfor alt har konsistensen, høye produksjonsverdier og oppsiktsvekkende karakter av annonsene reflektert kompetanse, mens subtile høyt stillte spørsmål om Doles avanserte alder. Bob Dole for president Jack Kemp for visepresident En bedre mann for et bedre Amerika Bob Doles reklame viser ham som en krigshelt og en mann med enkel integritet, i motsetning til Clintons tvilsomme moral. Men meningsmålinger viste gjentatte ganger at med økonomien i god form var det offentlige mer interessert i president Clintons jobbprestasjon enn i de mange mindre skandaler som hadde kommet fram i løpet av hans første semester. Doles reklame, inkonsekvent i melding og tone, klarte ikke å etablere et effektivt mål. Ett sted, The Threat, begynte med opptak fra Lyndon Johnsons berømte 1964 Daisy kommersielle om faren for atomkrig, og uttalt at den største trusselen var narkotika. Men annonsen avslørte aldri hvordan dette problemet var knyttet til Clinton. Doles forslag om en 15 prosent skattesnor ble sitert i mange annonser, men uten noen forklaring på hvordan det ville vært finansiert. Med en sunn økonomi og et svakende budsjettunderskudd, var en skattesnit ikke en høy prioritet for velgere. MOVING FORTH Del 1: Designbeslutninger i fremre kjernen av Brad Rodriguez Denne artikkelen ble først oppført i The Computer Journal 59 (januar februar 1993). INNLEDNING Alle i Forth samfunn snakker om hvor lett det er å porten Forth til en ny CPU. Men som mange quoteasyquot - og quotobviousquot-oppgaver, er det ikke skrevet mye om hvordan å gjøre det. Så, da Bill Kibler foreslo dette emnet for en artikkel, bestemte jeg meg for å bryte med den store muntlige tradisjonen til Forthwrights, og dokumentere prosessen i svart og hvitt. I løpet av disse artiklene vil jeg utvikle Forths for 6809, 8051 og Z80. Jeg gjør 6809 for å illustrere en enkel og konvensjonell Forth-modell pluss, Ive har allerede publisert en 6809 assembler ROD91, ROD92, og jeg trenger en 6809 Forth for fremtidige TCJ-prosjekter. Jeg gjør 8051 Forth for et universitetsprosjekt, men det illustrerer også noen ganske forskjellige designbeslutninger. Z80 Forth er for alle CPM-leserne til TCJ, og for noen venner med TRS-80s som samler støv. ESSENTIAL HARDWARE Du må velge en CPU. Jeg vil ikke dykke inn i fordelene til en CPU over en annen for Forth, siden en CPU-valg vanligvis blir tvunget på deg av andre hensyn. Dessuten er gjenstanden for denne artikkelen å vise hvordan man beveger seg frem til hvilken som helst CPU. Du kan forvente den vanlige 16-biters fremre kjernen (se nedenfor) for å oppta omtrent 8K byte av programplass. For en full kjerne som kan kompilere Forth-definisjoner, bør du tillate minst 1 K byte RAM. For å bruke Forhånds blokkeringssystem for diskoppbevaring, bør du legge til 3 Kbytes eller mer for buffere. For en 32-biters Forth-modell, doble disse tallene. Dette er minimumene for å få en kjerne fremover. Hvis du vil kjøre et program på maskinvaren din, bør du øke PROM og RAM-størrelsen som passer. 16 ELLER 32 BIT Ordstørrelsen som brukes av Forth, er ikke nødvendigvis den samme som for CPU. Den minste praktiske Forth er en 16-biters modell, dvs. en som bruker 16-biters heltall og 16-biters adresser. Det fremre samfunnet kaller dette kvotcellquot-størrelsen, siden quotwordquot refererer til en videre definisjon. 8-bits CPUer støtter nesten alltid 16-biters fremover. Dette krever vanligvis eksplisitt koding av dobbeltbyte-aritmetikk, selv om noen 8-biters CPUer har noen 16-biters operasjoner. 16-biters CPUer kjører vanligvis 16-biters fremover, selv om de samme dobbelte presisjonsteknikkene kan brukes til å skrive en 32-biters fremover på en 16-biters CPU. Minst en 32-biters Forth har blitt skrevet for 80868088. 32-bits CPUer kjører normalt 32-biters Forths. En mindre Forth-modell sparer sjelden kodenes lengde eller prosessortiden. Imidlertid vet jeg om minst en 16-bit Forth skrevet for 68000. Dette krymper programkodestørrelsen med en faktor på to, siden høydefinisjoner Forth definisjoner blir en streng med 16-biters adresser i stedet for en streng på 32- bit adresser. (Dette kommer snart til syne.) De fleste 68000-er har nok RAM. Alle eksemplene som er beskrevet i denne artikkelen, er 16-biters fremover som kjører på 8-bits CPUer. THREADING TECHNIQUE quotedread codequot er kjennetegnet for Forth. En videre quotthreadquot er bare en liste over adresser til rutiner som skal utføres. Du kan tenke på dette som en liste over subrutineanrop, med CALL-instruksjonene fjernet. Gjennom årene har mange trekkvariasjoner blitt utarbeidet, og hvilken som er best avhenger av CPU og applikasjonen. For å ta en avgjørelse må du forstå hvordan de fungerer, og deres avvik. Indirekte trådkode (ITC) Dette er den klassiske Forth-trekkteknikken, brukt i fig. Forth og F83, og beskrevet i de fleste bøkene på Forth. Alle de andre threading ordninger er quotimprovementsquot på dette, så du må forstå ITC å sette pris på de andre. La oss se på definisjonen av et forutgående ord SQUARE: I en typisk ITC Forth vil dette vises i minnet som vist i Figur 1. (Overskriften vil bli diskutert i en fremtidig artikkel, den inneholder housekeeping-informasjon som brukes til kompilering, og er ikke involvert i tråder .) Anta at SQUARE oppstår mens du utfører et annet fremtidsord. Forward Interpreter Pointer (IP) vil peke til en celle i minnet - som er inneholdt i det kvoterende ordet - som inneholder adressen til ordet SQUARE. (For å være presis, inneholder cellen en adresse til SQUAREs Code Field.) Tolken henter den adressen, og bruker den til å hente innholdet i SQUAREs Code Field. Disse innholdene er enda en adresse - adressen til en maskinsprogsunderrutine som utfører ordet SQUARE. I pseudokode er dette: Dette illustrerer et viktig, men sjelden uttalt prinsipp: Adressen til det fremre ordet som nettopp er skrevet inn, holdes i W. CODE-ord, trenger ikke denne informasjonen, men alle andre typer fremtredende ord gjør det. Hvis SQUARE ble skrevet i maskinskode, ville dette være slutten på historien: den lille maskinkoden ville bli utført, og deretter hoppe tilbake til Fortholken - som, siden IP ble økt, peker på neste ord til utføres. Det er derfor den fremre tolken vanligvis kalles NESTE. Men, SQUARE er et høyt nivå kvotekvot definisjon - den inneholder en quotthreadquot, en liste over adresser. For å utføre denne definisjonen, må Forth-tolken bli startet på nytt på et nytt sted: Parameterfeltet for SQUARE. Selvfølgelig må tolkernes gamle plassering bli lagret, for å gjenoppta kvoterkvoten Fortsatt ord når SQUARE er ferdig. Dette er akkurat som en subrutine-anrop Maskinens språkhandling av SQUARE er ganske enkelt å trykke den gamle IP-en, sette IP til et nytt sted, kjøre tolken, og når SQUARE er ferdig, trykk IP. (Som du ser, er IP-kvoten mot kvoten på høyt nivå Forth.) Dette kalles DOCOLON eller ENTER i ulike Forths: Dette identiske kodefragmentet brukes av alle høyt nivåer (dvs. gjenget) Forth definitions Thats hvorfor en peker til dette kodefragmentet, ikke selve fragmentet, er inkludert i den forrige definisjonen. Over hundrevis av definisjoner, legger besparelsene opp Og dette er grunnen til at det kalles Indirekte tråder. Kvoturnetten fra subroutinequot er ordet EXIT, som blir kompilert når Forth ser. (Noen fremover kaller det S i stedet for EXIT.) EXIT utfører bare en maskinsprogrutine som gjør følgende: Gå gjennom et par nestede Forth definisjoner, for å forsikre deg selv om at dette fungerer. Legg merke til egenskapene til ITC: hvert fremre ord har et en-celle kodefelt. Kolondefinisjoner kompilere en celle for hvert ord som brukes i definisjonen. Og den fremre tolken må faktisk utføre en dobbelt indireksjon for å få adressen til den neste maskinkoden å løpe (først gjennom IP, deretter gjennom W). ITC er hverken den minste eller den raskeste gjengeteknikken. Det kan være den enkleste, selv om DTC (beskrevet neste) egentlig ikke er mer komplisert. Så hvorfor er så mange Forths indirekte-threaded Hovedsakelig fordi tidligere Forths, brukt som modeller, var indirekte-threaded. I disse dager blir DTC blitt mer populært. Så når skal ITC bli brukt Av de ulike teknikkene produserer ITC de reneste og mest elegante definisjonene - ingenting annet enn adresser. Hvis du er avhengig av slike hensyn, kan ITC appellere til deg. Hvis koden fins rundt med innsiden av definisjonene, kan enkelheten og ensartetheten av ITC-representasjonen øke overførbarheten. ITC er den klassiske Forth-modellen, så det kan være foretrukket for utdanning. Til slutt, på CPUer som mangler en subrutine-anropsinstruksjon - for eksempel 1802 - ITC er ofte mer effektiv enn DTC. Direct Threaded Code (DTC) Direct Threaded Code er forskjellig fra ITC i bare én respekt: ​​i stedet for kodefeltet som inneholder adressen til en maskinkode, inneholder kodefeltet selve maskinskoden selv. Jeg sier ikke at den komplette koden for ENTER er inneholdt i hver kolondefinisjon I quothigh-levelquot Frem ord, vil kodefeltet inneholde et subrutineanrop. som vist i figur 2. Kolondefinisjoner, for eksempel, vil inneholde et anrop til ENTER-rutinen. NESTE pseudo-koden for direkte tråder er rett og slett: Dette gir hastighet: tolken utfører nå bare en enkelt indireksjon. På Z80 reduserer dette NEXT-rutinen - det mest brukte kodefragmentet i den fremre kjernen - fra elleve instruksjoner til syv. Dette koster plass: hver høydefinisjonsdefinisjon i en Z80 Forth (for eksempel) er nå en byte lenger, siden en 2-byte-adresse er erstattet av et 3-byte-anrop. Men dette er ikke helt sant. En 32-bit 68000 Forth kan erstatte en 4-byte-adresse med en 4-byte BSR-instruksjon, uten tap av nett. Og på Zilog Super8, som har maskininstruksjoner for DTC Forth, erstattes 2-byte-adressen med en 1-byte ENTER-instruksjon, noe som gjør DTC Forth mindre på Super8 Selvfølgelig er DTC CODE-definisjonene to byte kortere, siden de Jeg trengte ikke lenger en pointer. Jeg pleide å tro at definisjoner på høyt nivå i DTC Forths krevde bruk av et subrutineanrop i kodefeltet. Frank Sergeants Pygmy Forth SER90 demonstrerer at et enkelt hopp kan brukes like enkelt, og vil vanligvis være raskere. Guy Kelly har samlet en flott gjennomgang av Forth-implementeringer for IBM PC KEL92, som jeg sterkt anbefaler til alle kjerneforfattere. Av 19 Forths studerte han, brukte 10 DTC, 7 brukte ITC og 2 brukte subrutine-tråder (diskuteres neste). Jeg anbefaler bruk av Direct-Threaded Code over Indirect-Threaded Code for alle nye Forth-kjerner. Hopp til NEXT, eller kodes det in-line Den fremre indre tolk, NEXT, er en felles rutine for alle CODE-definisjoner. Du kan bare beholde en kopi av denne vanlige rutinen, og få alle CODE-ordene til å hoppe over det. (Merk at du hopper til NEXT en subrutine Ring er ikke nødvendig.) Hastigheten til NEXT er imidlertid avgjørende for hastigheten til hele Forth-systemet. Også på mange CPUer er NEXT-rutinen ganske kort, ofte bare to eller tre instruksjoner. Så det kan være å foretrekke å kode NEXT in-line, uansett hvor det er brukt. Dette gjøres ofte ved å lage NEXT en assembler-makro. Dette er en enkel hastighet versus plassbeslutning: in-line NEXT er alltid raskere, men nesten alltid større. Den totale størrelsesøkningen er antall ekstra byte som kreves for utvidelse i linje, ganger antall CODE-ord i systemet. Noen ganger er det ingen bytte i det hele tatt: i en 6809 DTC Forth, er en in-line NEXT kortere enn en Jump Instruction Subroutine Threaded Code (STC). En høydefinisjon på forhånd er ingenting annet enn en liste over underrutiner som skal utføres. Du trenger ikke tolker for å oppnå dette, men du kan få samme effekt ved å bare stryke en liste over subrutine samtaler sammen: Se figur 3. Denne representasjonen av Forth-ord har blitt brukt som utgangspunkt for å forklare Forth threading teknikker til montering språk programmerere KOG82. STC er en elegant representasjon kolon definisjoner og CODE ord er nå identiske. quotDefined wordsquot (VARIABLEs, CONSTANTs og lignende) håndteres på samme måte som i DTC - kodefeltet begynner med et hopp eller ring til noen maskinkode andre steder. Den største ulempen er at subrutineanrop vanligvis er større enn enkle adresser. På Z80, for eksempel, øker størrelsen på kolondefinisjonene med 50 - og det meste av søknaden er kolondefinisjoner Kontrarivis, på 32-biters 68000 kan det ikke være noen størrelsesøkning i det hele tatt når 4-byte-adresser erstattes med 4-byte BSRer. (Men hvis kodestørrelsen overskrider 64K, må noen av disse adressene byttes ut med 6-bytes JSR.) Subroutine-tråden kan være raskere enn direkte tråder. Du sparer tid ved ikke å ha tolk, men du mister tid fordi alle henvisninger til et fremtidsord innebærer en trykk og pop på en returadresse. I en DTC Forth, forårsaker kun høyt nivå ord på aktivitet på returbunken. På 6809 eller Zilog Super8 er DTC raskere enn STC. Det er en annen fordel for STC: den dispenserer med IP-registeret. Noen prosessorer - som 8051 - er desperat kort for å adressere registre. Å eliminere IP kan virkelig forenkle og øke hastigheten på kjernen. Den eneste måten å vite, er å skrive eksempelkode. Dette er nært involvert med registervalg, diskutert i neste avsnitt. STC med direkte ekspansjonsoptimalisering på eldre og 8-bits CPUer, omfatter nesten alle tidligere primitive flere maskininstruksjoner. Men på mer kraftige CPUer, er mange tidligere primitiver skrevet i en enkelt instruksjon. For eksempel på 32-bit 68000 er DROP ganske enkelt I en subrutin-threaded Forth, ved å bruke DROP i et kolon definisjon vil resultere i sekvensen ADDQ er en tobyte instruksjon. Hvorfor skrive en firebyte-subrutineanrop til en tobyte-instruksjon Uansett hvor mange ganger DROP er brukt, er det ingen besparelser Koden er mindre og raskere hvis ADDQ er kodet direkte inn i strømmen av BSRer. Noen fremtredende kompilatorer gjør dette kvote-line expansionskvoten av CODE-ordene CUR93a. Ulempen med in-line ekspansjon er at dekompilering tilbake til den opprinnelige kildekoden blir svært vanskelig. Så lenge subroutine-anrop brukes, har du fremdeles pekere (subrutinadressene) til de fremre ordene som omfatter tråden. Med pekere til ordene, kan du få navnene sine. Men når et ord er utvidet til in-line-kode, er all kunnskap om hvor den koden kommer fra, tapt. Fordelen med in-line ekspansjon - bortsett fra hastighet og størrelse - er potensialet for kodeoptimalisering. For eksempel vil Forth-sekvensen bli kompilert i 68000 STC som, men kunne utvides i tråd som en enkelt maskininstruksjon. Optimering Forth compilers er for bredt et emne for denne artikkelen. Dette er et aktivt område av Forth språkforskning se for eksempel SCO89 og CUR93b. Den endelige kulminasjonen av optimalisert STC er en Forth som kompilerer til quotpurequot maskinkode, akkurat som en C - eller Fortran-kompilator. Token trådkode (TTC) DTC og STC tar sikte på å forbedre hastigheten på fremtidige programmer, til en viss pris i minnet. Nå kan vi flytte den andre retningen fra ITC, mot noe langsommere men mindre. Formålet med en videre tråd er å spesifisere en liste over fremtredende ord (subrutiner) som skal utføres. Anta at et 16-biters Forth-system bare hadde maksimalt 256 forskjellige ord. Deretter kunne hvert ord unikt identifiseres med et 8-biters tall. I stedet for en liste over 16-biters adresser, vil du ha en liste over 8-biters identifikatorer eller quottokens, og kvadratstørrelsenes definisjoner vil bli halvert. En token-threaded Forth beholder en tabell med adresser på alle fremtredende ord, som vist i figur 4. Tollverdien brukes deretter til å indeksere i denne tabellen for å finne fremre ord som svarer til et gitt token. Dette legger til et nivå av indireksjon til den fremre tolken, så det er tregere enn en kvadratkryss-threadedquot Forth. Hovedfordelen ved token-threaded Forths er liten størrelse. TTC er mest sett i håndholdte datamaskiner og andre alvorlige størrelsesbegrensede applikasjoner. Dessuten kan tabellen med quotentrypoints i alle Forth-ordene forenkle sammenkobling av separatutviklede moduler. Ulempen med TTC er hastighet: TTC gjør den tregeste fremtiden. TTC-kompilatoren er også litt mer kompleks. Hvis du trenger mer enn 256 Forth-ord, er det nødvendig å ha en åpen kodingsordning for å blande 8-biters og større tokens. Jeg kan forestille en 32-biters Forth ved hjelp av 16-biters tokens, men hvor mange 32-biters systemer er størrelsesbegrenset Segment Threaded Code Siden det er så mange 8086-derivater i verden, fortjener segmenttråden en kort omtale. I stedet for å bruke quotumormalquot byte-adresser i et 64K-segment, brukes avsnittadresser. (En kvotestilling er 16 byte i 8086.) Så kan tolken laste disse adressene inn i segmentregistre, i stedet for å inn i de vanlige adressene. Dette tillater en 16-biters Forth-modell for effektivt å få tilgang til hele megabyte 8086-minnet. Den viktigste ulempen ved segmenttråden er 16-byte kvadratkvotalitetskvoten i minnet. Hvert fremre ord må være justert til en 16-byte grense. Hvis Forth ord har tilfeldige lengder, vil et gjennomsnitt på 8 byte bli bortkastet per Forth ord. REGISTRERING AV TILDELING Ved siden av gjengeteknikken er bruk av CPU-registre den mest avgjørende designbeslutningen. Det er sannsynligvis det vanskeligste. Tilgjengeligheten av CPU-registre kan avgjøre hvilken trådeteknikk som kan brukes, og til og med hva minnekortet vil være De klassiske fremkallingsregistrene Den klassiske Forth-modellen har fem kvotetiske registers. quot Disse er abstrakte enheter som brukes i primitive operasjoner av Forth. NEXT, ENTER og EXIT ble tidligere definert i form av disse abstrakte registre. Hver av disse er en cellevidde - det vil si i 16-biters Forth, disse er 16-biters register. (Det er unntak fra denne regelen, som du vil se senere.) Disse er kanskje ikke alle CPU-registre. Hvis CPUen ikke har nok register, kan noen av disse lagres i minnet. Jeg beskriver dem i rekkefølgen av deres betydning, dvs. bunnen av denne listen er de beste kandidatene som skal lagres i minnet. W er arbeidsregisteret. Den brukes til mange ting, inkludert minne referanse, så det skal være et adresseregister, dvs. du må kunne hente og lagre minne ved hjelp av innholdet i W som adresse. Du må også kunne gjøre aritmetikk på W. (I DTC Forths må du også kunne hoppe indirekte ved hjelp av W.) W brukes av tolken i hvert forutgående ord. I en CPU som bare har ett register, vil du bruke det til W og beholde alt annet i minnet (og systemet vil være utrolig sakte). IP er tolkpointeren. Dette brukes av hvert forkortet ord (gjennom NEXT, ENTER eller EXIT). IP må være et adresseregister. Du må også kunne øke IP. Subroutine threaded Forths trenger ikke dette registret. PSP er Parameter Stack (eller quotdata stackquot) Pointer, noen ganger kalt bare SP. Jeg foretrekker PSP fordi SP ofte er navnet på et CPU-register, og de bør ikke forveksles. De fleste CODE-ord bruker dette. PSP må være en stabelpeker eller et adresseregister som kan økes og dekrementeres. Det er også et pluss hvis du kan gjøre indeksert adressering fra PSP. RSP er Return Stack Pointer, noen ganger kalt bare RP. Dette brukes av kolondefinisjoner i ITC og DTC Forths, og av alle ord i STC Forths. RSP må være en stabelpeker, eller et adresseregister som kan økes og dekrementeres. Hvis i det hele tatt mulig. sett W, IP, PSP, og RSP i registre. De virtuelle registre som følger kan holdes i minnet, men det er vanligvis en rask fordel å holde dem i CPU-registre. X er et arbeidsregister, ikke betraktet som et av kvoteklassifiseringen Forth-register, selv om den klassiske ITC Forths trenger det for den andre indireksjonen. I ITC må du kunne hoppe indirekte ved hjelp av X. X kan også brukes av noen CODE-ord for å gjøre aritmetiske og lignende. Dette er spesielt viktig på prosessorer som ikke kan bruke minne som operand. For eksempel kan ADD på en Z80 være (i pseudokode) Noen ganger er et annet arbeidsregister, Y, også definert. UP er brukerpekeren, og holder basen til oppgavens brukerområde. UP er vanligvis lagt til en forskyvning, og brukes av høyt nivå fremkodskode, så det kan bare lagres et sted. Men hvis CPUen kan gjøre indeksert adressering fra UP-registeret, kan CODE-ordene lettere og raskt få tilgang til brukervariabler. Hvis du har et overskudd av adresseregister, bruk en for UP. Enkeltoppgave fremover trenger ikke opp. X - om nødvendig - er viktigere å være i register enn UP. UP er det enkleste av de fremre virtuelle registre for å flytte inn i minnet. Bruk av maskinvarestabletten De fleste CPUer har en stabelpeker som en del av maskinvaren, som brukes av interrupts og subroutine-samtaler. Hvordan går dette kartet inn i Forth-registerene Skulle det være PSP eller RSP Det korte svaret er, det avhenger. Det sies at PSP brukes mer enn RSP i ITC og DTC Forths. Hvis CPUen har få adresseregister, og PUSH og POP er raskere enn eksplisitt referanse, bruker du maskinvarebunken som Parameter Stack. På den annen side, hvis CPUen er rik på adressemoduser - og tillater indeksert adressering - er det et pluss å ha PSP som et generelt adresseliste. I dette tilfellet bruker du maskinvarebunken som Return Stack. Noen ganger gjør du heller ikke TMS320C25s maskinvarebunke er bare åtte celler dyp - alt annet enn ubrukelig for Forth. Derfor er maskinvarebunken bare brukt for avbrudd, og både PSP og RSP er adresseregister med generelle formål. (ANS Forth angir minst 32 celler av Parameter Stack og 24 celler av Return Stack Jeg foretrekker 64 celler av hver.) Du vil av og til støte på dogmaen som maskinvarebunken kvitterer for Parameter Stack, eller du kan få tilbake Return Stack. I stedet kodes noen eksempler fremfor primitive, for eksempel og se hvilken tilnærming som er mindre eller raskere. (DUP og DROP, forresten, er ingen test - de er vanligvis trivielle.) Noen ganger når du underlige konklusjoner Gary Bergstrom har påpekt at en 6809 DTC Forth kan gjøres noen få sykluser raskere ved å bruke 6809 brukerstabelpekeren som IP NEXT blir en POP. Han bruker et indeksregister for en av Forths stabler. Top-Of-Stack in Register Fremtidig ytelse kan forbedres betraktelig ved å holde toppelementet i Parameter Stack i et register. Mange Utgående ord (for eksempel 0) trenger ikke å bruke stakken. Andre ord gjør fortsatt det samme antallet pushes og pops, bare på et annet sted i koden. Bare noen få Forth ord (DROP og 2DROP) blir mer komplisert, siden du ikke lenger kan justere stakkpekeren - du må også oppdatere TOS-registeret også. Det er noen regler når du skriver CODE-ord: Et ord som fjerner elementer fra stakken må legge til quotnewquot-TOS i sitt register. Et ord som legger til elementer i stabelen, må skyve quotoetquot-TOS på bunken (med mindre det forbruker av ordet). Hvis du har minst seks CPU-registre i celleformat, anbefaler jeg at du holder TOS i et register. Jeg anser TOS mer viktig enn UP å ha i register, men mindre viktig enn W, IP, PSP og RSP. (TOS i register utfører mange av funksjonene i X-registret.) Det er nyttig hvis dette registeret kan utføre minneadressering. PDP-11s, Z8s og 68000s er gode kandidater. Ni av de 19 IBM PC Forths studert av Guy Kelly KEL92 holder TOS i register. Jeg tror at denne innovasjonen har blitt motstått på grunn av den falske oppfatningen at a) den legger til instruksjoner, og b) toppstakkelementet må være tilgjengelig som minne. Det viser seg at selv slike ord som PICK, ROLL og DEPTH blir trivielt modifisert for TOS-in-register. Hva med å buffere to stakkelementer i registre Når du holder toppen av stabelen i et register, blir det totale antallet operasjoner som utføres, stort sett det samme. Et trykk er et trykk, uansett om det er før eller etter operasjonen du utfører. På den annen side legger buffering av to stakkelementer i registre et stort antall instruksjoner - et trykk blir et trykk etterfulgt av et trekk. Bare dedikerte Forth-prosessorer som RTX2000 og utrolig smart optimaliserende kompilatorer kan dra nytte av å buffere to stablingselementer i registre. Noen eksempler Her er registeroppdragene laget av Forths for en rekke forskjellige CPUer. Prøv å utlede designbeslutningen fra forfatterne fra denne listen. quotSPquot refererer til harddiskpekeren. quotZpagequot refererer til verdier som holdes på 6502s minne side null, som er nesten like nyttige som - noen ganger mer nyttige enn - verdier holdt i registre, f. eks. de kan brukes til minneadressering. quotFixedquot betyr at Paynes 8051 Forth har et enkelt, ubrukelig brukerområde, og UP er en hardkodet konstant. Smalregistreringer Merk noe som er ukjent i forrige liste 6502 Forth - en 16-biters modell - bruker 8-biters stavepoints Det er mulig å lage PSP, RSP og UP mindre enn cellens størrelse på Forth. Dette skyldes at stablene og brukerområdet begge er relativt små områder av minnet. Hver stabel kan være så liten som 64 celler i lengde, og brukerområdet overskrider sjelden 128 celler. Du trenger bare å sikre at enten a) disse dataområdene er begrenset til et lite område med minne, så en kort adresse kan brukes, eller b) de høye adressebitene er gitt på en annen måte, f. eks. velg en minneside. I 6502 er maskinvarebunken begrenset til side 1 av RAM (adresser 01xxh) ved utformingen av CPU. 8-punkts pekepekeren kan brukes til Return Stack. Parameterstakken holdes på siden null for RAM, som kan indirekte nås av 8-biters indeksregister X. (Spørsmål til den avanserte studenten: hvorfor bruk 6502s X, og ikke Y Hint: se på adresseringsmodusene som er tilgjengelige. ) I 8051 kan du bruke 8-bitregistrene R0 og R1 til å adressere eksternt RAM, forutsatt at du eksplisitt sender ut de høye 8 bitene til adressen til port 2. Dette tillater en kvote seleksjon for to stabler. UP er forskjellig fra PSP og RSP: det gir bare en basisadresse, den blir aldri økt eller redusert. Så det er praktisk å levere kun de høye biter av dette virtuelle registeret. De lave bitene må da leveres med hvilken indeksert adresseringsteknikk som benyttes. For eksempel på 6809 kan du bruke DP-registeret til å holde de høye 8 bitene av UP, og deretter bruke Direct Page adressering for å få tilgang til noen av de 256 stedene på denne siden. Dette tvinger alle brukerområdene til å begynne på en adresse xx00h, noe som ikke er stor motgang, og begrenser brukerområdet til 128 celler i lengde. På 8086 kan du tenkelig bruke et segmentregister for å angi basisadressen til brukerområdet. REFERANSER CUR93a Curley, Charles, quotLife i FastForth Lane, citerer venter på publikasjon i Forth Dimensions. Beskrivelse av en 68000 subrutin-gjenget Forth. CUR93b Curley, Charles, quotOptimizing i en BSRJSR Threaded Forth, quote venter publikasjon i Forth Dimensions. Enkeltpass kodeoptimalisering for FastForth, i bare fem skjermbilder med kode Inkluderer notering. KEL92 Kelly, Guy M. quotForth Systems Comparisons, quot. Forth Dimensions XIII: 6 (MarApr 1992). Også publisert i 1991 FORML Conference Proceedings. Begge er tilgjengelige fra Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Illustrerer designavvik fra mange 8086 Forths med kodefragmenter og benchmarks - sterkt anbefalt KOG82 Kogge, Peter M. quotAn Architectural Trail til Threaded Code Systems, citerer IEEE Computer, vol. 15 nr. 3 (mar 1982). Fortsetter den endelige beskrivelsen av ulike gjengeteknikker. ROD91 Rodriguez, B. J. quotB. Y.O. Assembler, sitat Del 1, The Computer Journal 52 (SepOct 1991). Generelle prinsipper for skriving Forth assemblers. ROD92 Rodriguez, B. J. quot. B.Y. O. Assembler, sitat Del 2, The Computer Journal 54 (JanFeb 1992). En 6809 assembler i Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer for Compiling Forward, citerer 1989 FORML Conference Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. God beskrivelse av en 68000 optimaliserer ingen kode som er oppgitt. CUR86 Curley, Charles, Real-Forth for 68000. privat distribuert (1986). JAM80 James, John S. fig-Forth for PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth for Apple II. Mountain View Press (1981). LAX84 Laxen, H. og Perry, M. F83 for IBM PC. versjon 2.1.0 (1984). Distribuert av forfatterne, tilgjengelig fra Forth Interest Group eller GEnie. LOE81 Loeliger, R. G. Gjengetolkende språk. BYTE Publikasjoner (1981), ISBN 0-07-038360-X. Kan være den eneste boken som er skrevet om emnet for å skape en fremkalt kjernekode (eksempelet som brukes er Z80). Verdt det hvis du finner en kopi. MPE92 MicroProcessor Engineering Ltd MPE Z8Super8 PowerForth Mål. MPE Ltd. 133 Hill Lane, Shirley, Southampton, S01 5AF, U. K. (juni 1992). Et kommersielt produkt. PAY90 Payne, William H. Embedded Controller FORTH for 8051-familien. Academic Press (1990), ISBN 0-12-547570-5. Dette er en komplett kvotekvot for en 8051 Forth, inkludert en metakompiler for IBM PC. Hardcopy-filer kan lastes ned fra GEnie. Ikke for nybegynner SER90 Sergeant, Frank, Pygmy Forth for IBM PC. versjon 1.3 (1990). Distribuert av forfatteren, tilgjengelig fra Forth Interest Group. Versjon 1.4 er nå tilgjengelig på GEnie, og verdt den ekstra innsatsen å skaffe. TAL80 Talbot, R. J. fig-Forth for 6809. Forth Interest Group (1980). Forfattere notat for webpublisering: Filene som tidligere var tilgjengelige på GEnie online-tjenesten, er nå tilgjengelig fra FTP-serveren Forth Interest Group, ftp: ftp. forth. orgpubForth.

No comments:

Post a Comment