Job Control Language ( JCL ) — это язык сценариев, используемый в операционных системах мэйнфреймов IBM для указания системе, как запустить пакетное задание или запустить подсистему. [1] Цель JCL — указать, какие программы запускать, какие файлы или устройства [2] использовать для ввода или вывода, а иногда также указать, при каких условиях следует пропустить шаг. Параметры в JCL также могут предоставлять учетную информацию для отслеживания ресурсов, используемых заданием, а также на какой машине задание должно выполняться.
Существует два различных языка управления заданиями IBM:
Они разделяют некоторые основные правила синтаксиса и несколько основных концепций, но в остальном они очень разные. [3]
Операционная система VM не имеет JCL как такового; компоненты CP и CMS имеют командные языки .
Некоторые слова или фразы, используемые в сочетании с JCL, характерны для технологии мэйнфреймов IBM.
Первоначально мэйнфреймовые системы были ориентированы на пакетную обработку . Многие пакетные задания требуют настройки с особыми требованиями к основному хранилищу и выделенным устройствам, таким как магнитные ленты , частные дисковые тома и принтеры, настроенные с помощью специальных форм. [8] JCL был разработан как средство обеспечения доступности всех требуемых ресурсов до того, как задание будет запланировано для запуска. Например, многие системы, такие как Linux, позволяют указывать требуемые наборы данных в командной строке , и, следовательно, подлежать замене оболочкой или генерироваться программой во время выполнения. В этих системах планировщик заданий операционной системы имеет мало или вообще не имеет представления о требованиях задания. Напротив, JCL явно указывает все требуемые наборы данных и устройства. Планировщик может предварительно выделять ресурсы до того, как выпустить задание для запуска. Это помогает избежать « взаимной блокировки », когда задание A удерживает ресурс R1 и запрашивает ресурс R2, в то время как одновременно выполняемое задание B удерживает ресурс R2 и запрашивает R1. В таких случаях единственным решением для оператора компьютера является завершение одного из заданий, которое затем необходимо перезапустить. При управлении заданиями, если запланировано выполнение задания A, задание B не будет запущено до тех пор, пока задание A не завершится или не освободит требуемые ресурсы.
Для DOS и OS единицей работы является задание . Задание состоит из одного или нескольких шагов, каждый из которых представляет собой запрос на запуск одной конкретной программы. Например, до появления реляционных баз данных задание по созданию печатного отчета для руководства могло состоять из следующих шагов: написанная пользователем программа для выбора соответствующих записей и копирования их во временный файл; сортировка временного файла в требуемом порядке, обычно с использованием утилиты общего назначения; написанная пользователем программа для представления информации в удобном для чтения конечным пользователям виде, включающей другую полезную информацию, такую как промежуточные итоги; и написанная пользователем программа для форматирования выбранных страниц информации конечного пользователя для отображения на мониторе или терминале.
И в DOS, и в OS JCL первой «картой» должна быть карта JOB, которая: [9]
Процедуры (обычно называемые procs ) — это предварительно написанные JCL для шагов или групп шагов, вставленных в задание. Оба JCL допускают такие процедуры. Procs используются для повторения шагов, которые используются несколько раз в одном задании или в нескольких разных заданиях. Они экономят время программиста и снижают риск ошибок. Чтобы запустить процедуру, нужно просто включить в файл JCL одну «карточку», которая копирует процедуру из указанного файла и вставляет ее в поток заданий. Кроме того, procs могут включать параметры для настройки процедуры для каждого использования.
Максимальная длина строки в DOS и OS JCL составляет 80 символов, поскольку при первом использовании DOS/360 и OS/360 основным методом ввода новых данных в компьютерную систему были 80-колоночные перфокарты . [10] Позднее стало возможным отправлять задания через файлы на диске или ленте с более длинными записями, но компоненты отправки заданий операционной системы игнорировали все после символа 80.
Строго говоря, оба семейства операционных систем используют только 71 символ на строку. Символы 73-80 обычно являются порядковыми номерами карт, которые система печатает в отчете о завершении работы, и полезны для определения местоположений любых ошибок, сообщаемых операционной системой. Символ 72 обычно остается пустым, но он может содержать непустой символ, указывающий на то, что оператор JCL продолжается на следующей карте.
Все команды, имена параметров и значения должны быть написаны заглавными буквами, за исключением имен файлов USS .
Все строки, за исключением входных данных в потоке (см. ниже), должны начинаться с косой черты " /
", а все строки, обрабатываемые операционной системой, должны начинаться с двух косых черт //
- всегда начиная с первого столбца . Однако есть два исключения: оператор-разделитель и оператор-комментарий. Оператор-разделитель начинается с косой черты и звездочки ( /*
), а оператор-комментарий в JCL ОС начинается с пары косых черт и звездочки ( //*
) или звездочки в JCL DOS.
Многие утверждения JCL слишком длинны, чтобы уместиться в 71 символ, но их можно расширить на неопределенное количество карточек продолжения с помощью:
Структура наиболее распространенных типов карточек следующая: [11]
DOS и OS JCL допускают потоковый ввод, т. е. "карточки", которые должны обрабатываться прикладной программой, а не операционной системой. Данные, которые должны храниться долгое время, обычно хранятся на диске, но до того, как использование интерактивных терминалов стало обычным, единственным способом создания и редактирования таких файлов на диске было предоставление новых данных на картах.
DOS и OS JCL имеют разные способы сигнализации о начале входного потока, но оба заканчивают входной поток в /*
столбце 1 карты, следующей за последней картой данных в потоке. Это заставляет операционную систему продолжить обработку JCL в карте, следующей за картой /*
. [12]
//SYSIN DD *
. Операторы JCL могут быть включены как часть данных в потоке с помощью операторов DD DATA.// SUBM EXEC PGM = IEBGENER // SYSPRINT DD SYSOUT = Z // SYSUT2 DD SYSOUT = ( A , INTRDR ) // SYSIN DD DUMMY // SYSUT1 DD DATA , DLM = ZZ // RUNLATR JOB ACCT , MANIX , CLASS = A . TYPRUN = HOLD //* ^ ЗАДАНИЕ для последующего запуска // CPUHOG EXEC PGM = PICALC1K // OUTPUT DD DSN = PICALC .1000 DGTS , SPACE = ( TRK , 1 ), DISP = (, KEEP ) ZZ //* ^ как указано в DLM=ZZ // DROPOLDR EXEC PGM = IEFBR14 // DELETE4 DD DSN = PICALC .4 DGTS , DISP = ( OLD , DELETE ) // DELETE5 DD DSN = PICALC .5 DGTS , DISP = ( OLD , DELETE )
Фред Брукс , который руководил проектом OS/360, в котором был создан JCL, назвал его «худшим языком программирования, когда-либо созданным кем-либо и где-либо» в своей книге «Проектирование дизайна» , где он использовал его в качестве примера в главе «Как ошибаются опытные дизайнеры». [14] Он объяснил это неспособностью дизайнеров понять, что JCL на самом деле является языком программирования.
Большая часть сложности OS JCL, в частности, проистекает из большого количества опций для указания информации о наборе данных . В то время как файлы в операционных системах типа Unix абстрагируются в упорядоченные потоки байтов, при этом задача чтения и записи структурированных данных принадлежит исключительно программам уровня пользователя (которые, в конечном счете, поглощают и выдают такие потоки), а практические детали хранения данных и доступа к ним в значительной степени обрабатываются операционной системой без ведома пользовательских программ; наборы данных в OS/360 и ее преемниках раскрывают свои типы и размеры файлов, типы и длины записей, размеры блоков, информацию об устройстве, такую как плотность магнитной ленты и информация о метках. Хотя для многих опций существуют системные значения по умолчанию, программисту все еще многое предстоит указать с помощью комбинации JCL и информации, закодированной в программе. Чем больше информации закодировано в программе, тем она менее гибкая, поскольку информация в программе переопределяет все, что есть в JCL; таким образом, большая часть информации обычно предоставляется через JCL.
Например, чтобы скопировать файл в операционной системе Unix , пользователь должен ввести команду вроде:
cp старыйФайл новыйФайл
Следующий пример с использованием JCL можно использовать для копирования файла на OS/360:
// IS198CPY JOB ( IS198T30500 ), 'COPY JOB' , CLASS = L , MSGCLASS = X // COPY01 EXEC PGM = IEBGENER // SYSPRINT DD SYSOUT = * // SYSUT1 DD DSN = OLDFILE , DISP = SHR // SYSUT2 DD DSN = NEWFILE , // DISP = ( NEW , CATLG , DELETE ), // SPACE = ( CYL ,( 40 , 5 ), RLSE ), // DCB = ( LRECL = 115 , BLKSIZE = 1150 ) // SYSIN DD DUMMY
Вторым объяснением сложности JCL являются ожидания, отличающиеся от тех, которые существуют в ПК или Unix-подобной среде.
DISP=(NEW,CATLG,DELETE)
означает «если программа выполняется успешно, создать новый файл и каталогизировать его; в противном случае удалить новый файл». Программы, работающие на ПК, часто зависят от пользователя, который должен очистить данные после проблем с обработкой.JOB
карта сообщает операционной системе, как выставлять счета на счет пользователя ( IS198T30500
), какой предопределенный объем памяти и других ресурсов может быть выделен ( CLASS=L
), и несколько других вещей. //SYSPRINT DD SYSOUT=*
сообщает компьютеру, что нужно распечатать отчет программы на принтере по умолчанию , который загружен обычной бумагой, а не на каком-то другом принтере, который может быть загружен пустыми чеками. DISP=SHR
сообщает операционной системе, что другие программы могут читать OLDFILE
в то же время .Более поздние версии операционных систем DOS/360 и OS/360 сохранили большинство функций оригинального JCL, хотя были сделаны некоторые упрощения, чтобы не заставлять клиентов переписывать все свои файлы JCL. [ необходима цитата ] Многие пользователи сохраняют в качестве процедуры любой набор операторов JCL, который, вероятно, будет использоваться более одного или двух раз. [18]
Синтаксис OS JCL похож на синтаксис макросов в языке ассемблера System/360 и поэтому был знаком программистам в то время, когда многие программы были написаны на языке ассемблера.
// TLBL TAPEFIL,'COPYTAPE.JOB',,,,2 // ASSGN SYS005,200 // DLBL DISKFIL,'COPYTAPE.JOB',0,SD // EXTENT SYS005,VOL01,1,0,800,1600
Параметры JCL в DOS являются позиционными, что затрудняет их чтение и запись, но упрощает анализ системой.
DOS JCL в некоторой степени смягчает трудности позиционных параметров, используя больше операторов с меньшим количеством параметров, чем OS JCL. В этом примере операторы ASSGN, DLBL и EXTENT выполняют ту же работу (указывая, где должен храниться новый файл на диске), что и один DD
оператор в OS JCL.
В оригинальном DOS/360 и в большинстве версий DOS/VS приходилось указывать номер модели устройства, которое должно было использоваться для каждого файла на диске или ленте — даже для существующих файлов и для временных файлов, которые удалялись в конце работы. Это означало, что если клиент обновлял оборудование до более современного, приходилось менять многие файлы JCL.
Более поздние версии семейства DOS/360 сократили количество ситуаций, в которых требовались номера моделей устройств.
DOS/360 изначально требовала от программиста указания местоположения и размера всех файлов на DASD . EXTENT
Карта определяет том, на котором находится экстент, начальную абсолютную дорожку и количество дорожек. Для z/VSE файл может иметь до 256 экстентов на разных томах.
OS JCL состоит из трех основных типов операторов: [19]
JOB
заявление, в котором указывается начало задания и информация обо всем задании, такая как выставление счетов, приоритет выполнения, а также ограничения по времени и пространству.EXEC
оператор, который идентифицирует программу или процедуру [20], которая должна быть выполнена на этом этапе задания, DD
(Определение данных) операторы, которые идентифицируют файл данных, который будет использоваться на шаге, и подробную информацию об этом файле. DD
Операторы могут располагаться в любом порядке в пределах шага.С самого начала JCL для семейства ОС (вплоть до z/OS ) был более гибким и простым в использовании.
В следующих примерах используется старый стиль синтаксиса, который был реализован сразу после запуска System/360 в 1964 году. Старый синтаксис по-прежнему довольно распространен в задачах, которые выполняются десятилетиями, с небольшими изменениями.
Каждое выражение JCL разделено на пять полей: [21]
Идентификатор-Имя поля-Операция поля-Параметр поля-Комментарии поля-Поле ^ ^ ^ ^ нет места пространство пространство пространство пространство
Поле идентификатора должно быть объединено с полем имени , т.е. между ними не должно быть пробелов.
//
): Поле идентификатора указывает системе, что оператор является оператором JCL, а не данными. Поле идентификатора состоит из следующего://
/*
//*
$
, #
, @
) символов.JOB
, EXEC
и DD
.// НОВЫЙ ФАЙЛ DD DSN = MYFILE01 , ЕДИНИЦА = ДИСК , МЕСТО = ( TRK , 80 , 10 ), // DCB = ( LRECL = 100 , BLKSIZE = 1000 ), // DISP = ( НОВЫЙ , CATLG , УДАЛИТЬ )
Все основные параметры операторов OS JCL идентифицируются ключевыми словами и могут быть представлены в любом порядке. Некоторые из них содержат два или более подпараметров, например SPACE
(сколько дискового пространства выделить новому файлу) и DCB
(подробная спецификация макета файла) в примере выше. Подпараметры иногда являются позиционными, как в SPACE
, но самые сложные параметры, например DCB
, имеют подпараметры с ключевыми словами.
Позиционный параметр должен предшествовать параметрам ключевого слова. Параметры ключевого слова всегда присваивают значения ключевому слову с помощью знака равенства ( =
). [22]
Оператор DD
используется для ссылки на данные. Этот оператор связывает внутреннее описание набора данных программы с данными на внешних устройствах: дисках, лентах, картах, принтерах и т. д. DD может предоставлять такую информацию, как тип устройства (например, '181','2400-5','TAPE'), серийный номер тома для лент или дисков и описание файла данных, называемое подпараметром DCB
после блока управления данными (DCB) в программе, используемой для идентификации файла.
Информация, описывающая файл, может поступать из трех источников: информация карты DD, информация метки набора данных для существующего файла, сохраненного на ленте или диске, и макрос DCB, закодированный в программе. При открытии файла эти данные объединяются, причем информация DD имеет приоритет над информацией метки, а информация DCB имеет приоритет над обеими. Затем обновленное описание записывается обратно в метку набора данных. Это может привести к непреднамеренным последствиям, если предоставлена неверная информация DCB. [23]
Из-за перечисленных выше параметров и конкретной информации для различных методов доступа и устройств оператор DD является самым сложным оператором JCL. В одном справочном руководстве IBM описание оператора DD занимает более 130 страниц — более чем в два раза больше, чем операторы JOB и EXEC вместе взятые. [24]
Оператор DD позволяет вводить встроенные данные в поток заданий. Это полезно для предоставления управляющей информации таким утилитам, как IDCAMS, SORT и т. д., а также для предоставления входных данных программам.
С самого начала JCL для семейства операционных систем OS предлагал высокую степень независимости от устройств. Даже для новых файлов, которые должны были сохраняться после окончания работы, можно было указать тип устройства в общих терминах, например, , UNIT=DISK
, UNIT=TAPE
или UNIT=SYSSQ
(лента или диск). Конечно, если это имело значение, можно было указать номер модели или даже конкретный адрес устройства. [25]
Процедуры позволяют группировать один или несколько операторов " EXEC PGM= " и DD , а затем вызывать их с помощью " EXEC PROC= procname" -или- просто "EXEC procname" [26]
Объект, называемый Библиотекой процедур, позволял предварительно сохранять процедуры.
Процедуры также можно включить в поток заданий, завершив процедуру оператором // PEND
, а затем вызвав ее по имени так же, как если бы она находилась в библиотеке процедур.
Например:
// SUMPRINT PROC // PRINT EXEC PGM=IEBGENER // SYSUT1 DD DSN = CEO . FILES . DAYEND . RPT24A , DISP = SHR // SYSUT2 DD SYSOUT = A // SYSIN DD DUMMY // PEND // EXEC SUMPRINT
Процедуры ОС JCL были параметризованы с самого начала, что делало их похожими на макросы или даже простые подпрограммы , и, таким образом, увеличивало их возможность повторного использования в широком диапазоне ситуаций. [27]
// MYPROC PROC FNAME = MYFILE01 , SPTYPE = TRK , SPINIT = 50 , SPEXT = 10 , LR = 100 , BLK = 1000 ..... // NEWFILE DD DSN =& FNAME , UNIT = DISK , SPACE = ( & SPTYPE , & SPINIT , & SPEXT ), // DCB = ( LRECL =& LR , BLKSIZE =& BLK ), DISP = ( NEW , CATLG , DELETE ) ....
В этом примере все значения, начинающиеся с амперсанда " &
", являются параметрами, которые будут указаны, когда задание запросит использование процедуры. Оператор PROC, в дополнение к присвоению процедуре имени, позволяет программисту указывать значения по умолчанию для каждого параметра. Таким образом, можно использовать одну процедуру в этом примере для создания новых файлов множества различных размеров и макетов. Например:
// JOB01 JOB .......... // STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000 или // JOB02 JOB .......... // STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000
В многошаговых заданиях более поздний шаг может использовать рефербэк вместо указания полностью файла, который уже был указан на предыдущем шаге. Например:
// MYPROC ................ // MYPR01 EXEC PGM = .......... // NEWFILE DD DSN =& MYFILE , UNIT = DISK , SPACE = ( TRK , 50 , 10 ), // DCB = ( LRECL = 100 , BLKSIZE = 1000 ), DISP = ( NEW , CATLG , DELETE ) .... // MYPR02 EXEC PGM = .......... // INPUT01 DD DSN = * . MYPR01 . NEWFILE
Здесь MYPR02
используется файл, указанный NEWFILE
в шаге MYPR01
( DSN
означает «имя набора данных» и указывает имя файла; DSN не может превышать 44 символа [28] ).
В заданиях, которые содержат смесь JCL, специфичных для задания, и вызовов процедур, шаг, специфичный для задания, может ссылаться на файл, который был полностью указан в процедуре, например:
// MYJOB JOB .......... // STEP01 EXEC MYPROC Использование процедуры // STEP02 EXEC PGM = ......... Шаг, специфичный для этого задания // INPUT01 DD DSN = * . STEP01 . MYPR01 . NEWFILE
где DSN=*.STEP01.MYPR01.NEWFILE
означает «использовать файл, указанный как NEWFILE
в шаге MYPR01
процедуры, используемой шагом STEP01
этого задания». Использование имени шага, вызвавшего процедуру, а не имени процедуры позволяет программисту использовать одну и ту же процедуру несколько раз в одном и том же задании, не путаясь в том, какой экземпляр процедуры используется в реферале.
Файлы JCL могут быть длинными и сложными, а язык неудобен для чтения. OS JCL позволяет программистам включать два типа пояснительных комментариев:
X
") в столбце 72, за которым следует " //
" в столбцах 1–3 следующей строки.// MYJOB JOB .......... //* Строки, содержащие только комментарии. //******** Часто используется для разделения листинга JCL на разделы ******** // STEP01 EXEC MYPROC Комментарий 2 на той же строке, что и оператор // STEP02 EXEC PGM = ......... Комментарий 3 был расширен и X // переполняется на другую строку. // INPUT01 DD DSN = STEP01 . MYPR01 . NEWFILE
Например, OS JCL позволяет программистам объединять («цеплять») входные файлы так, чтобы они отображались в программе как один файл.
// INPUT01 DD DSN = MYFILE01 , DISP = SHR // DD DSN=JOESFILE,DISP=SHR // DD DSN=SUESFILE,DISP=SHR
2-й и третий операторы не имеют значения в поле имени, поэтому ОС обрабатывает их как конкатенации. Файлы должны быть одного базового типа (почти всегда последовательные) и иметь одинаковую длину записи, однако длина блока не обязательно должна быть одинаковой.
В ранних версиях ОС (конечно, до OS/360 R21.8) длина блока должна была быть в порядке убывания, или пользователь должен был проверить каждый экземпляр и добавить к именованному оператору DD максимальную найденную длину блока, как, например, в:
// INPUT01 DD DSN = MYFILE01 , DISP = SHR , BLKSIZE = 800 // DD DSN=JOESFILE,DISP=SHR (предполагается, что BLKSIZE равен или меньше 800) // DD DSN=SUESFILE,DISP=SHR (предполагается, что BLKSIZE равен или меньше 800)
В более поздних версиях ОС (конечно, после OS/MVS R3.7 с соответствующими «выбираемыми блоками») сама ОС во время распределения проверяла каждый экземпляр в конкатенации и подставляла максимальную длину блока, которая была найдена.
Обычным вариантом было просто определить максимально возможную длину блока на устройстве и указать ее в именованном операторе DD, например,
// INPUT01 DD DSN = MYFILE01 , DISP = SHR , BLKSIZE = 8000 // DD DSN=JOESFILE,DISP=SHR (предполагается, что BLKSIZE равен или меньше 8000) // DD DSN=SUESFILE,DISP=SHR (предполагается, что BLKSIZE равен или меньше 8000)
Целью этого отката было гарантировать, что метод доступа выделит набор входных буферов, достаточно большой для размещения любого из указанных наборов данных.
ОС ожидает, что программы установят код возврата, который указывает, насколько успешной она считала себя. Наиболее распространенные общепринятые значения: [29] : стр.87
OS JCL называет код возврата COND
(«код условия») и может использовать его для принятия решения о том, следует ли запускать последующие шаги. Однако, в отличие от большинства современных языков программирования, условные шаги в OS JCL не выполняются, если указанное условие истинно, что приводит к появлению мнемоники : «Если это истинно, пройдите дальше [без запуска кода]». Чтобы еще больше усложнить ситуацию, условие может быть указано только после шага, к которому оно относится. Например:
// MYJOB JOB ........... // STEP01 EXEC PGM = PROG01 .... // STEP02 EXEC PGM = PROG02 , COND = ( 4 , GT , STEP01 ) .... // STEP03 EXEC PGM = PROG03 , COND = ( 8 , LE ) .... // STEP04 EXEC PGM = PROG04 , COND = ( ONLY , STEP01 ) .... // STEP05 EXEC PGM = PROG05 , COND = ( EVEN , STEP03 ) ....
означает:
STEP01
и получите код возврата.STEP02
если число 4 больше STEP01
кода возврата.STEP03
если число 8 меньше или равно любому предыдущему коду возврата.STEP04
только в случае STEP01
аварийного завершения.STEP05
, даже если STEP03
он завершился ненормально.Это преобразуется в следующий псевдокод :
запустить STEP01 , если код возврата STEP01 больше или равен 4 , то запустить ШАГ02конец, если любой предыдущий код возврата меньше 8 , то запустить ШАГ03конец, если если STEP01 ненормально завершился , то запустить ШАГ04конец, если если STEP03 ненормально завершился , то запустить ШАГ05еще запустить ШАГ05конец, если
Обратите внимание, что, читая шаги, содержащие COND
операторы в обратном порядке, можно понять их довольно легко. Это пример логической транспозиции . Однако IBM позже ввела условие IF в JCL, тем самым несколько упростив программирование для программистов, сохранив COND
параметр (чтобы избежать внесения изменений в существующие JCL, где COND parm
используется).
Параметр COND
также может быть указан в JOB
операторе. Если это так, система «выполняет те же самые тесты кода возврата для каждого шага в задании. Если тест кода возврата оператора JOB удовлетворен, задание завершается». [30]
Задания используют ряд программ-утилит IBM для помощи в обработке данных. Утилиты наиболее полезны при пакетной обработке. Утилиты можно сгруппировать в три набора:
OS JCL, несомненно, сложен [31] и описывается как «враждебный пользователю». [32] [33] Как спрашивалось в одной учебной книге по JCL: «Почему даже опытные программисты колеблются, когда дело доходит до языка управления заданиями?» [34] В книге утверждалось, что многие программисты либо копировали контрольные карты, не понимая, что они делают, либо «верили распространенным слухам о том, что JCL ужасен, и только «упорные» компьютерщики когда-либо понимали его», и передавали задачу выяснения операторов JCL кому-то другому. [34] Такое отношение можно найти в учебниках по языкам программирования, которые предпочитали сосредотачиваться на самом языке, а не на том, как программы на нем запускаются. Как говорилось в одном учебнике по Fortran IV при перечислении возможных сообщений об ошибках от компилятора WATFOR : «Вы были настолько глупы, что пытались написать свои собственные системные контрольные карты 'DD'? Прекратите и воздержитесь немедленно; бегите, а не идите за помощью». [35]
Тем не менее, в некоторых книгах, подробно изучающих JCL, подчеркивается, что как только вы изучите его хотя бы на относительно профессиональном уровне, вы обретете свободу от установок по умолчанию и гораздо лучший контроль над тем, как система IBM обрабатывает вашу рабочую нагрузку. [34] [31] В другой книге говорилось о сложности, но говорилось: «Не унывайте. Возможности JCL, которые вы получите из [предыдущей главы], — это все, что когда-либо понадобится большинству программистов». [31]
В системах мэйнфреймов IBM язык управления записью заданий (Job Entry Control Language) или JECL — это набор операторов управления языком команд , которые предоставляют информацию для подсистемы спулинга — JES2 или JES3 на z/OS или VSE/POWER для z/VSE . Операторы JECL могут «указывать, на каком сетевом компьютере запускать задание , когда запускать задание и куда отправлять результирующий вывод». [29]
JECL отличается от языка управления заданиями (JCL), который инструктирует операционную систему , как выполнять задание.
Существуют различные версии JECL для трех сред.
Ранняя версия языка управления записью заданий для OS/360 Remote Job Entry (номер программы 360S-RC-536) использовала идентификатор ..
в столбцах 1–2 входной записи и состояла из одного управляющего оператора: JED
(Определение записи задания). «Команды рабочей станции», такие как LOGON
, LOGOFF
, и STATUS
также начинались с ..
. [36]
Хотя термин еще не был разработан, HASP обладал функциональностью, схожей с тем, что впоследствии стало JECL JES , включая /*
синтаксис.
Для JES2 операторы JECL начинаются с /*
, для JES3 они начинаются с //*
, за исключением команд remote /*SIGNON
и /*SIGNOFF
. Команды для двух систем совершенно разные.
Следующие операторы JES2 JECL используются в z/OS 1.2.0. [37]
Следующие операторы JES3 JECL используются в z/OS 1.2.0 [39]
Для VSE операторы JECL начинаются с ' * $$
' (обратите внимание на один пробел). Язык управления вводом заданий определяет начальную и конечную строки заданий JCL. Он сообщает VSE / POWER , как обрабатывать это задание. Операторы JECL определяют имя задания (используемое VSE/POWER), класс, в котором обрабатывается задание, и расположение задания (т. е. D
, L
, K
, H
).
Пример:
* $$ РАБОТА JNM=ИМЯ,DISP=K,КЛАСС=2[здесь есть некоторые заявления JCL]* $$ ЕО
Другие пакетные системы мэйнфреймов имели некоторую форму языка управления заданиями, независимо от того, назывались они так или нет; их синтаксис полностью отличался от версий IBM, но они обычно предоставляли схожие возможности. Интерактивные системы включают « командные языки » — командные файлы (такие как файлы PCDOS «.bat») могут запускаться неинтерактивно, но они обычно не обеспечивают такую же надежную среду для запуска автоматических заданий, как JCL. В некоторых компьютерных системах язык управления заданиями и интерактивный командный язык могут отличаться. Например, TSO в системах z/OS использует CLIST или Rexx в качестве командных языков вместе с JCL для пакетной работы. В других системах они могут быть одинаковыми.
DD
Имена наборов данных не должны превышать 44 символа, включая все сегменты имени и точки.
, в частности, печально известен своей враждебностью к пользователям и был назван Фредом Бруксом «худшим языком программирования из когда-либо созданных» ... (http://dtsc.dfw.ibm.com/MVSDS/'HTTPD2.APPS.ZOSCLASS.PDF(ZCLA...)[ссылка в оригинале].