Systemprogrammiersprache - Systems Programming Language

Systemprogrammiersprache
Paradigmen prozedural , zwingend , strukturiert
Familie ALGOL
Erstmals erschienen 1972 ; Vor 49 Jahren  ( 1972 )
Beeinflusst von
ALGOL 60 , ESPOL
Beeinflusst
ZSPL, Micro-SPL, Action!

Die Systemprogrammiersprache , die oft auf SPL abgekürzt, aber manchmal auch als SPL / 3000 bezeichnet wird , war eine prozedurale Programmiersprache, die von Hewlett-Packard für die HP 3000- Minicomputerlinie geschrieben und erstmals 1972 eingeführt wurde. SPL wurde zum Schreiben des primären Betriebs des HP 3000 verwendet System , Multi-Programming Executive (MPE). Ähnliche Sprachen auf anderen Plattformen wurden allgemein als Systemprogrammiersprachen bezeichnet , was die Sache verwirrte.

Ursprünglich als Alpha Systems Programming Language bekannt , benannt nach dem Entwicklungsprojekt, das die 3000er-Serie produzierte, wurde SPL entwickelt, um das stapelbasierte Prozessordesign des Alpha zu nutzen . Es basiert auf ESPOL , einer ähnlichen von ALGOL abgeleiteten Sprache, die von den Burroughs B5000- Mainframe- Systemen verwendet wird und auch eine Reihe von 1960er-Sprachen wie PL360 und JOVIAL beeinflusst hat .

Bis Mitte der 1970er Jahre führte der Erfolg der HP-Systeme zu einer Reihe von SPL-Ablegern. Beispiele hierfür sind ZSPL für den Zilog Z80- Prozessor und Micro-SPL für den Xerox Alto . Die später inspirierte Aktion! für die Atari 8-Bit-Familie , die ziemlich erfolgreich war. Letzteres folgte genauer der Pascal- Syntax und verlor einige der SPL-Eigenheiten.

SPL wurde während der Lebensdauer der ursprünglichen HP 3000-Plattform mit integrierten Schaltkreisen häufig verwendet . In den 1980er Jahren wurden HP 3000 und MPE in einem Emulator neu implementiert , der auf PA-RISC- basierten HP 9000- Plattformen ausgeführt wurde. HP hat Pascal als bevorzugte Systemsprache für PA-RISC beworben und keinen SPL-Compiler bereitgestellt. Dies verursacht Code Wartung betrifft, und 3rd - Party - SPL - Compiler wurden eingeführt , um diese Notwendigkeit zu füllen.

Geschichte

Hewlett-Packard stellte 1967 seine ersten Minicomputer vor , die HP 2100- Serie. Die Maschinen wurden ursprünglich von einem externen Team für Union Carbide entwickelt und waren hauptsächlich für industrielle eingebettete Steuerungszwecke gedacht, nicht für den breiteren Datenverarbeitungsmarkt. HP sah dies als eine natürliche Ergänzung zu seinem bestehenden Instrumentierungsgeschäft an und stellte es zunächst diesen Benutzern zur Verfügung. Trotzdem stellte HP fest, dass das Preis-Leistungs-Verhältnis der Maschine sie auf dem Geschäftsmarkt zunehmend erfolgreicher machte.

In dieser Zeit wurde das Konzept der Zeitteilung immer beliebter, insbesondere als die Kernspeicherkosten sanken und die Systeme mit mehr Speicher ausgeliefert wurden. 1968 führte HP ein gebündeltes System mit zwei Computern der Serie 2100 ein, auf denen HP Time-Shared BASIC ausgeführt wird. Dieses System bot ein vollständiges Betriebssystem sowie die Programmiersprache BASIC . Diese Zwei-Maschinen-Systeme, die zusammen als HP 2000 bezeichnet werden, waren ein sofortiger Erfolg. HP BASIC war viele Jahre lang sehr einflussreich und seine Syntax kann in einer Reihe von Mikrocomputer- BASICs gesehen werden, darunter Palo Alto TinyBASIC , Integer BASIC , North Star BASIC , Atari BASIC und andere.

Die Designer von HP fragten sich: "Wenn wir mit einem Junkie-Computer wie dem 2116 ein so gutes Time-Sharing-System herstellen können, überlegen Sie, was wir erreichen könnten, wenn wir unseren eigenen Computer entwerfen würden." Zu diesem Zweck begann das Unternehmen 1968, ein größeres Team zusammenzustellen, um eine neue mittelgroße Architektur zu entwerfen. Zu den neuen Teammitgliedern gehörten diejenigen, die an Burroughs- und IBM- Mainframe- Systemen gearbeitet hatten, und die daraus resultierenden Konzepte hatten eine starke Ähnlichkeit mit dem äußerst erfolgreichen Burroughs B5000- System. Der B5000 verwendete einen Stapelmaschinenprozessor , der die Implementierung von Multiprogramming vereinfachte, und dieselbe Architektur wurde auch für das neue HP-Konzept ausgewählt.

Es wurden zwei Implementierungen in Betracht gezogen, eine 32-Bit-Maschine im Mainframe-Maßstab, bekannt als Omega, und ein 16-Bit-Design, bekannt als Alpha. Fast alle Anstrengungen waren auf die Omega gerichtet, aber im Juni 1970 wurde Omega abgesagt. Dies führte zu einer umfassenden Neugestaltung von Alpha, um es von den 2100 zu unterscheiden, und es entstand schließlich mit Plänen für ein noch aggressiveres Betriebssystemdesign. Omega hatte vorgehabt, im Batch-Modus zu laufen und einen kleineren Computer, das "Front-End", zu verwenden, um Interaktionen mit dem Benutzer zu verarbeiten. Dies war das gleiche Betriebskonzept wie bei der Serie 2000. Ein weiteres Jahr 2000 würde Alpha jedoch nicht ausreichen, und es wurde die Entscheidung getroffen, einen einzigen Betrieb für den Batch-, interaktiven und sogar Echtzeitbetrieb zu haben .

Damit dies funktioniert, war ein erweitertes Computerbus- Design mit umfassendem direkten Speicherzugriff (DMA) und ein erweitertes Betriebssystem (OS) erforderlich , um schnell auf Benutzeraktionen reagieren zu können. Das B5000 war für seine Zeit auch insofern einzigartig, als sein Betriebssystem und seine Kerndienstprogramme alle in einer Hochsprache , ESPOL , programmiert waren . ESPOL war eine Ableitung der ALGOL-Sprache, die auf die B5000 abgestimmt war. Dieses Konzept hatte in den 1960er Jahren großen Einfluss und führte zu neuen Sprachen wie JOVIAL , PL / 360 und BCPL . Das HP Team entschied, dass sie auch eine von ALGOL abgeleitete Sprache für die Arbeit ihrer Betriebssysteme verwenden würden. Die ähnliche Sprache von HP war ursprünglich als Alpha Systems Programming Language bekannt.

Die Entwicklung von Alpha dauerte mehrere Jahre, bevor es 1972 als HP 3000 auf den Markt kam. Die Maschine war nur wenige Monate auf dem Markt, bevor klar war, dass sie einfach nicht richtig funktionierte, und HP musste alle bereits verkauften 3000 zurückrufen. Es wurde Ende 1973 wieder eingeführt, wobei die meisten Probleme behoben waren. Ein bedeutendes Upgrade des gesamten Systems, der CX-Maschine und des MPE-C, um darauf zu laufen, reformierte sein Image und der 3000 wurde in der zweiten Hälfte der 1970er Jahre ein weiterer großer Erfolg.

Dieser Erfolg machte SPL fast so weit verbreitet wie das BASIC der 2000er-Serie, und wie diese Sprache führte SPL zu einer Reihe von Versionen für andere Plattformen. Bemerkenswert unter ihnen war Micro-SPL, eine Version, die für die Xerox Alto Workstation geschrieben wurde. Diese Maschine hatte ursprünglich BCPL als Hauptsprache verwendet, aber die Unzufriedenheit mit ihrer Leistung veranlasste Henry Baker , eine nicht rekursive Sprache zu entwerfen, die er 1979 mit Clinton Parker implementierte. Clinton würde dann Micro-SPL weiter modifizieren, um Action zu produzieren ! für die Atari 8-Bit-Familie im Jahr 1983.

HP hat das HP 3000-System auf dem PA-RISC-Chipsatz neu implementiert und eine neue Version des Betriebssystems MPE / iX ausgeführt. MPE / iX hatte zwei Modi: Im "nativen Modus" wurden Anwendungen ausgeführt, die mit neueren Pascal-Compilern für PA-RISC neu kompiliert wurden, während im "kompatiblen Modus" die gesamte vorhandene Software per Emulation ausgeführt werden konnte. HP hat keinen Compiler im einheitlichen Modus für MPE / iX bereitgestellt, sodass es nicht einfach war, vorhandene Software auf die neue Plattform zu verschieben. Allegro Consultants hat eine SPL-kompatible Sprache namens "SPLash!" Dies könnte zum ursprünglichen HP 3000-Code kompiliert werden, um im Emulator ausgeführt zu werden, oder zum nativen Modus. Dies bot einen Portierungspfad für vorhandene SPL-Software.

Sprache

Grundlegende Syntax

SPL folgt im Allgemeinen den Syntaxkonventionen von ALGOL 60 und ist jedem bekannt, der Erfahrung mit ALGOL oder seinen Nachkommen wie Pascal und Modula-2 hat . Wie diese Sprachen können Programmanweisungen mehrere physikalische Zeilen umfassen und mit einem Semikolon enden. Kommentare werden mit dem COMMENT Schlüsselwort oder durch Umschließen des Kommentartextes in << und >> gekennzeichnet.

Anweisungen werden mit BEGIN und END in Blöcke gruppiert, obwohl wie in Pascal auf das END eines Programms ein Punkt folgen muss. Das gesamte Programm ist von BEGIN und END umgeben, ähnlich wie Pascal, aber oben fehlt ein PROGRAM-Schlüsselwort oder eine ähnliche Anweisung. Der Grund dafür ist, dass SPL es ermöglicht, jeden Codeblock als eigenes Programm zu verwenden oder in ein anderes Programm zu kompilieren, um als Bibliothek zu fungieren. Die Erstellung von Code als Programm oder Unterprogramm war nicht Teil der Sprache selbst, sondern wurde platziert, indem die $CONTROL SUBPROGRAM Compiler-Direktive oben in die Datei eingefügt wurde.

Die Sprache verwendete das Schlüsselwort INTRINSIC, um den direkten Aufruf von externem Code durch Angabe eines lokalen Namens zu ermöglichen. Beispielsweise könnte eine Maschinensprachenbibliothek , die eine Funktion zum Ausführen der Konsolenglocke verfügbar macht, in ein SPL-Programm importiert werden, INTRINSIC BELL und dann könnte die Glocke unter Verwendung des Schlüsselworts BELL so betrieben werden, als wäre es ein nativer Befehl.

Im Gegensatz zu Pascal, wo PROCEDURE und FUNCTION waren separate Konzepte, verwendet SPL einen eher C-ähnlichen Ansatz, bei dem jedem PROCEDURE ein Typ vorangestellt werden kann, um ihn in eine Funktion umzuwandeln. In Übereinstimmung mit der Syntax anderer ALGOL-ähnlicher Sprachen wurden die Parametertypen nach dem Namen aufgelistet, nicht als Teil davon. Zum Beispiel:

INTEGER PROCEDURE FACT(N); VALUE N; INTEGER N;

Deklariert eine Funktion FACT, die einen Wert N annimmt, der eine ganze Zahl ist. Das VALUE gibt an, dass diese Variable auch der Rückgabewert für die Prozedur ist.

Obwohl ALGOL und Pascal verpönt waren, erlaubten sie, Code mit einem führenden Namen zu kennzeichnen, der mit einem Doppelpunkt endet, der dann für das Ziel von Schleifen und GO TO Anweisungen verwendet werden konnte. Ein kleiner Unterschied besteht darin, dass bei SPL die Beschriftungsnamen im Variablenabschnitt mit dem LABEL Schlüsselwort deklariert werden mussten.

SPL fügte diesem Konzept die ENTRY Anweisung hinzu, mit der diese Beschriftungen weiter als "Einstiegspunkte" definiert werden konnten, auf die über die Befehlszeile zugegriffen werden konnte. In den Eintragsanweisungen genannte Beschriftungen wurden für das Betriebssystem verfügbar gemacht und konnten über den Befehl RUN aufgerufen werden. Zum Beispiel könnte man ein Programm schreiben, das Zeichenfolgenfunktionen enthält, um es in Groß- oder Kleinbuchstaben umzuwandeln, und dann ENTRY-Punkte für diese beiden bereitstellen. Dies kann über die Befehlszeile als aufgerufen werden RUN $STRINGS,TOUPPER .

Datentypen

SPL unterscheidet sich am deutlichsten von ALGOL dadurch, dass seine Datentypen sehr maschinenspezifisch sind, basierend auf dem 16-Bit- Big-Endian- Wortformat des 3000 .

Der INTEGER Typ ist ein vorzeichenbehafteter 16-Bit-Typ mit 15 Wertbits und dem niedrigstwertigen Bit als Vorzeichen. DOUBLE ist eine 32-Bit-Ganzzahl, kein Gleitkommatyp. REAL ist ein 32-Bit-Gleitkommawert mit 22 Bit für die Mantisse und 9 für den Exponenten, während LONG es sich um einen 64-Bit-Gleitkommawert mit 54 Bit Mantisse und 9 Bit Exponent handelt.

BYTE wird für die Zeichenverarbeitung verwendet, die aus einem 16-Bit-Maschinenwort besteht, das zwei 8-Bit-Zeichen enthält. LOGICAL ist ein boolescher Typ, der ein einzelnes Bit im höchstwertigen Bit speichert . Es gibt kein Äquivalent zu einem PACKED Modifikator wie in Pascal, daher LOGICAL wird etwas Speicher verschwendet.

Wie bei C sind Daten schwach typisiert , Speicherorte und variabler Speicher sind vermischte Konzepte, und man kann direkt über ihre Speicherorte auf Werte zugreifen. Zum Beispiel der Code:

INTEGER A,B,C
LOGICAL D=A+2

definiert drei 16-Bit-Ganzzahlvariablen, A, B und C, und dann einen LOGICAL, ebenfalls einen 16-Bit-Wert. Das bedeutet = , wie Pascal, "ist äquivalent zu", nicht "erhält den Wert von", was := in algolähnlichen Sprachen verwendet wird. In der zweiten Zeile heißt es also "Deklariere eine Variable D, die sich am selben Speicherort wie A + 2 befindet", in diesem Fall auch die Position der Variablen C. Dadurch kann derselbe Wert über C oder als Ganzzahl gelesen werden eine logische durch D.

Diese Syntax mag modernen Lesern seltsam erscheinen, bei denen der Speicher im Allgemeinen eine Black Box ist, hat jedoch eine Reihe wichtiger Verwendungszwecke bei der Systemprogrammierung, bei der bestimmte Speicherorte Werte von der zugrunde liegenden Hardware enthalten. Insbesondere kann eine Variable definiert werden, die auf die Vorderseite einer Wertetabelle zeigt, und dann zusätzliche Variablen deklariert werden, die auf einzelne Werte in der Tabelle verweisen. Wenn sich die Tabellenposition ändert, muss sich nur ein einziger Wert ändern, die Anfangsadresse und alle einzelnen Variablen folgen automatisch in ihren richtigen relativen Offsets.

Zeiger wurden deklariert, indem der POINTER Modifikator zu einer Variablendeklaration hinzugefügt und der Speicherort einer Variablen mit der dereferenziert wurde @ . Somit INTEGER POINTER P:=@A wird ein Zeiger deklariert, dessen Wert die Adresse der Variablen A enthält, nicht der Wert von A. Er @ kann auf beiden Seiten der Zuweisung verwendet werden. @P:=A Wenn Sie den Wert von A in P setzen, was wahrscheinlich zu einem baumelnden Zeiger führt , zeigt @P:=@A P auf A, während P:=A der Wert von A an die Stelle gesetzt wird , auf die P aktuell zeigt.

In ähnlicher Weise enthält SPL eine C-ähnliche Array-Unterstützung, bei der die Indexvariable eine Anzahl von Wörtern ist, die von dem für die Anfangsvariable festgelegten Speicherplatz versetzt ist. Im Gegensatz zu C stellte SPL nur eindimensionale Arrays bereit und verwendete Klammern im Gegensatz zu Klammern. Es konnten auch Variablen deklariert GLOBAL werden. In diesem Fall wurde kein lokaler Speicher für sie reserviert, und es wurde angenommen, dass der Speicher in einer anderen Bibliothek deklariert wurde. Dies spiegelt das extern Schlüsselwort in C wider .

Literale können mit verschiedenen Suffixen angegeben werden, und solche ohne Suffix werden angenommen INTEGER . Zum Beispiel 1234 würde als interpretiert werden INTEGER , während 1234D war ein DOUBLE . E bezeichnet a REAL und L a LONG . Zeichenfolgenkonstanten wurden durch doppelte Anführungszeichen begrenzt, und doppelte Anführungszeichen innerhalb einer Zeile wurden mit einem zweiten doppelten Anführungszeichen maskiert.

Variablendeklarationen können Konstanten verwenden, um einen Anfangswert wie in zu definieren INTEGER A:=10 . Beachten Sie die Verwendung von "zuweisen" anstelle von "ist-a". Darüber hinaus verfügte SPL über ein EQUATE Schlüsselwort, mit dem eine Textzeichenfolge als Variable definiert werden konnte, und ersetzte dann beim Kompilieren alle Instanzen dieser Variablen im Code durch die Literalzeichenfolge. Dies ähnelt dem const Schlüsselwort in C.

Speichersegmentierung

Wie in der damaligen Zeit üblich, verwendete der HP 3000 ein byteorientiertes segmentiertes Speichermodell , bei dem eine Adresse ein einzelnes 16-Bit-Wort war, sodass Code auf bis zu 65.536 Bytes (oder wie sie es nannten, "Halbwörter") zugreifen konnte. ). Um auf größere Speichermengen zugreifen zu können, wurde ein virtuelles Speichersystem verwendet. Beim Zugriff auf den Speicher wurde der 16-Bit-Adresse einer von zwei 8-Bit-Segmentwerten vorangestellt, einer für den Programmcode (PB) und einer für variable Daten. Das Ergebnis war eine 24-Bit-Adresse. Während jedes Programm gleichzeitig auf insgesamt 128 kB zugreifen konnte, konnte es die Segmente austauschen, um auf einen vollen 16-MB-Speicherplatz zuzugreifen.

SPL enthielt eine Vielzahl von Unterstützungssystemen, damit Programme einfach segmentiert werden können und diese Segmentierung dann im Code relativ unsichtbar wird. Der primäre Mechanismus bestand darin, die $CONTROL SEGMENT=asegmentname Compiler-Direktive zu verwenden, die definierte, in welches Segment der folgende Code eingefügt werden sollte. Die Standardeinstellung war MAINLINESEG , aber der Programmierer konnte eine beliebige Anzahl zusätzlicher benannter Segmente hinzufügen, um den Code in Blöcken zu organisieren.

Andere Eigenschaften

SPL enthielt eine "Bitextraktions" -Funktion, die ein vereinfachtes Bit-Fiddling ermöglichte . Auf jedes Bit oder jede Bitfolge in einem Wort kann mit der .(x:y) Syntax zugegriffen werden , wobei x und y die Start- und Endbitpositionen von 0 bis 15 waren. Somit wurde A.(8:15) das untere Byte des Wortspeichers A zurückgegeben. Dieses Format könnte verwendet werden Bits nach Bedarf teilen und zusammenführen. Darüber hinaus wurden zusätzliche Operationen für Verschiebungen und dreht sich zur Verfügung gestellt und kann mit der auf jede Variable angewendet werden & , zum Beispiel A:=A & LSR(3) .

Beispiel

Dieses einfache Programm aus der Version 1984 des Referenzhandbuchs zeigt die meisten Funktionen der SPL-Sprache.

Das Programm als Ganzes ist zwischen dem BEGIN und und abgegrenzt END. . Es beginnt mit der Definition einer Reihe globaler Variablen, A, B und C, definiert eine einzelne Prozedur und ruft sie dann zwanzigmal auf. Beachten Sie, dass das Verfahren kein hat BEGIN und END ihrer eigenen , weil es nur eine Zeile eigentlichen Code enthält, X:=X*(Y+Z); die INTEGER X,Y,Z nicht Teil des Codes selbst betrachtet, ist es die Art der drei Parameter , die in auf der Linie geführt wird oben und wird als Teil dieser Linie betrachtet.

 BEGIN
     INTEGER A:=0, B, C:=1;
     PROCEDURE N(X,Y,Z);
         INTEGER X,Y,Z;
         X:=X*(Y+Z);
     FOR B:=1 UNTIL 20 DO
         N(A,B,C);
 END.

Verweise

Zitate

Literaturverzeichnis