Systemprogrammeringsspråk - Systems Programming Language
| Paradigmer | prosessuelle , imperativ , strukturert |
|---|---|
| Familie | ALGOL |
| Først dukket opp | 1972 |
| Påvirket av | |
| ALGOL 60 , ESPOL | |
| Påvirket | |
| ZSPL, Micro-SPL, Action! | |
Systemprogrammeringsspråk , ofte forkortet til SPL, men noen ganger kjent som SPL / 3000 , var et prosessorientert programmeringsspråk skrevet av Hewlett-Packard for HP 3000 minicomputer- linjen og ble først introdusert i 1972. SPL ble brukt til å skrive HP 3000s primære operativsystem system , Multi-Programming Executive (MPE). Lignende språk på andre plattformer ble generelt referert til som systemprogrammeringsspråk , noe som var forvirrende.
Opprinnelig kjent som Alpha Systems Programming Language , oppkalt etter utviklingsprosjektet som produserte 3000-serien, ble SPL designet for å dra nytte av Alfas stabelbaserte prosessordesign . Det er mønstret på ESPOL , et lignende ALGOL- avledet språk som brukes av Burroughs B5000- hovedrammesystemer , som også påvirket en rekke 1960- tallsspråk som PL360 og JOVIAL .
Gjennom midten av 1970-tallet produserte suksessen til HP-systemene en rekke SPL-offshoots. Eksempler inkluderer ZSPL for Zilog Z80- prosessoren, og Micro-SPL for Xerox Alto . Den senere inspirerte Action! for Atari 8-bits familien , som var ganske vellykket. Sistnevnte fulgte nærmere Pascal- syntaksen og mistet noen av SPLs særegenheter.
SPL ble mye brukt i løpet av de originale integrerte kretsbaserte versjonene HP 3000-plattformen. På 1980-tallet ble HP 3000 og MPE implementert på nytt i en emulator som kjørte på PA-RISC- baserte HP 9000- plattformer. HP promoterte Pascal som det foretrukne systemspråket på PA-RISC og ga ikke en SPL-kompilator. Dette forårsaket bekymringer for vedlikehold av koder , og tredjeparts SPL- kompilatorer ble introdusert for å dekke dette behovet.
Historie
Hewlett-Packard introduserte sine første minidatamaskiner , HP 2100- serien, i 1967. Maskinene var opprinnelig designet av et eksternt team som jobbet for Union Carbide og hovedsakelig ment for industriell innebygd kontroll, ikke det bredere databehandlingsmarkedet. HP så dette som en naturlig passform med deres eksisterende instrumenteringsvirksomhet og kastet det til brukerne. Til tross for dette fant HP at maskinens pris / ytelsesforhold gjorde dem stadig mer vellykkede i bedriftsmarkedet.
I løpet av denne perioden ble konseptet med tidsdeling stadig populært, spesielt ettersom kjernehukommelseskostnadene falt og systemene begynte å leveres med mer minne. I 1968 introduserte HP et samlet system med to maskiner i 2100-serien som kjørte HP Time-Shared BASIC , som ga et komplett operativsystem samt BASIC-programmeringsspråket . Disse to-maskinsystemene, samlet kjent som HP 2000-tallet, ble en umiddelbar suksess. HP BASIC var svært innflytelsesrik i mange år, og syntaksen kan sees i en rekke mikrocomputer BASICs, inkludert Palo Alto TinyBASIC , Integer BASIC , North Star BASIC , Atari BASIC og andre.
Designere hos HP begynte å lure på "Hvis vi kan produsere et tidsdelingssystem som er så bra ved hjelp av en søppel datamaskin som 2116, tenk hva vi kan oppnå hvis vi designer vår egen datamaskin." I 1968 begynte selskapet å sette sammen et større team for å designe en ny mellomstor arkitektur. Nye teammedlemmer inkluderte de som hadde jobbet med Burroughs og IBM mainframe- systemer, og de resulterende konseptene lignet sterkt på det meget vellykkede Burroughs B5000- systemet. B5000 brukte en stablemaskinprosessor som gjorde multiprogrammering enklere å implementere, og den samme arkitekturen ble også valgt for det nye HP-konseptet.
To implementeringer ble vurdert, en 32-bits hovedrammeskala-maskin kjent som Omega, og en 16-biters design kjent som Alpha. Nesten all innsats var på Omega, men i juni 1970 ble Omega kansellert. Dette førte til et omfattende redesign av Alpha for å skille det fra 2100-tallet, og til slutt dukket det opp med planer om en enda mer aggressiv operativsystemdesign. Omega hadde tenkt å kjøre i batch-modus og bruke en mindre datamaskin, "frontend", for å behandle interaksjoner med brukeren. Dette var det samme betjeningskonseptet som 2000-serien. Imidlertid ville nok en 2000 ikke være nok for Alpha, og beslutningen ble tatt om å ha en enkelt operasjon for batch, interaktiv og til og med sanntidsoperasjon .
For å få dette til å fungere trengte det en avansert datamaskinbussdesign med omfattende direkte minnetilgang (DMA) og krevde et avansert operativsystem (OS) for å gi raske svar på brukerhandlinger. B5000 var også unik for sin tid ved at operativsystemet og kjerneverktøyene var programmert på et høyt nivå språk , ESPOL . ESPOL var et derivat av ALGOL-språket som var innstilt på å fungere på B5000-tallet, et konsept som var svært innflytelsesrik på 1960-tallet og førte til nye språk som JOVIAL , PL / 360 og BCPL . HP-teamet bestemte seg for at de også ville bruke et ALGOL-avledet språk for deres operativsystemarbeid. HPs lignende språk var opprinnelig kjent som Alpha Systems Programming Language.
Det tok flere år å utvikle Alpha før den kom ut i 1972 som HP 3000. Maskinen var på markedet i bare noen få måneder før det var klart at den rett og slett ikke fungerte riktig, og HP ble tvunget til å huske alle 3000 som allerede var solgt. Den ble introdusert på nytt i slutten av 1973, med de fleste av problemene som ble løst. En større oppgradering av hele systemet, CX-maskinen og MPE-C for å kjøre på den, reformerte image og 3000 ble en annen stor suksess i andre halvdel av 1970-tallet.
Denne suksessen gjorde SPL nesten like utbredt som 2000-BASIC-serien, og i likhet med det språket resulterte SPL i en rekke versjoner for andre plattformer. Bemerkelsesverdig blant dem var Micro-SPL, en versjon skrevet for Xerox Alto- arbeidsstasjonen. Denne maskinen hadde opprinnelig brukt BCPL som hovedspråk, men misnøye med ytelsen førte til at Henry Baker designet et ikke-rekursivt språk som han implementerte med Clinton Parker i 1979. Clinton ville deretter modifisere Micro-SPL for å produsere Action! for Atari 8-bits familien i 1983.
HP implementerte HP 3000-systemet på nytt på PA-RISC-brikkesettet og kjørte en ny versjon av operativsystemet kjent som MPE / iX. MPE / iX hadde to modi, i "native mode" kjørte applikasjoner som var blitt kompilert for PA-RISC ved å bruke nyere Pascal-kompilatorer, mens den under "kompatibel modus" kunne kjøre all eksisterende programvare via emulering. HP leverte ikke en native mode kompilator for MPE / iX, så det var ikke en enkel prosess å flytte eksisterende programvare til den nye plattformen. For å dekke behovet skrev Allegro Consultants et SPL-kompatibelt språk kalt "SPLash!" som kan kompileres til den originale HP 3000-koden for å kjøre i emulatoren, eller til naturlig modus. Dette tilbød en porteringsvei for eksisterende SPL-programvare.
Språk
Grunnleggende syntaks
SPL følger generelt ALGOL 60 syntakskonvensjoner, og vil være kjent for alle som har erfaring med ALGOL eller dens etterkommere, som Pascal og Modula-2 . I likhet med disse språkene kan programerklæringer strekke seg over flere fysiske linjer og ende med semikolon. Kommentarer er betegnet med COMMENT nøkkelordet, eller ved å omgir kommentarteksten i << og >>.
Uttalelser er gruppert i blokker med BEGIN og SLUT, selv om SLUTTET for et program, som i Pascal, må følges av en periode. Programmet som helhet er omgitt av BEGIN og END., Ligner på Pascal, men mangler et PROGRAM-nøkkelord eller lignende uttalelse øverst. Årsaken til dette er at SPL tillater at hvilken som helst blokk med kode brukes som et program alene, eller kompileres til et annet program for å fungere som et bibliotek. Opprettelsen av kode som et program eller underprogram var ikke en del av språket i seg selv, men ble håndtert i stedet ved å plassere $CONTROL SUBPROGRAM kompileringsdirektivet øverst i filen.
Språket brukte INTRINSIC-nøkkelordet for å tillate at ekstern kode ble kalt direkte ved å gi den et lokalt navn. For eksempel kan et maskinspråksbibliotek som avslører en funksjon for å kjøre konsollklokken importeres til et SPL-program, INTRINSIC BELL og deretter kan klokken drives ved å bruke nøkkelordet BELL som om det var en innfødt kommando.
I motsetning til Pascal, hvor PROCEDURE og FUNCTION var separate konsepter, bruker SPL en mer C-lignende tilnærming der noen PROCEDURE kan være prefikset med en type for å gjøre den om til en funksjon. I tråd med syntaksen til andre ALGOL-lignende språk, ble parametertypene oppført etter navnet, ikke en del av det. For eksempel:
INTEGER PROCEDURE FACT(N); VALUE N; INTEGER N;
Erklærer en funksjon FAKTA som tar en verdi N som er et heltall. Det VALUE indikerer at denne variabelen også er returverdien for prosedyren.
Selv om ALGOL og Pascal mislikte, tillot det at kodene ble merket ved hjelp av et ledende navn som endte med et kolon, som deretter kunne brukes som mål for løkker og GO TO utsagn. En mindre forskjell er at SPL krevde at etikettenavnene skulle deklareres i variabeldelen ved hjelp av LABEL nøkkelordet.
SPL la til dette konseptet med ENTRY uttalelsen som tillot at disse etikettene ble ytterligere definert som "inngangspunkter" som kunne nås fra kommandolinjen. Etiketter navngitt i oppføringsuttalelsen (e) ble utsatt for operativsystemet og kunne kalles fra RUN-kommandoen. For eksempel kan man skrive et program som inneholder strengfunksjoner for å konvertere til store eller små bokstaver, og deretter gi ENTRY-poeng for disse to. Dette kan kalles fra kommandolinjen som RUN $STRINGS,TOUPPER .
Datatyper
Hvor SPL skiller seg mest ut fra ALGOL, er at datatypene er veldig maskinspesifikke, basert på 3000-tallets 16-bit store endian-ordformat .
Den INTEGER typen er en 16-bit signert type, med 15 biter av verdi og den minst signifikante bit som tegn. DOUBLE er et 32-biters heltall, ikke en flytende punkt-type. REAL er en 32-biters flytpunkt-verdi med 22 bits for mantissaen og 9 for eksponenten, mens den LONG er en 64-biters flyt-punkt-verdi med 54 bits mantissa og 9 bits eksponent.
BYTE brukes til tegnbehandling, bestående av et 16-biters maskinord som inneholder to 8-biters tegn. LOGICAL er en boolsk type som lagrer en enkelt bit i den viktigste biten . Det finnes ingen tilsvarende som en PACKED modifikator som finnes i Pascal, så det LOGICAL er litt bortkastet med minne.
I likhet med C er data svakt skrevet , minneplasseringer og variabel lagring er blandede konsepter, og man kan få tilgang til verdier direkte gjennom stedene deres. For eksempel koden:
INTEGER A,B,C LOGICAL D=A+2
definerer tre 16-biters heltallvariabler, A, B og C, og deretter en LOGISK, også en 16-biters verdi. Den = , som Pascal, betyr "tilsvarer", ikke "får verdien av", som brukes := i Algol-lignende språk. Så den andre linjen sier "erklær en variabel D som er på samme minneplassering som A + 2", som i dette tilfellet også er plasseringen til variabelen C. Dette gjør at den samme verdien kan leses som et heltall via C eller en logisk gjennom D.
Denne syntaksen kan virke rart for moderne lesere der minne vanligvis er en svart boks , men den har en rekke viktige bruksområder i systemprogrammering der bestemte minneplasser har verdier fra den underliggende maskinvaren. Spesielt tillater det en å definere en variabel som peker mot forsiden av en verditabell, og deretter deklarere flere variabler som peker på individuelle verdier i tabellen. Hvis tabellplasseringen endres, må bare en enkelt verdi endres, startadressen og alle de enkelte variablene vil automatisk følge i riktig relative forskyvning.
Pekere ble erklært ved å legge POINTER modifikatoren til en hvilken som helst variabelerklæring, og minneplasseringen til en variabel derferensert med @ . Dermed INTEGER POINTER P:=@A erklærer en peker hvis verdi inneholder adressen til variabelen A, ikke verdien av A. @ kan brukes på hver side av tildelingen; @P:=A setter verdien av A i P, noe som sannsynligvis resulterer i en dinglende peker , @P:=@A får P til å peke på A, mens den P:=A setter verdien av A til stedet som for tiden pekes på av P.
På en lignende måte inkluderer SPL C-lignende arraystøtte der indeksvariabelen er et antall ord forskjøvet fra minneplasseringen satt for den opprinnelige variabelen. I motsetning til C ga SPL bare endimensjonale matriser og brukte parenteser i motsetning til parentes. Variabler kunne også deklareres GLOBAL , i så fall ble det ikke satt av noe lokalt minne til dem, og lagringen ble antatt å bli deklarert i et annet bibliotek. Dette speiler extern nøkkelordet i C.
Bokstaver kan spesifiseres med forskjellige suffikser, og de uten suffiks antas å være INTEGER . For eksempel, 1234 ville bli tolket som en INTEGER , mens det 1234D var en DOUBLE . E betegnet a REAL og L a LONG . Strengkonstanter ble avgrenset av doble anførselstegn, og doble anførselstegn innenfor en linje slapp unna med et annet dobbelt anførselstegn.
Variable deklarasjoner kan bruke konstanter til å definere en startverdi, som i INTEGER A:=10 . Legg merke til bruken av tildelingen til i stedet for er-a. I tillegg hadde SPL et EQUATE nøkkelord som gjorde det mulig å definere en tekststreng som en variabel, og erstattet deretter alle forekomster av den variabelen i koden med den bokstavelige strengen under kompilering. Dette ligner på const nøkkelordet i C.
Minne segmentering
Som vanlig i tiden brukte HP 3000 en byteorientert segmentert minnemodell der en adresse var et enkelt 16-biters ord, slik at koden fikk tilgang til opptil 65 536 byte (eller som de kalte det, "halvord" ). For å tillate større mengder minne å få tilgang til, ble et virtuelt minnesystem brukt. Når du fikk tilgang til minne, ble 16-biters adressen prefikset med en av to 8-biters segmentverdier, en for programkoden (PB) og en for variabel data. Resultatet var en 24-biters adresse. Dermed, mens hvert program hadde tilgang til totalt 128 kB til enhver tid, kunne det bytte segmentene for å få tilgang til hele 16 MB minne.
SPL inkluderte en rekke støttesystemer for å la programmene enkelt segmenteres og deretter gjøre den segmenteringen relativt usynlig i koden. Den primære mekanismen var å bruke $CONTROL SEGMENT=asegmentname kompileringsdirektivet som definerte hvilket segment følgende kode skulle plasseres i. Standard var MAINLINESEG , men programmereren kunne legge til et hvilket som helst antall ekstra navngitte segmenter for å organisere koden i blokker.
Andre funksjoner
SPL inkluderte en "bit-ekstraksjon" -funksjon som tillot forenklet bitfiddling . Enhver bit, eller streng av biter, i et ord kan nås ved hjelp av .(x:y) syntaksen, der x og y var start- og sluttbitposisjonene fra 0 til 15. Dermed A.(8:15) returnerte den nedre byten av ordet lagring A. Dette formatet kunne brukes å dele og slå sammen biter etter behov. I tillegg ble det gitt ytterligere operasjoner for skift og rotasjoner, og kan brukes på hvilken som helst variabel med & for eksempel A:=A & LSR(3) .
Eksempel
Dette enkle programmet, fra 1984-versjonen av referansehåndboken, viser de fleste funksjonene i SPL-språket.
Programmet som helhet er avgrenset mellom BEGIN og END. . Det begynner med definisjonen av en serie globale variabler, A, B og C, definerer en enkelt prosedyre og kaller den deretter tjue ganger. Merk at prosedyren ikke har et BEGIN og END av seg selv fordi den bare inneholder en linje med faktisk kode, X:=X*(Y+Z); det INTEGER X,Y,Z regnes ikke som en del av selve koden, det indikerer typen av de tre parametrene som sendes inn på linjen over og regnes som en del av den linjen.
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.
Referanser
Sitater
Bibliografi
- Edler, Christopher (november 1995). "The Strongest Castle: The Rise, Fall and Rise of the HP 3000" . Den analytiske motoren . 3 (1). ISSN 1071-6351 . Arkivert fra originalen 3. februar 2002.
- Green, Bob (2004). HP3000 Evolution . Robelle .
- Referansehåndbok for systemprogrammeringsspråk (PDF) . Hewlett Packard. Februar 1984.