Thursday, 4 May 2017

Moving Average R Code


Ich möchte hinzufügen, dass dies nicht der Fall für andere Sprachen als R. Ich weiß, die Frage ist gelöst und über R, aber vielleicht jemand anderes findet dies nützlich: Außer EngineR (Standard), werden alle Chunks in separaten Sitzungen ausgeführt, so Die Variablen können nicht direkt geteilt werden. Wenn wir von Objekten, die in früheren Chunks erstellt wurden, Gebrauch machen wollen, müssen wir sie in der Regel auf Dateien schreiben (als Nebenwirkungen). Für den bash-Motor können wir Sys. setenv () verwenden, um Variablen von R zu bash (Beispiel) zu exportieren. Ein anderer Ansatz ist, das (experimentelle) runr Paket zu verwenden. Python Beispiel 2a): Python Beispiel 2b): Transcript Museum des bewegten Bildes Das Wohnzimmer Kandidat nächstes Jahrhundert, Clinton, 1996 BILL CLINTON (Voiceover): Lassen Sie mich Ihnen sagen, dass ich geehrt werde, die Gelegenheit gegeben zu haben, aufzustehen Für die Werte und Interessen der gewöhnlichen Amerikaner. TEXT: WELFARE REFORM, ARBEITSANFORDERUNGEN. MEDICARE, BILDUNG GESCHÜTZTE BILL CLINTON (Voiceover): Mein Job als Präsident ist, sich um das amerikanische Volk zu kümmern. Und ich habe mein Bestes getan, um mich um dieses Land zu kümmern. TEXT: DEFICIT CUT 60. STEUERN SCHNITT FÜR 15.000.000 FAMILIEN BILL CLINTON (Voiceover): Wir sind sicherer. Wir sind sicherer, TEXT: DEATH PENALTY FÜR DROGEN KINGPINS BILL CLINTON (Voiceover): Wir sind mehr wohlhabend, TEXT: WACHSENDE WIRTSCHAFT: 10.000.000 NEUE JOBS BILL CLINTON (Voiceover): Aber am Ende, was wir stehen, TEXT: FÜR DIE ZUKUNFT. EXPAND FAMILIE MEDICAL VERLASSEN BILL CLINTON (Voiceover): Die Werte, die wir umarmen und die Dinge, für die wir kämpfen, TEXT: FÜR DIE ZUKUNFT. BAN COP KILLER BULLETS BILL CLINTON (Voiceover): Wird die Zukunft gestalten TEXT: 1500 STEUERKREDIT FÜR COLLEGE TUITIONJOB TRAINING BILL CLINTON (Voiceover): Dass wir alle mit leben werden. TEXT: SCHLIESSEN SIE KINDER AUS TOXIC WASTE BILL CLINTON (Voiceover): Wenn wir unsere Hände in Zusammenarbeit halten, TEXT: CAPITAL GAINS STEUER SCHNITT FÜR HOME EIGENTÜMER BILL CLINTON (Voiceover): Aber immer aufstehen für das, was wir wissen, ist richtig, TEXT: BALANCE DER BUDGE FÜR EIN WACHSENDE WIRTSCHAFT BILL CLINTON (Voiceover): Die Zukunft dieses Landes wird noch heller sein als seine glänzende Vergangenheit. BILL CLINTON: Es liegt in unserer Verantwortung, das zu machen. TEXT: CLINTONGORE. GEBÄUDE EINE BRÜCKE ZUM 21. JAHRHUNDERT Nächstes Jahrhundert, ClintonGore 03996 Generalausschuss, 1996 Vom Museum des bewegten Bildes, der Wohnzimmerkandidat: Präsidentenkampagne Werbespots 1952-2012. Livingroomcandidate. orgcommercials1996next-century (zugegriffen 25. Februar 2017). Um dieses Video per E-Mail zu verknüpfen oder weiterzuleiten, kopiere es und füge diese URL ein: Dank einer robusten Wirtschaft und der Abwesenheit von teilnehmenden außenpolitischen Fragen bei den Präsidentschaftswahlen genoss Bill Clinton eine relativ störungsfreie Fahrt auf dem Weg zum Werden Erster Demokrat seit Franklin Roosevelt in eine zweite Vollzeit gewählt werden. Clintons-Sieg stellte ein beeindruckendes politisches Comeback dar. Im Jahr 1994 hatten die Republikaner die Kontrolle über beide Häuser gewonnen. Mit großem Einfluss beeinflusst House Speaker Newt Gingrich den Republikanischen Vertrag mit Amerika, eine konservative legislative Agenda. Während der intensiven Budgetkämpfe zwischen dem Präsidenten und dem Kongress wurde die Bundesregierung zweimal abgeschaltet. Clinton beschuldigte dies auf den Republikanern, was es ihm ermöglichte, sich in der Mitte zu positionieren und die Republikaner als Extremisten darzustellen. Die Clinton-Kampagne verknüpfte wiederholt seinen Gegner Bob Dole mit Gingrich, während er Mainstream-Ursachen wie den Family Leave Act, College-Unterrichtsgutschriften und ein Rating-System für das Fernsehen verteidigte. Dole versuchte, ohne viel Erfolg, die Charakterfrage zu seinem Vorteil zu nutzen. Doch die Öffentlichkeit zeigte wenig Interesse an Clinton-Skandalen wie Whitewater, Filegate und Travelgate und Anschuldigungen für Kampagne-Finanzen Missbrauch. Bill Clinton für Präsident Al Gore für Vizepräsident Aufbau einer Brücke zum 21. Jahrhundert Bill Clintons Anzeigen konsequent assoziiert Bob Dole mit House Speaker Newt Gingrich. Grobkörnige Schwarz-Weiß-Aufnahmen von Dole, die neben Gingrich stehen, nutzten die Öffentlichkeit mit dem republikanischen Kongress nach dem Abschalten der Bundesregierung. Im Gegensatz zu diesen unheilverkündenden Bildern skizzierten bunte, optimistische Montagen Clintons-Errungenschaften in einer Vielzahl von sozialen Programmen. Diese Anzeigen nahmen an der robusten Wirtschaft teil und spielten auch auf die Angst, dass die Republikaner, die auf große Regierung stürzen, Programme bedrohen könnten, die die Öffentlichkeit unterstützt hat, wie Sozialversicherung und Bildung. Andere Anzeigen konzentrierten sich auf Mikro-Themen, wie Clintons Unterstützung für Schuluniformen und ein TV-Rating-System. Mit der Phrase, die unsere Werte als einen ihrer Slogans schützt, konnte die Clinton-Kampagne den politischen Mainstream nutzen. Clintons Unterstützung der Todesstrafe und Absicht, das Wohlergehen zu schneiden, gehörten zu den traditionell konservativen Positionen, die in seinen Werbespots angekündigt wurden. Vor allem die Konsequenz, die hohen Produktionswerte und die optimale Natur der Anzeigen spiegelten Kompetenz wider, während die Fragen über Doles fortgeschrittenes Alter subtil aufgeworfen wurden. Bob Dole für Präsident Jack Kemp für Vizepräsident Ein besserer Mann für ein besseres Amerika Bob Doles Werbespots stellen ihn als Kriegsheld dar und ein Mann von einfacher Integrität, im Gegensatz zu Clintons fragwürdige Moral. Allerdings zeigten die Umfragen wiederholt, dass die Öffentlichkeit mit der Wirtschaft in gutem Zustand mehr an der Arbeit von Präsident Clintons interessiert war als in den zahlreichen kleinen Skandalen, die während seiner ersten Amtszeit entstanden waren. Doles Werbespots, inkonsistent in Botschaft und Ton, nicht zu einem effektiven Ziel zu etablieren. Ein Spot, The Threat, begann mit Aufnahmen von Lyndon Johnsons berühmten 1964 Daisy kommerziellen über die Gefahr des Atomkrieges, und stellte fest, dass die größte Bedrohung Drogen war. Aber die Anzeige hat nie klar, wie dieses Problem mit Clinton verbunden war. Doles Vorschlag von einem 15 Prozent Steuersenkung wurde in zahlreichen Anzeigen zitiert, aber ohne irgendeine Erklärung, wie es gefördert worden wäre. Mit einer gesunden Wirtschaft und einem schrumpfenden Haushaltsdefizit war eine Steuersenkung für die Wähler keine hohe Priorität. MOVING FORTH Teil 1: Designentscheidungen im Forth Kernel von Brad Rodriguez Dieser Artikel erschien erstmals im Computer Journal 59 (JanuarFebruar 1993). EINFÜHRUNG Jeder in der Forth-Community spricht darüber, wie einfach es ist, Port zu einer neuen CPU zu portieren. Aber wie viele quoteasyquot und quotobviousquot Aufgaben, ist nicht viel geschrieben, wie es zu tun ist So, als Bill Kibler dieses Thema für einen Artikel vorschlug, beschloss ich, mit der großen mündlichen Tradition von Forthwrights zu brechen und den Prozess in Schwarz und Weiß zu dokumentieren. Im Laufe dieser Artikel werde ich Forths für die 6809, 8051 und Z80 entwickeln. Ich mache das 6809, um ein einfaches und konventionelles Forth-Modell zu veranschaulichen, und Ive veröffentlichte bereits einen 6809 Assembler ROD91, ROD92 und Ill, der einen 6809 Forth für zukünftige TCJ-Projekte benötigt. Ich mache das 8051 Forth für ein Universitätsprojekt, aber es illustriert auch einige ziemlich unterschiedliche Designentscheidungen. Die Z80 Forth ist für alle CPM Leser von TCJ, und für einige Freunde mit TRS-80s sammeln Staub. DIE WESENTLICHE HARDWARE Sie müssen eine CPU wählen. Ich werde nicht in die Vorzüge einer CPU über eine andere für Forth, da eine CPU-Wahl ist in der Regel auf Sie durch andere Überlegungen gezwungen. Außerdem ist der Gegenstand dieses Artikels zu zeigen, wie man Forth zu jeder CPU verschieben kann. Sie können den üblichen 16-Bit-Forth-Kernel (siehe unten) erwarten, um etwa 8 KByte des Programmraums zu besetzen. Für einen vollständigen Kernel, der Forth Definitionen kompilieren kann, solltest du mindestens 1 KByte RAM speichern. Um das Block-Management-System von Forths für den Festplattenspeicher zu verwenden, sollten Sie 3 KByte oder mehr für Puffer hinzufügen. Für ein 32-Bit-Forth-Modell, doppelte diese Zahlen. Dies sind die Minima, um einen Forth Kernel zu bekommen und zu laufen. Um eine Anwendung auf Ihrer Hardware auszuführen, sollten Sie PROM - und RAM-Größen anpassen. 16 OR 32 BIT Die von Forth verwendete Wortgröße ist nicht unbedingt dieselbe wie die der CPU. Das kleinste praktische Forth ist ein 16-Bit-Modell, d. h. eins, das 16-Bit-Integer und 16-Bit-Adressen verwendet. Die Forth-Community nennt dies die quotcellquot-Größe, da quotwordquot auf eine Forth-Definition verweist. 8-Bit-CPUs unterstützen fast immer 16-Bit-Forths. Dies erfordert in der Regel eine explizite Codierung von Double-Byte-Arithmetik, obwohl einige 8-Bit-CPUs einige 16-Bit-Operationen haben. 16-Bit-CPUs laufen häufig 16-Bit-Forths, obwohl die gleichen Doppelpräzisionstechniken verwendet werden können, um ein 32-Bit-Forth auf einer 16-Bit-CPU zu schreiben. Mindestens ein 32-Bit-Forth wurde für den 80868088 geschrieben. 32-Bit-CPUs laufen normalerweise 32-Bit-Forths. Ein kleineres Forth-Modell spart selten Code-Länge oder Prozessor-Zeit. Allerdings kenne ich mindestens einen 16-Bit-Forth, der für die 68000 geschrieben wurde. Dies schrumpft die Anwendungscodegröße um einen Faktor von zwei, da High-Level-Forth-Definitionen eine Zeichenfolge von 16-Bit-Adressen werden, anstatt eine Zeichenfolge von 32- Bit-Adressen. (Das wird in Kürze deutlich.) Die meisten 68000s haben jedoch viel RAM. Alle in diesem Artikel beschriebenen Beispiele sind 16-Bit-Forths, die auf 8-Bit-CPUs laufen. DAS GEWINDESTECHNIK quotDhreaded codequot ist das Markenzeichen von Forth. A Forth quotthreadquot ist nur eine Liste von Adressen von Routinen, die ausgeführt werden sollen. Sie können dies als eine Liste der Unterprogramm-Anrufe denken, mit der CALL-Anweisungen entfernt. Im Laufe der Jahre wurden viele Threading-Variationen entworfen, und welche am besten hängt von der CPU und der Anwendung ab. Um eine Entscheidung zu treffen, musst du verstehen, wie sie arbeiten und ihre Kompromisse. Indirektes Threaded Code (ITC) Dies ist die klassische Forth-Threading-Technik, die in Abb. Forth und F83 verwendet wird und in den meisten Büchern auf Forth beschrieben ist. Alle anderen Threading-Schemata sind quotimprovementsquot auf diesem, also müssen Sie ITC verstehen, um die anderen zu schätzen. Lets Blick auf die Definition eines Forth Wortes SQUARE: In einem typischen ITC Forth Dies würde im Speicher erscheinen, wie in Abbildung 1 gezeigt. (Der Header wird in einem zukünftigen Artikel diskutiert es hält Haushalt Informationen für Compilation verwendet und ist nicht in Threading beteiligt .) Angenommen, SQUARE wird bei der Ausführung eines anderen Forth-Wortes angetroffen. Forths Interpreter Pointer (IP) wird auf eine Zelle im Speicher hinweisen - in diesem Quotenwort enthalten - das die Adresse des Wortes SQUARE enthält. (Um genau zu sein, enthält diese Zelle die Adresse von SQUAREs Code Field.) Der Interpreter holt diese Adresse und verwendet sie dann, um den Inhalt des SQUAREs Code Field zu holen. Diese Inhalte sind noch eine Adresse - die Adresse einer Maschinensprache Unterroutine, die das Wort SQUARE führt. In Pseudocode ist dies: Dies veranschaulicht ein wichtiges, aber selten aufgeklärtes Prinzip: Die Adresse des Forth Wortes, das gerade eingegeben wurde, wird in W gehalten. CODE Worte brauchen diese Information nicht, aber alle anderen Arten von Forth Worten. Wenn SQUARE in Maschinencode geschrieben wurde, wäre dies das Ende der Geschichte: das Bit des Maschinencodes würde ausgeführt werden, und dann springen Sie zurück zum Forth Interpreter - das, da IP inkrementiert wurde, zeigt auf das nächste Wort zu Hingerichtet werden Aus diesem Grund wird der Forth-Interpreter normalerweise NEXT genannt. Aber, SQUARE ist eine High-Level-Quollonquot-Definition - es hält ein quotthreadquot, eine Liste von Adressen. Um diese Definition durchzuführen, muss der Forth-Interpreter an einem neuen Ort neu gestartet werden: das Parameterfeld von SQUARE. Natürlich muss der alte Ort des Dolmetschers gespeichert werden, um das Quottwort weiterzuleiten, sobald SQUARE beendet ist. Das ist genau wie ein Unterprogramm-Aufruf Die Maschinensprache-Aktion von SQUARE ist einfach, die alte IP zu schieben, IP auf einen neuen Ort zu setzen, den Dolmetscher auszuführen, und wenn SQUARE fertig ist, (Wie Sie sehen können, ist die IP-Adresse das Zitat-Kontrapunkt von High-Level-Forth.) Dies wird DOCOLON oder ENTER in verschiedenen Forths genannt: Dieses identische Codefragment wird von allen hochrangigen (dh mit Gewinde versehenen) Forth-Definitionen verwendet. Das ist, warum ein Zeiger Zu diesem Code-Fragment, nicht das Fragment selbst, ist in der Forth-Definition enthalten. Über hunderte von Definitionen, die Einsparungen addieren Und das ist, warum seine genannt Indirekt Threading. Das Rückmeldung von subroutinequot ist das Wort EXIT, das kompiliert wird, wenn Forth sieht. (Einige Forths nennen es S anstelle von EXIT.) EXIT führt gerade eine Maschinensprache Routine, die die folgenden: Gehen Sie durch ein paar verschachtelte Forth Definitionen, nur um sicherzustellen, dass dies funktioniert. Beachten Sie die Eigenschaften von ITC: jedes Forth Wort hat ein einzelliges Codefeld. Colon-Definitionen kompilieren eine Zelle für jedes Wort, das in der Definition verwendet wird. Und der Forth-Interpreter muss eigentlich eine doppelte Indirektion ausführen, um die Adresse des nächsten Maschinencodes zu starten (zuerst über IP, dann durch W). ITC ist weder die kleinste noch die schnellste Threading-Technik. Es kann das einfachste sein, obwohl DTC (beschrieben als nächstes) wirklich nicht komplexer ist. Also warum sind so viele Forths indirekt-threaded Vor allem, weil früheren Forths, als Modelle verwendet wurden, wurden indirekt-threaded. In diesen Tagen wird DTC immer beliebter. Also wann sollte ITC verwendet werden Von den verschiedenen Techniken produziert ITC die saubersten und elegantesten Definitionen - nichts als Adressen. Wenn Sie auf solche Überlegungen abgestimmt sind, kann sich ITC an Sie wenden. Wenn Ihr Code mit dem Innere der Definitionen herumgeht, kann die Einfachheit und Einheitlichkeit der ITC-Darstellung die Portabilität verbessern. ITC ist das klassische Forth-Modell, also kann es für die Ausbildung bevorzugt sein. Schließlich, auf CPUs ohne Subroutine Anrufanweisung - wie die 1802 - ITC ist oft effizienter als DTC. Direct Threaded Code (DTC) Direct Threaded Code unterscheidet sich von ITC nur in einer Hinsicht: anstelle des Codefeldes, das die Adresse eines Maschinencodes enthält, enthält das Codefeld den aktuellen Maschinencode selbst. Ich sage nicht, dass der komplette Code für ENTER in jeder Dollon-Definition enthalten ist. In quothigh-levelquot Forth Worten enthält das Code-Feld einen Unterprogrammaufruf. Wie in Abbildung 2 dargestellt. Colon-Definitionen enthalten zum Beispiel einen Aufruf der ENTER-Routine. Der NEXT-Pseudocode für das direkte Threading ist einfach: Das gewinnt Geschwindigkeit: Der Dolmetscher führt nun nur eine einzige Indirektion durch. Auf der Z80 reduziert dies die NEXT-Routine - das meist genutzte Codefragment im Forth-Kernel - von elf Anleitungen bis zu sieben Das kostet Raum: Jede High-Level-Definition in einem Z80 Forth (zB) ist nun ein Byte länger, Da eine 2-Byte-Adresse durch einen 3-Byte-Aufruf ersetzt wurde. Aber das ist nicht allgemein wahr. Ein 32-Bit 68000 Forth kann eine 4-Byte-Adresse durch eine 4-Byte-BSR-Anweisung ersetzen, für keinen Nettoverlust. Und auf dem Zilog Super8, der Maschinenanweisungen für DTC Forth hat, wird die 2-Byte-Adresse durch eine 1-Byte-ENTER-Anweisung ersetzt, so dass ein DTC Forth kleiner auf dem Super8 ist. Natürlich sind die DTC-CODE-Definitionen zwei Bytes kürzer, da sie Ich brauche überhaupt keinen Zeiger mehr Ich dachte, dass High-Level-Definitionen in DTC Forths die Verwendung eines Unterprogrammaufrufs im Codefeld erforderten. Frank Sergeants Pygmy Forth SER90 zeigt, dass ein einfacher Sprung genauso einfach genutzt werden kann und in der Regel schneller ist. Guy Kelly hat eine hervorragende Überprüfung von Forth-Implementierungen für den IBM PC KEL92 zusammengestellt, den ich allen Forth-Kernel-Autoren sehr empfehlen kann. Von den 19 Forths, die er studierte, nutzten 10 DTC, 7 benutzte ITC und 2 benutzte Subroutine Threading (diskutiert als nächstes). Ich empfehle die Verwendung von Direct-Threaded Code über Indirect-Threaded Code für alle neuen Forth-Kernel. Springe zu NEXT, oder kodiere es in-line Der Forth innere Interpreter, NEXT, ist eine gemeinsame Routine zu allen CODE-Definitionen. Sie könnten nur eine Kopie dieser gemeinsamen Routine zu halten, und haben alle CODE Worte zu ihm springen. (Beachten Sie, dass Sie zu NEXT springen eine Unterroutine Aufruf ist nicht notwendig.) Allerdings ist die Geschwindigkeit von NEXT entscheidend für die Geschwindigkeit des gesamten Forth-Systems. Auch bei vielen CPUs ist die NEXT-Routine ziemlich oft oft nur zwei oder drei Anweisungen. So kann es vorzuziehen, NEXT in-line zu codieren, wo immer es benutzt wird. Dies geschieht häufig, indem man NEXT ein Assembler-Makro macht. Das ist eine einfache Geschwindigkeit vs. Raumentscheidung: Inline NEXT ist immer schneller, aber fast immer größer. Die Gesamtgrößenerhöhung ist die Anzahl der zusätzlichen Bytes, die für die Inline-Erweiterung erforderlich sind, mal die Anzahl der CODE-Wörter im System. Manchmal gibt es keine Kompromisse: In einem 6809 DTC Forth ist eine Inline-NEXT kürzer als ein Sprung-Befehl Subroutine Threaded Code (STC) Eine High-Level-Forth-Definition ist nichts als eine Liste von Subroutinen, die ausgeführt werden sollen. Sie brauchen nicht Dolmetscher, um dies zu erreichen, können Sie die gleiche Wirkung durch einfaches Anreißen einer Liste von Unterprogrammaufrufen zusammen: Siehe Abbildung 3. Diese Darstellung von Forth-Wörtern wurde als Ausgangspunkt verwendet, um Forth-Threading-Techniken für die Assembler-Programmierer KOG82 zu erklären. STC ist eine elegante Darstellung Colon Definitionen und CODE Worte sind jetzt identisch. DeDefined wordsquot (VARIABLEs, CONSTANTs und dergleichen) werden wie im DTC behandelt - das Codefeld beginnt mit einem Sprung oder einem Anruf zu irgendeinem Maschinencode an anderer Stelle. Der Hauptnachteil ist, dass Subroutine-Anrufe in der Regel größer als einfache Adressen sind. Auf der Z80 z. B. steigt die Größe der Doppelpunktdefinitionen um 50 - und die meisten deiner Anwendung sind Doppelpunktdefinitionen. Auf einer 32-Bit-68000 kann es überhaupt keine Größenerhöhung geben, wenn 4-Byte-Adressen ersetzt werden 4-Byte-BSRs. (Wenn aber Ihre Codegröße 64 KB überschreitet, müssen einige dieser Adressen durch 6-Byte-JSRs ersetzt werden.) Das Subroutine-Threading kann schneller sein als das direkte Threading. Sie sparen Zeit, indem Sie keinen Dolmetscher haben, aber Sie verlieren Zeit, weil jeder Hinweis auf ein Forth-Wort einen Push und Pop einer Rücksendeadresse beinhaltet. In einem DTC Forth verursachen nur hochrangige Wörter Aktivität auf dem Rücksprungstapel. Auf dem 6809 oder Zilog Super8 ist DTC schneller als STC. Es gibt einen weiteren Vorteil für STC: es verzichtet auf das IP-Register. Einige Prozessoren - wie die 8051 - sind verzweifelt an die Adressierung von Registern. Die Eliminierung der IP kann den Kernel wirklich vereinfachen und beschleunigen Der einzige Weg, um sicher zu wissen, ist, Beispielcode zu schreiben. Dies ist eng mit der Registerauswahl verbunden, im nächsten Abschnitt besprochen. STC mit Inline-Erweiterungsoptimierung Direktkompilierung Bei älteren und 8-Bit-CPUs beinhaltet fast jedes Forth-Primitiv mehrere Maschinenbefehle. Aber auf leistungsstärkeren CPUs, viele Forth Primitive sind in einer einzigen Anweisung geschrieben. Zum Beispiel, auf dem 32-Bit 68000, DROP ist einfach In einem Subroutine-Threaded Forth, mit DROP in einer Doppelpunkt-Definition würde in der Sequenz ADDQ ist eine Zwei-Byte-Anweisung führen. Warum einen 10-Byte-Unterprogramm-Aufruf zu einem Zwei-Byte-Befehl schreiben Egal wie oft DROP verwendet wird, theres keine Einsparungen Der Code ist kleiner und schneller, wenn der ADDQ direkt in den Strom von BSRs codiert wird. Einige Forth-Compiler machen diese Quinline-Erweiterung der CODE-Wörter CUR93a. Der Nachteil der Inline-Erweiterung ist, dass das Dekompilieren des ursprünglichen Quellcodes sehr schwierig wird. Solange Subroutine-Aufrufe verwendet werden, haben Sie immer noch Zeiger (die Unterroutinen-Adressen) zu den Forth-Wörtern, die den Thread enthalten. Mit Zeigern zu den Wörtern können Sie ihre Namen erhalten. Aber sobald ein Wort in Inline-Code erweitert wird, ist alles Wissen, woher dieser Code kam, verloren. Der Vorteil der Inline-Erweiterung - abgesehen von Geschwindigkeit und Größe - ist das Potenzial für Code-Optimierung. Zum Beispiel würde die Forth-Sequenz in 68000 STC kompiliert werden, aber könnte in-line als eine einzige Maschine Anweisung erweitert werden Optimierung Forth Compiler ist zu breit ein Thema für diesen Artikel. Dies ist ein aktiver Bereich der Forth Sprachforschung, zum Beispiel, SCO89 und CUR93b. Die endgültige Kulmination der optimierten STC ist ein Forth, die kompatibel zu quotpurequot Maschinencode, genau wie ein C oder Fortran Compiler. Token Threaded Code (TTC) DTC und STC zielen darauf ab, die Geschwindigkeit von Forth Programmen zu verbessern, um einige Kosten im Speicher. Jetzt können wir die andere Richtung von ITC bewegen, in Richtung etwas langsamer, aber kleiner. Der Zweck eines Forth-Threads ist es, eine Liste von Forth-Wörtern (Subroutinen) anzugeben, die ausgeführt werden sollen. Angenommen, ein 16-Bit-Forth-System hatte nur maximal 256 verschiedene Wörter. Dann könnte jedes Wort durch eine 8-Bit-Zahl eindeutig identifiziert werden. Statt einer Liste von 16-Bit-Adressen, hättest du eine Liste von 8-Bit-Bezeichnern oder Quottokens, und die Größe der Doppelpunktdefinitionen wäre halbiert. Ein Token-Threaded Forth hält eine Tabelle von Adressen aller Forth Wörter, wie Gezeigt in Fig. 4. Der Token-Wert wird dann verwendet, um in diese Tabelle zu indexieren, um das Forth-Wort zu finden, das einem gegebenen Token entspricht. Dies fügt eine Ebene der Indirektion für den Forth-Interpreter hinzu, also ist es langsamer als ein quotaddress-threadedquot Forth. Der Hauptvorteil von Token-Threaded Forths ist klein. TTC wird am häufigsten in Handheld-Computern und anderen stark beschränkten Anwendungen gesehen. Auch die Tabelle der Quotienten platziert in alle Forth Worte vereinfachen die Verknüpfung von separat kompilierten Modulen. Der Nachteil von TTC ist Geschwindigkeit: TTC macht die langsamsten Forths. Auch der TTC-Compiler ist etwas komplexer. Wenn du mehr als 256 Forth Worte brauchst, ist es notwendig, ein offenes Codierungsschema zu haben, um 8-Bit - und größere Token zu mischen. Ich kann mir vorstellen, dass ein 32-Bit-Forth mit 16-Bit-Token, aber wie viele 32-Bit-Systeme sind size-constrained Segment Threaded Code Da gibt es so viele 8086 Derivate in der Welt, Segment Threading verdient eine kurze Erwähnung. Anstelle der Verwendung von quotnormalquot-Byteadressen innerhalb eines 64K-Segments werden Absatzadressen verwendet. (Ein Quittungsquottel ist 16 Bytes im 8086.) Dann kann der Interpreter diese Adressen in Segmentregister laden, anstatt in die üblichen Adressregister. Dies ermöglicht ein 16-Bit-Forth-Modell, um effizient auf das volle Megabyte des 8086-Speichers zuzugreifen. Der Hauptnachteil des Segmentgewindeschneidens ist der 16-Byte-Quotenbildungsraum des Speicherplatzes. Jedes Wort muss auf eine 16-Byte-Grenze ausgerichtet sein. Wenn Forth-Wörter zufällige Längen haben, wird ein Durchschnitt von 8 Bytes pro Forth-Wort verschwendet. REGISTER ALLOCATION Neben der Threading-Technik ist die Verwendung der CPUs-Register die wichtigste Designentscheidung. Es ist wahrscheinlich das schwierigste. Die Verfügbarkeit von CPU-Registern kann bestimmen, welche Threading-Technik verwendet werden kann, und sogar, was die Speicherkarte sein wird Die klassischen Forth-Register Das klassische Forth-Modell hat fünf quadratische Register. Es handelt sich um abstrakte Entitäten, die in den primitiven Operationen von Forth verwendet werden. NEXT, ENTER und EXIT wurden früher in Bezug auf diese abstrakten Register definiert. Jeder von diesen ist eine Zelle breit - d. h. in einem 16-Bit-Forth, das sind 16-Bit-Register. (Es gibt Ausnahmen von dieser Regel, wie Sie später sehen werden.) Diese können nicht alle CPU-Register sein. Wenn Ihre CPU nicht genug Register hat, können einige von ihnen im Speicher gehalten werden. Ich beschreibe sie in der Reihenfolge ihrer Bedeutung, d. h. die Unterseite dieser Liste sind die besten Kandidaten, die im Gedächtnis gespeichert werden sollen. W ist das Arbeitsregister. Es wird für viele Dinge verwendet, einschließlich Speicherreferenz, also sollte es ein Adressregister sein, d. h. Sie müssen in der Lage sein, Speicher zu speichern und Speicher mit dem Inhalt von W als die Adresse zu speichern. Du musst auch in der Lage sein, Arithmetik auf W. (In DTC Forths, du musst auch in der Lage sein, indirekt mit W zu springen.) W wird von dem Dolmetscher in jedem Forth Wort verwendet. In einer CPU, die nur ein Register hat, würdest du es für W verwenden und alles andere im Gedächtnis halten (und das System wäre unglaublich langsam). IP ist der Interpreter Pointer. Dies wird von jedem Forth-Wort (über NEXT, ENTER oder EXIT) verwendet. IP muss ein Adressbuch sein. Du musst auch in der Lage sein, IP zu erhöhen. Subroutine threaded Forths brauchen nicht dieses Register. PSP ist der Parameter Stack (oder quotdata stackquot) Zeiger, manchmal auch einfach SP genannt. Ich bevorzuge PSP, weil SP häufig der Name eines CPU-Registers ist, und sie sollten nicht verwirrt werden. Die meisten CODE-Wörter verwenden das. PSP muss ein Stapelzeiger sein oder ein Adressregister, das inkrementiert und dekrementiert werden kann. Es ist auch ein Plus, wenn man indizierte Adressierung von PSP machen kann. RSP ist der Return Stack Pointer, der manchmal einfach RP genannt wird. Dies wird von Doppelpunktdefinitionen in ITC und DTC Forths und bei allen Wörtern in STC Forths verwendet. RSP muss ein Stapelzeiger oder ein Adressregister sein, das inkrementiert und dekrementiert werden kann. Wenn überhaupt möglich . Setzen W, IP, PSP und RSP in Registern. Die virtuellen Register, die folgen, können im Speicher gehalten werden, aber es gibt normalerweise einen Geschwindigkeitsvorteil, um sie in CPU-Registern zu halten. X ist ein Arbeitsregister, das nicht als eines der quotclassicalquot Forth Register betrachtet wird, obwohl das klassische ITC Forths es für die zweite Indirektion benötigt. In ITC müssen Sie in der Lage sein, indirekt mit X zu springen. X kann auch von einigen CODE-Wörtern verwendet werden, um Arithmetik und so zu tun. Dies ist besonders wichtig für Prozessoren, die kein Speicher als Operand verwenden können. Zum Beispiel könnte ADD auf einem Z80 sein (im Pseudocode) Manchmal ist auch ein anderes Arbeitsregister Y definiert. UP ist der User Pointer, der die Basisadresse des Task-User-Bereichs hält. UP wird in der Regel zu einem Offset hinzugefügt und wird von High-Level-Forth-Code verwendet, so dass es nur irgendwo gespeichert werden kann. Aber wenn die CPU indizierte Adressierung aus dem UP-Register ausführen kann, können CODE-Wörter einfacher und schneller auf Benutzervariablen zugreifen. Wenn Sie einen Überschuss von Adressregistern haben, verwenden Sie einen für UP. Single-Task Forths brauchen nicht UP. X - wenn nötig - ist wichtiger, sich zu registrieren als UP. UP ist die einfachste der virtuellen Register, um in den Speicher zu gelangen. Verwendung des Hardware-Stacks Die meisten CPUs haben einen Stack-Pointer als Teil ihrer Hardware, die von Interrupts und Unterprogrammaufrufen verwendet wird. Wie ist diese Karte in die Forth-Register Sollte es die PSP oder die RSP Die kurze Antwort ist, es hängt davon ab. Es wird gesagt, dass die PSP mehr als die RSP in ITC und DTC Forths verwendet wird. Wenn Ihre CPU nur wenige Adressregister hat und PUSH und POP schneller sind als explizite Referenz, verwenden Sie den Hardware-Stack als Parameter Stack. Auf der anderen Seite, wenn Ihre CPU ist reich an Adressierung Modi - und ermöglicht indizierte Adressierung - theres ein Plus in die PSP als Allzweck-Adresse registrieren. Verwenden Sie in diesem Fall den Hardware-Stack als Return Stack. Manchmal machst du weder den TMS320C25s Hardware Stack nur acht Zellen tief - alles aber nutzlos für Forth. So wird sein Hardware-Stack nur für Interrupts verwendet, und sowohl PSP als auch RSP sind Allzweck-Adressregister. (ANS Forth spezifiziert ein Minimum von 32 Zellen von Parameter Stack und 24 Zellen von Return Stack Ich bevorzuge 64 Zellen von jedem.) Sie werden gelegentlich begegnen das Dogma, dass die Hardware-Stack-Quotte bequot der Parameter Stack, oder quotmust bequot der Return Stack. Stattdessen Code einige Probe Forth Primitiven, wie und sehen, welche Ansatz ist kleiner oder schneller. (DUP und DROP, übrigens sind kein Test - sie sind in der Regel trivial.) Gelegentlich erreichen Sie seltsame Schlussfolgerungen Gary Bergstrom hat darauf hingewiesen, dass ein 6809 DTC Forth kann ein paar Zyklen schneller gemacht werden, indem Sie die 6809 Benutzer Stack Zeiger als die IP NEXT wird zum POP. Er verwendet ein Indexregister für einen der Forths-Stacks. Top-of-Stack in Register Forths Leistung kann erheblich verbessert werden, indem man das obere Element des Parameters Stack in einem Register Viele Forth Wörter (wie 0) dann nicht brauchen, um den Stack zu verwenden. Andere Worte machen immer noch die gleiche Anzahl von Pushs und Pops, nur an einem anderen Ort im Code. Nur wenige Forth-Wörter (DROP und 2DROP) werden komplizierter, da man den Stack-Pointer nicht mehr einfach einstellen kann - man muss auch das TOS-Register aktualisieren. Es gibt ein paar Regeln beim Schreiben von CODE-Wörtern: Ein Wort, das Elemente aus dem Stack entfernt, muss das Quell-TOS in sein Register platzieren. Ein Wort, das dem Stapel Gegenstände hinzufügt, muss das Quotto-TOS auf den Stapel schieben (es sei denn, es ist natürlich das verbraucht durch das Wort). Wenn Sie mindestens sechs Zellen-CPU-Register haben, empfehle ich, die TOS in einem Register zu halten. Ich betrachte TOS wichtiger als UP, um mich zu registrieren, aber weniger wichtig als W, IP, PSP und RSP. (TOS im Register führt viele der Funktionen des X-Registers aus.) Es ist nützlich, wenn dieses Register die Speicheradressierung durchführen kann. PDP-11s, Z8s und 68000s sind gute Kandidaten. Neun der 19 IBM PC Forths studiert von Guy Kelly KEL92 halten TOS in Register. Ich denke, diese Neuerung wurde wegen der falschen Überzeugungen widerstanden, dass a) sie Anweisungen hinzufügt und b) das obere Stapelelement als Speicher zugänglich sein muss. Es stellt sich heraus, dass auch solche Worte wie PICK, ROLL und DEPTH für TOS-in-Register trivial geändert werden. Was ist mit dem Puffern von zwei Stapelelementen in Registern Wenn Sie die Oberseite des Stapels in einem Register halten, bleibt die Gesamtzahl der Operationen im Wesentlichen gleich. Ein Push bleibt ein Push, egal ob es vor oder nach der Operation, die Sie durchführen. Auf der anderen Seite fügt das Puffern von zwei Stapelelementen in Registern eine große Anzahl von Befehlen hinzu - ein Push wird ein Push, gefolgt von einer Bewegung. Nur dedizierte Forth-Prozessoren wie der RTX2000 und fantastisch clever optimierende Compiler können von der Pufferung von zwei Stack-Elementen in Registern profitieren. Einige Beispiele Hier sind die Registerzuweisungen von Forths für eine Anzahl verschiedener CPUs. Versuchen Sie, die Designentscheidungen der Autoren aus dieser Liste abzuleiten. QuotSPquot bezieht sich auf den Hardware-Stack-Pointer. QuotZpagequot bezieht sich auf Werte, die in der 6502s-Speicherseite Null gehalten werden, die fast genauso nützlich sind wie - manchmal nützlicher als - Werte, die in Registern, z. B. Sie können für die Speicheradressierung verwendet werden. QuotFixedquot bedeutet, dass Paynes 8051 Forth einen einzigen, unbeweglichen Benutzerbereich hat und UP eine hartcodierte Konstante ist. Schmale Register Beachten Sie etwas Ungewöhnliches in der vorherigen Liste Das 6502 Forth - ein 16-Bit-Modell - verwendet 8-Bit-Stack-Zeiger Es ist möglich, PSP, RSP und UP kleiner als die Zellengröße des Forth zu machen. Dies liegt daran, dass die Stacks und der Benutzerbereich beide relativ kleine Speicherbereiche sind. Jeder Stapel kann so klein sein wie 64 Zellen in der Länge, und der Benutzerbereich übersteigt selten 128 Zellen. Sie müssen lediglich sicherstellen, dass entweder a) diese Datenbereiche auf einen kleinen Speicherbereich beschränkt sind, so dass eine kurze Adresse verwendet werden kann oder b) die hohen Adreßbits auf andere Weise bereitgestellt werden, z. B. Eine Speicherseite auswählen. Im 6502 ist der Hardware-Stack durch die Gestaltung der CPU auf Seite eins des RAM (Adressen 01xxh) beschränkt. Der 8-Bit-Stack-Pointer kann für den Return Stack verwendet werden. Der Parameter Stack wird auf der Seite Null des RAM gehalten, auf den indirekt durch das 8-Bit-Indexregister X zugegriffen werden kann. (Frage für den fortgeschrittenen Schüler: Warum das 6502s X verwenden und nicht Y Hinweis: Schau dir die verfügbaren Adressierungsmodi an. ) Im 8051 können Sie die 8-Bit-Register R0 und R1 verwenden, um das externe RAM zu adressieren, vorausgesetzt, dass Sie die hohen 8 Bits der Adresse explizit an Port 2 ausgeben. Dies ermöglicht eine Rückmeldung für zwei Stacks. UP unterscheidet sich von PSP und RSP: Es gibt einfach eine Basisadresse, die es niemals inkrementiert oder dekrementiert wird. So ist es praktisch, nur die hohen Bits dieses virtuellen Registers zu liefern. Die niedrigen Bits müssen dann von einer beliebigen indizierten Adressierungstechnik bereitgestellt werden. Zum Beispiel können Sie auf dem 6809 das DP-Register verwenden, um die hohen 8 Bits von UP zu halten und dann die Direct Page Adressierung zu verwenden, um auf eine der 256 Standorte auf dieser Seite zuzugreifen. Dies zwingt alle Benutzerbereiche, an einer Adresse xx00h zu beginnen, was keine große Härte ist und den Benutzerbereich auf 128 Zellen begrenzt. Auf dem 8086 können Sie ein Segmentregister vorstellen, um die Basisadresse des Benutzerbereichs anzugeben. REFERENZEN CUR93a Curley, Charles, quotLife in der FastForth Lane, die auf die Veröffentlichung in Forth Dimensions wartet. Beschreibung eines 68000 Subroutine-Threaded Forth. CUR93b Curley, Charles, quotOptimierung in einem BSRJSR Threaded Forth, in Erwartung der Veröffentlichung in Forth Dimensions. Single-Pass-Code-Optimierung für FastForth, in nur fünf Bildschirmen Code Inklusive Auflistung. KEL92 Kelly, Guy M. quotForth Systems Vergleiche, Forth Dimensionen XIII: 6 (MarApr 1992). Auch veröffentlicht in der 1991 FORML Conference Proceedings. Beide sind bei der Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Illustriert Design Kompromisse von vielen 8086 Forths mit Code-Fragmenten und Benchmarks - sehr empfehlenswert KOG82 Kogge, Peter M. quotAon Architectural Trail zu Threaded-Code-Systeme, IEEE Computer, vol. 15 nein 3 (März 1982). Bleibt die endgültige Beschreibung der verschiedenen Threading-Techniken. ROD91 Rodriguez, B. J.B. Y.O. Assembler, Teil 1, The Computer Journal 52 (SepOkt 1991). Allgemeine Grundsätze des Schreibens von Forth Assemblern. ROD92 Rodriguez, B. J.B. Y.O. Assembler, Teil 2, The Computer Journal 54 (JanFeb 1992). Ein 6809 Assembler in Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer für die Kompilierung von Forth, 1989 ForML Conference Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Gute Beschreibung eines 68000 Optimierers ohne Code. CUR86 Curley, Charles, real-Forth für die 68000. Privat verteilt (1986). JAM80 James, John S. fig-Forth für den PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth für den Apple II. Mountain View Press (1981). LAX84 Laxen, H. und Perry, M. F83 für den IBM PC. Version 2.1.0 (1984). Verteilt durch die Autoren, erhältlich von der Forth Interest Group oder GEnie. LOE81 Loeliger, R. G. Threaded Interpretive Sprachen. BYTE Publikationen (1981), ISBN 0-07-038360-X. Kann das einzige Buch sein, das jemals über das Thema der Schaffung eines Forth-artigen Kernels geschrieben wurde (das verwendete Beispiel ist der Z80). Es lohnt sich, wenn man eine Kopie finden kann. MPE92 MicroProcessor Engineering Ltd. MPE Z8Super8 PowerForth Target. MPE Ltd. 133 Hill Lane, Shirley, Southampton, S01 5AF, U. K. (Juni 1992). Ein kommerzielles Produkt. PAY90 Payne, William H. Embedded Controller FORTH für die 8051 Familie. Academic Press (1990), ISBN 0-12-547570-5. Dies ist ein komplettes quotkitquot für einen 8051 Forth, einschließlich eines metacompilers für den IBM PC. Hardcopy nur Dateien können von GEnie heruntergeladen werden. Nicht für den Anfänger SER90 Sergeant, Frank, Pygmy Forth für den IBM PC. Version 1.3 (1990). Verteilt durch den Autor, erhältlich von der Forth Interest Group. Version 1.4 ist jetzt auf GEnie verfügbar und lohnt sich die zusätzliche Anstrengung zu erhalten. TAL80 Talbot, R. J. Fig-Forth für die 6809. Forth Interest Group (1980). Autoren vermerken für die Webpublikation: Die Dateien, die früher im GEnie Online Service zur Verfügung stehen, sind ab sofort beim FTP Server FTP, ftp. forth. orgpubForth erhältlich.

No comments:

Post a Comment