1.1        CUPL

linguaggio didattico scientifico

CUPL è un linguaggio prodotto presso la Cornell University nel 1966 a scopi didattici per IBM/360.

Il linguaggio ha un solo tipo di dato, numeri floating point lunghi, strutturabili come scalari, vettori e matrici.

La struttura del linguaggio è semilibera, nel senso che l’unico vincolo è che ciò che inizia nella prima colonna è considerato una etichetta (label).

Dato l’orientamento scientifico di CUPL, oltre alla presenza delle più comuni funzioni, vi sono funzioni per operare su matrici (DET(mat) determinante, DOT(mat1,mat2) prodotto di matrici, INV(mat) inverso di una matrice, ecc…).

Il linguaggio è dotato di assegnazione (LET variabile = ...), salto di programma ( GO TO label), condizionale (IF condizione THEN istruzioni ELSE istruzioni), in cui condizione è una semplice relazione fra due dati, o più relazioni connesse tramite AND o OR.

Le iterazioni sono controllate dall’istruzione PERFORM label ... che esegue il blocco di istruzioni compreso fra la riga contenente label BLOCK e la riga contenente label END; la tabella sottostante contiene i vari tipi di PERFORM.

PERFORM label

Esegue il blocco label BLOCK ... label END

PERFORM label n TIMES

Esegue il blocco label BLOCK ... label END n volte

PERFORM label WHILE relazione

Esegue il blocco label BLOCK ... label END fintanto che relazione è verificata

PERFORM label FOR variab = da TO finoa BY incremento

Esegue il blocco label BLOCK ... label END fino a che variab raggiunge finoa

READ e WRITE permettono l’input e l’output dei dati, in particolare READ è associato alla pseudoistruzione *DATA posta in fondo al sorgente del programma che segnala l’inizio dei dati[1]. Il sorgente esposto è stato generato da un programma Icon (v. par. 1.36 ) che ha interpretato un sorgente in linguaggio IT (v. IT par. 1.38 ). Il programma “verifica” limx→0 sen(x)/x = 1, segnalando i vari rapporti, al decrescere di x.

CUPL and CORC for UNIX by Eric S. Raymond

COMMENT PROGRAMMA CUPL CHE INTERPRETA PROGRAMMA IT source.it

        LET C10 = 0.5

        LET C11 = 0.4

LAB3    LET C2 = 0.

        PERFORM LAB19 FOR C1 = C10 BY -0.01 TO C11

LAB19   BLOCK

        LET Y1 = SIN(C1)

        LET C2 = C2 + (C1 - Y1)

        LET Y4 = Y1 / C1

        WRITE Y4

LAB19   END

        WRITE C2

        LET C10 = C10 - 0.1

        LET C11 = C11 - 0.1

        IF C10 = 0.4 THEN       GO TO LAB3

        STOP

Nel risultato dell’elaborazione qui riportato, Y4 è il rapporto sen(x)/x e C2 contiene la somma di xi-sen(xi); il ciclo è effettuato due volte.

               Y4 =          0.958851077

               Y4 =          0.960460996

               Y4 =          0.962039949

               Y4 =          0.963587841

               Y4 =          0.965104580

               Y4 =          0.966590076

               Y4 =          0.968044239

               Y4 =          0.969466982

               Y4 =          0.970858222

               Y4 =          0.972217873

               C2 =          0.157189423

               Y4 =          0.973545856

               Y4 =          0.974842090

               Y4 =          0.976106498

               Y4 =          0.977339005

               Y4 =          0.978539537

               Y4 =          0.979708021

               Y4 =          0.980844389

               Y4 =          0.981948571

               Y4 =          0.983020502

               Y4 =          0.984060118

               C2 =          0.075529983

 

1.1.1             CUPL per i PLD ATMEL

CUPL è un HDL (Hardware Description Language) per programmare I PLD (Programmable Logic Device) ATMEL.

1.1.2             CORC

CORC (CORnell Compiler) è un predecessore di CUPL (1962), di cui ne è un sottoinsieme con piccole differenze nelle parole chiavi, realizzato da Richard Conway e William Maxwell. Lo scopo di CORC era di disporre di un semplice linguaggio per calcoli scientifici.

E’ stato sviluppato inizialmente su Burroughs 220, successivamente su CDC 1604 della Control Data Corporation, infine divenne CUPL (1966) su  IBM System/360. Lo sviluppo privilegiò la robustezza del linguaggio

Accetta tipi di dato numerici, organizzabili in matrici fino a due dimensioni. Variabili e matrici devono essere dichiarate, ed eventualmente inizializzate, in testa al programma; il sorgente del programma ha una struttura fissa, ad esempio il carattere che indica la continuazione è posto in colonna 21 ed il seguito inizia  a colonna 42.

Il linguaggio dispone delle più comuni funzioni matematiche e trigonometriche, compresa la generazione di numeri pseudo casuali ed il calcolo del massimo e minimo di una serie di valori o espressioni, l’assegnazione è LET variabile = ..., il salto di programma è GO TO label, l’istruzione condizionale è IF condizione THEN GO TO label ELSE GO TO label, in cui condizione è una relazione fra due dati, o più relazioni connesse tramite AND o OR (non mescolati); gli operatori di confronto sono EQL, NEQ, LSSLEQ, GTR e GEQ.

Le iterazioni sono gestite tramite l’istruzione REPEAT label ..., con alcune varianti, che esegue il blocco di istruzioni compreso fra la riga contenente label BEGIN e la riga contenente label END.

REPEAT label espressione TIMES

REPEAT label UNTIL relazione

REPEAT label FOR variab = e1, e2, ... (ei,ej,ek),...

La versione REPEAT ... FOR è piuttosto sofisticata, potendosi indicare i valori per cui eseguire il ciclo e anche sequenze di valori caratterizzate da un valore iniziale, un incremento della variabile e dal valore finale.

L’input output è realizzato da READ e WRITE, i commenti sono introdotti col comando NOTE.

Qui di seguito un esempio di programma Corc che calcola la radice cubica col metodo di Newton. .

TITLE corc Cube Root with Newton method

Y 1.0

N 1000.0

DIFF 0

CICLO BEGIN

      LET Y = ((N/(Y * Y))+ 2 * Y)/3

CICLO END

ROOTLOOP

NOTE Compute next value

REPEAT CICLO 1 TIMES

NOTE Compute absolute value of difference

LET DIFF = Y * Y * Y - N

IF DIFF GEQ 0 THEN GO TO POSITIVE

LET DIFF = -DIFF

POSITIVE

IF DIFF GEQ 0.001 THEN GO TO ROOTLOOP

WRITE N," ",Y

Il programma è stato interpretato da TXL (v. Txl par. 1.105 ) che ha generato un sorgente in elastiC (v. elastiC par. 1.26 .

1.1.3             CLP

CLP (Cornell List Processor) è una estensione di CORC per simulazione ispirato al SIMSCRIPT, con l’implementazioni quali  l’accesso ai nastri magnetici e istruzioni per generare reports. CPL introduce un nuovo tipo di dato, detto entity, le cui caratteristiche principali sono la creazione dinamica e l’appartenerenza a differenti insiemi, dette liste. Ci sono inoltre,istruzioni per generare nuove occorrenze di entity (LET I = NEW CAR), per cancellarle, per inserirle in liste (INSERT CAR(I) FIRST ON STREET). Anche l’istruzione REPEAT è stata adattata per operare sulle liste. Qui a lato una serie di  semplici istruzioni, interpretate da un programma elastiC (v. elastiC 1.26 ).

LET I = NEW CAR

LET J = NEW CAR

LET K = NEW CAR

LET L = NEW CAR

INSERT CAR(J) ON LANE

INSERT CAR(K) ON LANE

INSERT CAR(I) ON REPAIR

INSERT CAR(L) ON LANE

REMOVE CAR(J) FROM LANE

 

 



[1] Si ricordi che all’epoca i programmi, e spesso i dati, erano su schede perforate, e quindi era del tutto naturale avere in un solo pacco di schede programma e dati.