RPG (linguaggio di programmazione)

Da Wikipedia, l'enciclopedia libera.
Template-info.svg

RPG oppure RPG IV è un linguaggio di programmazione nativo per minicomputer IBM della serie iSeries, denominata anche, più comunemente, AS/400. La sua versione più recente comprende l'uso di prototipi di funzioni e procedure, binding statico e dinamico dei dati, accesso a librerie di routine scritte in C, uso di funzioni contenute in DLL compilate a partire da altri linguaggi, e supporta totalmente codice dotato di sintassi ricorsiva e rientrante.

Cenni generali[modifica | modifica sorgente]

Un programma RPG inizia tipicamente con una File Specification, contenente la lista di tutti i file da scrivere, leggere o modificare, seguita da una Input Specification, con le strutture dei dati (data Structures) e le matrici. Segue la Calculation Specification che racchiude la parte più importante del programma, ed infine la Output Specification, usata, fra l'altro, per impostare l'aspetto dei report stampati.

Una delle modalità di funzionamento più caratteristiche del linguaggio è il cosiddetto ciclo (The Cycle): ogni programma RPG gira all'interno di un loop (letteralmente anello, cioè gruppo di istruzioni eseguite ciclicamente), che può essere usato, ad esempio, per esaminare uno alla volta tutti i record di un file. In alternativa il ciclo può ripetersi per un numero indefinito di volte, finché non viene interrotto dal verificarsi di un evento, oppure a seguito di un esplicito comando dell'utente. Altra caratteristica dell'RPG è che, molto più del COBOL e del FORTRAN, il modo in cui il codice è scritto è strettamente dipendente da come il testo è incolonnato. In altre parole anche gli spazi vuoti all'interno del codice devono avere un'esatta dimensione. Tutto questo era valido fino a qualche anno fa. Ultimamente il linguaggio si è evoluto e permette anche la scrittura in formato libero.

Cenni storici[modifica | modifica sorgente]

L'RPG è uno dei pochi linguaggi creati al tempo dei primi calcolatori a schede perforate che sono ancora oggi in uso. È stato originariamente sviluppato dall'IBM nel 1960 per il popolare calcolatore IBM 1401. All'inizio RPG era l'acronimo di "Report Program Generator", descrizione che spiegava bene lo scopo per cui era stato progettato: produrre report a partire da file di dati, compresa la funzione di ricerca di record e di calcolo di totali parziali. A quel tempo i linguaggi alternativi disponibili erano il COBOL ed il BASIC, il primo particolarmente ridondante, il secondo poco potente, così che l'RPG assunse una posizione dominante in ambito IBM. In seguito l'RPG fu perfezionato, sempre da IBM, per equipaggiare la propria serie di mainframe, in particolare il modello S390, prendendo il nome di RPG II.

La sintassi dell'RPG è nata per emulare la configurazione dei pannelli di programmazione a spinotti dei primi calcolatori; poiché il Sistema 3 è stato inizialmente sviluppato come successore di questi tipi di calcolatore, l'RPG II è stato adattato ai modelli System 3, System 32, System 34, e System 36, mentre una versione ulteriormente migliorata, l'RPG III, è stata creata appositamente per il System 38 ed il suo successore AS/400, un minicomputer ora evolutosi a sua volta nelle serie E-Server ed iSeries. Questa versione è denominata anche RPG/400, dotata di una sintassi molto più lineare e leggibile e di maggiore efficienza in lettura di file e database, è stata la base per lo sviluppo dell'AS 400, ed il suo editor è semplicemente basato sulla modifica delle linee di programma, con la presentazione immediata di template corrispondenti ai vari tipi di istruzioni da inserire.

l'RPG III è notevolmente più evoluto rispetto alla versione iniziale, comprendendo costrutti strutturati di tipo più moderno, come blocchi IF-ENDIF, loop inizializzati dal DO, e possibilità di scrivere subroutine.

Nel 1998 è stato rilasciato l'RPG IV, conosciuto anche come RPG/LE oppure RPG/ILE. Notare come il nome del linguaggio ha perso il significato iniziale, come dichiarato ufficialmente dalla stessa IBM. Questa versione offre ai programmatori la possibilità di scrivere codice in formato più libero, cioè non vincolato da un rigido incolonnamento delle parole chiave, ed un set di istruzioni molto più ricco, definito Extended Calculation Specification. L'RPG è così strettamente correlato alle API del sistema operativo OS/400 che praticamente tutti gli oggetti software sono trattati come se fossero file (qualcosa di analogo alla filosofia alla base di Unix). Il contenuto visualizzato sui display dei terminali, suddiviso in sotto-finestre, è aggiornato semplicemente scrivendo su un file, con un'istruzione tipo: *DISPLAY.

Esempio di codice[modifica | modifica sorgente]

Il programma seguente riceve come parametro di input il numero di codice di un cliente e ne restituisce il nome e l'indirizzo nei parametri di output:


      * Tradizionalmente l'RPG richiede di rispettare l'incolonnamento; solo in alcuni casi
      * è permesso formattare il codice liberamente.  
      * L'azione eseguita dalle varie istruzioni è codificata da una lettera 
      * nella colonna 6.
      * Un asterisco (*) nella colonna 7 indica che la riga contiene solo un commento.

      * "F" (file) è usato per definire files o altri dispositivi di I/O
     FARMstF1   UF   E             Disk    Rename(ARMST:RARMST)

      * "D" è usato per definire le variabili
     D pCusNo          S              6p 0
     D pName           S             30a
     D pAddr1          S             30a
     D pAddr2          S             30a
     D pAddr3          S                   Like(pAddr2)
     D pCity           S             25a
     D pState          S              2a
     D pZip            S             10a

      * "C" (calculation) è usato per indicare le righe che contengono i comandi.
      * I parametri sono denominati usando gli identificatori "plist" e "parm" 
     C     *entry        plist
     C                   parm                    pCusNo
     C                   parm                    pName
     C                   parm                    pAddr1
     C                   parm                    pAddr2
     C                   parm                    pCity
     C                   parm                    pState
     C                   parm                    pZip

      * Il comando "chain" è usato per accedere in modo random ad un file indicizzato.
     C     pCusNo        chain     ARMstF1

      * Se il record è trovato, il contenuto dei suoi campi viene trasferito all'output.
     C                   if        %found
     C                   eval      pName  = ARNm01
     C                   eval      pAddr1 = ARAd01
     C                   eval      pAddr2 = ARAd02
     C                   eval      pCity  = ARCy01
     C                   eval      pState = ARSt01
     C                   eval      pZip   = ARZp15
     C                   endif
       
      * l'RPG utilizza gli "indicators" ("indicatori" in italiano), che possono assumere 
        lo stato di ON/OFF. 
        Quelli normalmente usati dal programmatore sono identificati con un numero (da 01 a 99).
        Ne esistono altri, definiti "speciali" che servono per : 
        .comunicare con l'esterno ("indicatori esterni" - da U1 a U8)
        .segnalare errori (in modo primitivo - da H1 a H9)
        .segnalare il cambio del contenuto ("rotture") di campi definiti "di livello" 
         (automaticamente, da parte dell'RPG - da L1 a L9) (*@)
        .segnalare la corrispondenza ("matching") di campi definiti "di confronto" 
         (automaticamente, da parte dell'RPG - da M1 a M9 + MR) (*@)
        .segnalare l'emissione della prima pagina (comunemente usato anche come segnalazione 
         di inizio programma - 1P) (*@)
        .segnalare il raggiungimento della riga di overflow (fine foglio - da OA a OG + OV) (*@)
        .segnalare il termine del programma (automaticamente da parte dell'RPG, quando viene 
         rilevata la fine di un flusso quando letto in modalità sequenziale - "Last Record", LR) (*@) 
        .etc
        
        (*@) Vengono gestiti direttamente dall'RPG (sono conseguenza dell'automazione messa a 
         disposizione dell' RPG stesso) ma possono venir attivati anche dal programmatore.


      * L'esecuzione è terminata.
     C                   eval      *InLR = *On
 

Collegamenti esterni[modifica | modifica sorgente]