CDC NOS CCL
CYBER Control Language on Control Data's NOS operating system: the job-control language of IFE, WHILE, BEGIN and .PROC that turned punched-card control statements into something close to a scripting language on 60-bit Cyber mainframes.
Created by Control Data Corporation (no individual designer is credited in the manuals)
CDC NOS CCL is the CYBER Control Language as implemented on the Network Operating System (NOS), Control Data Corporation’s operating system for its 60-bit 6000-series, Cyber 70, Cyber 170 mainframes, and the later Cyber 180 machines running in their Cyber 170 state. On these machines a job was a sequence of control statements (NOS 2 manuals call them commands), one per card or line, such as GET,PROG. or FTN5,I=PROG. CCL added verbs that operate on that sequence itself. IFE and SKIP skip statements conditionally, WHILE and ENDW repeat a block, SET assigns values to registers, and BEGIN expands and runs a stored procedure. The result sat somewhere between a job-control language such as IBM’s JCL and a Unix shell script. For the computing centres, universities and laboratories that ran Cyber systems from the late 1970s into the 1990s, CCL procedures were the ordinary way to package a multi-step job as a single command.
History & Origins
The KRONOS control language
CCL did not appear from nowhere. KRONOS, the time-sharing system that NOS replaced, already had a small control language. Revision D of the KRONOS 2.1 reference manual (June 1975) describes it as statements “very similar to FORTRAN statements”: GOTO, SET, CALL, IF, DISPLAY, FILE and NUM, with FORTRAN-style expressions (.EQ., .AND. and so on) and symbolic names such as EF (previous error flag) and EM (exit mode). The manual singles out procedure files as “an important feature”: a group of control statements “which can be called much like a subroutine,” started with CALL or by naming the file.
NOS was released in 1975. Its first user manuals (the NOS 1 Application Programmers Instant, July 1975) list that same KRONOS set of control-language statements.
CYBER Control Language
The name “CYBER Control Language” and the structured verbs that go with it appear first on NOS/BE, CDC’s other Cyber operating system. Revision C of the NOS/BE Version 1 reference manual, dated 15 March 1977 and covering NOS/BE 1.2 at PSR level 447, adds a new section 5, “CYBER Control Language (CCL).”
NOS got CCL about a year later. The revision record of the NOS 1 Application Programmers Instant shows no CCL through the NOS 1.2 editions of January and July 1977. Revision E, dated 12 April 1978 and “revised to reflect NOS 1.3,” lists “CDC CYBER Control Language” among the added features. The NOS 1.4 edition of August 1979 lists BEGIN, IFE, ELSE, ENDIF, WHILE, ENDW, REVERT and .PROC next to the old KRONOS CALL, and marks the CCL-only features with “(CCL)”.
A note on the date. The encyclopedia master list gives 1976 for this entry. The manuals examined here do not support that: they show the KRONOS-derived control language in NOS from 1975, CCL on NOS/BE from March 1977, and CCL on NOS from NOS 1.3 in 1978. This page uses 1978, the year CCL itself reached NOS. A NOS source dated 1976 that mentions CCL would change that.
Design Philosophy
CCL was designed to fit an existing command stream, not to replace it. Every CCL statement is itself a control statement with the same shape as REWIND,TAPE1.: a verb, parameters separated by commas, and a terminating period. That design has consequences:
- Structured flow, not a new syntax. Blocks are delimited by label strings instead of nesting keywords:
IFE,expr,LABEL.is closed byENDIF,LABEL., andWHILE,expr,LOOP.byENDW,LOOP.The NOS 2 manual warns that WHILE labels should be unique within a job and that duplicates “can produce unpredictable results.” - The job’s own state is the data. Most of the useful values are symbolic names the system maintains: the error flag, the exit mode, the current time-sharing subsystem, the terminal page width, the operating system version. A procedure asks the system about itself instead of computing values.
- Procedures are macros first. A CCL procedure is expanded before it runs. Parameters are substituted textually into the procedure body to produce a command record, and that record is then executed. In NOS 2, the
.IFdirective controls what goes into the command record at expansion time, while theIFcommand decides what runs at execution time. The manual spends a good deal of space on this two-stage model.
Key Features
Conditional and iterative statements
| Statement | Purpose |
|---|---|
IFE,expr,label. (NOS 2: IF/IFE) | If expr is true, process the following statements; otherwise skip to the matching ELSE or ENDIF |
SKIP,label. | Skip unconditionally to the matching terminator |
ELSE,label. / ENDIF,label. | End or reverse a skip (NOS 2 also has ELSEIF) |
WHILE,expr,label. / ENDW,label. | Repeat the enclosed statements while expr is true |
SET,name=expr. | Assign a value to a settable symbolic name such as R1 |
DISPLAY,expr. | Evaluate an expression and write the result to the dayfile |
BEGIN,pname,pfile,params. | Expand and run procedure pname from file pfile |
REVERT. / REVERT,ABORT. | Return from a procedure, normally or with an error |
NOS 2 also has a one-line form, IF,expression.command., which runs or skips a single command.
Registers and symbolic names
In NOS 2, the settable names include three control registers R1, R2 and R3, which are local to a procedure: when a procedure reverts, they are restored to the values they had when it was called. R1G is a global register that keeps its value across calls, and there is a local error flag EF and a global error flag EFG. Read-only names report the environment, for example SS (the interactive subsystem), PW (page width), TIME, WEEKDAY and VERCCL, the CCL release level. Functions such as FILE(lfn,attribute), DT(lfn) (device type) and NUM(string) (is the string numeric?) query files and parameters.
This loop is the WHILE example from the NOS 2 System Commands manual. It repeats five times, writing R1 to the dayfile on each pass:
SET,R1=0.
SET,R2=5.
WHILE,R1.LT.R2,FINISH.
SET,R1=R1+1.
DISPLAY,R1.
ENDW,FINISH.
Procedures
A procedure begins with a .PROC header naming it and its formal parameters (keywords), optionally with default values. It is stored on a file and started with BEGIN. The following minimal example uses the formats documented in the NOS 1.4 Instant; it is an illustration, not copied from a manual:
.PROC,COPYIT,IN=OLDFILE,OUT=NEWFILE.
REWIND,IN.
COPYEI,IN,OUT.
REVERT.
Called with BEGIN,COPYIT,PROCFIL,IN=MAZE,OUT=TAXES., it expands to REWIND,MAZE. and COPYEI,MAZE,TAXES. The job’s dayfile then shows the expanded commands and a closing $REVERT.CCL line, as the NOS 2 manual’s own examples do. The NOS/BE manual also documents in-procedure directives: .DATA embeds data in the procedure, .EOR and .EOF write record and partition marks on that data, and .* adds comments that are not printed in the dayfile.
Interactive procedures (NOS 2)
NOS Version 2 turned procedures into interactive commands. Adding *I to the procedure name in the header makes the system prompt the terminal user for any required parameter that is missing or invalid. Adding *M makes it present a numbered menu of choices. Headers can attach checklists of acceptable values to each parameter. A help section of .HELP directives, closed by .ENDHELP, supplies text for ? requests; if there are no .HELP directives, the system generates help from the header. Later directives include .EX, which executes a command immediately and is mostly used for menu options, .SET, and a .WHILE/.ENDW pair that operates at expansion time.
Evolution
| Period | Release | Change (per CDC manual revision records) |
|---|---|---|
| 1975 | KRONOS 2.1, NOS 1.0 | KRONOS-style control language with CALL procedure files |
| March 1977 | NOS/BE 1.2 | CYBER Control Language introduced on NOS/BE |
| April 1978 | NOS 1.3 | CYBER Control Language added to NOS |
| April 1982 | NOS 2.0 | Parameter-prompting (*I) procedures |
| January 1983 | NOS 2.1 | Menu procedures (*M), new procedure directives |
| October 1983 | NOS 2.2 | Screen-mode input for procedures |
| 1984–1985 | NOS 2.3, 2.4.1 | Manual revisions list “NOS procedure enhancements” |
| April 1987 | NOS 2.5.2 | .SET directive; STR, STRB, STRD functions |
| April 1988 | NOS 2.6.1 | LVL function, able to report the CCL level |
The NOS 2 manuals also treat CCL as one part of a larger system. The flow-control commands have their own chapter, and procedures have a separate chapter covering headers, directives, parameter matching modes and help. By August 1994, the NOS 2 Installation Handbook (revision R, NOS 2.8.3 at PSR level 840) carried a Control Data Systems, Inc. copyright rather than Control Data Corporation’s. Its installation process still consists largely of running procedures from an INSTALL procedure file.
Current Relevance
CCL is a historical language. No vendor supports NOS, and Cyber hardware has long been out of production. The language can still be run, though. Wikipedia lists NOS 2.8.7 as the latest NOS release. DtCyber, Kevin Jordan’s derivative of Tom Hunter’s Desktop CYBER simulator (on GitHub since February 2021 and still updated in September 2026; Jordan is with the Nostalgic Computing Center), installs a working NOS 2.8.7 system on Windows, Linux, macOS or FreeBSD hosts. Parts of that system are written in CCL: its README describes the NETSEND and NETRECV utilities as “interactive CCL procedures” with context-sensitive help, and says the services of its NJMD message daemon are CCL procedures in the NJMDLIB library. For anyone exploring NOS today, reading and writing CCL procedures is part of using the system.
There is no Docker image; DtCyber, built from source, is the practical way to run CCL.
Why It Matters
CCL shows the step from job-control statements to a real command language, taken inside a mainframe batch environment instead of on a minicomputer. Within a job file that was still, conceptually, a deck of cards, it provided structured conditionals and loops, local and global registers with call-and-return semantics, parameterized procedures stored in libraries, and, by 1982–83, self-documenting commands that prompted for parameters and generated menus. Its label-matched IFE/ENDIF blocks and its expand-then-execute procedure model are specific to CDC. For the many scientific and university sites that used Cyber systems, CCL was the language used to automate everyday work on the machine.
Sources and Verification Notes
- KRONOS control language: KRONOS 2.1 Reference Manual Vol. 1, publication 60407000 revision D (17 June 1975), section “Control Language.” This page does not claim the facility existed in the July 1973 first edition, because that edition was not checked.
- NOS 1 dates: revision record of the NOS 1 Application Programmers Instant, publication 60436000 revision G (31 August 1979): revision A July 1975; revision E, 12 April 1978, NOS 1.3, adds CCL; revision G, NOS 1.4.
- NOS/BE dates: revision record of the NOS/BE Version 1 Reference Manual, publication 60493800 revision E (13 June 1978); CCL introduction text from revision C/D (August 1977).
- NOS 2 features and examples: NOS Version 2 Reference Set Volume 3, System Commands, publication 60459680 revision M (8 December 1989), including its revision record for revisions A–M.
- DtCyber: GitHub API (repository created 24 February 2021, last push 22 September 2026) and the repository’s NOS2.8.7/README.md for the NETSEND, NETRECV and NJMD claims.
- Installation procedures: NOS Version 2 Installation Handbook, publication 60459320 revision R (August 1994).
- Not verified: the exact release date of NOS 2.8.7 (Wikipedia gives none), the manual revision dates for NOS 2.3 and 2.4.1, and any single designer of CCL. The master list’s 1976 date could not be matched to any CCL documentation.
Timeline
Notable Uses & Legacy
NOS system installation
The NOS Version 2 Installation Handbook (revision R, August 1994, NOS 2.8.3) has the site analyst build products by running installation procedures from the INSTALL procedure file, and use procedures such as SYSGEN and MANLOAD to place files and load the online manuals
Batch job control on Cyber installations
CCL's purpose, as the NOS/BE manual puts it, is to conditionally skip or process control statements and to process and reprocess groups of them. That lets a single card deck or job file branch on the error flag, loop over a set of files, or call a shared procedure library with BEGIN
Interactive terminal commands
From NOS 2 on, procedures can prompt for parameters (*I) or display numbered menus (*M), with generated or hand-written .HELP text. Site-written procedures could therefore act as commands for terminal users, not just batch scripts
DtCyber NOS 2.8.7 network utilities
In the preservation system distributed with DtCyber, the NETSEND and NETRECV file-transfer utilities are implemented as interactive CCL procedures with context-sensitive help, and the NJMD message daemon's services, including an ECHO service, are CCL procedures kept in the NJMDLIB library