Язык управления заданиями
Язык управления заданиями ( JCL ) — это язык сценариев, используемый в операционных системах мэйнфреймов IBM для указания системе, как запустить пакетное задание или запустить подсистему. [1] Цель JCL — указать, какие программы запускать, какие файлы или устройства использовать. [2] для ввода или вывода, а иногда и для указания, при каких условиях пропустить шаг. Параметры в JCL также могут предоставлять учетную информацию для отслеживания ресурсов, используемых заданием, а также того, на каком компьютере должно выполняться задание.
Существует два различных языка IBM Job Control:
- один для семейства операционных систем, которое начинается с DOS/360 и последним членом которого является z/VSE ; и
- другой для линии от OS/360 до z/OS , причем последняя теперь включает расширения JES , заданий вводом язык управления (JECL) .
Они имеют общие правила синтаксиса и несколько основных понятий, но в остальном они сильно отличаются. [3]
не Операционная система ВМ имеет JCL как такового; Компоненты CP и CMS имеют командные языки .
Терминология
[ редактировать ]Некоторые слова или фразы, используемые в сочетании с JCL, относятся к технологии мэйнфреймов IBM.
- Набор данных: «набор данных» — это файл; он может быть временным или постоянным и располагаться на диске, ленточном накопителе или другом устройстве. [4] [5]
- Член: «член» секционированного набора данных (PDS) — это отдельный набор данных в PDS. Доступ к участнику можно получить, указав имя PDS с именем участника в круглых скобках. Например, системный макрос GETMAIN в SYS1.MACLIB может называться SYS1.MACLIB(GETMAIN). [6]
- Разделенный набор данных: «разделенный набор данных» или PDS — это набор элементов или архив. Секционированные наборы данных обычно используются для хранения текстовых данных, таких как исходный код, макросы ассемблера (SYS1.MACLIB), конфигурация системы (SYS1.PARMLIB), многократно используемые процедуры JCL (SYS1.PROCLIB) и т. д. По сути, они имеют что-то общее с архивные файлы (ZIP, TAR и т. д.) и каталоги в других операционных системах. Они также используются для хранения двоичного кода (загрузочных модулей или объектов программы); в этом смысле они примерно аналогичны статическим библиотекам на основе ar в системах на базе Unix. Как и в большинстве подобных структур, однажды сохраненный член не может быть обновлен; член необходимо удалить и заменить, например, с помощью утилиты IEBUPDTE . [6] С момента выпуска MVS DFP 3.2 в 1989 году PDSE (расширенный набор разделенных данных) существовали как улучшенная версия PDS; [7] с точки зрения пользователя или прикладного программиста они в основном не изменились (за исключением удаления некоторых малоизвестных устаревших функций), но их внутренняя реализация сильно отличается.
- USS: системные службы Unix, полная среда Unix, работающая как часть базовой программы управления MVS и позволяющая запускать файлы, сценарии, задачи и программы Unix на мэйнфрейме в полностью совместимой с POSIX среде Unix без виртуализации.
Мотивация
[ редактировать ]Первоначально системы мэйнфреймов были ориентированы на пакетную обработку . Многие пакетные задания требуют настройки с особыми требованиями к основному хранилищу и выделенным устройствам, таким как магнитные ленты , частные дисковые тома и принтеры, настроенные со специальными формами. [8] JCL был разработан как средство обеспечения доступности всех необходимых ресурсов перед запланированным запуском задания. Например, многие системы, такие как Linux, позволяют указывать необходимые наборы данных в командной строке и, следовательно, подлежат замене оболочкой или генерировать программой во время выполнения. В этих системах операционной системы планировщик заданий практически не имеет представления о требованиях задания. Напротив, JCL явно указывает все необходимые наборы данных и устройства. Планировщик может предварительно выделить ресурсы перед запуском задания. Это помогает избежать « тупика », когда задание A удерживает ресурс R1 и запрашивает ресурс R2, в то время как одновременно выполняющееся задание B удерживает ресурс R2 и запрашивает R1. В таких случаях единственным решением для оператора компьютера является прекращение одного из заданий, которое затем необходимо перезапустить. При управлении заданиями, если запланировано выполнение задания А, задание Б не будет запущено до тех пор, пока задание А не завершится или не освободит необходимые ресурсы.
Функции, общие для DOS и OS JCL.
[ редактировать ]Работы, этапы и процедуры
[ редактировать ]И для 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 символ, но их можно расширить на неопределенное количество карточек продолжения следующим образом:
ОС JCL | ДОС JCL |
---|---|
Завершение всех фактических карточек JCL, кроме последней, в месте, где в синтаксисе требуется запятая ( , ) |
Завершение всех фактических карточек JCL, кроме последней, в месте, где в синтаксисе требуется запятая ( , ) и непустой символ в столбце 72
|
Начинаем каждую карту продолжения с // в столбце 1, а затем хотя бы 1 пробел |
Каждая карта продолжения начинается с пробелов и продолжается в столбце 15. |
Структура наиболее распространенных типов карт такова: [11]
ОС JCL | ДОС JCL |
---|---|
|
|
Входной поток в потоке
[ редактировать ]И DOS, и OS JCL допускают поточный ввод, т. е. «карты», которые должны обрабатываться прикладной программой, а не операционной системой. Данные, которые должны храниться в течение длительного времени, обычно хранятся на диске, но до того, как использование интерактивных терминалов стало обычным явлением, единственным способом создания и редактирования таких дисковых файлов была передача новых данных на карты.
DOS и OS JCL имеют разные способы сигнализации о начале ввода в потоке, но оба заканчивают ввод в потоке с помощью /*
в столбце 1 карты, следующей за последней картой данных в потоке. Это заставляет операционную систему возобновить обработку JCL на карте после /*
карта. [12]
- OS JCL: операторы DD можно использовать для описания потоковых данных, а также наборов данных. Оператор DD, работающий с данными в потоке, имеет звездочку (*) после идентификатора DD, например
//SYSIN DD *
. Операторы JCL можно включать в поток данных с помощью операторов DD DATA.
- Операнд с именем DLM позволял указать разделитель (по умолчанию «/*»). Указание альтернативного разделителя позволяет читать JCL как данные, например, для копирования процедур в элемент библиотеки или для отправки задания внутреннему читателю .
- Пример, [13] который отправляет задание внутреннему читателю ( INTRDR ), а затем удаляет два файла:
//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
//* ^ a JOB to run later
//CPUHOG EXEC PGM=PICALC1K
//OUTPUT DD DSN=PICALC.1000DGTS,SPACE=(TRK,1),DISP=(,KEEP)
ZZ
//* ^ as specified by DLM=ZZ
//DROPOLDR EXEC PGM=IEFBR14
//DELETE4 DD DSN=PICALC.4DGTS,DISP=(OLD,DELETE)
//DELETE5 DD DSN=PICALC.5DGTS,DISP=(OLD,DELETE)
- Программа под названием PICALC1K будет ожидать (TYPRUN=HOLD) ее освобождения вручную.
- Программа под названием IEFBR14 будет запущена СЕЙЧАС, и по завершении два существующих файла, PICALC.4DGTS и PICALC.5DGTS, будут удалены.
- DOS JCL: Просто введите данные в потоке после карты EXEC для программы.
Сложность
[ редактировать ]Фред Брукс , курировавший проект OS/360, в рамках которого был создан JCL, назвал его «худшим языком компьютерного программирования, когда-либо созданным кем-либо и где угодно» в книге «Дизайн дизайна» , где он использовал его в качестве примера в главе «Как эксперты Дизайнеры ошибаются». [14] Он объяснил это тем, что дизайнеры не осознали, что JCL на самом деле является языком программирования.
Большая часть сложности ОС JCL, в частности, связана с большим количеством опций для указания информации о наборе данных . В то время как файлы в Unix -подобных операционных системах абстрагируются в упорядоченные потоки байтов, причем задача чтения и записи структурированных данных принадлежит исключительно программам пользовательского уровня (которые, в конечном итоге, принимают и испускают такие потоки), а практические детали данных хранение и доступ к ним в значительной степени осуществляются операционной системой без ведома пользовательских программ; наборы данных в OS/360 и ее преемниках раскрывают типы и размеры файлов, типы и длины записей, размеры блоков, информацию, специфичную для устройства, такую как плотность магнитной ленты , и информацию о метках. Хотя для многих опций существуют системные настройки по умолчанию, программисту еще многое предстоит указать с помощью комбинации JCL и информации, закодированной в программе. Чем больше информации закодировано в программе, тем менее гибкой она является, поскольку информация в программе переопределяет все, что есть в JCL; таким образом, большая часть информации обычно предоставляется через JCL.
Например, чтобы скопировать файл в операционной системе Unix , пользователь должен ввести такую команду:
cp oldFile newFile
Следующий пример с использованием 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-подобной среде.
- Младшие процессоры System/360 были менее мощными и более дорогими, чем ПК середины 1980-х годов, для которых была разработана MS-DOS. OS/360 предназначалась для систем с минимальным объемом памяти 32 КБ, а DOS/360 — для систем с минимальным объемом памяти 16 КБ. ЦП 360/30 — самый дешевый на момент анонса System/360 в 1964 году — обрабатывал от 1,8 до 34,5 тыс. инструкций в секунду. [15] Первый IBM PC в 1981 году имел 16 или 64 КБ памяти и обрабатывал около 330 000 инструкций в секунду. [16] [17] В результате JCL должен был легко обрабатываться компьютером , а простота использования программистами имела гораздо меньший приоритет. В ту эпоху программисты были намного дешевле компьютеров.
- JCL был разработан для пакетной обработки . Таким образом, он должен сообщать операционной системе все, включая то, что делать в зависимости от результата шага. Например,
DISP=(NEW,CATLG,DELETE)
означает «если программа работает успешно, создайте новый файл и занесите его в каталог; в противном случае удалите новый файл». Программы, запускаемые на ПК, часто зависят от того, сможет ли пользователь выполнить очистку после обработки проблем. - Машины System/360 были разработаны для совместного использования всеми пользователями организации. Итак,
JOB
card сообщает операционной системе, как выставить счет пользователю (IS198T30500
), какой заранее определенный объем памяти и других ресурсов может быть выделен (CLASS=L
) и многое другое.//SYSPRINT DD SYSOUT=*
указывает компьютеру распечатать отчет программы на принтере по умолчанию , в который загружена обычная бумага, а не на каком-либо другом принтере, в который могут быть загружены пустые чеки.DISP=SHR
сообщает операционной системе, что другие программы могут читатьOLDFILE
в то же время .
Более поздние версии операционных систем DOS/360 и OS/360 сохраняют большинство функций исходного JCL, хотя и были сделаны некоторые упрощения, чтобы не заставлять клиентов переписывать все свои файлы JCL. [ нужна ссылка ] Многие пользователи сохраняют в качестве процедуры любой набор операторов JCL, который, вероятно, будет использоваться более одного или двух раз. [18]
Синтаксис OS JCL аналогичен синтаксису макросов на языке ассемблера System/360 и поэтому был знаком программистам в то время, когда многие программы писались на ассемблере.
ДОС JCL
[ редактировать ]Позиционные параметры
[ редактировать ]//TLBL TAPEFIL,'COPYTAPE.JOB',,,,2
//ASSGN SYS005,200
//DLBL DISKFIL,'COPYTAPE.JOB',0,SD
//EXTENT SYS005,VOL01,1,0,800,1600
Параметры DOS JCL являются позиционными, что затрудняет их чтение и запись, но облегчает анализ системой.
- Программист должен помнить, какой элемент и в какой позиции находится в каждом типе оператора.
- Если некоторые необязательные параметры опущены, но включены более поздние, то пропущенные параметры должны быть представлены запятыми без пробелов, как в приведенном выше операторе TLBL.
DOS JCL в некоторой степени смягчает трудности с позиционными параметрами, используя больше операторов с меньшим количеством параметров, чем OS JCL. В этом примере операторы ASSGN, DLBL и EXTENT выполняют ту же работу (указывая, где должен храниться новый дисковый файл), что и одиночный файл. DD
заявление в ОС JCL.
Зависимость от устройства
[ редактировать ]В исходной DOS/360 и в большинстве версий DOS/VS нужно было указывать номер модели устройства, которое должно было использоваться для каждого файла на диске или ленте — даже для существующих файлов и для временных файлов, которые должны были быть удалены в любой момент. конец работы. Это означало, что если клиент перешел на более современное оборудование, многие файлы JCL пришлось изменить.
Более поздние члены семейства DOS/360 сократили количество ситуаций, в которых требовались номера моделей устройств.
Распределение файлов вручную
[ редактировать ]DOS/360 изначально требовал от программиста указания местоположения и размера всех файлов на DASD . EXTENT
card определяет том, на котором находится экстент, начальную абсолютную дорожку и количество дорожек. В z/VSE файл может иметь до 256 экстентов на разных томах.
ОС JCL
[ редактировать ]OS JCL состоит из трех основных типов операторов: [19]
JOB
заявление, которое идентифицирует начало задания, а также информацию обо всем задании, такую как выставление счетов, приоритет выполнения, а также ограничения по времени и пространству.EXEC
заявление, которое идентифицирует программу или процедуру [20] которые будут выполнены на этом этапе задания,
и информацию о шаге, включая УСЛОВИЯ для выполнения или пропуска шага.DD
Операторы (Определение данных), которые идентифицируют файл данных, который будет использоваться на шаге, и подробную информацию об этом файле.DD
операторы могут располагаться в любом порядке внутри шага.
С самого начала JCL для семейства ОС (вплоть до z/OS ) был более гибким и простым в использовании.
В следующих примерах используется старый стиль синтаксиса, который был предоставлен сразу после запуска System/360 в 1964 году. Старый синтаксис до сих пор довольно распространен в заданиях, которые выполнялись десятилетиями с небольшими изменениями.
Правила кодирования операторов JCL
[ редактировать ]Каждый оператор JCL разделен на пять полей: [21]
Identifier-Field Name-Field Operation-Field Parameter-Field Comments-Field ^ ^ ^ ^ no space space space space
Поле идентификатора должно быть объединено с полем имени , т. е. между ними не должно быть пробелов.
- Поле идентификатора (
//
): Поле идентификатора указывает системе, что оператор является оператором JCL, а не данными. Поле идентификатора состоит из следующего:- Столбцы 1 и 2 всех операторов JCL, кроме оператора разделителя, содержат
//
- Столбцы 1 и 2 оператора разделителя содержат
/*
- Столбцы 1, 2 и 3 оператора комментария JCL содержат
//*
- Столбцы 1 и 2 всех операторов JCL, кроме оператора разделителя, содержат
- Поле имени : Поле имени идентифицирует конкретный оператор, чтобы другие операторы и система могли ссылаться на него. Для операторов JCL его следует закодировать следующим образом:
- Имя должно начинаться в столбце 3.
- Имя может содержать от 1 до 8 буквенно-цифровых или национальных символов (
$
,#
,@
) персонажи. - Первый символ должен быть буквой.
- После имени должен идти хотя бы один пробел.
- Поле операции : Поле операции определяет тип оператора или, в случае командного оператора, команду. Поле операции должно быть закодировано следующим образом:
- Поле операции состоит из символов синтаксического поля оператора.
- Операция следует за полем имени.
- Перед операцией и после нее должен стоять хотя бы один пробел.
- Операция станет одной из
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)
[ редактировать ]The 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= имя_процесса" или просто "имя_процесса EXEC" [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
or
//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 Using a procedure
//STEP02 EXEC PGM=......... Step which is specific to this job
//INPUT01 DD DSN=*.STEP01.MYPR01.NEWFILE
где DSN=*.STEP01.MYPR01.NEWFILE
означает «использовать файл, идентифицированный как NEWFILE
в шаге MYPR01
процедуры, используемой на этапе STEP01
этого задания». Использование имени шага, вызвавшего процедуру, а не имени процедуры, позволяет программисту использовать одну и ту же процедуру несколько раз в одном и том же задании, не путаясь в том, какой экземпляр процедуры используется в обратной ссылке.
Комментарии
[ редактировать ]Файлы JCL могут быть длинными и сложными, а язык нелегко читать. ОС JCL позволяет программистам включать пояснительные комментарии двух типов:
- В той же строке, что и оператор JCL. Их можно расширить, поместив символ продолжения (обычно "
X
") в столбце 72, за которым следует "//
" в столбцах 1–3 следующей строки. - Строки, содержащие только комментарии, часто используются для объяснения основных моментов общей структуры JCL, а не локальных деталей. Строки только для комментариев также используются для разделения длинных сложных файлов JCL на разделы.
//MYJOB JOB ..........
//* Lines containing only comments.
//******** Often used to divide JCL listing into sections ********
//STEP01 EXEC MYPROC Comment 2 on same line as statement
//STEP02 EXEC PGM=......... Comment 3 has been extended and X
// overflows into another line.
//INPUT01 DD DSN=STEP01.MYPR01.NEWFILE
Объединение входных файлов
[ редактировать ]ОС 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 assumed to be equal to or less than 800)
// DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 800)
В более поздних версиях ОС (конечно, после OS/MVS R3.7 с соответствующими «выбираемыми единицами») сама ОС во время выделения проверяла каждый экземпляр в конкатенации и заменяла найденную максимальную длину блока.
Обычным отходом было просто определить максимально возможную длину блока на устройстве и указать ее в указанном операторе DD, как, например,
//INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=8000
// DD DSN=JOESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000)
// DD DSN=SUESFILE,DISP=SHR (BLKSIZE assumed to be equal to or less than 8000)
Целью этого резервного варианта было гарантировать, что метод доступа выделит набор входных буферов, который был бы достаточно большим, чтобы вместить любой из указанных наборов данных.
Условная обработка
[ редактировать ]ОС ожидает, что программы установят код возврата, который указывает, насколько успешной, по мнению программы, она была. Наиболее распространенными условными значениями являются: [29] : стр.87
- 0 = Нормально – все ОК
- 4 = Предупреждение – незначительные ошибки или проблемы.
- 8 = Ошибка – существенные ошибки или проблемы.
- 12 = Серьезная ошибка – серьезные ошибки или проблемы, результатам (например, созданным файлам или отчетам) нельзя доверять.
- 16 = Ошибка терминала – очень серьезные проблемы, не используйте результаты!
OS JCL ссылается на код возврата как COND
(«код условия») и может использовать его, чтобы решить, следует ли выполнять последующие шаги. Однако, в отличие от большинства современных языков программирования, условные шаги в ОС 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
ненормально закончилось.
Это преобразуется в следующий псевдокод :
run STEP01 if STEP01's return code is greater than or equal to 4 then run STEP02 end if if any previous return code is less than 8 then run STEP03 end if if STEP01 abnormally ended then run STEP04 end if if STEP03 abnormally ended then run STEP05 else run STEP05 end if
Обратите внимание, что, прочитав шаги, содержащие COND
утверждения задом наперед, их можно довольно легко понять. Это пример логического транспонирования .
Однако позже IBM ввела условие IF в JCL, тем самым несколько упростив кодирование для программистов, сохранив при этом COND
параметр (чтобы избежать внесения изменений в существующие JCL, где COND parm
используется).
The COND
параметр также может быть указан в JOB
заявление. В этом случае система «выполняет одни и те же тесты кода возврата для каждого шага задания. Если проверка кода возврата оператора JOB удовлетворена, задание завершается». [30]
Утилиты
[ редактировать ]Джобс использует ряд служебных программ IBM для обработки данных. Утилиты наиболее полезны при пакетной обработке. Утилиты можно сгруппировать в три группы:
- Утилиты наборов данных — создавайте, печатайте, копируйте, перемещайте и удаляйте наборы данных.
- Системные утилиты — поддержка и управление каталогами и другой системной информацией.
- Службы методов доступа — обработка методов доступа к виртуальному хранилищу (VSAM) и наборов данных, отличных от VSAM.
Сложность использования
[ редактировать ]ОС 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.
ОС/360
[ редактировать ]Ранняя версия языка управления вводом заданий для удаленного ввода заданий OS/360 (номер программы 360S-RC-536) использовала идентификатор ..
в столбцах 1–2 входной записи и состоял из одного управляющего оператора: JED
(Определение записи о вакансии). «Команды рабочей станции», такие как LOGON
, LOGOFF
, и STATUS
тоже началось с ..
. [36]
до JES JECL
[ редактировать ]Хотя этот термин еще не был разработан, HASP имел функциональность, аналогичную тому, что впоследствии стало JECL в JES , включая /*
синтаксис.
з/ОС
[ редактировать ]Для JES2 операторы JECL начинаются с /*
, для JES3 они начинаются с //*
, кроме удаленного /*SIGNON
и /*SIGNOFF
команды. Команды для двух систем совершенно разные.
JES2 JECL
[ редактировать ]Следующие операторы JES2 JECL используются в z/OS 1.2.0. [37]
Заявление JECL | Функция | Пример |
---|---|---|
/*$command |
Вводит операторскую (консольную) команду | /*$S PRINTER3 [38]
|
/*JOBPARM |
Указывает значения параметров, связанных с заданием | /*JOBPARM TIME=10
|
/*MESSAGE |
Отправляет сообщение на консоль оператора | /*MESSAGE CALL JOE AT HOME IF JOB ABENDS
|
/*NETACCT |
Указывает номер счета для сетевого задания | /*NETACCT 12345
|
/*NOTIFY |
Указывает место назначения для сообщений уведомлений | /*NOTIFY SAM
|
/*OUTPUT |
Указывает SYSOUT. параметры набора данных | /*OUTPUT FORMS=BILL
|
/*PRIORITY |
Устанавливает приоритет выбора задания | /*PRIORITY 15
|
/*ROUTE |
Указывает место назначения вывода или узел выполнения | /*ROUTE PRT RMT5
|
/*SETUP |
Запрашивает монтирование тома или другую автономную операцию | /*SETUP TAPE01,TAPE02
|
/*SIGNOFF |
Завершает удаленный сеанс | /*SIGNOFF
|
/*SIGNON |
Начинает удаленный сеанс | /*SIGNON REMOTE5 password
|
/*XEQ |
Указывает узел выполнения | /*XEQ DENVER
|
/*XMIT |
Указывает задание или набор данных для передачи на другой сетевой узел. | /*XMIT NYC
|
JES3 JECL
[ редактировать ]Следующие операторы JES3 JECL используются в z/OS 1.2.0. [39]
Заявление JECL | Функция | Пример |
---|---|---|
//**command |
Вводит операторскую (консольную) команду JES3. | |
//*DATASET |
Отмечает начало набора данных в потоке | |
//*ENDDATASET |
Отмечает конец встроенного набора данных | |
//*ENDPROCESS |
Обозначает конец серии //*PROCESS заявления |
|
//*FORMAT |
Указывает SYSOUT параметры набора данных |
|
//*MAIN |
Указывает значения параметров, связанных с заданием | |
//*NET |
Определяет связи между заданиями с помощью управления заданиями, зависящего от JES3. | |
//*NETACCT |
Указывает номер счета для сетевого задания | |
//*OPERATOR |
Отправляет сообщение на консоль оператора | |
//*PAUSE |
Останавливает считыватель ввода | |
//*PROCESS |
Определяет нестандартную работу | |
//*ROUTE |
Указывает узел выполнения задания. | |
/*SIGNOFF |
Завершает удаленный сеанс | /*SIGNOFF
|
/*SIGNON |
Начинает удаленный сеанс |
z/VSE
[ редактировать ]Для VSE операторы JECL начинаются с ' * $$
' (обратите внимание на один пробел). Язык управления вводом заданий определяет начальную и конечную строки заданий JCL. Он сообщает VSE / POWER , как выполнять эту работу. Операторы JECL определяют имя задания (используемое VSE/POWER), класс, в котором задание обрабатывается, и расположение задания (т. е. D
, L
, K
, H
).
Заявление JECL [40] | Функция | Пример |
---|---|---|
* $$ CTL |
Устанавливает класс ввода по умолчанию | * $$ CTL CLASS=A
|
* $$ JOB |
Указывает атрибуты задания | * $$ JOB JNM=PYRL,PRI=9
|
* $$ EOJ |
Отмечает окончание работы | * $$ EOJ
|
* $$ RDR |
Вставляет файл с дискеты 3540 во входной поток. | * $$ RDR SYS005,'fname',2
|
* $$ PRT |
Определяет характеристики буферных файлов печати. «LST» является синонимом «PRT». |
* $$ PRT FNO=STD,COPY=2
|
* $$ PUN |
Определяет характеристики буферных перфорационных файлов. | * $$ PUN DISP=T,TADDR=280
|
* $$ SLI |
Вставляет данные («книгу») из исходной библиотеки операторов во входной поток. | * $$ SLI A.JCL1
|
* $$ DATA |
Вставляет данные из устройства чтения карт в книгу, полученную из библиотеки исходных операторов. | * $$ DATA INPUT1
|
Пример:
* $$ JOB JNM=NAME,DISP=K,CLASS=2
[some JCL statements here]
* $$ EOJ
Другие системы
[ редактировать ]Другие пакетные системы для мэйнфреймов имели ту или иную форму языка управления заданиями, называлась она так или нет; их синтаксис полностью отличался от версий IBM, но обычно они предоставляли схожие возможности. Интерактивные системы включать « командные языки » — командные файлы (такие как файлы PCDOS «.bat») можно запускать в неинтерактивном режиме, но они обычно не обеспечивают такую надежную среду для выполнения автоматических заданий, как JCL. В некоторых компьютерных системах язык управления заданиями и язык интерактивных команд могут различаться. Например, TSO в системах z/OS использует CLIST или Rexx в качестве командных языков наряду с JCL для пакетной работы. В других системах они могут быть такими же.
См. также
[ редактировать ]- dd (Unix) — программа для Unix, вдохновленная
DD
- Утилиты для мэйнфреймов IBM
- Пакетная обработка
- Набор данных (мэйнфрейм IBM)#Generation Data Group
Ссылки
[ редактировать ]- ^ «Каждое задание, отправленное на выполнение... должно включать операторы JCL» — ibm.com
- ^ и многие более сложные детали , например, следует ли сохранить или удалить файл, максимальное дисковое пространство, до которого он может вырасти, имя предварительно смонтированной ленты.
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 1.
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 5.
- ^ Маккуиллен, Язык ассемблера System/360–370 , стр. 385–386.
- ^ Jump up to: а б Маккуиллен, Язык ассемблера System/360–370 , стр. 288–289, 400.
- ^ Льюис, Сесилия (8 августа 2011 г.). «Что мы сделали для вас в последнее время с PDSE» (PDF) . ДОЛЯ в Орландо . Проверено 3 марта 2023 г.
- ^ Маккуиллен, Язык ассемблера System/360–370 , стр. 22–24.
- ^ МакКвиллен, Язык ассемблера System/360–370 , стр. 380–382.
- ^ Стерн и Стерн, Структурированное программирование на COBOL , стр. 528–529.
- ^ Стерн и Стерн, Структурированное программирование на COBOL , стр. 529, 531.
- ^ Стерн и Стерн, Структурированное программирование на COBOL , стр. 529, 537.
- ^ по образцу https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.hasc300/has2z1_Submitting_to_the_internal_reader_from_jobs_or_tasks.htm с использованием знаний, относящихся к тому времени, когда от IBM появились грин-карты, и работал Manix. для компании, владеющей сортировщиком карточек IBM
- ^ Брукс, Фредерик П. (2010). Дизайн дизайна . Аддисон-Уэсли . стр. 167–173. ISBN 978-0-201-36298-5 .
- ^ «Архивы IBM: System/360 Model 30» . www-03.ibm.com . 23 января 2003 г. Проверено 25 апреля 2016 г.
- ^ «ИБМ ПК» . Архивировано из оригинала 5 июля 2006 г. Проверено 21 октября 2007 г.
- ^ IBM-совместимые компьютеры. История компьютеров. Архивировано 14 августа 2007 г. в Wayback Machine.
- ^ Браун, Гэри ДеВард (2002). zOS JCL (пятое изд.). Джон Уайли и сыновья. п. 248. ИСБН 0471-236357 .
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 8, 23. Есть также два дополнительных оператора, PROC и PEND, используемые для тестирования процедур JCL.
- ^ Предварительно сохраненный набор команд JCL "EXEC PGM=" и "DD", которые можно параметризовать.
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 12–16.
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 13–15.
- ^ Корпорация IBM (август 1978 г.). Руководство по службам управления данными OS/VS MVS (PDF) . Проверено 17 октября 2014 г.
- ^ Корпорация IBM (июнь 1971 г.). Операционная система IBM System/360: Справочник по языку управления заданиями (PDF) . Проверено 25 июня 2019 г.
- ^ Маккуиллен, Язык ассемблера System/360–370 , стр. 297, 406–407.
- ^ значением по умолчанию для оператора EXEC является PROC=
- ^ Эшли и Фернандес, Язык управления заданиями , стр. 129–131.
- ^ «Имена наборов данных» . ИБМ . 27 марта 2014 г.
Имена наборов данных не должны превышать 44 символов, включая все сегменты и точки имени.
- ^ Jump up to: а б Браун, Гэри ДеВард (2002). zOS JCL . Джон Уайли и сыновья. ISBN 9780471426738 . Проверено 5 мая 2014 г.
- ^ Корпорация IBM. «Взаимосвязь параметров COND в операторах JOB и EXEC» . Центр знаний IBM . Проверено 21 февраля 2018 г.
- ^ Jump up to: а б с Маккуиллен, Язык ассемблера System/360–370 , стр. 406–407.
- ^ Чарли, Альфред (1993). NetView: продукт IBM для управления сетью . Нью-Йорк: Ван Ностранд Рейнхольд. п. 93 . ISBN 0-442-01407-4 .
- ^ Мэтью В. Блод (6 апреля 2020 г.). «Новые безработные жители Нью-Йорка разочарованы технологиями эпохи 1970-х годов (nytimes.com)» . Проверено 7 мая 2020 г.
JCL, в частности, общеизвестно враждебен пользователям, и Фред Брукс назвал его «худшим языком программирования, когда-либо созданным» ... (http://dtsc.dfw.ibm.com/MVSDS/'HTTPD2.APPS.ZOSCLASS.PDF(ZCLA) ...) [ссылка в оригинале].
- ^ Jump up to: а б с Эшли и Фернандес, Язык управления заданиями , стр. vii–viii, задняя обложка.
- ^ Блатт, Джон М. (1971). Введение в программирование на FORTRAN IV: использование компиляторов WATFOR/WATFIV . Пасифик Палисейдс, Калифорния: Издательство Goodyear. п. 276. ИСБН 0-87620-440-Х .
- ^ Корпорация IBM (1968). Запись удаленного задания операционной системы IBM System/360 (PDF) . Проверено 5 мая 2014 г.
- ^ Корпорация IBM. «Управляющие операторы подсистемы ввода заданий 2 (JES2)» . z/OS V1R2.0 МВС JCL . Архивировано из оригинала 18 октября 2015 года . Проверено 25 февраля 2013 г.
- ^ другие примеры можно просмотреть в разделе Приоритет автоматической буферизации в Хьюстоне # Команды оператора.
- ^ Корпорация IBM. «Управляющие инструкции подсистемы ввода заданий 3 (JES3)» . z/OS V1R2.0 МВС JCL . Архивировано из оригинала 18 октября 2015 года . Проверено 25 февраля 2013 г.
- ^ Корпорация IBM (1974). Установка и работа DOS/VS POWER/VS (PDF) .
Источники
[ редактировать ]- «Руководство пользователя z/OS V1R6.0 MVS JCL» (PDF) (5-е изд.). ИБМ. Сентябрь 2004 г. Архивировано из оригинала (PDF) 19 августа 2013 г. Проверено 12 октября 2006 г.
- «Справочник по z/OS V1R7.0 MVS JCL» (PDF) (11-е изд.). ИБМ. Апрель 2006 г. Архивировано из оригинала (PDF) 19 августа 2013 г. Проверено 12 октября 2006 г.
- Джонстон, Джерри (1 апреля 2005 г.). «ВСЕ: Взгляд на последние 40 лет» . з/Журнал . Томас Коммуникейшнз. Архивировано из оригинала 4 марта 2009 года.
- «Компьютерные хроники: 1972 – 1981» . ThinkQuest . Корпорация Оракл . 1998. Архивировано из оригинала 21 июня 2009 года.
- ДеВард Браун, Гэри (7 июня 2002 г.). zOS JCL (5-е изд.). Уайли. ISBN 978-0-471-23635-1 .
- «Поля операторов JCL» . z/OS V1R11.0 MVS JCL Reference z/OS V1R10.0-V1R11.0 . ИБМ. 2010.
- Корпорация IBM (март 2007 г.). Введение в новый мэйнфрейм: основы z/VSE (PDF) . IBM, Международная организация технической поддержки. ISBN 978-0-73-848624-6 . Проверено 6 декабря 2017 г.
- Эшли, Рут; Фернандес, Джуди Н. (1978). Язык управления заданиями: Самоучитель . Нью-Йорк: Джон Уайли и сыновья. ISBN 0-471-03205-0 .
- Маккуиллен, Кевин (1975). Язык ассемблера (ОС) System/360–370 . Фресно, Калифорния: Майк Мурач и партнеры. LCCN 74-29645 .
- Стерн, Нэнси; Стерн, Роберт А. (1980). Структурированное программирование на COBOL (3-е изд.). Нью-Йорк: Джон Уайли и сыновья. ISBN 0-471-04913-1 .