# Digital Command Language

DCL, die DIGITAL Command Language, ist die Standard-Kommandosprache des Betriebssystems OpenVMS, welches ursprünglich von der Firma Digital Equipment Corporation (kurz DEC) entwickelt wurde. Aktuell wird OpenVMS von VMS Software Inc. weiterentwickelt und vertrieben. Der erste Einsatz war unter dem Betriebssystem RSX-11.
Mit DCL lassen sich am Kommando-Prompt Aktionen ausführen, etwa zur Dateibe- und verarbeitung (ähnlich wie unter MS-DOS) oder zur Systemadministration, aber auch komplexe Kommandoprozeduren erstellen, die interaktiv oder im Batchbetrieb laufen können (vgl. Shellskripte unter Unix).

## Eigenschaften von DCL

DCL erlaubt die Erstellung von komplexen Kommandoprozeduren und ist somit durchaus für die Programmierung geeignet, jedoch sind DCL als Kommandosprache auch Grenzen gesetzt. Im Vergleich zu konventionellen Programmiersprachen weist DCL Vor- und Nachteile auf.
Die folgenden Punkte zählen für DCL.
* DCL ist auf jedem OpenVMS-System verfügbar.
* DCL-Kommandoprozeduren können schnell entwickelt werden. Der Programmierer muss keine Editieren/Kompilieren/Linken-Zyklen durchlaufen, da DCL eine interpretierte Sprache ist.
* DCL-Prozeduren können bei Bedarf schnell angepasst, verändert oder erweitert werden.
* DCL-Prozeduren können OpenVMS-Werkzeuge (englisch utilities) und andere Software-Produkte auf einfache Weise nutzen.
* Einige komplexe Aspekte der Programmierung für OpenVMS werden durch DCL signifikant vereinfacht, wie z. B. die Behandlung von Fehlern und Interrupts (soweit die Verarbeitung verhältnismäßig unkompliziert bleibt).
* Weniger erfahrene Programmierer können DCL-Prozeduren benutzen, um einzelne Blöcke einer umfassenderen Programmierung separat zu erstellen.
Die folgenden Punkte zählen zu den Grenzen von DCL.
* Eine DCL-Prozedur wird langsamer abgearbeitet als ein konventionelles, kompiliertes Programm, da eine DCL-Kommandoprozedur durch einen Interpreter ausgeführt wird. Dies kommt speziell zum Tragen, wenn die DCL-Prozedur sehr rechenintensive Kommandos (z. B. sehr viele arithmetische Operationen) durchführt. Es kommt weniger zum Tragen, wenn die Prozedur z. B. hauptsächlich Dateioperationen durchführt.
* DCL fehlen einige wichtige arithmetische Funktionen, wie z. B. die Unterstützung von Gleitkommazahlen.
* Fähigkeiten und Möglichkeiten zur Strukturierung von Daten, die wichtig für viele Software-Algorithmen sind, sind so gut wie nicht existent in DCL.
* DCL lässt einige Konstrukte moderner Programmierung vermissen, wie etwa WHILE- oder FOR-Schleifen. Diese müssen in DCL manuell nachgebildet werden.
* Nur einfache Benutzerschnittstellen können in DCL realisiert werden. DCL hat keine Unterstützung für Fenstertechniken oder andere graphische Darstellungen.
* Ein Programm kann von einer DCL-Prozedur nur aufgerufen werden, wenn es eine Kommandoschnittstelle (englisch command interface) bereitstellt, d. h. Codebibliotheken können von DCL aus nicht direkt genutzt werden.
* Die Flexibilität von DCL kann es als schwierig gestalten, eine Prozedur zu erstellen, die es einem weniger privilegierten Benutzer gestattet, ausgewählte Funktionen zu benutzen, zu denen der Benutzer nicht direkt autorisiert ist (englisch captive command procedures). Zum Beispiel akzeptiert das INQUIRE-Kommando nicht nur Eingaben, sondern kann auch zur Ausführung von lexikalischen Funktionen (englisch lexical functions) benutzt werden.
Als DCL in den 1970ern konzipiert wurde, konnte die weitere Entwicklung und Nutzung für die Erstellung komplexer Aufgaben nicht unbedingt vorhergesehen werden, so dass DCL in einigen Punkten nicht so strukturiert wie andere modernere Programmiersprachen erscheinen mag.

## Spezialitäten von DCL

DCL weist einige Besonderheiten im Vergleich zu anderen Kommandosprachen auf.

### Foreign Commands

In DCL ist es möglich (und üblich), sogenannte Fremdkommandos (englisch foreign commands) zu definieren. Über diesen Mechanismus können Benutzer, z. B. in ihrer Loginprozedur, eigene Kommandos oder abgewandelte Standardkommandos definieren.
Nach dieser Definition wird das neue Kommando FOO das Programm namens FOO.EXE aufrufen. Hierbei können optional auch Parameter an das Programm mit übergeben werden.
Hier wird das neue Kommando ST definiert, welches anschließend eine Kurzfassung des Kommandos zum Anzeigen der Zeit ist.
Hier wird das Standardkommando DELETE als foreign command so erweitert, dass standardmäßig die Optionen zum Nachfragen und Protokollieren mit angegeben sind. Der Stern bei der Definition regelt, ab welcher Position das Kommando auch in abgekürzter Form benutzt werden darf.

### Logical Names

Ein logischer Name (englisch logical name) ist eine benannte Entität, die kreiert und der ein Wert zugewiesen werden kann. Dieser Name (oder auch kurz Logical genannt) steht dann anschließend für diesen Wert in einem Kontext wie etwa einer Dateispezifikation. Innerhalb dieses Kontexts ersetzt OpenVMS automatisch den logischen Namen durch seinen Wert. Ein logischer Name ähnelt einem Symbol, allerdings unterscheiden sich die beiden Konzepte in wichtigen Punkten. Logische Namen werden in entsprechenden Tabellen (englisch logical name tables) gespeichert. Diese Tabellen können auf verschiedenen Ebenen verfügbar gemacht werden: einem einzelnen Prozess, einer Familie von Prozessen oder allen Prozessen im System. Daher können logische Namen – im Gegensatz zu Symbolen – von mehreren Prozessen (d. h. prozessübergreifend) genutzt werden. In einem VMS-Cluster können logische Namen sogar über Rechnergrenzen hinweg existieren.

## Erstellen von Kommandoprozeduren

Das Erstellen von Kommandoprozeduren in DCL erfolgt mittels eines Texteditors, der direkt vom DCL-Prompt aus aufgerufen werden kann.
Die Dateiextension für eine DCL-Datei lautet .com – diese Extension unter OpenVMS ist nicht zu verwechseln mit der gleichlautenden Extension unter DOS/Windows, die eine andere Bedeutung hat.

### LOGIN.COM

Üblicherweise wird eine spezielle Prozedur nach dem Login eines Benutzer automatisch ausgeführt. Diese Prozedur trägt in der Regel den Namen LOGIN.COM – dies kann pro Benutzer vom Systemadministrator (ggf. auch mit abweichendem Namen) festgelegt werden. In dieser DCL-Prozedur können entweder vom Benutzer selbst oder vom Systemadministrator wichtige Eigenschaften und Kommandos definiert werden, die für die Sitzung des Benutzers wichtig sind.

### Zeilenkennung

Skripte (bzw. Kommandoprozeduren) in DCL ähneln Skripten in anderen Sprachen, jedoch mit einigen Ausnahmen. Alle DCL-Kommandos in einer Kommandoprozedur müssen mit einem $-Zeichen beginnen. Andere Zeilen werden als Eingabe für ein Kommando gewertet (Selbst Zeilen, die mit THEN oder ELSE beginnen, erfordern das $-Zeichen).
Das folgende Beispiel demonstriert die Verwendung des TYPE-Kommandos, um einen Abschnitt auf dem Bildschirm darzustellen.

### Indirekte Referenzierung von Variablen

Es ist durchaus möglich, in DCL Arrays nachzubilden. Die einzelnen Elemente eines Arrays werden durch übersetzte Symbole referenziert. Diese Technik erlaubt es dem Programmierer, Datenstrukturen in dynamischer Größe zu erstellen, die ggf. die Daten selbst als Index benutzen.
In diesem Beispiel ist der Variablen regenbogenblau der Wert "rot" zugewiesen, der Variablen regenbogengruen der Wert "gelb".

### Lexikalische Funktionen

Mittels lexikalischer Funktionen (englisch lexical functions) ist es DCL möglich, Systeminformationen zu erhalten (etwa über den eigenen Prozess oder über ein Device (dt. Gerät)) und erweiterte Stringmanipulationen durchführen. Alle lexikalischen Funktionen beginnen mit f$.
Dieses Beispiel wird über die lexikalische Funktion f$user den Namen des aktuell angemeldeten Benutzers an der Konsole ausgeben.