Kontrollspråk
Paradigm | nödvändigt |
---|---|
Designad av | IBM |
Utvecklare | IBM |
Dök först upp | 1978 |
OS | Control Program Facility , IBM i |
Licens | Proprietär |
Influerad av | |
Job Control Language , PL/I | |
påverkade | |
Windows PowerShell |
Kontrollspråket ( CL ) är ett skriptspråk som ursprungligen skapades av IBM för System/38 Control Program Facility och senare används i OS/400 (nu känt som IBM i) . Det har en likhet med IBM Job Control Language och består av en uppsättning kommandoobjekt (*CMD) som används för att anropa traditionella program eller få hjälp med vad dessa program gör. CL kan också användas för att skapa CL-program (kongruenta med skalskript ) där det finns ytterligare kommandon som ger programliknande funktionalitet (IF/ELSE, variabeldeklaration , filinmatning, etc.)
Även om CL är ett skriptspråk för systemadministration, används det främst för att skapa kompilerade program. Användningen av tolkade CL-skript genom kommandot SBMDBJOB är i själva verket extremt begränsad.
Medan tusentals kommandon skrevs av IBM-utvecklare för att utföra uppgifter på systemnivå som att kompilera program, säkerhetskopiera data, ändra systemkonfigurationer, visa systemobjektdetaljer eller ta bort dem, är kommandon inte begränsade till problem på systemnivå och kan utformas för användarapplikationer också.
Kommandon och program
Parametrar ( kommandoradsargument ) definierade i huvudprocedurerna för alla traditionella System/38- och AS/400-program är hårdkodade listor som är uppbyggda av parametrar som kan vara numeriska, alfanumeriska, booleska, etc. och i vilken ordning parametrarna godkänts är viktigt. Detta är en skarp skillnad från Unix- och DOS -världarna där parameterlistan i Unix-skalskript och C-program är en uppsättning eller en uppsättning teckenpekare och oftare än inte är parametrarna inte positionsberoende.
Utvecklarens lösning på detta problem var kommandoobjektet (*CMD). Medan parametrarna på kommandot kan specificeras i valfri ordning, är varje parameter definierad för att skickas i en specifik ordning till programmet. Programmeraren kan också definiera bland annat parameterns datatyp , unika parameternamn, beskrivande text (för prompt), standardvärde (används endast om parametern inte specificeras under exekvering), om värdena är begränsade till en viss set eller range, om den inmatade datan ska ändras till ett annat värde innan programmet anropas osv.
Som mest grundläggande namnger ett kommando ett enda program som ska anropas när användaren skriver eller frågar kommandot och trycker på Enter-tangenten. Kommandot tar alla parametrar som skrivits av användaren, och de som inte skrivits av användaren, och bygger en parameterlista som det skickar till programmet när det anropas.
Syntax
BNF för en mycket förenklad CL-kommandosyntax skulle definieras enligt följande :
< CL-kommando > ::= kommandonamn [ < positional-parameter-list > ] [ < named-parameter-list > ] < positional-parameter-list > ::= < parameter-värde > [ < positional-parameter- list > ] < named-parameter-list > ::= parameter-name "(" < parameter-element-list > ")" [ < named-parameter-list > ] < parameter-element-list > ::= < parameter -värde > [ < parameter-element-lista > ] < parameter-värde > ::= CL-namn | kvalificerat-CL-namn | "*"speciellt värde | generiskt-CL-namn"*" | "'"alfanumeriskt värde"'" | numeriskt värde | "X'"hexadecimalt värde"'"
Objekten ovan som slutar på -name följer objektnamnkonventioner , vilket generellt sett betyder att namnet börjar med en bokstav och kan vara upp till tio tecken långt. (CL-kommandon är också skiftlägesokänsliga.)
Ett bra exempel på ett typiskt CL-kommando är kommandot Change Program (CHGPGM) nedan:
CHGPGM MYPGM OPTIMIZE(*FULL) RMVOBS(*BLKORD *PRCORD) TEXT('Mitt program.')
Kommandot ovan skickar fyra parametrar till programmet som bearbetar Change Program och de är:
- MYPGM: En positionsparameter (PGM) och den enda parameter som krävs. I det här fallet är det namnet på programmet som ändras. Positionsparametrar är alltid först. När en namngiven parameter dyker upp måste alla parametrar som följer vara namngivna parametrar.
- OPTIMIZE(*FULL): En namngiven parameter som anger ett enskilt element som är ett speciellt värde. I det här fallet kommer programmet att ändras så att det blir helt optimerat.
- RMVOBS(*BLKORD *PRCORD): En namngiven parameter (Remove Observability) som anger flera specialvärden. I det här fallet säger du åt den att ta bort två typer av profileringsdata från programmet.
- TEXT('Mitt program.'): En annan namngiven parameter som anger ett enda alfanumeriskt värde. I det här fallet är det att ändra den beskrivande texten i programmet.
I verkligheten kommer systemet att passera många fler parametrar än de fyra specificerade ovan. Detta beror på att resten av CHGPGM-kommandots parametrar inte specificerades, så standardvärden skickas istället. För varje parameter på denna, förutom PGM-parametern, är den standardinställningen *SAME , vilket betyder att den inte ändras.
Uppmaning
Alla CL-kommandon kan begäras direkt från kommandoraden eller inom CL-programkällan genom att skriva kommandot och trycka på funktionstangenten F4 . Ett OS/400-kommando kan också uppmanas genom att skriva ett ? före kommandot. (Detta är användbart i ett interaktivt program som visar en kommandosträng som redan har fyllt i vissa värden.)
Systemet kommer då att visa en skärm med den uppsättning parametrar som programmet accepterar/kräver (obligatoriska parametrar är vanligtvis markerade).
Nödvändiga parametrar listas först och parametrar med systemlevererade standardvärden listas sist av alla. För att se alla parametrar, tryck på F10. Om något val kräver ytterligare val, visas dessa när du väljer det värdet för den parametern, genom att visas på skärmen.
Frågan förbättras ytterligare för att låta programmeraren hitta vilka värden som är giltiga för varje parameter. För att göra detta under prompten flyttar användaren markören till det aktuella parameterfältet och trycker på F4 igen. Systemet skulle sedan visa en skärm som beskriver vilken typ av inmatning som krävs och en tillgänglig lista över tillåtna värden.
För att ange ett längre namn, eller utöka listan så att du kan ange extra värden, skriv ett plustecken istället för ett värde. (Som när du listar namn på objekt som ska sparas eller återställas.)
Kommando hjälp
Markörkänslig hjälp kan också tillhandahållas på kommandon men det är inte nödvändigt. Om hjälp har tillhandahållits kan man visa hjälp för en parameter genom att flytta markören till önskat parameterfält och trycka på F1 (hjälp). För att få hjälp med hela kommandot i sig (och alla dess parametrar) skulle användaren trycka på F1 var som helst på displayen och sedan trycka på F2 (utökad hjälp).
Skapa nya kommandon
Nya kommandon kan skapas för att anropa icke-systemprogram och de kommer att fungera precis som den inbyggda varianten. Kommandodefinitionsspråket beskrivs i CL Programmer's Guide .
Det är en bra idé att skapa hjälpskärmar för nya kommandon och deras parametrar. Alla hjälpskärmar använder panelgruppobjekt (*PNLGRP) och dessa kan skapas med hjälp av UIM-språket som beskrivs i IBM AS/400 Application Display Programming manual .
Med början i V5R3 av operativsystemet lades en ny, mycket enklare metod för att skapa hjälp till: kör kommandot
GENCMDDOC CMD(MYLIB/MYCMD) TODIR('/QSYS.LIB/MYLIB.LIB/QPNLSRC.FILE) GENOPT(*UIM)
En skelett UIM-panelgrupp genereras automatiskt inklusive alla parametrar som beskrivs av kommandot. Resultatfilen kan redigeras (seu, wdsc, rdi), sedan kompileras med kommandot CRTPNLGRP och slutligen associeras med kommandot via CHGCMD HLPPNLGRP().
Att hitta rätt kommando
Det finns 2 262 inbyggda IBM-kommandon i V7R3, men det är inte så svårt att hitta dem på grund av flera konstruktioner av systemet som gör livet enklare. Dessa arbetsbesparande design är: Standardiserade förkortningar, Kommandogrupperingsmenyer och Kommandoval.
Standardiserade förkortningar
IBM-utvecklarna standardiserade förkortningarna som användes för att skapa kommandonamn. Verb som förändring renderas alltid som CHG , visas som DSP , fungerar som WRK , skapa som CRT , etc. Ämnen som program är alltid PGM , användare är USR , modul är MOD , server är SVR , etc. Du kan se alla möjliga verb och ämne som används i systemet i menyerna VERB och SUBJECT , skriv bara in kommandona GO VERB eller GO SUBJECT.
På samma sätt förkortades "Control Language Programming" CLP, och källtypen var följaktligen CLP. Med introduktionen av ILE-programmeringsmodellen ändrades källtypen till "CLLE".
VERB- och SUBJECT-menyerna är en del av vad som kallas kommandogrupperingsmenyerna. För varje tre (eller fyra) bokstäverförkortning finns det en meny tillägnad den som börjar med bokstäverna CMD . Så för att se alla CHG- kommandon skulle användaren utföra kommandot GO CMDCHG. För programkommandon skulle menyn vara CMDPGM.
Det finns andra menyer förutom kommandogrupperingsmenyerna. Startpunkten för menysystemet kan nås genom att trycka på F4 på en tom kommandorad.
Kommandoval
Om man bara känner till en del av ett kommando eller om programvara från tredje part används där kommandona inte överensstämmer med AS/400-förkortningsstandarden så skulle du ange den del av kommandot som är känt, bifoga en asterisk (för att göra det generisk) och tryck på enter. Systemet kommer sedan att visa en lista med kommandon i jobbets bibliotekslista som matchar de generiska namnen som just skrivits. Man kan sedan bläddra igenom listan och leta efter kommandot som behövs och sedan välja det med alternativ 1.
I bakgrunden använder systemet kommandot SLTCMD för att utföra denna funktion. Om man vill välja alla kommandon i ett bibliotek , fråga då detta kommando och ange specialvärdet *ALL.
Exempelkod
Följande är ett exempel på CL-programmering. Programmet konverterar interaktivt datum från Julian till MDY och vice versa. Resultaten visas på rad 24 i terminalen. Den accepterar två parametrar. &IN -
parametern som är datumsträngen som ska konverteras. Om en juliansk sträng ska den vara i formatet YYNNN där YY är årtalet och NNN är årets dagnummer. Om en MDY-sträng måste den vara i formatet MMDDYY. Den andra parametern är &TYP
som är den typ av datum som ska konverteras till. Det måste vara 'J' (Julian) eller 'M' (MDY). Till exempel: kommandot CALL PGM(ICVTDATC) PARM('04180' 'M')
kommer att konvertera det julianska datumet 04180 till 062804 (28 juni 2004).
PGM (&IN &TYP) DCL &IN *CHAR 6 DCL &OUT *CHAR 8 DCL &TYP *CHAR 1 IF (&TYP = J) + DO CVTDAT DATE(&IN) TOVAR(&OUT) FROMFMT(*MDY) + TOFMT(*JUL) TOSEP( *NONE) ENDDO ELSE IF (&TYP = M) + DO CVTDAT DATE(&IN) TOVAR(&OUT) FROMFMT(*JUL) + TOFMT(*MDY) TOSEP(*NONE) ENDDO SNDPGMMSG MSG('IN=' || &IN | | ' OUT=' || &OUT) + MSGTYPE(*COMP) ENDPGM