Язык управления заданиями ( JCL ) — это язык сценариев, используемый в операционных системах мэйнфреймов IBM для указания системе, как запустить пакетное задание или запустить подсистему. [1] Цель JCL — указать, какие программы запускать, какие файлы или устройства [2] использовать для ввода или вывода, а иногда также указать, при каких условиях пропустить шаг. Параметры в JCL также могут предоставлять учетную информацию для отслеживания ресурсов, используемых заданием, а также того, на каком компьютере должно выполняться задание.
Существует два различных языка IBM Job Control:
Они имеют общие правила синтаксиса и несколько основных понятий, но в остальном они сильно отличаются. [3]
Операционная система ВМ не имеет JCL как такового; Компоненты CP и CMS имеют командные языки .
Некоторые слова или фразы, используемые в сочетании с JCL, относятся к технологии мэйнфреймов IBM.
Первоначально системы мэйнфреймов были ориентированы на пакетную обработку . Многие пакетные задания требуют настройки с особыми требованиями к основному хранилищу и выделенным устройствам, таким как магнитные ленты , частные дисковые тома и принтеры, настроенные со специальными формами. [8] JCL был разработан как средство обеспечения доступности всех необходимых ресурсов перед запуском задания. Например, многие системы, такие как Linux, позволяют указывать необходимые наборы данных в командной строке и, следовательно, подлежат замене оболочкой или генерировать программой во время выполнения. В этих системах планировщик заданий операционной системы практически не имеет представления о требованиях задания. Напротив, JCL явно указывает все необходимые наборы данных и устройства. Планировщик может предварительно выделить ресурсы перед запуском задания. Это помогает избежать « тупика », когда задание A удерживает ресурс R1 и запрашивает ресурс R2, в то время как одновременно выполняющееся задание B удерживает ресурс R2 и запрашивает R1. В таких случаях единственным решением для оператора компьютера является прекращение одного из заданий, которое затем необходимо перезапустить. При управлении заданиями, если запланировано выполнение задания А, задание Б не будет запущено до тех пор, пока задание А не завершится или не освободит необходимые ресурсы.
И для DOS, и для OS единицей работы является задание . Задание состоит из одного или нескольких шагов, каждый из которых представляет собой запрос на запуск одной конкретной программы. Например, до появления реляционных баз данных работа по созданию печатного отчета для руководства могла состоять из следующих шагов: написанная пользователем программа для выбора соответствующих записей и копирования их во временный файл; отсортируйте временный файл в нужном порядке, обычно с помощью утилиты общего назначения; написанная пользователем программа для представления информации таким образом, чтобы ее было легко читать конечным пользователям, и включающая другую полезную информацию, такую как промежуточные итоги; и написанную пользователем программу для форматирования выбранных страниц информации конечного пользователя для отображения на мониторе или терминале.
Как в DOS, так и в OS JCL первой «картой» должна быть карта JOB, которая: [9]
Процедуры (обычно называемые procs ) — это заранее написанные JCL для шагов или групп шагов, вставленные в задание. Оба JCL допускают такие процедуры. Процессы используются для повторения шагов, которые используются несколько раз в одном задании или в нескольких разных заданиях. Они экономят время программиста и снижают риск ошибок. Чтобы запустить процедуру, нужно просто включить в файл JCL одну «карточку», которая копирует процедуру из указанного файла и вставляет ее в поток заданий. Кроме того, процедуры могут включать параметры для настройки процедуры для каждого использования.
И DOS, и OS JCL имеют максимальную полезную длину строки 80 символов, потому что, когда DOS/360 и OS/360 впервые использовались, основным методом предоставления новых входных данных в компьютерную систему были перфокарты с 80 столбцами . [10] Позже стало возможным отправлять задания через файлы на диске или ленте с большей длиной записи, но компоненты отправки заданий операционной системы игнорировали все после символа 80.
Строго говоря, оба семейства операционных систем используют только 71 символ в строке. Символы 73–80 обычно представляют собой порядковые номера карт, которые система печатает в отчете об окончании задания и полезны для определения местоположений любых ошибок, о которых сообщает операционная система. Символ 72 обычно остается пустым, но он может содержать непустой символ, указывающий, что оператор JCL продолжается на следующей карте.
Все команды, имена и значения параметров должны быть написаны заглавными буквами, за исключением имен файлов USS .
Все строки, за исключением входных данных в потоке (см. ниже), должны начинаться с косой черты " /
", а все строки, обрабатываемые операционной системой, должны начинаться с двух косых черт //
- всегда начиная с первого столбца . Однако есть два исключения: оператор-разделитель и оператор комментария. Операторы-разделители начинаются с косой черты и звездочки ( /*
), а оператор комментария в OS JCL начинается с пары косых черт и звездочки ( //*
) или звездочки в DOS JCL.
Многие операторы 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 //* ^ as задано 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 на самом деле является языком программирования.
Большая часть сложности ОС 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]
Синтаксис ОС 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
.// NEWFILE DD DSN = MYFILE01 , UNIT = DISK , SPACE = ( TRK , 80 , 10 ), // DCB = ( LRECL = 100 , BLKSIZE = 1000 ), // DISP = ( NEW , CATLG , DELETE )
Все основные параметры операторов 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 . ФАЙЛЫ . ДЕНЬ . 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 = ......... . // ВХОД01 ДД ДСН = * . МГПР01 . НОВЫЙ ФАЙЛ
Здесь MYPR02
используется файл, указанный NEWFILE
на шаге MYPR01
( DSN
означает «имя набора данных» и указывает имя файла; DSN не может превышать 44 символов [28] ).
В заданиях, которые содержат смесь вызовов JCL и процедур, специфичных для задания, шаг, специфичный для задания, может ссылаться обратно на файл, который был полностью указан в процедуре, например:
// MYJOB JOB .......... // STEP01 EXEC MYPROC Использование процедуры // STEP02 EXEC PGM = ......... Шаг, специфичный для этого задания // INPUT01 DD DSN = * . ШАГ01 . МГПР01 . НОВЫЙ ФАЙЛ
где DSN=*.STEP01.MYPR01.NEWFILE
означает «использовать файл, указанный NEWFILE
на этапе MYPR01
процедуры, используемой на этапе STEP01
этого задания». Использование имени шага, вызвавшего процедуру, а не имени процедуры, позволяет программисту использовать одну и ту же процедуру несколько раз в одном и том же задании, не путаясь в том, какой экземпляр процедуры используется в обратной ссылке.
Файлы JCL могут быть длинными и сложными, а язык нелегко читать. ОС JCL позволяет программистам включать пояснительные комментарии двух типов:
X
») в столбец 72, а затем « //
» в столбцы 1–3 следующей строки.// MYJOB JOB .......... //* Строки, содержащие только комментарии. //******* Часто используется для разделения списка JCL на разделы ******** // Комментарий STEP01 EXEC MYPROC 2 в той же строке, что и оператор // STEP02 EXEC PGM = ...... ... Комментарий 3 расширен, и X // переполняется в другую строку. // INPUT01 DD DSN = STEP01 . МГПР01 . НОВЫЙ ФАЙЛ
ОС JCL позволяет программистам объединять («цепочки») входные файлы так, чтобы они отображались в программе как один файл, например
// INPUT01 DD DSN = MYFILE01 , DISP = SHR // DD DSN=JOESFILE,DISP=SHR // DD DSN=SUESFILE,DISP=SHR
Второй и третий операторы не имеют значения в поле имени, поэтому ОС рассматривает их как конкатенацию. Файлы должны быть одного и того же базового типа (почти всегда последовательные) и иметь одинаковую длину записи, однако длина блока не обязательно должна быть одинаковой.
В ранних версиях ОС (конечно, до 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
(«кодом условия») и может использовать его, чтобы решить, выполнять ли последующие шаги. Однако, в отличие от большинства современных языков программирования, условные шаги в ОС JCL не выполняются, если указанное условие истинно, что приводит к появлению мнемоники : «Если это правда, пройдите дальше [без запуска кода]». Еще больше усложняет ситуацию то, что условие можно указать только после шага, к которому оно относится. Например:
// МОЕ ЗАДАНИЕ ЗАДАНИЕ ........... // 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 , тогда запустите ШАГ 02end if, если любой предыдущий код возврата меньше 8 , то запустите ШАГ 03end if если STEP01 завершился ненормально тогда запустите ШАГ 04end if если STEP03 завершился ненормально тогда запустите ШАГ05еще запустите ШАГ05конец, если
Обратите внимание, что, прочитав шаги, содержащие COND
утверждения, в обратном порядке, их можно довольно легко понять. Это пример логического транспонирования . Однако позже IBM представила условие IF в JCL, тем самым несколько упростив кодирование для программистов, сохранив при этом параметр COND
(чтобы избежать внесения изменений в существующие JCL, где COND parm
он используется).
Параметр COND
также может быть указан в JOB
заявлении. В этом случае система «выполняет одни и те же тесты кода возврата для каждого шага задания. Если проверка кода возврата оператора JOB удовлетворена, задание завершается». [30]
Джобс использует ряд служебных программ IBM для обработки данных. Утилиты наиболее полезны при пакетной обработке. Утилиты можно сгруппировать в три группы:
ОС JCL, несомненно, сложна [31] и описывается как «враждебная пользователю». [32] [33] В одном учебном пособии по JCL задается вопрос: «Почему даже опытные программисты колеблются, когда дело доходит до языка управления заданиями?» [34] В книге говорилось, что многие программисты либо копировали управляющие карты, толком не понимая, что они делают, либо «верили распространенным слухам о том, что JCL ужасен, и только «стойкие» компьютерщики когда-либо понимали это» и поручали задачу выяснение утверждений JCL для кого-то другого. [34] Такое отношение можно встретить в учебниках по языкам программирования, в которых предпочтение отдается самому языку, а не тому, как на нем выполняются программы. Как сказано в одном учебнике Фортрана IV , перечисляя возможные сообщения об ошибках компилятора WATFOR : «Неужели вы были настолько глупы, что попытались написать свои собственные карты управления системой «DD»? Немедленно прекратите и воздержитесь; бегите, а не идите, за помощью. " [35]
Тем не менее, в некоторых книгах, подробно посвященных JCL, подчеркивается, что, как только JCL будет изучен хотя бы на достаточно высоком уровне, вы получите свободу от настроек по умолчанию для всей установки и гораздо лучший контроль над тем, как система IBM обрабатывает вашу рабочую нагрузку. [34] [31] В другой книге обсуждалась сложность, но говорилось: «Мужайтесь. Возможности JCL, которые вы получите из [предыдущей главы], — это все, что когда-либо понадобится большинству программистов». [31]
В мэйнфреймах IBM Язык управления вводом заданий или JECL — это набор операторов управления командным языком , которые предоставляют информацию для подсистемы буферизации — JES2 или JES3 в z/OS или VSE/POWER для z/VSE . Операторы JECL могут «указать, на каком сетевом компьютере запускать задание , когда запускать задание и куда отправлять результирующий вывод». [29]
JECL отличается от языка управления заданиями (JCL), который указывает операционной системе , как выполнить задание.
Для трех сред существуют разные версии JECL.
Ранняя версия языка управления вводом заданий для удаленного ввода заданий OS/360 (номер программы 360S-RC-536) использовала идентификатор ..
в столбцах 1–2 входной записи и состояла из одного управляющего оператора: JED
(Определение ввода задания). «Команды рабочей станции», такие как LOGON
, LOGOFF
, а STATUS
также начинались с ..
. [36]
Хотя этот термин еще не был разработан, HASP имел функциональность, аналогичную тому, что впоследствии стало JECL JES , включая /*
синтаксис.
Для JES2 операторы JECL начинаются с /*
, для JES3 — с //*
, за исключением удаленных команд /*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
).
Пример:
* $$ JOB JNM=NAME,DISP=K,CLASS=2[некоторые заявления JCL здесь]* $$ ЭОДж
Другие пакетные системы для мэйнфреймов имели ту или иную форму языка управления заданиями, называлась она так или нет; их синтаксис полностью отличался от версий IBM, но обычно они предоставляли схожие возможности. Интерактивные системы включают в себя « командные языки » — командные файлы (такие как файлы PCDOS «.bat») можно запускать в неинтерактивном режиме, но они обычно не обеспечивают такую надежную среду для выполнения автоматических заданий, как JCL. В некоторых компьютерных системах язык управления заданиями и язык интерактивных команд могут различаться. Например, TSO в системах z/OS использует CLIST или Rexx в качестве командных языков наряду с JCL для пакетной работы. В других системах они могут быть такими же.
DD
Имена наборов данных не должны превышать 44 символов, включая все сегменты и точки имени.
JCL, в частности, общеизвестно враждебен пользователям, и Фред Брукс назвал его «худшим языком программирования, когда-либо созданным» ... (http://dtsc.dfw.ibm.com/MVSDS/'HTTPD2.APPS.ZOSCLASS.PDF(ZCLA) ...) [ссылка в оригинале].