Upload
others
View
12
Download
0
Embed Size (px)
Citation preview
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Tomáš Oberhuber
Faculty of Nuclear Sciences and Physical EngineeringCzech Technical University in Prague
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Programování v z/OS1 Softwarový projekt
2 Programovací jazyky v z/OS
3 Vyvtvorení spustitelného kódu
4 Moduly
5 Programování v C/C++ v z/OS
6 Prekladac C/C++
7 Linkování programu
8 Spuštení programu v TSO/E
9 Použití katalogovaných procedur
10 Optimalizace pri programování v C/C++
11 Práce se soubory v C/C++
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Softwarový projekt
(7. kapitola v Introduction to the New Mainframe)
• návrh aplikace• vývoj a testování• postupné nasazování, casto v soubehu s puvodním
systémem
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Programovací jazyky v z/OS
• Assembler• umožnuje kontrolu nad kódem na úrovni bitu/bytu• vhodný pro psaní subrutin volaných z jiných jazyku• z/OS je napsaný v assembleru
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Programovací jazyky v z/OS
• COBOL - Common Bussines-Oriented Language• PL/I• C/C++• Java• CLIST
• obdoba shellových skriptu• prakticky se ale napoužívá, nahrazuje ho Rexx
• Rexx - Restructured Extended Executor
LANGUAGE ENVIRONMENT• systemové API použitelné ve všech jazycích
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Vyvtvorení spustitelného kódu
• velké programy se delí na menší logické celky - moduly• v C++ vetšinou jednu trídu implementujeme v jednom
souboru• z jednoho souboru mužeme volat funkce nebo metody
implementované nekde jinde jejichž kód není známý
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Vyvtvorení spustitelného kódu
Pro urychlení vytvárení spustitelného kódu se procesprekladu delí na nekolik kroku:
• Preprocessing/prekompilace• Kompilace• Linkování• Spuštení programu
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Preprocesing/prekompilace
• jde o zpracování maker preprocesoru #include, #define• pri programování se subsytémy CICS (transkace),
DB2(databáze) se nepoužívají funkce ale makra• EXEC SQL ...
• to je stejné i v Unixu nebo ve Windows
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Kompilace
• zdrojový kód zpracovaný preprocesorem se predáprekladaci
• ten vytvárí strojový kód tzv. object modul - ten ještenelze spouštet
• prekladac nezná kód ani adresu funkcíimplementovaných v jiných modulech
• místo toho si poznamená pouze jméno volané funkce -symbolický odkaz
• nahrazení symbolických odkazu je práce pro linker(binder)
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Linkování
• linkování provádí tzv. LINKER, mainframe používá i tzv.BINDER
• binder je "modernejší" - umožnuje napr. uložit výstupdo PDSE
• linker potom bere všechny objektové moduly anahrazuje symbolické odkazy skoky na skutecnéadresy nebo vloží patricný binární kód
• to, co delá linker se nekdy muže provádet za choduprogramu, kdy objektový modul linkuje dynamicky - DLL
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Spoušt’ení programu
• dríve obstarával tzv. BATCH LOADER• dnes je nahrazen BINDERem• nacítá dané moduly do VIRTUAL STORAGE a spouští
je
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Moduly
• ukládájí se do PDS, tím dostáváme knihovnu• zdrojové texty - SOURCE (MODUL) LIBRARY• objektové moduly - OBJECT (MODUL) LIBRARY• spustitelné programy - LOAD (MODUL) LIBRARY
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Programování v C/C++ v z/OS
Je nekolik zpusobu, jak prekládat a linkovat programy vC/C++
• v závislosti na adresování 16. bitové, 31. bitové a 64.bitové
• s využítím IPA = Interprocedural Analysis• prekladac bežne provádí jen optimalizace na úrovni
jednotlivých procedur• pomocí parametru IPA(NOLINK) provede prekladac
první fázi prekladu, kdy do výsledného kódu prídádodatecné informace
• druhá fáze se volá s parametrem IPA(LINK), kdy dojdek samotnému provedení optimalizací
• s využitím XPLINK = Extra Performance Linking• jde o optimalizaci pro rychlé volání funkcí
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++
//OBETO80J JOB (90300000),’OBETO80’,CLASS=A,REGION=48M,// MSGLEVEL=(1,1),MSGCLASS=H,NOTIFY=&SYSUID// JCLLIB ORDER=(CEE.SCEEPROC,CBC.SCBCPRC)//COMPILE EXEC PGM=CCNDRVR,// PARM=’/SEARCH(’’CEE.SCEEH.+’’) NOOPT SO OBJ LIST’//STEPLIB DD DSNAME=CEE.SCEERUN,DISP=SHR// DD DSNAME=CEE.SCEERUN2,DISP=SHR// DD DSNAME=CBC.SCCNCMP,DISP=SHR//SYSLIN DD DSNAME=OBETO80.INTRO.OBJ(HELLO),DISP=SHR//SYSPRINT DD SYSOUT=*//SYSIN DD DSNAME=OBETO80.INTRO.C(HELLO),DISP=SHR
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++Prekladac pro C/C++ se jmenuje CCNDRVRParametry se predávají pomocí PARM:// PARM=’[run-time-options]/program-parameters’
• zdvojené ” se používá pro vložení apostrofu dopredávaného retezce
• SEARCH(”CEE.SCEEH.+”)• kde jsou uloženy hlavickové soubory - obdoba -I u gcc• LSEARCH se používá pro uživatelské hlavickové
soubory (ne systemové)• NOOPT - NOOPTMIZE/OPTIMIZE
• žádné optimalizace, jiná možnost je OPT(2) neboOPT(3) - použije se IPA
• SO - SOURCE/NOSOURCE• vypisuje zdrojový kód a nekteré diagnostické zprávy
• OBJ - OBJECT/NOOBJECT• zda se má vytváret object modul
• LIST - vypíše výsledný kód v assembleru
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++
• DEBUG - preklad s informacemi pro ladení• ARCH - architektura
• 0 - spustitelné všude• 5 - na z/900
• CHECKOUT - varování pred možnými chybami v kódu• COMPACT - zmenšuje výsledný kód• DEFINE - definice pro preprocesor• DLL - generování DLL kódu• GOFF - Generalized Object File Format• INLINE - vkládané funkce• IPA - Interprocedural Analysis
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++
• LP64/ILP32 - 64. bitový nebo 31. bitový preklad• OPTFILE - udává data set s volbami pro optimalizace• PPONLY - spustit pouze preprocesor• RTTI - run-time type information - umožnuje použítdynamic_cast
• SQL - pro zpracování SQL maker• UNROLL - rozbalování smycek• XPLINK - Extraperformance linking
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++
Použité DDNAMES:
• SYSIN - zdrojový kód• SYSLIB - systemové hlavickové soubory• SYSOUT - chybová hlášení• STEPLIB - run-time knihovny
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Prekladac C/C++
V JCL pro preklad je nutné pripojit následující knihovny:
• CEE.SCEERUN - PDS knihovna obsahující run-timerutiny pro C/C++, COBOL, PL/I, FORTRAN
• CEE.SCEERUN2 - PDSE knihovna obsahující run-timerutiny pro C/C++ a COBOL
• CBC.SCCNCMP -
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Linkování programu
K linkováni se používá tzv. BINDER.Existují tri zpusoby, jak linkovat program:
1 jedno jediné linkování2 linkování jednotlivých objektových modulu3 prelinkovat zmenený object modul
Program pro linkování se jmenuje IEWL.
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Linkování programu - jednojediné linkování
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Linkování programu - linkováníjednotlivých objektových
modulu
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Linkování programu -prelinkovat zmenený object
modul
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Spuštení programu v TSO/E
V TSO/E lze použít príkazy:CALL ’program-data-set-member-name’[’parameters’]CALL ’obeto80.intro.load(hello)’
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Použití katalogovanýchprocedur
Jazyk C jazyk C++ VýznamEDCC CBCC preklad 31-bitových a
64-bitových programuEDCCB CBCCB preklad a linkování
31-bitových programuEDCQCB CBCQCB preklad a linkování
64-bitových programuEDCCBG CBCCBG preklad, linkování a spuštení
31-bitového programuEDCQCBG CBCQCBG preklad, linkování a spuštení
64-bitového programu
Další procedury viz.:
• C/C++ User’s Guide - str. 297, 298,• Language Environment Programming Guide - str. 105
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Program pro vypsáníargumentu príkazové rádky
INTRO.C(ARGS)
#include <stdio.h>int main( int argc, char* argv[] ){
int i;for( i = 0; i < argc; i ++ )
printf( "Argument %d -> %s\n", i, argv[ i ] );return 0;
}
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Program pro vypsáníargumentu príkazové rádky
JCL kód pro preklad a linkování - využívá katalogovanouproceduru EDCCB:INTRO.JCL(ARGS)
//OBETO80J JOB (90300000),’OBETO80’,CLASS=A,// REGION=48M,MSGLEVEL=(1,1),MSGCLASS=H,// NOTIFY=&SYSUID//MYLIB JCLLIB ORDER=(’CEE.SCEEPROC’,’CBC.SCBCPRC’)//COMPPRC EXEC PROC=EDCCB,// CPARM=’SO LIST’,// INFILE=’OBETO80.INTRO.C(ARGS)’,// OUTFILE=’OBETO80.INTRO.LOAD(ARGS),DISP=SHR’
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Program pro vypsáníargumentu príkazové rádky
JCL pro spuštení:INTRO.JCL(ARGSJOB)
//OBETO80J JOB (90300000),’OBETO80’,CLASS=A,// REGION=4096K,MSGLEVEL=(1,1),MSGCLASS=H,// NOTIFY=&SYSUID//JOBLIB DD DSN=OBETO80.INTRO.LOAD,DISP=SHR//MYARGS EXEC PGM=ARGS,// PARM=’/ARG1 ARG2 ARG3 ARG4’//SYSOUT DD SYSOUT=*/*
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
Virtuální metody• svou funkcí casto nahrazují príkaz switch• príkaz switch lze pri prekládání lépe optimalizovat• volání virtuálních metod je nárocnejší
Výjimky• tvorí velkou prekážku pro optimalizaci• je nutné generovat mnoho kódu navíc pro možnost
sledování šírení výjimek• výrazne zpomalují kód, pokud k výjimce dojde
• - viz. M. Virius, Pasti a propasti jazyka C++, Výjimky bymely zustat výjimecné
• zpomalují ale i v prípade, kdy výjimka nevznikne
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
Virtuální metody• svou funkcí casto nahrazují príkaz switch• príkaz switch lze pri prekládání lépe optimalizovat• volání virtuálních metod je nárocnejší
Výjimky• tvorí velkou prekážku pro optimalizaci• je nutné generovat mnoho kódu navíc pro možnost
sledování šírení výjimek• výrazne zpomalují kód, pokud k výjimce dojde
• - viz. M. Virius, Pasti a propasti jazyka C++, Výjimky bymely zustat výjimecné
• zpomalují ale i v prípade, kdy výjimka nevznikne
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
RTTI - dynamic_cast<>
• Runtime Type Information - umožnuje zmenu typu za choduprogramu
• z toho plyne, že až za chodu programu se urcuje, jaký kódse bude provádet, to znemožnuje optimalizaci
• u kódu, kde hodne záleží na výkonu je lepší RTTI odstranit
• casto se lze RTTI vyhnout pomocí lepšího (jednoduššího)návrhu aplikace
STL - standard template library
• je dobré dobre znát, co se deje uvnitr a jakou trídu použít nakterý problém - seznamy, vektory apod.
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
New/delete - dynamické alokace pameti• dynamické alokace je VELMI nákladná• je lepší nešetrit príliš pametí, alokovat si všechny
struktury dopredu a neuvolnovat je, když je budu brzyopet potrebovat
• dynamická alokace muže vést k fragmentaci pameti avelkému užírání pameti
• viz. clánek na root.cz - Jak funguje malloc a free• http://www.root.cz/clanky/jak-funguje-malloc-a-free
• nekdy je možné alokaci na halde nahradit alokací nazásobníku pomocí alloca
• http://www.gnu.org/software/libc/manual/
html_node/Variable-Size-Automatic.html#Variable-Size-Automatic
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
ANSI aliasing rules
• používat konstanty - const• promenná se pak nemuže menit a není nutné ji pred
použitím vždy znovu nacítat v pameti - stací ji mít stáleuloženou v registru
• pri prístupu k datum pres ukazatel je lépe použít docasnou promennou
• používat lokální promenné místo globálních• každé volání funkce muže zmenit hodnotu globální
promenné, u lokálních se to stát nemuže• pri castém prístupu k globálním promenným je lépe
udelat lokální kopii• IPA toto umí rešit sama• je efektivnejší predávat data jako argument, než pomocí
globálních promenných• pro promenné v rámci modulu je dobré pužít oznacení static
• zarucuje, že se nebudou menit pri volání funkcí mimomodul
• omezit používání ukazatelu
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
Zápis matematických výrazuPri zápisu:
a = b * ( x * y * z );c = x * y * z * d;
je rozpoznán stejný výraz x * y * z, ale prí zápisu
a = b * x * y * z;c = x * y * z * d;
již tomu tak není.
• doporucuje se, stejné výrazy psát vlevo nebo dozávorek
• obzvlášt’ vhodné pro nemenný výraz uvnitr smycky
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
Prevod float na int je nárocný:
float a[ 10 ];for( i = 0; i < 10; i ++ )
a[ i ] = a[ i ] * i;
je lepší ve tvaru
float x = 1.0;for( i = 0; i < 10; i ++ ){
a[ i ] = a[ i ] * x;x = x + 1.0;
}
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
• je lepší používat násobení než delení• zápis x * ( 1.0 / 3.0 ) je rychlejší než x / 3.0
nebot’ v prvním prípade se delení provede v dobeprekladu
• pro aritmetické operace je výhodnejí použít int, nežchar nebo unsigned int
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Optimalizace pri programovánív C/C++
• funkce memcpy nebo memcmp bývají efektivnejší nežcykly
• memcmp muže být výhodnejší pro porovnávání struktur,než je bežné porovnávání
• memXXX jsou rychlejší než strXXX
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Práce se soubory v C/C++
Typy souboru v z/OS:• OS files - klasické z/OS soubory• HFS files - Hierarchical file system - unixové soubory v
USS - Unix System Services• VSAM data sets - Virtual Storage Acces Method -
databázové soubory• Terminal files - práce s terminálem• Memory files - docasné soubory• Hiperspace memory files - docasné soubory uložené v
pameti - do 2 GB• CICS Data Queus• z/OS LE Message File - soubor pro stderr/cerr
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Práce se soubory v C/C++Tri typy souboru podle zacházení s daty:
• text streams• stejné jako v Unixu• jde o text s nekolika speciálními rídícími znaky
• \n, \r, \t• tyto znaky se ukládají do souboru - u record I/O tomu tak
není
• binary streams• posloupnost bytu, žádné nemají speciální význam
• record I/O - logické záznamy - vety - F, FB, V, VB• obecne jde o bloky urcité velikosti• lze s nimi použít pouze funkce fread(), fwrite()
• nelze použít fprintf(), fscanf(), getc(), putc()• pokud chceme do vety zapsat více dat, než je její
velikost, data se oríznou• pri zmene obsahu vety se nemení velikost (napr. u V,
VB), pouze se prepíše príslušná cást• velikost vety nelze menit, jakmile je jednou vytvorena
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Príkaz fopenLze použít stejne jako v Unixu/Windows:
#include <stdio.h>
int main( int argc, char* argv[] ){
FILE* f1;int i;printf( "Vytvarim soubor intro.cfile" );f1 = fopen( "intro.cfile", "w" );if( f1 == NULL ){
printf( "Nemuzu otevrit soubor intro.cfile" );return 16;
}for( i = 0; i < 100; i ++ )
fprintf( f1, "radek %d\n", i);printf("Stiskni klavesu ...");getchar();close( f1 );return 0;
}
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Príkaz fopen
Funkci fopen lze udat i atributy data setu - DCB = DATACONTROL BLOCK atributy
• RECFM - formát dat• LRECL - logical record - veta - základní struktura dat
pro danou aplikaci• BLKSIZE - physical blocks
• množství dat, které budou nacteny z disku do bufferu prijedné operaci ctení
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Príkaz fopen
DCB tyto atributy se zjišt’ují:
1 z parametru volání funkce fopen(), freopen()2 atributu pro dané ddname (z JCL)3 z atributu existujícího souboru (pri otevírání) - pomocírecfm=*
4 defaultní hodnoty pro fopen() a freopen()• pro binární soubory je to
• VB pro spool soubory• FB jinak
• pro textové soubory je to• F a LRECL = BLKSIZE = 254• V - pokud je udáno LRECL a BLKSIZE• VB jinak
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Príkaz fopen
Možné formáty RECFM:
• F - fixed, V - variable, B - blocked, U - undefined• A - ASA znaky - pro formátování tisku na tiskárne• M - machine control characters• S - standard format
• každý blok musí být zaplnen vetami, než se vytvorí nový
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Príkaz fopen
#include <stdio.h>
int main( int argc, char* argv[] ){
FILE* f1;int i;printf( "Vytvarim soubor intro.cfileps\n" );f1 = fopen( "intro.cfileps", "w,recfm=fb,lrecl=20,blksize=3120" );if( f1 == NULL ){
printf( "Nemuzu otevrit soubor intro.cfileps" );return 16;
}for( i = 0; i < 100; i ++ )
fprintf( f1, "radek %d 012345678901234567890\n", i);printf("Stiskni klavesu ...");getchar();close( f1 );return 0;
}
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Fixed format record
F, FB, FBS, FS, FM, FBA, FBM, FBS, FSA, FSM, FBSA, FBSM
S - spanned files = jedna veta muže být rozdelena do vícebloku
• binární data• nezaplnené vety se doplnují nulami• data postupne pretékají z jedné vety do druhé• nezaplnené bloky se nedoplnují
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Fixed format record
• text non-ASA• zápis do nového záznamu se provede pomocí znaku \n
nebo uzavrením a otevrením souboru• data, která se nevejdou do vety jsou odseknuta• prázdná místa vety po \n se doplnují mezerami, znak
\n se neukládá• pri ctení se znak \n vloží na místo první mezery
sekvence mezer na konci vety• prepisování vety zmení jen prepsané pozice, ne celou
vetu• text ASA
• obsahuje speciální znaky ASA• první pozice ve vete obsahuje speciální znak urcující,
co se má provést pri prechodu k nové vete• new line, carriage return, form feed
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Variable-format record
V, VB, VBS, VS, VM, VBA, VBM, VBS, VSA, VSM, VBSA, VBSM
Obsahuje BDW a RDW.
• binární data• data "pretékají" do dalších vet• veta muže mít maximálne LRECL-4 bytu
• textová data• konec vety se urcuje pomocí \n• prázdná veta se uloží jako jedna mezera• pri zmene obsahu již nelze zmenit délku
• pri zápisu více dat -> oseknutí• pri zápisu méne dat -> doplnení mezerami
• text ASA - podobné jako u fixed
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Undefined
• vše se zpracovává jako data - i BDW, RDW a rídíciznaky
• LRECL nemá žádný význam, ale musí být menší nežBLKSIZE
• veta odpovídá bloku• binární data
• postupne zaplnují jednotlivé bloky• text
• \n znamená hranici bloku
TomášOberhuber
Softwarovýprojekt
Programovacíjazyky v z/OS
Vyvtvoreníspustitelnéhokódu
Moduly
Programovánív C/C++ vz/OS
PrekladacC/C++
Linkováníprogramu
Spušteníprogramu vTSO/E
Použití katalo-govanýchprocedur
Optimalizacepriprogramovánív C/C++
Práce sesoubory vC/C++
Udávání ddnames
Provádí se pomocí predpony DD: v názvu souboru:
#include<stdio.h>char text[ 80 ], *result;FILE *fp;
int main( void ){
fp = fopen( "DD:INFILE", "r" );while( fscanf( fp,"%s", text ) != EOF )
printf( "%s\n", text );fclose( fp );return 0;
}