JOSS - JOSS

JOSS
Paradigmen unstrukturiert , prozedural , zwingend
Familie JOSS
Entworfen von Klippe Shaw
Entwickler RAND Corporation
Erstmals erschienen 1963 ; Vor 58 Jahren ( 1963 )
Umfang Lexikalisches
Implementierungssprache Assemblersprache
Plattform JOHNNIAC , PDP-6
Beeinflusst
TELCOMP , CAL , FOCAL , MUMPS
Teil einer JOSS-Sitzung bei RAND im Jahr 1970, in der der Benutzer mehrere einfache Berechnungen einträgt direct mode. Beachten Sie den Unterschied zwischen dem Punkt am Ende der Aussagen und dem Interpunkt für die Multiplikation.

JOSS (Akronym für JOHNNIAC Open Shop System ) war eine der ersten interaktiven Timesharing - Programmiersprachen . Es war der Wegbereiter vieler Funktionen, die in den 1960er bis 1980er Jahren in Sprachen üblich wurden, darunter die Verwendung von Zeilennummern sowohl als Bearbeitungsanweisungen als auch als Ziele für Verzweigungen , Anweisungen, die auf booleschen Entscheidungen basieren , und ein integrierter Quellcode-Editor , der Anweisungen ausführen kann im directoder immediateModus, was sie eine dialogorientierte Benutzeroberfläche nannten .

JOSS wurde zunächst auf der JOHNNIAC- Maschine der RAND Corporation implementiert und 1963 online gestellt. Es erwies sich als sehr beliebt und die Benutzer verzettelten sich schnell. Bis 1964 wurde ein Ersatz mit höherer Leistung gesucht. JOHNNIAC wurde 1966 ausgemustert und durch einen PDP-6 ersetzt , der schließlich Hunderte von Computerterminals auf Basis des IBM Selectric unterstützte . Die Terminals verwendeten grüne Tinte für Benutzereingaben und schwarze für die Reaktion des Computers. Jeder nicht verstandene Befehl löste die Antwort Eh?oder aus SORRY.

Das System war sehr einflussreich und brachte eine Vielzahl von Häfen und Ablegern hervor. Einige blieben dem Original ähnlich, wie TELCOMP und STRINGCOMP , CAL , CITRAN, ISIS, PIL/I, JEAN ( ICT 1900 series ), Algebraic Interpretive Dialogue (AID, on PDP-10 ); während andere, wie FOCAL und MUMPS , sich in unterschiedliche Richtungen entwickelten. Es hat auch eine starke Ähnlichkeit mit den BASIC- Interpretern, die in den 1980er Jahren auf Mikrocomputern gefunden wurden , und unterscheiden sich hauptsächlich in Syntaxdetails .

Geschichte

Erste Idee

1959 schrieb Willis Ware ein RAND-Memo zum Thema Computer, in dem er feststellte, dass zukünftige Computer "eine Vielzahl von persönlichen Eingabe-Ausgabe-Stationen haben würden, so dass viele Menschen gleichzeitig mit der Maschine interagieren können". Das Memo erweckte das Interesse der US Air Force , Rands Hauptsponsoren, und 1960 gründeten sie das Information Processor Project, um dieses Konzept zu erforschen, das bald als Time-Sharing bekannt wurde . Bei dem Projekt ging es nicht speziell um Timesharing, sondern um die Verbesserung der Mensch-Computer-Interaktion insgesamt. Die Idee damals war, dass ein ständiges Hin- und Her-Interaktion zwischen Benutzer und Computer solche Interaktionen natürlicher machen würde. Wie JOSS-Direktor Keith Uncapher es später ausdrückte:

Es gab zwei Wahrnehmungen, die meiner Meinung nach das Experiment antrieben. Einer war, mindestens seit 1950, als ich zu Rand kam, lag der Fokus im Informatikbereich von Rand immer auf einer reibungslosen Benutzerinteraktion. Es wurde einfach in uns eingebaut. Wir haben es von Gunning gelernt. ... alles, woran wir gedacht haben. Die andere war, dass die Mathematiker mit Marchant-Rechnern zu kämpfen hatten und nicht in der Lage waren, JOHNNIAC in seiner rohen Form zu verwenden. Es war einfach zu schwer. Sie mussten lernen, Programmierer zu sein. Es war einfach eine frustrierende Erfahrung für sie. Wir wollten etwas, das ihnen eine natürliche Denkweise und Hilfestellung zur Lösung ihrer Probleme bietet, ohne viel Training und ohne die Vorstellung, Programmierer zu werden, denn das hätte sie abgehalten.

Ein formeller Vorschlag zur Entwicklung von JOSS auf dem JOHNNIAC- Computer wurde im März 1961 angenommen.

JOSS-1

JOSS wurde fast vollständig von J. Clifford Shaw implementiert , einem Mathematiker, der in Rands wachsender Computerabteilung arbeitete. Es wurde in einer symbolischen Assemblersprache namens EasyFox geschrieben (E und F im damaligen phonetischen Alphabet des US-Militärs), die ebenfalls von Shaw entwickelt wurde.

Das JOSS-System wurde im Mai 1963 zum ersten Mal offiziell vorgestellt und unterstützte fünf Konsolen, eine im Maschinenraum und vier weitere in Büros rund um das Gebäude. Die frühen Konsolen basierten auf der IBM Model 868 Transmitting Typewriter, da die Selectric zu Beginn der Entwicklung noch nicht auf dem Markt war. Der erste Fahrplan wurde am 17. Juni veröffentlicht, wobei JOSS täglich drei Stunden von 9 bis 12 Uhr lief. Es wurde im Januar 1964 auf acht Terminals für voll funktionsfähig erklärt. Die endgültige Version wurde im Januar 1965 eingesetzt.

Zu diesem Zeitpunkt war der JOHNNIAC bereits über ein Jahrzehnt alt, und seine röhrenbasierte Logik war von Anfang an nie sehr zuverlässig. Auch wenn es gut funktionierte, wurde das System so beliebt, dass es schnell ins Stocken kam. Die Nutzer waren begeistert, einer erklärte:

Die Leute passen ihr Leben an JOSS an… Es hat keinen Sinn, vor 10:00 Uhr in RAND zu kommen, wenn JOSS ankommt, tatsächlich ist Mittag oder nach 17:00 Uhr eine bessere Zeit, JOSS ist weniger beschäftigt. Wenn JOSS anfängt, Antworten zu tippen, wird das prickelnde Vergnügen nur noch durch die darauffolgende Angst ausgeglichen, wenn JOSS ins Geschwafel abbricht [ sic ] oder weggeht, um Ihren Code in Vergessenheit zu geraten. Wir können mit JOSS kaum leben, aber nicht ohne.

Ein anderer formuliert es prägnanter:

Es ist besser als Bier – wir sind begeistert.

JOSS-2-Umschaltung

Im Mai 1964 wurde die Entscheidung getroffen, eine neue Maschine als Ersatz für den JONNIAC zu suchen und diese vollständig dem Betrieb einer erweiterten Version von JOSS zu widmen. Die Maschine müsste auch neue Terminals unterstützen, die nach Rands Spezifikationen hergestellt wurden und bis zum 31. Oktober 1965 geliefert werden.

Für die neue Maschine gingen insgesamt neun Gebote ein. Die Digital Equipment Corporation (DEC) gewann den Wettbewerb mit ihrem neuen PDP-6- System, und die Finanzierung der Air Force wurde für den Kauf freigegeben. DEC stimmte auch zu, dreißig Terminals zu bauen, die auf der IBM Selectric-Schreibmaschine basieren, die mit einem speziellen Mechanismus modifiziert wurde, um in einem Endlospapiereinzug zur nächsten Seite vorzurücken. Mehrere andere Teile des Gesamtsystems wurden von anderen Firmen geliefert.

Die PDP-6 kam Ende Juli 1965 an und wurde zunächst mit Teletype Model 33 als Terminals getestet . Die neue Version des Codes wurde von Charles L. Baker, Joseph W. Smith, Irwin D. Greenwald und G. Edward Bryan entwickelt. Das System wurde erstmals im Oktober für betriebsbereit erklärt, obwohl dies sechs Stunden planmäßige Wartung pro Woche beinhaltete. Der erste Prototyp des Terminals kam im November an. Im Dezember wurde erstmals ein Terminal in Las Vegas aus der Ferne mit der Maschine verbunden. Im Februar 1966 wurde diese an die McClellan Air Force Base geschickt , gefolgt von einer im August an die Air Force Academy und zwei im September an die ARPA und ein Air Force-Büro im Pentagon . Die erste permanente Fernschreibverbindung für ein Fernschreibermodell 35 wurde im Februar 1967 auf der Langley Air Force Base installiert .

Mit der Inbetriebnahme der neuen Maschine wurde JOHNNIAC am 11. Februar 1966 vom Netz genommen und am 18. Februar offiziell ausgemustert. Sein letztes laufendes Programm war in JOSS geschrieben und zählte die Sekunden herunter, bis es ausgeschaltet wurde. Die Maschine wurde an das Los Angeles County Museum geschickt und landete schließlich im Computer History Museum außerhalb von San Francisco . Nachdem das Original durch das JOSS-2-System ersetzt wurde, wurde es rückwirkend als JOSS-1 bezeichnet.

Verwendung von JOSS-2

Ende 1966 war das neue JOSS-2 System voll funktionsfähig und wurde rund um die Uhr für JOSS eingesetzt. Die neue Maschine bot etwa die 30-fache Rechengeschwindigkeit, den fünffachen Speicherplatz pro Benutzer und viele neue Funktionen in der Sprache selbst. Die neue Plattform könnte letztendlich bis zu 100 Endgeräte im gleichzeitigen Einsatz unterstützen. Die Air Force blieb Eigentümer des Systems, Rand und andere fungierten als Berater. Die CPU-Zeit wurde externen Benutzern mit einer Rate von etwa 1 US-Dollar pro Minute in Rechnung gestellt, obwohl dies nur während der eigentlichen Ausführung geschah, die Zeit für Tippen und Drucken war kostenlos.

Bis 1970 gab es zwischen 500 und 600 Benutzer bei Rand und verschiedenen Air Force-Standorten im ganzen Land. Viele von ihnen waren Gelegenheitsnutzer, genau dafür war das System gedacht. Um sie zu unterstützen, wurden die kundenspezifischen Terminals mit speziellen "JOSS-Steckern" ausgestattet, damit sie von Büro zu Büro gefahren und in kundenspezifische Steckdosen gesteckt werden konnten. Zweihundert der Stecker wurden um Rand herum installiert, und das Chassis des Terminals wurde so konstruiert, dass es schmal genug ist, um durch Türen zu passen, während auf einer Seite noch Platz für einen Kaffee bleibt. Durch Umschalten des Netzschalters am Terminal wurde die Verbindung am neuen Standort hergestellt.

Die kundenspezifischen Terminals wurden für JOSS entwickelt, da die Ingenieure der Meinung waren, dass die "Telekommunikationsfunktionen des Model 33 für ungeübte Personen ein Rätsel sind" und für gelegentliche Benutzer zu verwirrend wären, um sie zu lernen. In der Praxis erwiesen sich die auf Selectric basierenden Mechanismen als zu fragil für den ständigen Einsatz, den sie sahen, und wurden häufig im Feld von IBM-Servicemitarbeitern repariert. 1970 wurde ein volles Drittel der Terminals komplett neu aufgebaut und die Ausgabe des Computers verlangsamt, um die Zuverlässigkeit zu verbessern. Die Air Force hatte zu diesem Zeitpunkt beschlossen, stattdessen das Modell 35 zu verwenden, da es sowohl leicht verfügbar als auch viel billiger war.

Die Nutzer waren begeistert und um ihnen zu dienen, begann Rand mit der Veröffentlichung des JOSS Newsletters , herausgegeben von Shirley Marks. Zwischen November 1967 und Juni 1971 wurden schließlich 44 Ausgaben veröffentlicht.

JOSS-3

In den frühen 1970er Jahren bauten Programmierer in einem der IBM -Werke an der Westküste einen JOSS-3 für die IBM 370/158 mit OS/360 . Es gibt nur wenige Informationen über dieses System, mit der Ausnahme, dass JOSS auf diesem Computer endgültig in den Ruhestand ging. Laut einer Anmerkung in einem historischen Überblick zögerte Rand, IBM die Verwendung des Namens JOSS zu erlauben, und als Ergebnis "wurde die IBM-Version nie weit verbreitet".

Implementierung

JOSS verwendete für seine IBM Selectric-Schreibmaschinenterminals eine benutzerdefinierte Kugel, ähnlich wie in diesem Beispiel, um mathematische Symbole bereitzustellen.

JOSS-II auf dem PDP-6 wurde in zwei Teile geteilt, passend zum internen Speicherlayout des Geräts. Die Maschine war mit zwei Kernspeicherbänken mit 16k 36-Bit-Wörtern in jeder Bank ausgestattet. Das JOSS-System selbst, das das Betriebssystem , den Benutzer- und Dateiverwaltungscode, den Terminal-Handler und den Interpreter umfasste, verbrauchte einen Großteil der ersten dieser Banken. Die zweite Bank wurde für Benutzerprogramme verwendet. Obwohl dies für die damalige Zeit eine relativ große Speichermenge war, wurde das System so stark genutzt, dass der Benutzerspeicher von 16 KB nicht ausreichte, und es wurde zur Unterstützung des Paging mit einer Magnettrommel gesichert . Die Trommel wurde von externer Hardware angetrieben und erforderte keine Aufmerksamkeit des Hauptprozessors.

Um mehrere Benutzerprogramme zu unterstützen, wurde die PDP-6-Hardware modifiziert, um Bit-20 jeder Adressreferenz zu untersuchen. Wenn dieses Bit gesetzt war, befand sich die Adresse im "Benutzerraum" und wurde so modifiziert, dass die Adresse Null auf die Basisadresse dieses Benutzers zeigte. Auf diese Weise könnten Benutzerprogramme im Speicher verschoben werden, ohne Probleme für das System zu verursachen, und das Betriebssystem könnte von Benutzer zu Benutzer wechseln, indem einfach nur ein einziges internes Register geändert wird.

Für den permanenten Speicher sorgte eine Storage Products- Festplatte mit 5,7 Millionen Wörtern Speicher. Wie bei der Trommel wurde die eigentliche Eingabe/Ausgabe zur und von der Trommel extern gehandhabt, obwohl in diesem Fall die Bewegung durch Benutzeraktionen zum Laden und Speichern ihrer Programme ausgelöst wurde. Ein IBM-kompatibles Bandlaufwerk wurde verwendet, um die Daten bei Bedarf von und zum Laufwerk zu verschieben, ein Vorgang, der ebenfalls unabhängig von der CPU war. Zwei DECtape- Einheiten waren ebenfalls verfügbar und funktionierten auf die gleiche Weise wie das IBM-Laufwerk.

Die Anschlüsse wurden durch einen benutzerdefinierten "Konzentrator" gehandhabt, der aus einem mechanischen Strowger-Schalter bestand, der jeden der 300 bis 400 möglichen Anschlussstecker mit jedem von 40 Ausgängen verbinden konnte. Weitere acht Leitungen waren den Eingängen des Teletype Model 33 gewidmet , im Gegensatz zu den Selectrics im JOSS-Stil. Diese 48 Leitungen wurden dann mit einem elektronischen Multiplexer verbunden, der mit der CPU verbunden war. Der Multiplexer war Interrupt- gesteuert, was bedeutet, dass inaktive Terminals keine Zyklen verbrauchten.

Die kundenspezifischen JOSS-Terminals wurden von DEC gebaut. Diese bestanden aus einem Selectric-Mechanismus, der in ein kundenspezifisches Chassis eingebaut war, das das Kommunikationssystem, die Stromversorgung und andere Komponenten enthielt. Ein benutzerdefinierter Fontball wurde verwendet, um grundlegende mathematische Symbole wie ≠ bereitzustellen, sodass Zweizeichenkombinationen wie <> nicht verwendet werden mussten. Das Kommunikationssystem basierte auf einem 6-Bit-Zeichencode in einem 8-Bit-Paket mit Start- und Stoppbits. Die Zeilen wurden mit 120 Bit/s angesteuert, um der maximalen Geschwindigkeit von 15 Zeichen pro Sekunde des Selectric-Mechanismus zu entsprechen. Shift-In- und Shift-Out-Codes wurden verwendet, um das Band von Grün zu Schwarz und zurück zu bewegen. Diese Codes wurden auch vom Kommunikationssystem bemerkt und änderten die Lichter auf der Frontplatte, um anzuzeigen, ob der Computer oder der Benutzer in diesem Moment die Kontrolle über das Terminal hatte.

Sprache

Direkter und indirekter Modus

JOSS führte die Idee eines einzigen Befehlszeileneditors ein , der sowohl als interaktive Sprache als auch als Programmeditor funktioniert. Befehle, die ohne Zeilennummer eingegeben wurden, wurden sofort ausgeführt, im so genannten "Direktmodus" von JOSS. Wenn dieselbe Zeile mit einer Zeilennummer vorangestellt wurde, wurde sie stattdessen in den Programmcode-Speicherbereich kopiert, den JOSS "indirekter Modus" nannte. Dem Programm wurden neue Zeilen hinzugefügt, wenn die Zeilennummer eindeutig war, vorhandene Zeilen durch dieselbe Nummer ersetzt oder aus dem Programm entfernt, wenn eine vorhandene Zeilennummer ohne Code danach eingegeben wurde.

Im Gegensatz zu den meisten BASICs hat JOSS die gesamte Benutzereingabe in Dateien gespeichert, nicht nur den Programmcode. Beim Laden tippte JOSS die Zeilen im Wesentlichen wieder ein. Dies bedeutete, dass Programmdateien sowohl Programmanweisungen als auch Direktmodusanweisungen enthalten konnten. Zum Beispiel war es üblich, Programme zu sehen, die die Anweisungszeilen auflisten und dann die Dateiende mit haben Go., um das Programm sofort auszuführen, sobald es fertig geladen ist. Es gab einige Funktionen, die nur im Direktmodus verwendet werden konnten, wie Letund Form, die ohne Zeilennummern eingegeben wurden, aber beim Laden des Programms immer noch zurückgegeben wurden.

Direkte und indirekte Anweisungen können in einem Arbeitsbereich frei gemischt werden. Dies ermöglichte das Einfügen von Kommentaren in den Quellcode durch Hinzufügen von Direktmoduszeilen, die mit beginnen *, oder indem eine am Ende einer Codezeile platziert und dann ein Kommentar danach hinzugefügt wurde. Leerzeilen wurden ebenfalls ignoriert, sodass das Programm der Übersichtlichkeit halber aufgebrochen werden konnte.

Programmanweisungen

Jede Zeile in einem JOSS-Programm muss mit einer Zeilennummer beginnen. Zeilennummern sind Festkommazahlen, die aus zwei zweistelligen ganzen Zahlen bestehen, die durch einen Punkt getrennt sind. Wie in BASIC werden Zeilennummern sowohl als Labels verwendet, um von Tound DoAnweisungen abzuzielen, als auch um das Editieren zu unterstützen. Die Eingabe einer Codezeile mit einer neuen Zeilennummer fügt sie in ein Programm ein, während die Eingabe einer Codezeile mit einer bestehenden Zeilennummer die vorherige Version ersetzt oder sie löscht, wenn sie leer ist.

Der Teil der Zeilennummer links vom Punkt wird als Seite oder Teil bezeichnet , während der Teil rechts davon als Zeile bezeichnet wird . Somit 10.12bezieht sich die Zeilennummer auf Seite 10, Zeile 12. Verzweigungen können entweder auf eine Seite oder eine Zeile innerhalb einer Seite abzielen. Wenn das spätere Format verwendet wird, wird die kombinierte Seite und Zeile als Schritt bezeichnet .

Seiten werden verwendet, um Unterprogramme zu definieren , die zurückkehren, wenn sich die nächste Zeile auf einer anderen Seite befindet. Befindet sich zum Beispiel auf Seite 3 eine Subroutine zum Berechnen der Quadratwurzel einer Zahl, könnte man drei Zeilen Code 3.1, 3.2 und 3.3 haben, und sie würde mit aufgerufen. Do part 3.Der Code würde nach dem Do zu der Anweisung zurückkehren, wenn erreicht die nächste Zeile auf einer anderen Seite, zB 4.1. Es besteht keine Notwendigkeit für das Äquivalent eines RETURNam Ende, obwohl eine vorzeitige Rückkehr erforderlich ist, Donedies erreicht wird.

Jede Zeile muss mit einem Befehlsschlüsselwort beginnen, das der Zeilennummer folgt. Es existiert kein Konzept eines Standardbefehls , wie es in BASIC mit seiner optionalen LETAnweisung der Fall ist . Mehrere Anweisungen können in einer Zeile platziert werden, getrennt durch Doppelpunkte oder Semikolons. Jede Zeile muss mit einem Punkt enden.

Schleifen und Bedingungen

JOSS verwendet eine Suffix-Notation, um die bedingte Auswertung anzuzeigen, "mache dies, wenn dies wahr ist", im Gegensatz zu den meisten Sprachen, die die Bedingung in der Präfix-Notation voranstellen, "wenn dies wahr ist, tue dies". Wie BASIC, aber im Gegensatz zu FORTRAN oder FOCAL , kann jede Anweisung auf diese Weise bedingt ausgewertet werden. Um beispielsweise einen String nur dann auszugeben, wenn eine Bedingung erfüllt ist, kann man if mit a kombinieren Type:

1.1 Type "Hello, World!" if X=5.

JOSS unterstützt sechs Infix Vergleiche =, , , , >, <, und Booleschen Operatoren or, andund not.

Schleifen wurden auf ähnliche Weise gehandhabt, wobei der ForBefehl und ein etwas obskures Format zur Angabe der Schleifengrenzen und des Schrittwerts verwendet wurden start(step)end. Um beispielsweise von 1 zu 10 zu gehen, ist das Format 1(2)10. Wie Ifkann Forauf jede andere Aussage angewendet werden:

1.2 Type "Hello, Wikipedia!" for i=1(2)10.

Beachten Sie, dass das for nur für eine einzelne Anweisung gilt; Wenn man mehrere Anweisungen in einer Schleife ausführen möchte, werden sie in einen anderen Teil getrennt und mit do aufgerufen:

1.3 Do part 5 for i=1(1)100.
5.1 Type "Hello, Wikipedia!".
5.2 Type "This is JOSS.".

Wie in BASIC können alle Eingaben in die for-Schleife Konstanten, Variablen oder andere Ausdrücke sein.

Ausdrücke und Sätze

Ein einzigartiges Merkmal von JOSS war der Umgang mit logischen Ausdrücken. Die meisten Computersprachen bieten zum Beispiel eine Möglichkeit, einen mehrteiligen mathematischen Ausdruck zu bilden, Set x=(1+2)·3.der die Variable x auf den Wert 9 setzt. JOSS erweiterte dieses Konzept, indem es das Konzept des "Proposition" klar definierte, ein Ausdruck, der ein logisches . zurückgibt Wert, wahr oder falsch, anstelle eines numerischen. Sie waren meist in IfAnweisungen zu sehen, wie in den obigen Beispielen, aber der boolesche Wert könnte auch direkt in einer Variablen gespeichert werden, oder man konnte mit der Funktion tv(Wahrheitswert) true in 1 und false in 0 umwandeln .

Neben Propositionen hatte JOSS auch das Konzept der "Bedingungsausdrücke". Diese bestanden aus Sätzen von Aussagen zusammen mit Code, der ausgeführt werden würde, wenn diese Aussage wahr wäre. Dies ermöglichte es, mehrstufige Entscheidungsbäume in einer einzigen Zeile zu schreiben. Sie dienen einem ähnlichen Zweck wie der ternäre Operator in modernen Sprachen wie C oder Java , wo sie verwendet werden, um einen Wert aus einer kompakten Struktur zurückzugeben, die if-then-else implementiert . Die Version von JOSS hat eine beliebige Anzahl von Bedingungen, nicht nur drei, daher handelt es sich eher um eine kompakte Switch-Anweisung als um eine kompakte Wenn-Dann- Anweisung .

In diesem Beispiel wird die Funktion der sgnFunktion neu erstellt:

Let s(x)=[x=0:0; x>0:1; x<0:-1].

Dies definiert eine Funktion "s", die einen einzelnen Parameter "x" nimmt und drei aufeinanderfolgende Tests damit durchführt. Je nachdem, welcher Test zuerst erfolgreich ist, wird der entsprechende Wert nach dem Doppelpunkt zurückgegeben.

Bereiche

Ein weiteres fortschrittliches Merkmal von JOSS war, dass es das Konzept eines Bereichs als eingebauten Typ hatte, der gespeichert und manipuliert werden konnte. Bereiche werden normalerweise als Eingaben für for -Schleifen gefunden , wo sie Teil der Syntax der Schleife selbst sind. Zum Beispiel schreibt man in BASIC eine for-Schleife mit dieser grundlegenden Syntax:

FOR I=1 TO 5 STEP 2

Dadurch wird eine Schleife ausgeführt, die I die Werte 1, 3, 5 zuweist und dann beendet wird.

JOSS verwendete ein etwas obskures Format, um die Grenzen der Schleife zu definieren. Der entsprechende Code in JOSS wäre:

 I=1(2)5

Beachten Sie, dass dieser Code kein for enthält. Das liegt daran, dass Ranges in JOSS erstklassige Bürger der Sprache sind und nicht wie in BASIC Teil einer Schleife sind. Bereiche können in vielen Kontexten außerhalb von Schleifen definiert und verwendet werden. Hier ist beispielsweise ein bedingter Ausdruck, der die Fakultät eines Parameters x auswertet:

Let f(x)=[x=0:1 ; fp(x)=0:prod(i=1(1)x:i)].

In diesem Beispiel gibt es zwei Hauptsätze, die durch das Semikolon getrennt sind. Der erste auf der linken Seite besagt, dass die Bedingung sofort 1 zurückgeben sollte, wenn der Parameter x 0 ist. Wenn dieser Satz fehlschlägt, geht er zum zweiten Test auf der rechten Seite über. Dieser prüft, ob der Bruchteil von x null ist (dh es ist eine ganze Zahl), und wenn ja, ruft er die prodFunktion auf, um einen Wertebereich zu multiplizieren. Der prodParameter von ' ist ebenfalls eine Aussage, aber in diesem Fall wird der Test durch einen Schleifeniterator ersetzt, der von 1 bis x in Schritten von 1 läuft. Wenn diese Aussage wahr ist, was für alle Werte der Schleife gilt, wird zurückgegeben der Index i. Dadurch wird eine Reihe von Werten prodvon 1 bis x gesendet .

Die Kombination dieser Funktionen ermöglicht es, komplexe Funktionen in wenigen Befehlen zu schreiben. Diese Art von Funktionalität ist nur in viel moderneren Sprachen üblich geworden, die normalerweise Iteratoren oder eine Kartenfunktion verwenden , um die gleichen Ergebnisse zu erzielen. Die Fähigkeit von JOSS, Entscheidungen und Schleifen in kompakter Form zu kombinieren, ist in anderen Sprachen der Ära unbekannt, einschließlich Ablegern wie FOCAL.

Befehle

Satz

Der SetBefehl weist die Ergebnisse eines Ausdrucks der angegebenen Variablen zu. Äquivalent zu BASICs LET.

01.30 Set p=3.14156.
01.60 Set i=l*(r/100)*t.

Setwar optional, wenn sie im Direktmodus verwendet wurde, wo man x=5.ohne den Set-Befehl tippen konnte . Dies war im indirekten Modus im Gegensatz zu BASIC nicht erlaubt.

Lassen

Letwurde verwendet, um benutzerdefinierte Funktionen zu definieren. Äquivalent zu BASICs DEF FN.

Let t(x)=sin(x)/cos(x).
Set j=t(1.1).
Type j.

Let kann auch verwendet werden, um den Wert einer Variablen mit einer Formel festzulegen, die aus einer Konstanten besteht:

Let x=5.

Ab diesem Zeitpunkt kann es genauso verwendet werden wie eines, das mit erstellt wurde Set. Es gibt jedoch einen feinen Unterschied, wenn dieses X im Code referenziert wird, wird der Wert berechnet, indem die rechte Seite ausgewertet wird. A Setwird nur einmal ausgewertet, ist also viel schneller.

Das System schlug Letim Allgemeinen vor, sie nur im Direktmodus zu verwenden und sie für die Verwendung in einem Programm zu speichern, indem sie oben oder unten in die Datei eingefügt werden. Dadurch wurde vermieden, Letdass sie während der Ausführung mehrfach aufgerufen wird, da sie nur einmal während des Ladevorgangs aufgerufen werden würde.

Anforderung

Der Demandnimmt eine Liste von Variablen und speichert die Benutzereingaben in Variablen. Der optionale asQualifizierer hat eine benutzerdefinierte Eingabeaufforderung hinzugefügt. Äquivalent zu BASICs INPUT.

01.01 Type "What is your age?".
01.02 Demand A.
01.03 Type "You are", A.
01.04 Demand H as "What is your height?".
01.05 Type H,"? That tall?".

Typ

Der TypeBefehl gibt ein oder mehrere durch Kommas getrennte Elemente aus. In seiner Grundform ist es äquivalent zu BASIC's PRINT. Jedoch Typeenthält eine Reihe von optionalen Formen , die es sehr überlastet machen, eine Reihe von nicht verwandten Ausgang Aufgaben.

Wenn sie zum Drucken von Werten verwendet werden, können die Parameter Variablen sein, Literalzeichenfolgen, die von doppelten Anführungszeichen umgeben sind, und das Sonderzeichen _, das einen Zeilenvorschub erzeugt. Typeunterstützt auch formatierte Ausgabe mit Formatzeichenfolgen. Weitere FormInformationen finden Sie im Abschnitt weiter unten.

Type wird auch als Äquivalent zur BASIC- LISTAnweisung verwendet, die das Programm schreibt. Zum Beispiel Type step 1.1.druckt eine einzelne Codezeile aus, während Type part 1.der gesamte Teil und Type all.das gesamte Programm ausgedruckt werden.

Darüber hinaus kann es auch zum Drucken von Listen mit internen Werten verwendet werden. Type all values.erzeugt eine Liste aller Variablen und ihrer Werte und gibt Type size.die Programmgröße aus. Zu den Schlüsselwörtern gehören size, timeund users.

Buchseite

Pagelöst einen Seitenvorschub an den speziellen JOSS Terminals aus. Normalerweise würde JOSS einen Seitenvorschub senden, wenn das Terminal die Zeile 54 auf dem Papier erreicht. Wenn man also sicherstellen wollte, dass ein Datenblock nicht in zwei Hälften geteilt wird, könnte man:

1.10 Page if $>44.

$ ist eine Pseudovariable, die die aktuelle Zeilennummer zurückgibt.

Leitung

Line löst einen Zeilenvorschub an den speziellen JOSS-Klemmen aus.

Zu

Der ToBefehl springt die Programmausführung mit bzw. zur angegebenen Teile- To part 1.oder To step 1.1.Schrittnummer. Es ist das Äquivalent zu BASICs GOTO. Im Gegensatz zu Go, einem indirekten Befehl, der von der Befehlszeile aus verwendet wird, der Programme startet, das Äquivalent zu BASICs RUN.

01.01 Demand "TYPE A NUMBER",A.
01.05 To step 1.01.
01.10 To part 1.

Tun

Doist ähnlich zu To, verzweigt jedoch zu einem Unterprogramm. Wie bei Tokönnen Sie Do partoder Do step. Wenn ein Schritt bereitgestellt wird, wird diese einzelne Zeile ausgeführt und kehrt dann zur Anweisung nach der Do. Wenn ein Teil bereitgestellt wird, beginnt die Ausführung in der ersten Zeile des Blocks und wird fortgesetzt, bis das Ende des Blocks erreicht oder eine DoneAnweisung gefunden wird.

01.15 Do step 7.24.
01.16 Do part 8.

Dohatte eine spezielle Kurzform für die Suche, die in den meisten Programmen sehr verbreitet ist. Dies verwendet den timesModifikator anstelle eines normalen for, im Fall von einfachen Schleifen. Die folgenden Zeilen sind also äquivalent:

Do part 1 for i=1(1)5.
Do part 1, 5 times.

JOSS unterhält einen Zeiger auf die gerade ausgeführte Zeile, die a Doändern würde. Es enthielt jedoch ein spezielles "parenthetic do", das im Direktmodus verwendet werden konnte, um bestimmte Abschnitte des Codes zu testen, ohne den Hauptzeiger zu ändern. Wenn das Programm beispielsweise aufgrund eines Fehlers gestoppt wurde und nicht klar war, welcher Abschnitt das Problem verursacht hat, könnte man ein bestimmtes Unterprogramm testen mit:

 (Do part 2.)

Fertig

Der DoneBefehl kehrt von einem Unterprogrammaufruf zurück. Da Unterprogramme beim Erreichen des Teileendes automatisch zurückkehren, Donewird es nur für einen vorzeitigen Rücksprung benötigt und wird oft mit einer Bedingung verwendet. Äquivalent zu BASICs RETURN.

*Routine to ask the user for a positive value and repeat until it gets one
01.10 Demand X as "Enter a positive value greater than zero".
01.20 Done if X>0.
01.30 To step 1.1

Halt

Der StopBefehl beendet die Ausführung des Programms und gibt die Kontrolle an die Editierumgebung zurück. Äquivalent zu BASICs ENDoder STOP, obwohl BASICs STOPdazu gedacht ist, die CONTAusführung an derselben Stelle aufzunehmen, ein Merkmal, das im arbeitsraumorientierten System von JOSS kein direktes Äquivalent hat.

01.10 Type X.
01.20 Stop.

gehen

Nur im Direktmodus verfügbar, Goentspricht BASIC's RUNund CONT, abhängig davon, ob ein Programm derzeit aufgrund eines Fehlers oder eines Stopaufgetretenen Befehls angehalten wird.

Abbrechen

Ein weiterer Nur-Direktmodus-Befehl Cancelwird verwendet, wenn das Programm wegen eines Fehlers angehalten wurde und der Benutzer das Programm zurücksetzen möchte, was er durch Löschen des Programmzählers tut . A Gowürde am letzten Ort abholen, aber mit einem a Cancelwieder oben Goanfangen. Wenn der aktuelle Unterbrechungspunkt auf eine Klammer zurückzuführen war (Do.), kann man ein Abbrechen in Klammern ausgeben (Cancel.), um genau diese Unterausführung zu stoppen und a zu ermöglichen Go, an der letzten nicht in Klammern gesetzten Zeile fortzufahren.

Mathematik

JOSS hat alle Zahlen als ganze Zahl und als dezimalen Exponenten gespeichert. Dies bedeutet, dass Berechnungen genaue Dezimalwerte waren, im Gegensatz zu Gleitkommaberechnungen .1/3 + 1/3 + 1/3 war genau 1.

JOSS enthielt sechs mathematische Operatoren:

  • + zur Ergänzung
  • - für Subtraktion
  • · für die Multiplikation (der Inpunkt, nicht der Punkt)
  • / für Teilung
  • * für Exponenten
  • |...| für absoluten Wert, mit einem Ausdruck in der Mitte

Mathematische Ausdrücke können () und [] in übereinstimmenden Paaren austauschbar verwenden, um den Vorrang festzulegen. Zum Beispiel:

  1.30 Set A=|-10*[5+1]*(1+5)|.

Würde 360 ​​produzieren.

Funktionen

Die Sprache enthielt die folgenden integrierten Funktionen:

Mathematik

  • sin() - Sinus eines Winkels im Bogenmaß
  • cos() - Kosinus
  • arg() - Nimmt X- und Y-Werte eines Punktes und gibt den Winkel zwischen diesem Punkt und der x-Achse zurück
  • log() - Naperian Log
  • exp() - Natürliche Grundlage für die Macht des Arguments
  • sqrt() - Quadratwurzel
  • sgn() - Vorzeichen des Arguments, 0 gibt 0 zurück, -ve Werte -1, +ve +1
  • ip()- Ganzzahliger Teil des Arguments, ip(22026.4658)gibt 22026 . zurück
  • fp() - Bruchteil, gibt .4658 . zurück
  • dp() - Ziffernteil, Rückgabe 2.20264658
  • ep() - Exponententeil, gibt 4 zurück, die Stelle der Dezimalstelle

Boolesches

  • tv() - Wahrheitswert, gibt 1 zurück, wenn der Ausdruck wahr ist, sonst 0

Looping-Funktionen

JOSS hat auch eine Reihe von Funktionen definiert, die intern ForSchleifen ausführen , um zu vermeiden, dass der Programmierer eine Schleife schreiben muss , um einfache Aufgaben wie das Summieren einer Reihe von Zahlen auszuführen. Die Parameter können entweder eine Liste einfacher Ausdrücke sein, die durch Kommas getrennt sind, oder ein Bereichskonstrukt, dessen Befehl eine beliebige Anweisung oder ein Funktionsaufruf sein kann.

  • max() - Maximalwert der bereitgestellten Ausdrücke
  • min() - Minimum
  • sum() - Summe
  • prod() - Produkt
  • first() - Erstes Element in der Liste, das einer Bedingung entspricht, gibt dieses Ergebnis zurück

Dokumentenverwaltung

Das JOSS-System verwendet eine Festplatte , um Benutzerprogramme in einem zugewiesenen Speicherplatz zu speichern. In diesem Raum befanden sich eine Reihe von Dateien, auf die mit einem mehrteiligen Dateinamen verwiesen wurde, der aus einer ganzen Zahl und einem aus fünf Buchstaben bestehenden Namen in Klammern bestand, zum Beispiel 123 (hello). Der ganzzahlige Teil entspricht einem Verzeichnis, und der Name ist die darin enthaltene Unterdatei, die von JOSS selbst verwaltet wird.

Dateien werden mit geschrieben File all as item filename.und mit geladen Recall item filename.. Man könnte auch nur bestimmte Teile des Arbeitsbereichs lesen oder speichern, beispielsweise File part 1 as item filename.um eine einzelne Routine in einer Datei zu speichern. Zusätzlich könnte man eine Standarddatei setzen, auf die alle Verweise mit Use item filename.Dateien konnten mit gelöscht werden Discard.

Beispielprogramm

1.1 Demand p,q.
1.2 Stop if q<0 or r(q,2)=0.
1.3 Set a=1.
1.4 Do part 2 while q>1 and a≠0.
1.5 Type a in form 3.
1.6 Stop.

2.1  Do part 20.
2.1  Do part 11 if p<0.
2.2  Do part 12 if p≥q.
2.3  Do part 13 if p=0.
2.4  Done if a=0.
2.5  Set p=p/4 while r(p,4)=0.
2.6  Do part 14 if r(p,2)=0.
2.7  Do part 20.
2.8  Set a=-a if r(p,4)=r(q,4)=3.
2.9  Set s=p, p=q, q=s.
2.95 Do part 20.

11.1 Set a=-a if r(q,4)=3.
11.2 Set p=|p|.
11.3 Do part 20.

12.1 Set p=r(p,q).
12.2 Do part 20.

13.1 Set a=0, p=1, q=1.

14.1 Set a=-a if r(q,8)=3 or r(q,8)=5.
14.2 Set p=p/2.

20.1 Type p, q in form 1 if a=1.
20.2 Type p, q in form 2 if a=-1.

Form 1: "  L(%.0f,%.0f)  ="
Form 2: "  -L(%.0f,%.0f)  ="
Form 3: "  %.0f\n"

Beachten Sie, dass dies kein Originalbeispiel ist, sondern eines aus einem modernen Simulator. Es gibt einige syntaktische Unterschiede zur ursprünglichen JOSS-Sprache.

Anmerkungen

Verweise

Zitate

Quellen

Weiterlesen