Monday 6 February 2017

Moving Media Realizzazione C

Introduzione ai ARIMA: modelli non stagionali ARIMA (p, d, q) equazione di previsione: modelli ARIMA sono, in teoria, la classe più generale di modelli per la previsione di una serie di tempo che può essere fatto per essere 8220stationary8221 dalla differenziazione (se necessario), forse unitamente trasformazioni non lineari come registrazione o sgonfiando (se necessario). Una variabile casuale che è una serie temporale è stazionaria se le sue proprietà statistiche sono tutte costanti nel tempo. Una serie stazionaria ha alcuna tendenza, le sue variazioni intorno la sua media hanno una ampiezza costante, e dimena in modo coerente. ossia suoi schemi temporali casuale breve termine sempre lo stesso aspetto in senso statistico. Quest'ultima condizione implica che le sue autocorrelazioni (correlazioni con i propri precedenti deviazioni dalla media) rimangono costanti nel tempo, o equivalentemente, che il suo spettro di potenza rimane costante nel tempo. Una variabile casuale di questa forma può essere visto (come al solito) come una combinazione di segnale e rumore, e il segnale (se risulta) potrebbe essere un modello di regressione medio veloce o lento, o oscillazione sinusoidale, o rapida alternanza di segno , e potrebbe anche avere una componente stagionale. Un modello ARIMA può essere visto come un 8220filter8221 che cerca di separare il segnale dal rumore, e il segnale viene poi estrapolato nel futuro per ottenere delle previsioni. L'equazione di previsione ARIMA per una serie temporale stazionaria è un lineare (cioè la regressione-tipo) equazione in cui i predittori sono costituiti da ritardi della variabile dipendente Andor ritardi degli errori di previsione. Cioè: Valore atteso di Y un andor costante una somma pesata di uno o più valori recenti di Y eo una somma pesata di uno o più valori recenti degli errori. Se i predittori sono costituiti solo di valori ritardati di Y. si tratta di un modello autoregressivo puro (8220self-regressed8221), che è solo un caso particolare di un modello di regressione e che potrebbe essere dotato di un software di regressione standard. Ad esempio, un autoregressiva del primo ordine (8220AR (1) 8221) modello per Y è un modello di regressione semplice in cui la variabile indipendente è semplicemente Y ritardato di un periodo (GAL (Y, 1) in Statgraphics o YLAG1 in RegressIt). Se alcuni dei fattori predittivi sono ritardi degli errori, un modello ARIMA NON è un modello di regressione lineare, perché non c'è modo di specificare period8217s 8220last error8221 come una variabile indipendente: gli errori devono essere calcolati su base periodica-to-periodo quando il modello è montato dati. Dal punto di vista tecnico, il problema con l'utilizzo errori ritardati come predittori è che le previsioni model8217s non sono funzioni lineari dei coefficienti. anche se sono funzioni lineari dei dati passati. Così, i coefficienti nei modelli ARIMA che includono errori ritardati devono essere stimati con metodi di ottimizzazione non lineare (8220hill-climbing8221) piuttosto che da solo risolvere un sistema di equazioni. L 'acronimo ARIMA sta per Auto-regressiva integrato media mobile. Ritardi della serie stationarized nell'equazione di previsione sono chiamati termini quotautoregressivequot, ritardi della errori di previsione sono chiamati quotmoving termini averagequot, e una serie di tempo che deve essere differenziata da effettuare stazionaria si dice che sia una versione quotintegratedquot di una serie stazionaria. modelli casuali di tendenza modelli di livellamento esponenziale casuale passeggiata e, modelli autoregressivi, e sono tutti i casi particolari di modelli ARIMA. Un modello ARIMA nonseasonal è classificato come (p, d, q) modello quot quotARIMA, dove: p è il numero di termini autoregressivi, d è il numero di differenze non stagionali necessari per stazionarietà, e q è il numero di errori di previsione ritardati in l'equazione di previsione. L'equazione di previsione è costruito come segue. In primo luogo, Sia Y il d ° differenza di Y. che significa: Si noti che la seconda differenza di Y (il caso d2) non è la differenza da 2 periodi fa. Piuttosto, è la prima differenza-of-the-prima differenza. che è l'analogo discreto di una derivata seconda, cioè l'accelerazione locale della serie piuttosto che la sua tendenza locale. In termini di y. l'equazione generale di previsione è: Qui i parametri medi in movimento (9528217s) sono definiti in modo tale che i loro segni sono negativi nell'equazione, seguendo la convenzione introdotta da Box e Jenkins. Alcuni autori e software (incluso il linguaggio di programmazione R) definirli in modo che abbiano segni più, invece. Quando i numeri reali sono inseriti nell'equazione, non c'è ambiguità, ma it8217s importante sapere quali convenzione il software utilizza quando si sta leggendo l'output. Spesso i parametri sono indicati lì da AR (1), AR (2), 8230, e MA (1), MA (2), 8230 ecc per identificare il modello ARIMA appropriato per Y. si inizia determinando l'ordine di differenziazione (d) che necessita stationarize serie e rimuovere le caratteristiche lordi di stagionalità, forse in combinazione con una trasformazione varianza stabilizzante come registrazione o sgonfiando. Se ci si ferma a questo punto e prevedere che la serie differenziata è costante, si è semplicemente montato un random walk o modello tendenza casuale. Tuttavia, la serie stationarized potrebbe ancora essere autocorrelato errori, il che suggerisce che un numero di termini AR (p 8805 1) Andor alcuni termini numero MA (q 8805 1) sono necessari anche nell'equazione di previsione. Il processo di determinazione dei valori di p, d, e q che sono meglio per una data serie di tempo saranno discussi nelle sezioni successive di note (i cui collegamenti sono nella parte superiore di questa pagina), ma in anteprima alcuni dei tipi di modelli ARIMA non stagionali che vengono comunemente riscontrato è riportata qui sotto. ARIMA modello autoregressivo (1,0,0) del primo ordine: se la serie è fermo e autocorrelato, forse può essere previsto come multiplo del proprio valore precedente, più una costante. L'equazione di previsione in questo caso è 8230which è Y regredito su se stessa ritardato di un periodo. Questo è un modello constant8221 8220ARIMA (1,0,0). Se la media di Y è zero, allora il termine costante non verrebbe inclusa. Se il coefficiente di pendenza 981 1 è positivo e meno di 1 su grandezza (che deve essere inferiore a 1 a grandezza se Y è fermo), il modello descrive significare-ritornando comportamento in cui il valore prossimi period8217s dovrebbe essere previsto per essere 981 1 volte lontano dalla media come questo period8217s valore. Se 981 1 è negativa, predice significare-ritornando comportamento con alternanza di segni, cioè si prevede anche che Y sarà al di sotto del prossimo periodo media se è al di sopra del periodo di dire questo. In un modello autoregressivo del secondo ordine (ARIMA (2,0,0)), ci sarebbe un termine Y t-2 sulla destra pure, e così via. A seconda dei segni e grandezze dei coefficienti, un (2,0,0) modello ARIMA poteva descrivere un sistema il cui reversione medio avviene in modo sinusoidale oscillante, come il moto di una massa su una molla che viene sottoposta a shock casuali . ARIMA (0,1,0) random walk: Se la serie Y non è fermo, il modello più semplice possibile è un modello casuale, che può essere considerato come un caso limite di un AR (1) modello in cui la autoregressivo coefficiente è uguale a 1, cioè una serie con infinitamente lenta reversione media. L'equazione pronostico per questo modello può essere scritto come: dove il termine costante è la variazione media del periodo a periodo (cioè lungo termine deriva) in Y. Questo modello può essere montato come un modello di regressione non intercetta in cui la prima differenza di Y è la variabile dipendente. Dal momento che include (solo) una differenza non stagionale e di un termine costante, è classificato come un quotARIMA (0,1,0) modello con constant. quot Il caso-roulant senza modello - drift sarebbe un ARIMA (0,1, 0) modello senza costante ARIMA (1,1,0) differenziata modello autoregressivo del primo ordine: Se gli errori di un modello random walk sono autocorrelati, forse il problema può essere risolto con l'aggiunta di un ritardo della variabile dipendente alla previsione equation - - cioè regredendo la prima differenza di Y su se stessa ritardato di un periodo. Ciò produrrebbe la seguente equazione previsione: che possono essere riorganizzate a Questo è un modello autoregressivo del primo ordine con un ordine di differenziazione non stagionale e di un termine costante - i. e. un (1,1,0) modello ARIMA. ARIMA (0,1,1) senza costante livellamento esponenziale semplice: Un'altra strategia per correggere gli errori autocorrelati in un modello random walk è suggerita dal semplice modello di livellamento esponenziale. Ricordiamo che per alcune serie di tempo non stazionaria (ad esempio quelle che presentano fluttuazioni rumorosi intorno a una media lentamente variabile), il modello random walk non esegue così come una media mobile di valori passati. In altre parole, invece di prendere l'osservazione più recente come la previsione della successiva osservazione, è preferibile utilizzare una media degli ultimi osservazioni per filtrare il rumore e più accuratamente stimare la media locale. Il semplice modello di livellamento esponenziale utilizza una media mobile esponenziale ponderata dei valori del passato per ottenere questo effetto. L'equazione pronostico per la semplice modello di livellamento esponenziale può essere scritto in un certo numero di forme matematicamente equivalenti. una delle quali è la cosiddetta forma correction8221 8220error, in cui la precedente previsione viene regolata nella direzione dell'errore fece: Perché e t-1 Y t-1 - 374 t-1 per definizione, questo può essere riscritta come : che è un ARIMA (0,1,1) - senza-costante equazione di previsione con 952 1 1 - 945. Ciò significa che è possibile montare un semplice livellamento esponenziale specificando come un modello ARIMA (0,1,1) senza costante, e il MA stimato (1) coefficiente corrisponde a 1-minus-alfa nella formula SES. Ricordiamo che nel modello SES, l'età media dei dati nelle previsioni 1-periodo-ahead è 1 945. senso che essi tenderanno a restare indietro tendenze o punti di svolta da circa 1 945 periodi. Ne consegue che l'età media dei dati nelle previsioni 1-periodo-prima di un ARIMA (0,1,1) - senza-costante modello è 1 (1-952 1). Così, per esempio, se 952 1 0.8, l'età media è 5. Come 952 1 avvicina 1, il ARIMA (0,1,1) - senza-costante modello diventa un media-molto-lungo termine in movimento, e come 952 1 si avvicina a 0 diventa un modello random walk-senza-drift. What8217s il modo migliore per correggere autocorrelazione: aggiunta termini AR o aggiungendo termini MA Nelle precedenti due modelli di cui sopra, il problema degli errori autocorrelati in un modello casuale è stato fissato in due modi diversi: aggiungendo un valore ritardato della serie differenziata l'equazione o l'aggiunta di un valore ritardato del l'errore di previsione. Quale approccio è meglio Una regola empirica per questa situazione, che sarà discusso più dettagliatamente in seguito, è che autocorrelazione positiva di solito è meglio trattata con l'aggiunta di un termine di AR al modello e negativo autocorrelazione di solito è meglio trattata con l'aggiunta di un MA termine. In serie business e tempo economica, autocorrelazione negativa si pone spesso come un artefatto di differenziazione. (In generale, differenziazione riduce autocorrelazione positiva e può anche provocare un interruttore da positivo a negativo autocorrelazione.) Quindi, il modello ARIMA (0,1,1), in cui la differenziazione è accompagnato da un termine MA, è più spesso utilizzato che un ARIMA (1,1,0) del modello. ARIMA (0,1,1) con costante semplice livellamento esponenziale con la crescita: Con l'implementazione del modello SES come un modello ARIMA, è in realtà guadagnare una certa flessibilità. Prima di tutto, il MA stimata (1) coefficiente è permesso di essere negativo. questo corrisponde ad un fattore di livellamento maggiore di 1 in un modello SES, che normalmente non è consentito dalla procedura model-fitting SES. In secondo luogo, si ha la possibilità di includere un termine costante nel modello ARIMA se lo si desidera, al fine di stimare un andamento medio diverso da zero. L'(0,1,1) modello ARIMA con costante ha l'equazione di previsione: Le previsioni di un periodo a venire da questo modello sono qualitativamente simili a quelle del modello SES, tranne che la traiettoria delle previsioni a lungo termine è in genere un pendenza riga (la cui pendenza è uguale a mu) anziché una linea orizzontale. ARIMA (0,2,1) o (0,2,2) senza costante livellamento esponenziale lineare: lineari modelli di livellamento esponenziale sono modelli ARIMA che utilizzano due differenze non stagionali in collegamento con termini MA. La seconda differenza di una serie Y non è semplicemente la differenza tra Y e si ritardato da due periodi, ma piuttosto è la prima differenza della prima --i. e differenza. il cambiamento-in-the-cambiamento di Y al periodo t. Così, la seconda differenza di Y al periodo t è uguale a (Y t - Y t-1) - (Y t-1 - Y t-2) Y t - 2Y t-1 Y t-2. Una seconda differenza di una funzione discreta è analoga ad una derivata seconda di una funzione continua: misura la quotaccelerationquot o quotcurvaturequot in funzione in un dato punto nel tempo. L'(0,2,2) modello ARIMA senza costante prevede che la seconda differenza della serie è uguale a una funzione lineare delle ultime due errori di previsione: che può essere riorganizzato come: dove 952 1 e 952 2 sono il MA (1) e MA (2) coefficienti. Questo è un modello di livellamento esponenziale lineare generale. essenzialmente lo stesso modello di Holt8217s e Brown8217s modello è un caso speciale. Esso utilizza pesato esponenzialmente medie mobili stimare sia a livello locale e una tendenza locale nella serie. Le previsioni a lungo termine di questo modello convergono ad una retta la cui inclinazione dipende dalla tendenza media osservata verso la fine della serie. ARIMA (1,1,2) senza costante smorzata-trend lineare livellamento esponenziale. Questo modello è illustrato nelle slide di accompagnamento sui modelli ARIMA. Si estrapola la tendenza locale alla fine della serie, ma appiattisce fuori a orizzonti previsionali più lunghi per introdurre una nota di cautela, una pratica che ha supporto empirico. Vedi l'articolo sul quotWhy il Damped Trend worksquot da Gardner e McKenzie e l'articolo quotGolden Rulequot da Armstrong et al. per dettagli. In genere è consigliabile attenersi a modelli in cui almeno uno dei p e q non è maggiore di 1, vale a dire non cercare di adattarsi a un modello come ARIMA (2,1,2), in quanto questo rischia di portare a sovradattamento e le questioni che sono discussi in modo più dettagliato nelle note sulla struttura matematica dei modelli ARIMA quotcommon-factorquot. implementazione foglio di calcolo: modelli ARIMA come quelli sopra descritti sono facili da implementare su un foglio di calcolo. L'equazione previsione è semplicemente una equazione lineare che fa riferimento ai valori passati della serie temporale originale e valori passati degli errori. Così, è possibile impostare un foglio di calcolo di previsione ARIMA memorizzando i dati nella colonna A, la formula di previsione nella colonna B, e gli errori (previsioni di dati meno) nella colonna C. La formula di previsione in una cella tipica nella colonna B sarebbe semplicemente un'espressione lineare, con riferimento ai valori precedenti in file di colonne a e C, moltiplicata per i coefficienti adeguati AR o MA memorizzati nelle cellule in altre parti del spreadsheet. MOVING FORTH Parte 1: le decisioni di progettazione nel quarto kernel di Brad Rodriguez Questo articolo è apparso in il Computer Journal 59 (JanuaryFebruary 1993). INTRODUZIONE Ognuno nel quarto parla di comunità su quanto sia facile è di port Forth ad una nuova CPU. Ma, come molti compiti quoteasyquot e quotobviousquot, non molto è scritto su come farlo Così, quando Bill Kibler suggerito questo argomento per un articolo, ho deciso di rompere con la grande tradizione orale di Forthwrights, e documentare il processo in bianco e nero. Nel corso di questi articoli mi svilupperò forths per il 6809, 8051 e Z80. Sto facendo il 6809 per illustrare un modello semplice e convenzionale Forth più, Ive ha già pubblicato un assemblatore 6809 ROD91, ROD92, e Ill essere che necessitano di un 6809 Forth per i futuri progetti TCJ. Sto facendo il 8051 Forth per un progetto universitario, ma illustra anche alcuni piuttosto diverse decisioni di progettazione. La Z80 Forth è per tutti i lettori di CPM TCJ, e per alcuni amici con TRS-80 a prendere polvere. HARDWARE ESSENZIALE È necessario scegliere una CPU. Non voglio approfondire i meriti di una CPU rispetto ad un altro per Forth, dal momento che la scelta della CPU è di solito costretto su di voi da altre considerazioni. Inoltre, l'oggetto di questo articolo è quello di mostrare come muoversi Forth a qualsiasi CPU. Ci si può aspettare il solito kernel Forth a 16 bit (vedi sotto) per occupare circa 8K byte di spazio programma. Per un kernel completo che può compilare Forth definizioni, si dovrebbe consentire un minimo di 1K byte di RAM. Per utilizzare il sistema di gestione del blocco forths per lo storage su disco, si dovrebbe aggiungere 3 Kbyte o più per i buffer. Per un modello a 32 bit Forth, doppi questi numeri. Questi sono i minimi per ottenere un Forth kernel installato e funzionante. Per eseguire un'applicazione sul proprio hardware, si dovrebbe aumentare PROM e RAM formati per soddisfare. 16 o 32 bit La dimensione parola usata da Forth non è necessariamente la stessa di quella della CPU. Il più piccolo Forth pratica è un modello a 16 bit cioè quello che utilizza interi a 16 bit e indirizzi a 16 bit. Il Forth comunità chiama questa dimensione quotcellquot, dal momento che quotwordquot si riferisce ad una definizione Forth. CPU 8-bit quasi invariabilmente supportano forths 16 bit. Questo di solito richiede esplicita codifica aritmetica doppio byte, anche se alcune CPU a 8 bit hanno un paio di operazioni a 16 bit. CPU 16 bit comunemente eseguiti forths 16 bit, anche se le stesse tecniche doppia precisione possono essere utilizzati per scrivere un 32-bit Forth su una CPU a 16 bit. Almeno un quarto a 32-bit è stato scritto per i 80868088. CPU a 32 bit funziona generalmente forths a 32 bit. Un modello più piccolo Forth raramente salva lunghezza del codice o il tempo del processore. Tuttavia, so di almeno un 16 bit Forth scritto per il 68000. Questo fa ridursi applicazione dimensione del codice di un fattore due, dato definizioni alto livello Forth diventano una serie di indirizzi a 16 bit anziché una stringa di 32 indirizzi bit. (Questo diventerà evidente a breve.) La maggior parte delle 68000s, però, hanno un sacco di RAM. Tutti gli esempi descritti in questo articolo sono forths a 16 bit in esecuzione su CPU a 8 bit. LA TECNICA FILETTATURA quotThreaded codequot è il segno distintivo di Forth. Un Forth quotthreadquot è solo un elenco di indirizzi di routine da eseguire. Si può pensare a questo come un elenco delle chiamate di subroutine, con le istruzioni CALL rimossi. Nel corso degli anni molte variazioni filettare sono stati ideati e qual è il migliore dipende dalla CPU e l'applicazione. Per prendere una decisione, è necessario capire come funzionano, e le loro compromessi. Indiretta Codice filettato (ITC) Questa è la classica tecnica Forth filettatura, utilizzata in gura Forth e F83, e descritto nella maggior parte dei libri di Forth. Tutti gli altri schemi di filettatura sono quotimprovementsquot su questo, quindi è necessario capire ITC ad apprezzare gli altri. Vediamo la definizione di un quadrato Forth parola: In un ITC tipico Forth questo apparirebbe nella memoria come mostrato in Figura 1. (L'intestazione sarà discusso in un prossimo articolo che contiene le informazioni di pulizia utilizzati per la compilazione, e non sta coinvolti nella filettatura .) si supponga SQUARE è verificato durante l'esecuzione di qualche altra parola Forth. Forths Interprete Pointer (IP) punterà a una cella nella memoria - contenuto all'interno di quella parola quototherquot - che contiene l'indirizzo della parola SQUARE. (Per essere precisi, quella cella contiene l'indirizzo di quadrati codice di campo.) L'interprete recupera l'indirizzo, e poi lo usa per recuperare il contenuto di piazze codice di campo. Questi contenuti sono ancora un altro indirizzo - l'indirizzo di una subroutine linguaggio macchina che esegue la parola quadrati. In pseudo-codice, questo è: Ciò illustra un principio importante, ma raramente chiarito: l'indirizzo del Forth parola appena entrato viene mantenuto in W. parole in codice non avete bisogno di queste informazioni, ma tutti gli altri tipi di Forth parole fare. Se SQUARE sono stati scritti in codice macchina, questa sarebbe la fine della storia: sarebbe stato eseguito quel po 'di codice macchina, e poi tornare al Forth interprete - che, dal momento che IP è stato incrementato, sta puntando alla parola successiva a essere eseguito. Questo è il motivo per cui l'interprete Forth di solito è chiamato NEXT. Ma, SQUARE è una definizione quotcolonquot di alto livello - detiene una quotthreadquot, un elenco di indirizzi. Per eseguire questa definizione, l'interprete Forth deve essere nuovamente avviato in una nuova posizione: il campo di parametro di SQUARE. Naturalmente, gli interpreti vecchia posizione deve essere salvato, per riprendere il quototherquot Forth parola una volta SQUARE è finito. Questo è proprio come una subroutine chiamata L'azione linguaggio macchina della piazza è semplicemente quello di spingere il vecchio IP, impostare IP in una nuova posizione, eseguire l'interprete, e quando è fatto SQUARE pop PI. (Come si può vedere, l'IP è il counterquot quotprogram di alto livello Forth.) Questo si chiama DOCOLON o ENTER in vari forths: Questo frammento di codice identico viene utilizzato da tutti di alto livello (ad esempio filettato) Forth definizioni Ecco perché un puntatore a questo frammento di codice, non il frammento stesso, è inclusa nella definizione Forth. Per centinaia di definizioni, i risparmi si sommano e questo è il motivo per cui la sua chiamata filettatura indiretta. Il quotreturn dal subroutinequot è la parola EXIT, che viene compilato quando Forth vede. (Alcuni forths chiamano S invece di uscire). EXIT solo esegue una routine di linguaggio macchina che esegue le seguenti operazioni: Passeggiata attraverso un paio di definizioni annidate Forth, solo per accertarvi che questo funziona. Si notino le caratteristiche di ITC: ogni Forth parola ha un codice di campo di un cellulare. definizioni Colon compilare una cella per ogni parola usata nella definizione. E l'interprete Forth deve effettivamente svolgere un doppio riferimento indiretto per ottenere l'indirizzo del codice macchina accanto a correre (prima attraverso IP, poi attraverso W). ITC non è né il più piccolo, né la tecnica di filettatura più veloce. Può essere il più semplice, anche se DTC (descritto di seguito) è in realtà più complessa. Allora, perché sono così tanti forths indiretta-threaded Soprattutto perché forths precedenti, utilizzati come modelli, sono stati indiretta - filettati. In questi giorni, DTC sta diventando sempre più popolare. Così, quando dovrebbe essere utilizzato ITC delle varie tecniche, ITC produce le definizioni più pulite e più eleganti - nient'altro che indirizzi. Se siete in sintonia a tali considerazioni, ITC può appello a voi. Se il codice traffica in giro con l'interno delle definizioni, la semplicità e l'uniformità della rappresentazione ITC possono aumentare la portabilità. ITC è il modello classico Forth, quindi potrebbe essere preferibile per l'istruzione. Infine, su CPU manca una istruzione di chiamata di sottoprogramma - come ad esempio il 1802 - ITC è spesso più efficiente di DTC. Diretta filettato codice (DTC) diretto codice threaded differisce da ITC in un solo aspetto: al posto del campo codice contenente l'indirizzo di qualche codice macchina, il campo codice contiene codice vero e proprio macchina stessa. Im non dicendo che il codice completo per ENTER è contenuta in ogni definizione del colon In parole quothigh-levelquot Forth, il campo codice conterrà una chiamata di subroutine. come mostrato in Figura 2. definizioni Colon, per esempio, conterrà una chiamata alla routine ENTER. Lo pseudo-codice successivo per la filettatura diretta è semplicemente: Questo guadagna velocità: l'interprete esegue ora un solo indiretto. Sul Z80 questo riduce la routine successiva - il frammento di codice più usato nel kernel Forth - da undici a sette istruzioni Questo costa spazio: ogni definizione di alto livello in un Z80 Forth (per esempio) è ora un byte più a lungo, poiché un indirizzo 2 byte è stata sostituita da una chiamata di 3 byte. Ma questo non è universalmente vero. A 68000 a 32 bit Forth può sostituire un indirizzo di 4 byte con una istruzione BSR 4 byte, per nessuna perdita netta. E sul Zilog Super8, che ha istruzioni macchina per DTC Forth, l'indirizzo 2 byte è sostituito da un 1 byte ENTER istruzioni, facendo un DTC Forth piccolo sul Super8 Naturalmente, le definizioni di DTC CODE sono due byte più breve, poiché non è più necessario un puntatore a tutto quello che ho usato per pensare che le definizioni di alto livello in DTC forths richiesto l'uso di una chiamata subroutine nel campo Codice. Frank Sergenti pigmeo Forth SER90 dimostra che un semplice salto può essere utilizzato con la stessa facilità, e di solito è più veloce. Guy Kelly ha compilato una superba revisione delle implementazioni indietro per il PC IBM KEL92, che consiglio vivamente a tutti Forth scrittori del kernel. Dei 19 forths ha studiato, 10 utilizzati DTC, 7 utilizzati ITC, e 2 filettatura subroutine utilizzati (discusso di seguito). Vi consiglio l'uso di-Threaded Diretta Codice over indiretto-Threaded codice per tutti i nuovi kernel Forth. Vai a NEXT, o il codice è in linea L'interprete Forth interno, NEXT, è una routine comune a tutte le definizioni di codice. Si potrebbe tenere solo una copia di questa routine comuni, e hanno tutte le parole in codice saltare ad esso. (Si noti che è Vai a PROSSIMO una subroutine chiamata non è necessario.) Tuttavia, la velocità di AVANTI è fondamentale per la velocità del sistema di tutto il Forth. Inoltre, in molte CPU, la routine AVANTI è piuttosto corta spesso solo due o tre istruzioni. Così può essere preferibile codice successivo in linea, dovunque sia usato. Questo è spesso fatto facendo AVANTI una macro assemblatore. Questa è una velocità semplice vs. decisione spazio: in-linea successiva sarà sempre più veloce, ma quasi sempre più grande. L'aumento totale dimensione è il numero di byte necessari per l'espansione in linea, volte il numero di parole di codice nel sistema. A volte non c'è nessun compromesso a tutti: in un 6809 DTC Forth, un filtro in linea successiva è più breve di un sottoprogramma Istruzione di salto filettato Codice (STC) Una definizione Forth ad alto livello non è altro che un elenco di subroutine da eseguire. Non avete bisogno di interpreti per raggiungere questo obiettivo si può ottenere lo stesso effetto, semplicemente infilare un elenco di subroutine chiamate insieme: Vedere Figura 3. Questa rappresentazione di Forth parole è stato utilizzato come punto di partenza per spiegare Forth tecniche di threading per i programmatori in linguaggio assembly KOG82. STC è un elegante definizioni rappresentazione del colon e CODICE parole sono ora identici. wordsquot quotDefined (variabili, costanti, e simili) sono gestite lo stesso che nel DTC - il campo del codice inizia con un salto o chiamare per un po 'di codice macchina altrove. Lo svantaggio principale è che le chiamate di subroutine di solito sono più grandi di indirizzi semplici. Sul Z80, ad esempio, la dimensione delle definizioni del colon aumenta del 50 - e la maggior parte della vostra applicazione è definizioni colon Al contrario, su un 32 bit 68000 ci può essere alcun aumento di dimensioni del tutto, quando gli indirizzi 4 byte vengono sostituiti con BSRS 4 byte. (Ma se la dimensione del codice supera i 64 KB, alcuni di questi indirizzi deve essere sostituito con JSR 6 byte.) Sottoprogramma filettatura può essere più veloce di filettatura diretta. Si risparmia tempo da non avere un interprete, ma si perde tempo, perché ogni riferimento ad una parola Forth comporta una spinta e pop di un indirizzo di ritorno. In un DTC Forth, solo parole di alto livello causano attività sulla pila di ritorno. Sul 6809 o Zilog Super8, DTC è più veloce di STC. C'è un altro vantaggio di STC: eroga con il registro IP. Alcuni processori - come il 8051 - sono disperatamente a corto di affrontare registri. Eliminando l'IP può davvero semplificare e velocizzare il kernel L'unico modo per sapere con certezza è quello di scrivere il codice di esempio. Questo è intimamente coinvolto con la selezione del registro, discusso nel prossimo paragrafo. STC con in linea di ottimizzazione espansione compilazione diretta sul vecchie CPU e 8-bit, quasi ogni Forth primitivo coinvolge diverse istruzioni macchina. Ma su CPU più potenti, molti Forth primitive sono scritti in una singola istruzione. Ad esempio, il 32-bit 68000, DROP è semplicemente In una subroutine filettati Forth, tramite DROP in una definizione colon comporterebbe la ADDQ sequenza è un'istruzione di due byte. Perché scrivere una subroutine chiamata a quattro byte per un'istruzione a due byte Non importa quante volte viene utilizzato GOCCIA, non c'è nessun risparmio Il codice è più piccolo e più veloce se il ADDQ è codificato direttamente nel flusso di BSRS. Alcuni Forth compilatori fanno quotin-line expansionquot di CODE parole CUR93a. Lo svantaggio di espansione in linea è che decompiling torna al codice sorgente originale diventa molto difficile. Fino a quando si usano le chiamate di subroutine, avete ancora puntatori (gli indirizzi sottoprogramma) alle parole Forth compongono il filo. Con puntatori alle parole, è possibile ottenere i loro nomi. Ma una volta che una parola è espansa in codice in-line, tutta la conoscenza del luogo in cui tale codice è venuto da è perduto. Il vantaggio di espansione in linea - a parte la velocità e le dimensioni - è il potenziale di ottimizzazione del codice. Ad esempio, la sequenza Forth verrebbe compilato 68000 STC come ma potrebbe essere esteso in-line come una singola istruzione macchina Ottimizzazione Forth compilatori è troppo ampia argomento di questo articolo. Questa è un'area attiva di ricerca lingua Forth vedere, per esempio, SCO89 e CUR93b. Il culmine finale ottimizzata STC è un Forth, che compila in quotpurequot codice macchina, proprio come un Fortran compilatore C o. Token filettato Codice (TTC) DTC e STC hanno lo scopo di migliorare la velocità di Forth programmi, ad un certo costo in memoria. Ora consente di muoversi nella direzione opposta da ITC, verso qualcosa di più lento ma più piccolo. Lo scopo di un filo Forth è specificare un elenco di Forth parole (subroutine) da eseguire. Supponiamo che un sistema a 16 bit Forth aveva solo un massimo di 256 parole diverse. Poi ogni parola potrebbe essere identificato in modo univoco da un numero a 8 bit. Invece di una lista di indirizzi a 16 bit, si avrebbe un elenco di identificatori a 8-bit o quottokens, quot e la dimensione delle definizioni del colon sarebbe dimezzato Un token-threaded Forth mantiene una tabella di indirizzi di tutte le parole indietro, come mostrato in Figura 4. il valore token viene quindi utilizzato per indicizzare questa tabella, trovare il Forth parola corrispondente ad una determinata token. Questo aggiunge un livello di indirezione al Forth interprete, quindi è più lento di un Forth quotaddress-threadedquot. Il vantaggio principale di forths token-threaded è di piccole dimensioni. TTC è più frequente nei computer palmari e altre applicazioni gravemente dimensioni limitate. Inoltre, la tabella di quotentry pointsquot in tutte le parole Forth può semplificare il collegamento di moduli separatamente compilati. Lo svantaggio di TTC è la velocità: TTC rende le forths più lente. Inoltre, il compilatore TTC è leggermente più complessa. Se avete bisogno di più di 256 Forth parole, il suo necessario avere qualche schema di codifica a tempo indeterminato di mescolare a 8-bit e gettoni di dimensioni maggiori. Posso immaginare un 32 bit Forth usando i token a 16 bit, ma come molti sistemi a 32 bit sono di dimensioni limitate segmento di codice filettato Poiché ci sono così tante 8086 derivati ​​in tutto il mondo, segmento filettatura merita una breve menzione. Invece di utilizzare indirizzi quotnormalquot byte all'interno di un segmento di 64 KB, vengono utilizzati gli indirizzi di paragrafo. (A quotparagraphquot è di 16 byte nel 8086.) Quindi, l'interprete può caricare questi indirizzi nei registri di segmento, anziché nei consueti registri di indirizzi. Questo permette un modello a 16 bit Forth per accedere in modo efficiente l'intera megabyte di memoria 8086. Lo svantaggio principale del segmento filettatura è il quotgranularityquot 16 byte di spazio di memoria. Ogni Forth parola deve essere allineato a un limite di 16 byte. Se Forth parole hanno lunghezze, una media di 8 byte verrà sprecato per Forth parola. REGISTRATI ASSEGNAZIONE Accanto alla tecnica di filettatura, l'utilizzo dei registri CPU è la decisione più importante di progettazione. La sua probabilmente il più difficile. La disponibilità di registri della CPU in grado di determinare quale tecnica di filettatura può essere utilizzato, e anche quello che la mappa di memoria sarà Avanti il ​​classico registra il modello classico Forth ha cinque registers. quot quotvirtual Questi sono entità astratte che vengono utilizzati nelle operazioni primitive di Forth. Quindi, immettere e uscire sono stati definiti in precedenza in termini di questi registri astratti. Ciascuno di questi è largo cellulare - ossia in un 16 bit Forth, questi sono registri a 16-bit. (Ci sono eccezioni a questa regola, come si vedrà più avanti.) Questi non possono essere tutti i registri della CPU. Se il vostro doesnt CPU hanno abbastanza registri, alcuni di questi possono essere tenuti in memoria. Ill descriverli in ordine di importanza vale a dire alla fine di questa lista sono i migliori candidati per essere memorizzati nella memoria. W è il registro di lavoro. E 'utilizzato per molte cose, tra cui riferimento di memoria, quindi dovrebbe essere registrare un indirizzo cioè si deve essere in grado di recuperare la memoria e negozio utilizzando il contenuto del W come l'indirizzo. È inoltre necessario essere in grado di fare l'aritmetica su W. (In DTC forths, si deve anche essere in grado di saltare indiretta utilizzando W.) W viene utilizzato dall'interprete in parola ogni Forth. In una CPU con un solo registro, si dovrebbe utilizzare per W e tenere tutto il resto nella memoria (e il sistema sarebbe incredibilmente lento). IP è il puntatore interprete. Questo è usato da ogni parola Forth (attraverso Successivamente, immettere, o EXIT). IP deve essere un registro indirizzo. È inoltre necessario essere in grado di incrementare IP. Subroutine filettato forths non hanno bisogno di questo registro. PSP è il parametro Stack (o stackquot quotdata) Pointer, a volte chiamato semplicemente SP. Io preferisco PSP perché SP è spesso il nome di un registro della CPU, ed essi sognerei essere confuso. La maggior parte delle parole in codice usano questo. PSP deve essere un puntatore di stack, o un registro di indirizzo che può essere incrementato e decrementato. E 'anche un vantaggio se si può fare indicizzato l'indirizzamento da PSP. RSP è il ritorno Stack Pointer, a volte chiamato semplicemente RP. Questo è usato da definizioni del colon in ITC e DTC forths, e da tutte le parole STC forths. RSP deve essere un puntatore di stack, o un registro di indirizzo che può essere incrementato e decrementato. Se a tutto il possibile. mettere W, IP, PSP, e RSP nei registri. I registri virtuali che seguono possono essere tenuti in memoria, ma di solito c'è un vantaggio di velocità per mantenerli in registri della CPU. X è un registro di lavoro, non considerato uno dei quotclassicalquot Forth registri, anche se la classica ITC forths bisogno per la seconda indiretto. In ITC si deve essere in grado di saltare indiretta utilizzando X. X può essere utilizzato anche da un paio di parole in codice per fare l'aritmetica e così via. Questo è particolarmente importante nei processori che non possono utilizzare la memoria come operando. Ad esempio, aggiungere un Z80 potrebbe essere (in pseudo-codice) A volte un altro registro di lavoro, Y, è anche definito. UP è il puntatore utente, tenendo l'indirizzo di base della zona di attività dell'utente. UP è di solito aggiunto un offset, e usate da alto livello di codice Forth, in modo che possa essere solo memorizzato da qualche parte. Ma se la CPU può non indicizzato l'indirizzamento dal registro UP, parole in codice possono più accedere facilmente e rapidamente variabili utente. Se si dispone di un surplus di registri di indirizzo, utilizzare uno per UP. Forths single-task non hanno bisogno UP. X - se necessario - è più importante tenere a registro di UP. UP è il più facile dei registri Forth virtuali a muoversi in memoria. L'utilizzo del Hardware Stack maggior parte delle CPU ha un stack pointer come parte del loro hardware, utilizzato da interruzioni e le chiamate di subroutine. Come funziona la mappa nei registri Forth Dovrebbe essere la PSP o il RSP La risposta breve è: dipende. Si dice che la PSP è utilizzata più che la RSP in ITC e DTC forths. Se la tua CPU ha pochi registri di indirizzi, e PUSH e POP sono più veloci di riferimento esplicito, utilizzare lo stack hardware come parametro Stack. D'altra parte, se la CPU è ricco di modi di indirizzamento - e permette indicizzata indirizzamento - theres un vantaggio nell'avere PSP come un registro di indirizzo generico. In questo caso, utilizzare lo stack hardware del Stack di ritorno. A volte si fa né Lo stack hardware TMS320C25s è solo otto cellule profondo - tutti, ma inutile per Forth. Così il suo stack di hardware viene utilizzato solo per gli interrupt, ed entrambi PSP e RSP sono registri di indirizzi di uso generale. (ANS Forth specifica un minimo di 32 cellule del parametro Pila e 24 celle di ritorno Stack preferisco 64 celle di ciascuno.) Si incontrano di tanto in tanto il dogma che la quotmust pila hardware bequot il parametro Stack, o quotmust bequot lo stack di ritorno. Invece, codice alcune primitive Forth esempio, come e vedere quale approccio è più piccolo o più veloce. (DUP e DROP, tra l'altro, non sono prova - theyre solito banale.) Di tanto in tanto si raggiunge strane conclusioni Gary Bergstrom ha fatto notare che un 6809 DTC Forth può essere fatta alcuni cicli più veloce utilizzando lo stack pointer 6809 utente come IP Next diventa un POP. Egli usa un registro indice per una delle pile forths. Top-of-stack in termini di prestazioni Registrati forths può essere migliorata notevolmente, mantenendo l'elemento superiore del Parametro stack in un registro Molti Forth parole (come ad esempio 0) dont quindi bisogno di utilizzare lo stack. Altre parole ancora fare lo stesso numero di spinte e pop, solo in un posto diverso nel codice. Solo poche parole Forth (DROP e 2DROP) diventato più complicato, dal momento che non è più possibile semplicemente modificare lo stack pointer - è necessario aggiornare i TOS registro pure. Ci sono alcune regole durante la scrittura di parole in codice: Una parola che rimuove gli elementi dallo stack deve apparire i TOS quotnewquot nel suo registro. Una parola che aggiunge elementi alla pila deve spingere i TOS quotoldquot sulla pila (a meno che, naturalmente, la sua consumata dalla parola). Se si dispone di almeno sei celle di dimensioni registri della CPU, vi consiglio di tenere la TOS in un registro. Ritengo TOS più importante che fino ad avere nel registro, ma meno importante di W, IP, PSP, e RSP. (TOS nel registro esegue molte delle funzioni del registro X). Il suo utile se questo registro può eseguire indirizzamento di memoria. PDP-11s, Z8s e 68000s sono buoni candidati. Nove dei 19 PC IBM forths studiati da Guy Kelly KEL92 tenere TOS nel registro. Credo che questa innovazione è stata resistito a causa delle false credenze che a) si aggiunge istruzioni, e b) l'elemento di stack superiore deve essere accessibile come memoria. Si scopre che anche parole come PICK, ROLL, e profondità sono banalmente modificati per TOS-in-registro. Che dire il buffering due elementi dello stack nei registri Quando si tiene la parte superiore dello stack in un registro, il numero totale di operazioni eseguite rimane essenzialmente la stessa. Una spinta rimane una spinta, indipendentemente dal fatto che sia prima o dopo l'operazione di sei esecuzione. D'altra parte, il buffering due elementi pila in registri aggiunge un gran numero di istruzioni - una spinta diventa una spinta seguito da un movimento. Solo processori dedicati sorgerà come l'RTX2000 e compilatori ottimizzanti straordinariamente intelligenti possono beneficiare di buffer due elementi dello stack nei registri. Alcuni esempi Ecco le assegnazioni dei registri realizzati da forths per una serie di diverse CPU. Cercare di dedurre le decisioni di progettazione degli autori da questo elenco. quotSPquot si riferisce al puntatore dello stack hardware. quotZpagequot si riferisce a valori custoditi nella pagina di memoria 6502s pari a zero, che sono quasi tanto utile quanto - a volte più utile di - valori conservati nei registri ad esempio essi possono essere utilizzati per l'indirizzamento della memoria. quotFixedquot significa che Paynes 8051 Forth ha un unico, area utente immobile, e UP è una costante hard-coded. Narrow Registri notato niente di strano nella lista precedente Il 6502 Forth - un modello a 16-bit - utilizza puntatori pila a 8-bit E 'possibile effettuare PSP, RSP, e UP inferiore alla dimensione delle cellule del Forth. Questo perché le pile e area utente sono entrambi relativamente piccole aree di memoria. Ogni stack può essere piccolo come 64 celle di lunghezza, e l'area utente raramente supera 128 cellule. Hai semplicemente bisogno di garantire che sia a) questi dati aree sono confinati ad una piccola area di memoria, quindi un breve discorso possono essere utilizzati, oppure b) i bit alti di indirizzo sono forniti in qualche altro modo, ad esempio, una pagina di memoria di selezione. Nel 6502, lo stack hardware è limitata alla prima pagina di RAM (indirizzi 01xxh) dal disegno della CPU. Il puntatore dello stack a 8-bit può essere utilizzato per lo stack di ritorno. Il parametro di Stack è tenuto in pagina zero della RAM, che può essere indirettamente accessibile dal registro indice X a 8 bit (Domanda per lo studente avanzato: perché usare i 6502s X, Y e non Suggerimento: guarda le modalità di indirizzamento disponibili. ) Nel 8051, è possibile utilizzare la 8-bit registri R0 e R1 per affrontare RAM esterna, a condizione che esplicitamente l'uscita delle alte 8 bit di indirizzo alla porta 2. Questo permette un selectquot quotpage per due pile. UP è diverso da PSP e RSP: fornisce semplicemente un indirizzo di base non è mai incrementato o decrementato. Così la sua pratica a fornire solo le alte bit di questo registro virtuale. I bit basse devono quindi essere forniti con qualsiasi tecnica di indirizzamento indicizzato viene utilizzato. Ad esempio, il 6809, è possibile utilizzare il registro di DP per contenere gli alti 8 bit di UP, e quindi utilizzare diretto pagina di indirizzamento per accedere a qualsiasi dei 256 luoghi in questa pagina. Questo costringe tutte le aree di utente per iniziare su un xx00h indirizzo, che non è un grande disagio, e limita l'area utente a 128 cellule di lunghezza. Al 8086 si potrebbe in teoria utilizzare un registro di segmento per specificare l'indirizzo di base della zona dell'utente. RIFERIMENTI CUR93a Curley, Charles, quotLife nel FastForth Lane, quot in attesa di pubblicazione in Forth Dimensioni. Descrizione di una Forth subroutine filettati 68000. CUR93b Curley, Charles, quotOptimizing in un BSRJSR filettato Forth, quot in attesa di pubblicazione in Forth Dimensioni. ottimizzazione del codice single-pass per FastForth, in soli cinque schermi di codice include quotazione. KEL92 Kelly, Guy M. quotForth Sistemi Confronti, quot Forth Dimensioni XIII: 6 (marapr 1992). Pubblicato anche in 1991 Forml Conference Proceedings. Entrambi disponibili dal Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Illustra compromessi di progettazione di molti 8086 forths con frammenti di codice e parametri di riferimento - altamente raccomandato KOG82 Kogge, Peter M. quotAn Trail architettonica di Threaded - Codice Sistemi, quot IEEE Computer, vol. 15 n. 3 (marzo 1982). Rimane la descrizione definitiva delle varie tecniche di filettatura. ROD91 Rodriguez, B. J. quotB. Y.O. Assembler, quot Parte 1, il computer Journal 52 (SepOct 1991). Principi generali di scrittura Forth assemblatori. ROD92 Rodriguez, B. J. quotB. Y.O. Assembler, quot parte 2, il computer Journal 54 (JanFeb 1992). Un 6809 assembler in Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer per la compilazione Forth, quot 1989 Formi Conference Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. buona descrizione di un ottimizzatore di 68000 nessun codice fornito. CUR86 Curley, Charles, reale Forth per il 68000. distribuito privatamente (1986). JAM80 James, John S. fico-Forth per il PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth per l'Apple II. Mountain View Press (1981). LAX84 Laxen, H. e Perry, M. F83 per il PC IBM. versione 2.1.0 (1984). Distribuito da autori, disponibili dal Forth Interest Group o GEnie. LOE81 Loeliger, R. G. filettati interpretativi Lingue. Pubblicazioni BYTE (1981), ISBN 0-07-038360-X. Può essere l'unico libro mai scritto sul tema della creazione di un kernel Forth-like (l'esempio utilizzato è la Z80). Ne vale la pena se è possibile trovare una copia. MPE92 microprocessore Engineering Ltd. MPE Z8Super8 PowerForth destinazione. MPE Ltd. 133 Hill Lane, Shirley, Southampton, S01 5AF, nel Regno Unito (giugno 1992). Un prodotto commerciale. PAY90 Payne, William H. AVANTI Embedded Controller per la famiglia 8051. Academic Press (1990), ISBN 0-12-547570-5. Questo è un quotkitquot completo per un 8051 Forth, compreso un metacompiler per il PC IBM. solo i file cartacei possono essere scaricati da GEnie. Non per il sergente SER90 novizio, Frank, Pygmy Forth per il PC IBM. versione 1.3 (1990). Distribuito da parte dell'autore, disponibile presso il Forth Interest Group. La versione 1.4 è ora disponibile su Genie, e vale la pena extra per ottenere. TAL80 Talbot, R. J. fico-Forth per il 6809. Forth Interest Group (1980). Autori fanno notare per la pubblicazione web: i file precedentemente disponibile sul servizio online GEnie sono ora disponibili dal server FTP Interest Group Forth, ftp: ftp. forth. orgpubForth. XanEdu fornisce contenuti, tecnologie e servizi personalizzati per i leader nel mondo degli affari e l'istruzione. esigenze di apprendimento accademico e professionale stanno cambiando più velocemente che mai. Dal 1999, XanEdu ha aiutato migliaia di partner di adattarsi e prosperare, fornendo la giusta combinazione di tecnologia, contenuti e servizi professionali qualificati per sostenere i loro obiettivi di apprendimento in movimento in avanti. Dalla nostra piattaforma SaaS-based per l'implementazione rapida mobili di contenuti, di servizi editoriali e di pubblicazione qualificati per gli educatori, a soluzioni accessibilità e di impegno per librerie, XanEdu fornisce le soluzioni semplici che aiutano i nostri partner preparano per domani l'apprendimento esigenze di oggi. CHI WE SERVE Scopri un percorso più veloce per prestazioni più elevate con una distribuzione rapida di contenuti mobili. Sviluppare materiali convenienti, unico come il tuo istituto, corsi, e gli studenti. materiali su misura per gli obiettivi del curriculum, controllare i costi e coinvolgere gli studenti in mobilità di oggi-centric. Mantenere il vostro team al passo con la politica critica, la regolamentazione e modifiche di processo.


No comments:

Post a Comment