Позвольте мне сказать вам ... карма - сука.

Когда я учился в аспирантуре, одним из моих обязательных курсов был курс углубленной статистики, который я искренне любил, но включал обязательный компонент компьютерной лаборатории, который меня до чертиков наскучил. Каждые две недели это был полуторачасовой блок, посвященный тому, как использовать SPSS, и большую часть времени казалось, что по крайней мере 40 минут этого блока было потрачено на объяснение, как нажать «Файл» - ›Открыть. В результате я выбрал компьютер, на котором экран был направлен в сторону от преподавателя, и провел большую часть времени в классе, играя в сети университета (самый известный пример - выяснить, как подключиться к прямой трансляции MSG, чтобы смотреть игру Рейнджерс без рекламы).

В любом случае, в то время я совершенно не сочувствовал одноклассникам, которые изо всех сил пытались понять, как делать что-то столь же простое, как взаимодействие с интерфейсом их операционной системы. А затем, примерно восемь лет спустя, я решил написать в блоге сообщение о разнице между переносом COBOL и его компиляцией, для чего мне потребовалось установить операционную систему IBM z / OS и взаимодействовать с ней ...

Как я уже сказал: карма - сука.

Если вы следовали одному из удивительных руководств о том, как настроить мэйнфрейм на обычном персональном компьютере, вы, вероятно, заметили, что они заканчиваются экраном входа в систему, как будто все, что дальше этого пункта, будет интуитивно понятным и самодостаточным. -понятно для новичков. Я имею в виду ... это было моим предположением, когда я собирался в этот проект. Я разберусь. Как трудно это может быть? Может, это займет у меня несколько часов. Может, мне придется погуглить кое-что… почитать документацию…

На это у меня ушло больше недели.

Более недели, чтобы выяснить, что достаточно для компиляции и запуска базовой программы.

Это заняло у меня столько времени, потому что переход от современных сред разработки программного обеспечения к z / OS требует большого количества стрижек. z / OS выглядит как командная строка, но представляет собой текстовый интерфейс, который хочет, чтобы вы взаимодействовали с ним, как с графическим интерфейсом, поэтому вам нужно знать не только, что это за команды, но и ГДЕ на экране, где можно вводить каждую команду. Практически все, что вы хотите сделать, требует написания сценария JCL, а JCL на первый взгляд - это чепуха со всеми заглавными буквами. Настройки по умолчанию и расположение библиотек могут сильно отличаться в зависимости от установки, при этом стандартный ответ о том, как выяснить вашу локальную правду, звучит так: «Позвоните своему системному администратору». У IBM так много документации, и она настолько плотна, что даже Google кажется невозможным проникнуть в нее.

Вдобавок ко всему, IBM использует специальные и совершенно не интуитивные названия для основных понятий…. КОНЕЧНО, ОНИ ДЕЛАЮТ.

Это свело меня с ума, и мое понимание того, как все работает и что делать, все еще находится в стадии разработки ... но я действительно многому научился, и я рад возможности поделиться, чтобы я мог делать свои маленькие часть, чтобы снизить доход Google от рекламы от всех тех поисковых запросов, которые вы в противном случае сделали бы.

Як 00: Наборы данных - файлы! (Навигация по z / OS)

Допустим, вы начинаете как я. У вас установлена ​​z / OS, и первое, что вы хотите сделать, это приветствовать мир на COBOL или что-то в этом роде. Вы полагаете, что, вероятно, есть разумные способы переместить файл из файловой системы вашего хоста в z / OS, но программа не очень длинная, поэтому, чтобы ускорить процесс, вы просто собираетесь ее перепечатать. Звучит довольно просто, правда? Создайте файл, перепечатайте вашу программу, сохраните файл, запустите компилятор, выполните программу.

За исключением того, что вы похожи на меня, вы быстро поймете, что, похоже, нет возможности создавать файлы. Не в меню, выбор опции редактирования немедленно выводит вас на этот запутанный экран с запросом местоположения вашего набора данных в каталоге, поиск в Google «Как мне создать файл в z / OS» возвращает кучу информации о z / OS Unix ( о котором мы не будем говорить здесь) и кучу вещей о создании наборов данных, которые не имеют отношения к делу, потому что вы не хотите создавать набор данных, который вы хотите создать файлом!

Что ж… Наборы данных это файлы.

Там я просто сэкономил вам много времени и обид. То, что IBM называет «наборами данных», практически все остальные ОС на планете называют файлами и каталогами. Наборы данных бывают двух видов: последовательные наборы данных, которые ведут себя очень похоже на файлы, и многораздельные наборы данных, которые ведут себя больше как каталоги в традиционной ОС.

Итак, чтобы создать файл, вам нужно выделить набор данных. В целях программирования вы, вероятно, захотите создать секционированный набор данных (подробнее о том, как это сделать через секунду), который будет иметь очень конкретное соглашение об именах, которому вы должны следовать:

PROJECT.GROUP.TYPE(MEMBER)

Вот что все это значит:

  • PROJECT: До смешного не интуитивно понятно: это должен быть идентификатор пользователя. Теоретически идентификатор пользователя учетной записи, с которой вы вошли в TSO. Если вы следуете примеру Геракла, вы, вероятно, для начала используете ibmuser.
  • GROUP: Считайте это именем своей папки. Это может быть все, что угодно, пока вы остаетесь в рамках ограничений имени набора данных. Помните как о длине символа, так и о выходе за рамки буквенно-цифрового ввода.
  • TYPE: Что это за файл на самом деле. Для нашей программы COBOL это будет COBOL. Для JCL это будет JCL. Но по мере прохождения этапов компиляции, компоновки и выполнения будут появляться и другие, менее простые типы, которые z / OS создаст для нас, такие как LOAD и OBJ.
  • MEMBER: В нашем аналоге «наборы данных являются файлами» это ваше имя файла. Как и GROUP, это может быть почти все, что вы хотите, с теми же ограничениями. Если для первой программы вы будете использовать буквенно-цифровые символы, вам не нужно слишком много знать о том, что z / OS разрешает, а что не разрешает.

В процессе создания и редактирования наборов данных вы будете проводить много времени в Interactive System Productivity Facility (далее ISPF). ISPF находится поверх TSO (то есть того, что вы вошли в систему) и предоставляет вам пользовательский интерфейс, который должен быть более дружелюбным (ага ...)

Як 01: Вы собираетесь использовать fn ОЧЕНЬ много (работа в ISPF)

Работать с ISPF… интересно. Я чувствую, что каждый раз, когда аргумент Vim -vs- Emacs вспыхивает в Интернете, все участники должны использовать ISPF в течение определенного периода времени, чтобы они оценили то, что есть у нас в современных текстовых редакторах.

Дизайн ISPF выглядит так, будто он действительно хочет быть графическим интерфейсом, но это не графический интерфейс, и для навигации по нему нужно использовать клавиатуру. Это дает определенные… причуды.

Первый экран, который вы увидите после входа в систему, - это меню параметров, которое выглядит примерно так:

По умолчанию командная строка находится в нижней части экрана, здесь она помечена как Option ===>. Эта часть не требует пояснений: вы вводите букву / цифру, соответствующую желаемому параметру, и нажимаете Return. Но это становится немного шатким, когда вы понимаете, что если вы нажмете клавишу вверх, курсор выйдет за пределы командной строки и позволит вам перемещаться по самому экрану. Если вы введете свой вариант не в командной строке, ваш компьютер издаст неодобрительный звуковой сигнал. Если вы переместите курсор к нужной опции, чтобы выбрать ее, ваш курсор вернется в командную строку.

ISPF, похоже, не заботится о том, где в командной строке вы вводите команды, а только о том, что вы выполняете определенные команды в командной строке. Итак, если вы хотите переместить курсор полностью вправо, прежде чем вводить 1 для просмотра файла, продолжайте.

Еще одна важная вещь, которую нужно знать об интерфейсе ISPF, - это то, что вы собираетесь работать с клавишей fn много. Так что знайте, где он находится, и привыкните к этому положению пальцев. F-клавиши, которые вы будете чаще всего использовать в этом упражнении, следующие:

  • F3: выход из любого экрана, на котором вы сейчас находитесь, и возврат к предыдущему экрану. Если вы редактируете набор данных, это также автоматически сохранит вашу работу перед выходом.
  • F8: прокрутите вниз
  • F7: прокрутите вверх

У некоторых пунктов меню есть подменю. Если вы знаете, что хотите открыть меню обработки Foreground (вариант 4) и выбрать компилятор COBOL (вариант 2 в подменю), вы можете просто ввести 4.2 в командной строке и сразу перейти к нему.

Як 02: Выделение набора данных для COBOL

Если бы мне нужно было выбрать то, что вызывало наибольшее беспокойство, я бы выяснил, какие настройки должен иметь мой набор данных, чтобы мой код COBOL скомпилировался правильно.

На самом деле… нет, это было не самое худшее. Хуже всего было выяснить причину, по которой моя программа не компилируется, потому что мои настройки набора данных были НЕПРАВИЛЬНЫМИ. На некоторых моих снимках экрана вы можете заметить, что я использую названия групп, такие как COBLOG3 и COBLOG4. Это потому, что я все испортил и все испортил множеством разных способов.

Чтобы выделить или создать набор данных, перейдите на панель «Утилиты» (вариант 3) и выберите параметр «Набор данных» в подменю (вариант 2). Первый экран будет довольно простым: вы наводите курсор на поля для Project, Group и Type и вводите ibmuser, имя вашей папки и COBOL соответственно. Затем вы переходите обратно в командную строку (вы можете использовать для этого свою мышь, FYI) и вводите нужный вариант (в данном случае A для выделения)

Затем вам будет представлен такой экран:

… .И будут огорчены, узнав, что вы не можете просто пойти «Пффтт… что угодно» и не задавать эти параметры. Кроме того, забавный факт, большинство параметров не могут быть изменены после распределения набора данных!

Если, как и я, вы обратились к официальной документации IBM в поисках рекомендаций относительно того, какими должны быть эти значения, вы, вероятно, оказались на этой странице и дали свои первые настройки набора данных, которые очень и очень плохи для COBOL. Вот места, где вы сейчас облажались и какие сообщения об ошибках вы, вероятно, получите при попытке компиляции:

  • RECORD LENGTH должно быть 80. Помните, что COBOL изначально запускался на перфокартах с шириной 80 столбцов, поэтому программы COBOL имеют фиксированную ширину и 80 столбцов. Если вы установите RECORD LENGTH на значение больше 80, компилятор сообщит вам: Входной LRECL слишком велик для типа языка. LRECL означает длину логической записи, и мне потребовалась целая вечность, чтобы понять, какое это имеет отношение к чему-либо. Как ни странно, решение пришло, когда я застрял в неприятном цикле ошибок в командной строке ISPF над красным дефисом. Совершенно случайно z / OS выплюнула сообщение, в котором говорилось: Кстати, LRECL для программ JCL должно быть 80, и я установил соединение.
  • BLOCK SIZE должно быть 4000. Ладно, это моя вина. К этому моменту я знал, что размер блока должен быть кратен LRECL, и я просто не обратил на это внимания и оставил его равным 5100. Ваш размер блока может быть другим, если вы хотите, если он равномерно делится на 80.
  • RECORD FORMAT это должно быть установлено на FB (фиксированный блок), а не на VB (переменные блоки) по причинам, которые должны быть очевидными, учитывая все, что описано выше. Ошибка в этом создала действительно интересный хаос при компиляции. Сначала казалось, что компилятор z / OS COBOL был немного более анальным в отношении отступов, чем GnuCOBOL, но после пары раундов возиться с отступами я понял, что компилятор игнорирует разрывы строк, выдавая следующие ошибки:

После того, как вы установили правильные настройки, не забудьте указать в качестве Data set name type для PDS для многораздельного набора данных.

И понеслось!

Як 03: Команды строки -vs- Командные команды

Набор данных правильно распределен, пора приступить к написанию COBOL.

В главном меню параметров выберите 2, чтобы отредактировать набор данных и заполнить значения Project, Group и Type нового набора данных. Затем введите имя файла в строке для Member, и откроется пустой файл.

Если при попытке редактирования файла отображается сообщение «X Protected», вернитесь к последнему экрану и установите флажок «Редактировать на рабочей станции».

Если у вас есть сообщения в верхней части файла, вы можете очистить их, набрав res или reset в командной строке внизу, но это также очистит все ваши пустые строки. Ничего страшного, правда? Просто переместите курсор в конец заголовка «Начало данных» и нажмите Return.

За исключением того, что в ISPF новые строки создаются не так. В редакторе есть два столбца, первый слева с красным текстом - это поле. По мере того, как вы вводите свою программу, она автоматически заполняется номерами строк. Но также здесь вы вводите строковые команды. Помните, когда я сказал, что ISPF необычный, вам нужно было убедиться, что вы набираете правильную команду в нужном месте? Это то, о чем я имел в виду. Если вы хотите создать новый разрыв строки в ISPF, вы не вводите команду в основной командной строке, вы переходите к строке непосредственно перед тем, где вы хотите новую строку, и набираете i в любом месте этого красного поля. Затем вы нажимаете return, и ISPF создаст новую строку и восстановит любое предполагаемое значение маржи.

Что ж, давайте напишем нашу тестовую программу на COBOL с некоторыми ошибками и исправим их с помощью ISPF:

Если бы я попытался скомпилировать эту программу, это привело бы к ошибке из-за неправильного отступа. Некоторые вещи помещаются в определенные столбцы в COBOL. Такие вещи, как заголовки деления (ИДЕНТИФИКАЦИЯ и ПРОЦЕДУРА), должны начинаться с столбца 8, здесь я начал с столбца 4. Поэтому мне нужно сдвинуть все мои строки на 4 пробела. К счастью, для этого есть строчная команда. Я могу ввести )4, чтобы сдвинуть отдельную строку, или )) в первой строке, которую я хочу сдвинуть, а затем ))4 в последней строке, которую я хочу сдвинуть, чтобы переместить весь блок.

Мы также не можем называть нашу программу «Тест» (предположительно, это слово зарезервировано), поэтому мы должны заменить его на что-нибудь другое. К сожалению, я не придумал, как вставить символы в середину строки. Мне трудно поверить, что нет другого способа сделать это, кроме как заново набрать всю строку, но я не смог понять, что это за команда. В настоящее время я использую change в основной командной строке, которая позволяет выполнять поиск и замену. Ввод change TEST HELLOW сделает свое дело.

В ISPF больше линейных и первичных команд, чем у меня есть время подробно описывать. См. Эту статью, чтобы получить хороший список.

Як 04: компилировать, связывать, загружать

Наверное, несправедливо называть z / OS устаревшей версией, но она определенно сохраняет некоторые устаревшие парадигмы, к которым нужно некоторое время привыкать. Когда дело доходит до компиляции и запуска программы, вы должны указывать мэйнфрейму выполнить каждый шаг, он ничего не предполагает, тогда как современные инструменты разработки, как правило, по умолчанию автоматизируют шаги, которые вы, скорее всего, захотите выполнить вместе, и добавляя флаги к разбейте вещи, если хотите.

Традиционный способ сделать это в z / OS - использовать IBM Job Control Language (JCL), который чем-то похож на bash мэйнфреймов. Фактически, каждый кусок документации будет сосредоточен на том, как вы делаете что-то в JCL, игнорируя интерфейс, который ISPF предоставляет для таких задач.

Мы не собираемся здесь использовать JCL. Или, скорее, мы собираемся использовать JCL, но позволим ISPF сгенерировать его для нас. Мы собираемся сделать это таким образом, потому что JCL на первый взгляд выглядит довольно тупо, и мы хотим, чтобы в этом процессе на одного яка было меньше.

Нам нужно сделать три шага, чтобы запустить то, что у нас есть сейчас в нашем наборе данных. Сначала нам нужно его скомпилировать. Компилятор COBOL z / OS возьмет наш код и превратит его в так называемую колоду объектов (возврат к старым временам, когда ваш скомпилированный вывод был перфорирован на колодах перфокарт). Для этого мы воспользуемся компилятором z / OS Foreground для COBOL (или опцией 4.2 из главного меню).

Появившаяся панель запросит ваши Project, Group, Type и Member. Вы можете оставить все остальное пустым или по умолчанию. Когда компилятор завершит работу, вы увидите три красных звездочки в качестве приглашения, тогда ISPF автоматически загрузит выходные данные задания. Несколько раз нажмите F8, чтобы прокрутить вниз и проверить наличие ошибок. Если все прошло хорошо, у вас должен быть код возврата 0.

Теперь вернитесь в главное меню, выберите вид и измените тип с COBOL на OBJ. Оставьте имя участника пустым и оставьте свои Project и Group такими же, как и в наборе данных. Вы увидите имя вашей программы в списке колод объектов.

Но сами колоды объектов не являются исполняемыми программами. Это восходит к тому, как эти машины работали изначально. Ваша колода объектов представляла собой физическую колоду перфокарт. Это не была программа, которую можно было запустить, вы загрузили ее обратно в машину. Итак, следующее, что нам нужно сделать, это сгенерировать загрузочный модуль.

Если вы вернетесь в главное меню и снова выберите «Передний план» (вариант 4), вы должны увидеть, что помимо различных компиляторов вы также можете выбрать что-то, называемое редактором подшивки / ссылок. Это то, что сгенерирует наш загрузочный модуль.

Первый набор параметров должен быть вам знаком, нам нужно ввести расположение нашей колоды объектов. Второй раздел - это то, хотим ли мы использовать подшивку или редактор ссылок. Разница между ними сейчас не очень важна. По умолчанию используется Binder, но для Hello World, вероятно, лучше использовать Linkage.

Когда вы создаете загрузочный модуль, редактор связей должен обязательно включать зависимости программы. COBOL, как и все другие языки программирования высокого уровня, требует определенных библиотек, и компилятор не упаковывает их автоматически вместе с набором объектов. В частности, вам нужен набор данных с именем SCEELKED, но его поиск может оказаться проблемой.

Скорее всего, это CEE.SCEELKED, и поскольку ibmuser фактически является учетной записью суперпользователя, есть действительно простой способ проверить это. Мы возвращаемся в главное меню, выбираем Utilities (3) и Dslist (4), затем в строке с надписью Dsname Level вводим CEE, а все остальное оставляем пустым.

Откроется полный список всего, что относится к проекту CEE. Если SCEELKED нет, отметьте SYS1 или SYS2

Если вы не включите библиотеку SCEELKED при попытке создать загрузочный модуль, вы получите следующие ошибки:

SYMBOL IGZCBSO UNRESOLVED
SYMBOL CEESTART UNRESOLVED
SYMBOL CEEBETBL UNRESOLVED
SYMBOL CEESG005 UNRESOLVED

Если загрузочный модуль сгенерирован правильно, вы получите код авторизации 0 и увидите модуль в Project.Group.LOAD(Member)

Есть гораздо более простой способ взаимодействия с редактором связей - напрямую через TSO. Выберите команду в главном меню (вариант 6) и в ответ на приглашение введите LINK project.group.OBJ(Member) lib('cee.sceelked'). То же самое и без интерфейса ISPF.

Итак, теперь (наконец-то!) Мы готовы выполнить нашу программу. Заходим в командную строку TSO (вариант 6) и вводим следующую команду:

CALL 'Project.Group.LOAD(Member)'

Як 05: Работа с катушками (Бонусный Як!)

В нашем подходе есть некоторые недостатки. Сценарии JCL не только позволяют нам выполнять все три шага за одно задание, но и вывод одного может быть направлен на ввод другого, тем самым создавая временные наборы данных, в которых этот ручной процесс создает более постоянные. Используя команду TSO CALL, наш вывод просто выгружается непосредственно в stdout, но обычная программа COBOL, которая скомпилирована и запускается с JCL, скорее всего, отправит свой вывод в спул. Несмотря на то, что мы не рассматриваем JCL в этом посте, все равно стоит познакомить вас с интерфейсом спула. Это пригодится позже.

Вариант S в главном меню, Средство отображения и поиска очереди - это то место, где вы чаще всего найдете свой результат. Вы также можете просмотреть системные журналы, узнать, какие задания находятся в очереди и их статус, а также как используются ресурсы мэйнфрейма.

В общем случае следует обратить внимание на две очереди: Output Queue и Held Output Queue. Задержанная очередь - это то место, где ваш вывод задания, вероятно, закончится в случае ошибки. Очередь вывода - это то место, куда обычно попадают успешно выполненные задания.

При просмотре очередей вывода следует помнить о некоторых полезных строковых командах. S выберет файл в этой строке. ? позволит вам перейти к определенным составным частям вывода (что может быть полезно, если вывод длинный и вы точно знаете, какой раздел хотите просмотреть). Часто результат работы - это больше, чем просто результат. Статистические данные о том, как выполнялось задание, что оно делало и где выполнялось, также являются частью вывода, найденного в катушке.

Идти вперед

Большая часть этого материала была собрана методом проб и ошибок. Я буду обновлять этот пост по мере развития моего понимания. Я уверен, что простое действие - записать все это и выложить в Интернет - привлечет самых разных людей, которые поделятся более подробной информацией. Исправления и уточнения приветствуются в комментариях!

Полезные ресурсы: