10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
1 | |
COBOL в мультиязыковых приложениях08.01.2020, 20:57. Просмотров 1658. Ответов 29
Метки нет Все метки)
(
Уважаемый Kukstyler, в продолжение нашего общения, по Вашему совету решил создать отдельную тему.
Как программиста в большей мере пишущего на PL/I меня заинтересовал следующий вопрос. Как бы Вы посоветовали организовать вызов программы написанной на PL/I из программы написанной на COBOL, в случае, если обе программы работают в одной CICS транзакции? В документации на IBM Knowledge Center мне удалось найти информацию о межпрограммном взаимодействии, и часть, связанная в PL/I мне понятна. Не могли бы Вы посоветовать как правильно организовать взаимодействие со стороны вызывающей COBOL программы под CICS. Буду благодарен Вам за совет.
0
|
|
08.01.2020, 20:57 | |
COBOL Manual Cobol for DOS Обсуждение COBOL Программы COBOL |
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
09.01.2020, 01:09 | 2 |
ByteCodeRunner, здравствуйте. Укажите платформу/ОС, а так же как именно Вы хотите вызвать программу PL/I из COBOL-а: через CALL или по средствам CICS (LINK, XCTL...) ?
Что конкретно Вы имеете в виду под "правильно организовать взаимодействие"? Или может опишите задачу, что конкретно Вам нужно сделать. ![]()
0
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
09.01.2020, 23:43 [ТС] | 3 |
Прошу прощения, к сожалению, сообщить что-либо о конфигурации нет возможности. В силу ограничений, вынужден формулировать вопросы для гипотетической системы. Надеюсь на Ваше понимание.
Ваш предыдущий ответ дал мне несколько вариантов. Вариант 1. (CALL) Пусть есть первая COBOL программа, которая через CALL вызывает вторую COBOL программу. И пусть вторая программа переписана на PL/I. Вопрос 1. Правильно ли я понимаю, что в таком случае, нужно: 1. Выполнить раздельную компиляцию каждой программы, получив два объектных модуля. 2. Далее с помощью редактора связей получить из двух объектных модулей один загрузочный модуль. 3. При этом между параметрами в вызове CALL (COBOL программа) и параметрами в точке входа EXTERNAL ENTRY (PL/I программа) должно быть соответствие форматов данных. Вариант 2. (LINK, XCTL) Пусть так же есть первая COBOL программа, которая через EXEC CICS LINK вызывает вторую COBOL программу, передавая параметры через COMMAREA. И пусть в этом случае вторая программа переписана на PL/I. Вопрос 2. Правильно ли я понимаю, что в таком случае, нужно: 1. Выполнить раздельную компиляцию каждой программы, получив два объектных модуля. 2. Далее с помощью редактора связей получить из двух объектных модулей два загрузочных модуля каждый из которых будет работать отдельно под управлением CICS, общаясь друг с другом посредством передачи данных через COMMAREA. 3. При этом так же должно быть обеспечено соответствие форматов данных которые передаются через COMMAREA. Так же у меня есть ещё один Вопрос 3. Подскажите пожалуйста, с точки зрения эффективности по памяти, правильно ли я понимаю, что Вариант 2 (LINK, XCTL) более затратный? Буду Вам благодарен за ответы, и если Вы не против продолжить общение, есть предложение. Можно было бы описать некоторую гипотетическую конфигурацию, т.е. взять условные версии ПО, придуманные PDS и некоторые условные задачи. Используя такую "машину" можно было бы обсудить интересные темы (подобно тому как это сделал Д.Кнут с помощью машины MIX). Хотелось бы на таком условном примере попробовать составлять JCL и рассматривать механизмы взаимодействия в рамках CICS. А наиболее интересные варианты можно будет проверить используя IBM Z Trial. Если Вы посчитаете такой вариант возможным, могу начать создавать такую гипотетическую "машину". Большое спасибо за Ваше время.
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
10.01.2020, 16:17 | 4 |
Верно.
Не обязательно! Можно (и как правило в больших системах приветствуется именно этот подход) записать вызов динамическим. Иначе при каждой модификации под-программы, надо будет заново линковать вызывающую программу. Нет. CICS контроллирует все ресурсы унитарно. Контролировать отдельную программу в сгруппированом бинарнике он не может. При первом вызове программы, бинарник загружается в кэш, что бы обновить кэш заново с файловой системы, надо запустить тех. транзакцию CECI SET PROGRAM има_программы NEWCOPY .Зависит от контекста, если данные чисто узкого характера, нужные только этим 2-м программам, то можно и через LINKAGE передать. Касаемо COMMAREA - это старый модус операнди, с кое-какими лимитаицями, в частности по максимальному объему. Последная тенденция использовать каналы и контейнеры (CICS Channels and Containters). COMMAREA - это пространство в памяти (структура данных) используемая всей транзакцией и контроллируемая CICS. Тогда как данные переданные через LINKAGE - локального характера (между 2-мя программами). При несоответствии типа/объёма данных в LINKAGE получим сразу-же красивый взрыв с 9-и этажной руганью (чисто технический). При несоответствии типа/объёма данных в COMMAREA - тоже, но скорее всегоне сразу (в зависимости от трнукаций/оверлапов данных). Как я уже писал, LINKAGE/COMMAREA это функционально разные типы памяти. 01 DFH-COMMAREA получает адрес памяти от CICS, тогда как LINKAGE от OС. COMMAREA необходима для мнгопрограммных транзакций, именно в ней и есть вся транзакция (её данные), и она сравнительно легко разделена многими программами. Не забивайте для чего вообще CICS - его задача гарантировать полный запуск транзакции либо полное её аннулирование в случае ошибки. Тут кажется Вы немного перепутали Batch/OnLine. Единственное место где JCL задействован в рамках CICS, это при запускe самого CICS региона (инстанции, скажем так). С радостью ![]()
2
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
10.01.2020, 23:10 [ТС] | 5 |
Большое Вам спасибо за содержательные ответы!
Буду очень рад дальнейшему общению и обсуждению. Возьму тайм аут до конца уик-энда, для обдумывания и подготовки вопросов!
1
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
14.01.2020, 00:00 [ТС] | 6 |
Еще раз спасибо за практические советы по работе с CICS!
Многие ранее неясные моменты прояснились! Очень интересуют именно особенности разработки под CICS. Из Вашего ответа я для себя обобщил, что разработка под CICS сводится к двум шагам: 1) Компиляция, с получением исполняемого загрузочного модуля (бинарника) с помощью JCL. 2) Загрузка в кэш CICS полученного бинарника с помощью CECI SET PROGRAM имя_программы NEWCOPY. Соответственно, для успешной разработки под CICS необходимо: 1) Уметь составить JCL. Для этого, я предполагаю, нужно правильно задать опции компилятора для получения бинарника под CICS. 2) Уметь использовать CECI или CEDA (?) для загрузки бинарника. Кстати, хотел спросить Вас, когда лучше использовать CEDA а когда CECI ? Ещё очень интересуют Каналы и Контейнеры. Много читал о них. Вы писали, что это современный и эффективный способ обойти ограничения COMMAREA (если не ошибаюсь это всего 32768 байт). Хотелось бы понять, как лучше эффективно использовать Каналы и Контейнеры для замены COMMAREA? Ведь COMMAREA используется всей транзакцией, а вот как использовать Каналы и Контейнеры таким же образом не совсем понятно. Очень хотелось бы научится самостоятельно писать JCL для компиляции под CICS для некоторой гипотетической задачи. Сейчас готовлю такой условный пример для нашего обсуждения в ближайшем посте. Постараюсь закончить и выложить завтра-послезавтра. Большое Вам спасибо!
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
14.01.2020, 11:37 | 7 |
CEDA используется для административных целеэ в CICS, по-этому как правило данная тех. транзакция запрещена обычным пользователям. Тогда как обновить кэш нужно и разработчикам тоже, для тестирования. По-этому им даётся доступ к CECI.
Канал это идентификатор пространства в памяти для транзакции. Тогда как Контейнеры - это "Подразделы" Канала: не всем программам нужны одни и те же данные. По-эотму некая группа программ может использовать одну группу Контейнеров, а другая другую. Но идентифицируются/связываются группы контейнеров через Каналы: https://www.ibm.com/support/kn... fcons.html Как правило, в начале каждой программы мы получаем Канал. Затем, на протяжении все программы получаем доступ к Контейнерам, указывая идентификатор Канала полученный в начале программы. Код
//C$COMPIL JOB PROB,&SYSUID,MSGCLASS=H,CLASS=S,TIME=0, // NOTIFY=&SYSUID,REGION=0M,RESTART=* //********************************************************************** // SET MEM=AAAAAAAA <== COBOL SOURCE //* -------------------------------------------- // SET CEELIB1=CEE.V2R1M0.SCEELKED <== CEE LIB // SET SRCLIB=UT27.KARLUR.SOURCE <== SRC LIB // SET COPY1=UT27.KARLUR.COPY <== COPY LIB //********************************************************************** //* COMPILE //********************************************************************** //COMPIL EXEC PGM=IGYCRCTL,PARM='MAP,APOST,DYN,NOOPT,SZ(MAX), // NOTERM,DATA(31),LIB,TEST,SOURCE,NOSEQ',REGION=0M //SYSPRINT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSLIB DD DSN=©1,DISP=SHR // DD DISP=SHR,DSN=USRC.ALLURE.V2310200.COPYCO // DD DISP=SHR,DSN=USRC.BAC.V2310000.COPYCO // DD DISP=SHR,DSN=USRC.BRF.V2311000.COPYCO //SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSDA, // DISP=(MOD,PASS),SPACE=(TRK,(3,3)) //SYSIN DD DISP=SHR,DSN=&SRCLIB.(&MEM) /* //********************************************************************** //* LINK //********************************************************************** //LINKEDIT EXEC PGM=HEWL,COND=(8,LT,COMPIL), // PARM='XREF,LIST,LET,REUS,DCBS,AMODE=31,RMODE=ANY,RENT' //SYSPRINT DD SYSOUT=* //SYSLIB DD DSN=&CEELIB1,DISP=SHR //SYSLIN DD DSNAME=&&LOADSET,DISP=(OLD,DELETE) //SYSLMOD DD DSN=&LOADLIB(&MEM),DISP=(MOD,PASS), // SPACE=(TRK,(100,10)),UNIT=SYSDA,RECFM=U //SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(10,10)) /* ![]()
2
|
Модератор
![]() |
|
14.01.2020, 16:23 | 8 |
Kukstyler, JCL... Повеяло прошлым... А ведь все помню! Работал на PL/I, ассемблере, Фортране. Сделал монитор компиляторов - программа, которая динамически вызывала нужный компилятор, настраивала DD-предложения, компилировала, вызывала редактор связей, формировала единый листинг...
3
|
Black Fregat
|
14.01.2020, 17:09
#9
|
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
14.01.2020, 17:46 | 10 |
Catstail, я уже несколько лет с ними не возился. Помню как в первый раз увидел, думаю чё за хрень такая, аж в глазах рябит!
![]() ![]()
1
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
14.01.2020, 23:43 [ТС] | 11 |
Kukstyler, большое Вам спасибо за ответы и за JCL!
Внимательно прочитал JCL, часть уже понимаю, но по некоторым параметрам есть вопросы. Читаю документацию. Опыт самостоятельного написания JCL у меня пока есть только для OS/VS2 MVS. Пишу их для компиляции и линковки моих PL/I и COBOL программ на собственном тестовом полигоне без CICS. А вот под CICS самостоятельно писать JCL пока возможности небыло. Теперь же на основе Вашего примера, попробую написать подобный JCL для PL/I под CICS и размещу его здесь. Кстати, для написания JCL под OS/VS2 MVS мне очень пригодились: (1) Р. Эшли, Д. Фернандес, Язык управления заданиями, 1981, и (2) В.П. Данилочкин и др., Операционная система ОС ЕС, 1988. Catstail, возможно Вы посоветуете ещё какие-нибудь интересные источники по JCL на которые стоит обратить внимание. Буду очень благодарен.
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
15.01.2020, 09:58 | 13 |
Можете смело их задавать. Всё я уже не помню, но большинство да, так что дерзайте
![]() Если дело касается запуска CICS, но соответствующий JCL, если не ошибаюсь, есть в инсталляционном пакете. Если говорить о компиляции, то JCL в принципе особе не отличается. Ведь всё дело в том, что до компиляции код прочёсывается пре-компилятором, переводящим все EXEC CICS в АPI вызовы CICS. Так что в JCL компиляции, надо просто указать соответствующие директивы компилятору: https://www.ibm.com/support/kn... env04.html https://www-01.ibm.com/servers/resourcelink/svc00100.nsf/pages/zOSV2R3sa231385/$file/ieab600_v2r3.pdf Но это как словарь.
0
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
16.01.2020, 00:40 [ТС] | 15 |
Catstail, большое Вам спасибо за рекомендованные книги! Первая книжка у меня есть - повезло найти её в бумажной форме, уже работаю с ней, взял её за основу.
0
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
19.01.2020, 23:42 [ТС] | 16 |
Уважаемый Kukstyler, в процессе чтения JCL у меня возникли несколько вопросов. Заранее прошу прощения, если вопросы эти покажутся Вам очевидными.
Итак, буду последовательно двигаться по коду. 1. Имя задания C$COMPIL Правильно ли я понимаю, что в именах допустимы символы '$', '@' и '#' ? 2. PROB Это я понимаю, идентификационная информация. Она может быть связана с проектом или типом задачи? 3. &SYSUID Это я понимаю, идентификационная информация пользователя, от которого запускается задание? 4. TIME=0 Это к сожалению непонятное мне значение параметра. Я привык задавать его одним из спосовов: TIME=(минуты,секунды) или TIME=1440. Так же читал о варианте TIME=(,секунды). Подскажите пожалуйста, а что происходит при TIME=0 ? 5. REGION=0M Так же непонятное мне значение. Если задача небольшая, под OS/VS2 и для PL/I и для COBOL я ставлю REGION=8M. Как бы Вы посоветовали выбирать значение этого параметра? 6. RESTART=* Правильно ли я понимаю, что в случае перезапуска задания параметр * указывает, что выполнение задания снова начнется с начала? Буду Вам очень благодарен за ответы. Продолжаю с большим интересом разбирать код.
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
20.01.2020, 01:23 | 17 |
Точно не помню, но кажется да. Символ & для декларации переменной, а так же на пример % тоже при случае использования Control-M.
![]() Это системная переменная, заменяющая &SYSUID на имя пользвоателя (SYStem User ID). Это лимит исполнения JOB-а по времени, 0 = без лимитов. Это максимально допустимая память, используемая JOB-ом. 0=без лимитов. ![]()
0
|
10 / 10 / 0
Регистрация: 06.07.2018
Сообщений: 18
|
|
28.01.2020, 00:47 [ТС] | 18 |
Kukstyler, прошу прощения за долгое отсутствие на форуме, был погружен в текущие заботы.
Возвращаясь к анализу кода, хотел бы задать ещё несколько вопросов. 7. Подскажите пожалуйста, какие наборы данных необходимо подключать в разделе SYSLIB, а какие в разделе SYSLIN? Хотелось бы понять как именно подготавливать наборы для SYSLIB и SYSLIN соответственно. 8. Подскажите пожалуйста, правильно ли я понимаю, что SYSUT1 - SYSUT7 это служебные DD имена, которые именно в COMPIL EXEC не используются?
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
28.01.2020, 12:17 | 19 |
Тут находятся copybook-и, ну для Кобол-а этот как .h файлы для Си.
https://www.ibm.com/support/kn... ev_115.htm
0
|
display "I'LL BE BACK"
1183 / 812 / 247
Регистрация: 02.04.2009
Сообщений: 3,029
|
|
12.02.2020, 23:53 | 20 |
ByteCodeRunner, как успехи?
![]()
0
|
12.02.2020, 23:53 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Delphi7 + COBOL Типы полей в COBOL Cobol & MacIntel Среда разработки Cobol Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |