MPL (programspråk)
Från Rilpedia
MPL, Module Procedure Language, är ett programspråk för administrativa tillämpningar.
Språkmiljön kännetecknas av plattformsoberoende genom interpretering liknande Java. De så kallade modulerna länkas inte på traditionellt sätt, utan kan installeras under drift. Språket är inte i första hand ägnat avancerade beräkningar, eller att beskriva grafiska användargränssnitt. MPL passar bättre att beskriva applikationslogik, och har deskriptiv definition av databastabeller och enklare användardialog. Språket är i grunden proceduruppbyggt, men har vissa enklare objektorienterade tillägg.
Innehåll |
Syntax
Syntaxen liksom namnet utgår från PL/1.
Fungerande program byggs upp av klasser, procedurer, tabelldefinitioner och definitioner av användardialog, s k format. Klasserna är av enklare slag, men medger ändå en objektorienterad struktur på programkoden.
Elementära datatyper finns för strängar av fast längd, decimaltal med deklarerat antal decimaler, binära heltal, och datum.
Databaslagring definieras enligt en allmän relationsmodell, och tillåter användning av flera olika databasfabrikat utan förändring av programmen. Det senare förutsätter dock att håller sig till en standardiserad instruktionsuppsättning.
Formaten kan definiera användardialog för användning i client-server arkitektur, men är inte relevanta när man använder webteknologi.
Exekveringsmiljön
MPL beskriver moduler som kompileras till intermediärkod, liknande byte-code i Java, eller P-kod i Pascal. Denna interpreteras och kan flyttas mellan olika typer av system. Installation i det aktiva modulförrådet kan ske under drift; det är först vid anrop mellan klasser och procedurer bindning etableras, även om korrekthet i gränssnitten kan kontrolleras redan vid kompileringen. Detta är givetvis en fördel i miljöer med höga krav på tillgänglighet.
Intermediärkoden är binärkompatibel mellan olika miljöer; den kan helt enkelt flyttas från ett modulförråd till ett annat, även om det hanteras av en helt annan processertyp.
Den interpreterade exekveringsmiljön hanterar även olikheter som finns i olika databassystem, samt tillåter att man använder klienter för olika miljöer som Windows, Macintosh och Linux.
Programexempel
Hello world
"Hello, World!" med utskrift på operatörsconsole:
HELLO: procedure; put console "Hello World!"; end;
"Hello, World!" visad i dialog för användaren
hello: procedure; declare OUTSTRING CHAR(30); OUTSTRING = "Hello World!"; alert_info(OUTSTRING); end;
Artikelregistrering
Enkel registrering av artiklar.
Förutsättning: en databastabell är definierad med namnet PRODTBL med primärnyckel PROD_ID, och två format; ett för val av prod-id, och ett för registrering av diverse termer för artikeln. Dessa har samma namn i databastabellen och i formatet, och binds på så vis av exekveringsmiljön för automatisk överföring.
PRODMAINT: procedure; declare PRODTBL record; declare PRODIDFORM,PRODDATAFORM format; do forever; if #(get PRODIDFORM) then exit PRODMAINT; // user leaves program if #(read PRODTBL) then do; // not in database PROD_NAME = "<noname>"; PROD_CATEGORY=""; PROD_PRICE = 0; PROD_CREATED = DAYNO; // today ... end; put PRODDATAFORM; // show product info if (get PRODDATAFORM) then do; // get user changes begtran standard "PRODTRAN"; write PRODTBL; // Save changes to database eotran "PRODTRAN"; // commit changes end; end; // forever end; // procedure
Databashanteringsklass
PR011: class; #include STD_CONSTANTS declare LOCK_READ fb(15); // used as boolean, to lock for reading construct: method; LOCK_READ = FALSE; end; LOCK_TBL: method( DOLOCK fb(15) 'TRUE or FALSE' ); LOCK_READ = DOLOCK; end; FETCH_CATEG: method( CATEG char(20) 'Selected category', RET_ID(40) char(10) 'Array of returned IDs', RET_NAME(40) char(30) 'Array of returned Names' ); declare I fb(15); declare PRODTBL record; RET_ID=""; RET_NAME=""; if LOCK_READ then exit FETCH_CATEG; begtran adlib "FETCHPROD"; PROD_CATEGORY = CATEG; // set first category to select read open PRODTBL using CATEGORY(CATEG); // select all rows until PROD_CATEGORY=CATEG do I=1 to 40; if #(read fetch PRODTBL) then exit; // exit loop when no more data RET_ID(I) = PROD_ID; RET_NAME(I) = PROD_NAME; end; eotran "FETCHPROD"; // closing database cursor end; end;