Pascal è stato implementato per la prima volta per il CDC Cyber, un mainframe degli anni '60 e '70, che come molte CPU aveva eccellenti prestazioni di esecuzione delle istruzioni sequenziali, ma anche una significativa penalizzazione delle prestazioni per le filiali. Questa e altre caratteristiche dell'architettura Cyber hanno probabilmente influenzato pesantemente il design Pascal dei loop for
.
Il Risposta breve è quella che permette l'assegnazione di una variabile di ciclo richiederebbe codice di protezione supplementare e l'ottimizzazione incasinato per le variabili di loop che potrebbero normalmente essere gestiti bene in registri indice a 18 bit. A quei tempi, le prestazioni del software erano molto apprezzate a causa della spesa dell'hardware e dell'incapacità di accelerarlo in qualsiasi altro modo.
lungo risposta
La Control Data Corporation 6600 famiglia, che comprende la Cyber, è un'architettura RISC usando parole di memoria centrale 60-bit a cui fanno riferimento gli indirizzi a 18 bit. Alcuni modelli avevano un'opzione (costosa, quindi non comune), la Compare-Move Unit (CMU), per indirizzare direttamente i campi di caratteri a 6 bit, ma altrimenti non esisteva alcun supporto per "byte" di alcun tipo. Poiché la CMU non può essere calcolata in generale, la maggior parte del codice Cyber è stata generata per la sua assenza.Dieci caratteri per parola rappresentavano il solito formato di dati fino a quando il supporto per i caratteri minuscoli lasciava il posto a una tentativa rappresentazione di caratteri a 12 bit.
Le istruzioni sono lunghe 15 bit o 30 bit, eccetto che le istruzioni CMU hanno una lunghezza effettiva di 60 bit. Quindi fino a 4 istruzioni confezionate in ogni parola, o due 30 bit, o una coppia di 15 bit e una 30 bit. Le istruzioni a 30 bit non possono includere parole. Poiché le destinazioni dei rami possono fare riferimento solo alle parole, i target di salto sono allineati alle parole.
L'architettura non ha stack. In effetti, la procedura chiamata istruzione RJ
è intrinsecamente non rientranti. RJ
modifica la prima parola della procedura chiamata scrivendo un salto all'istruzione successiva dopo l'istruzione RJ. Le procedure richiamate tornano al chiamante saltando al loro inizio, che è riservato per il collegamento di ritorno. Le procedure iniziano con la seconda parola. Per implementare la ricorsione, la maggior parte dei compilatori ha utilizzato una funzione di supporto.
Il file di registro ha otto istanze ciascuna di tre tipi di registro, A0..A7 per la manipolazione degli indirizzi, B0..B7 per l'indicizzazione e X0..X7 per l'aritmetica generale. I registri A e B sono 18 bit; I registri X sono 60 bit. L'impostazione da A1 a A5 ha l'effetto collaterale di caricare il registro X1-X5 corrispondente con il contenuto dell'indirizzo caricato. L'impostazione A6 o A7 scrive il contenuto X6 o X7 corrispondente all'indirizzo caricato nel registro A. A0 e X0 non sono collegati. I registri B possono essere utilizzati praticamente in ogni istruzione come valore da aggiungere o sottrarre da qualsiasi altro registro A, B o X. Quindi sono grandi per i piccoli contatori.
Per codice efficiente, un registro B viene utilizzato per variabili di loop poiché è possibile utilizzare su di esse istruzioni di confronto diretto (B2 < 100, ecc.); i confronti con i registri X sono limitati alle relazioni a zero, quindi confrontare un registro X a 100, ad esempio, richiede la sottrazione di 100 e il test del risultato per meno di zero, ecc. Se è stata consentita un'assegnazione alla variabile di ciclo, un valore a 60 bit dovrebbe essere controllato da un intervallo prima di essere assegnato al registro B. Questa è una vera seccatura. Herr Wirth probabilmente ha pensato che sia la seccatura che l'inefficienza non valevano l'utilità - il programmatore può sempre usare un ciclo while
o repeat
... until
in quella situazione.
stranezza Ulteriori
Diversi unico-a-Pascal caratteristiche del linguaggio riguardano direttamente gli aspetti del Cyber:
- la parola
pack
: o un unico "personaggio" consuma una parola di 60 bit oppure è composto da dieci caratteri per parola.
- la (inusuale) Tipo
alfa
: packed array [1..10] of char
- procedure intrinseche
pack()
e unpack()
per affrontare con i caratteri confezionati. Questi non eseguono alcuna trasformazione sulle architetture moderne, solo la conversione del tipo.
- la stranezza dei file
text
rispetto a file of char
- nessun carattere di fine riga esplicito. La gestione dei record è stata esplicitamente invocata con
writeln
- Mentre
set of char
era molto utile su CDC, non era supportato su molte macchine successive a 8 bit a causa dell'eccesso di memoria utilizzata (variabili/costanti a 32 byte per ASCII a 8 bit). Al contrario, una singola parola Cyber poteva gestire il set nativo di 62 caratteri omettendo newline e qualcos'altro.
- valutazione di espressioni complete (rispetto alle scorciatoie).Questi sono stati implementati non saltando e impostando uno o zero (come fanno la maggior parte dei generatori di codice oggi), ma usando le istruzioni della CPU che implementano l'aritmetica booleana.
Questa è la migliore risposta fino ad ora – MaD70
"L'istruzione for viene usata quando il numero di iterazioni è conosciuto in anticipo" - Wirth 1973, The Programming Language Pascal (Rapporto rivisto) http://maben.homeip.net/static/S100/software/pascal/1973%20The%20Programming%20Language%20Pascal.pdf –