MPL (programspråk)

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.

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;

Programspråk