Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Tomáš Oberhuber Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
Tomáš Oberhuber
Programování v z/OS
Softwarový projekt
1 Softwarový projekt
Programovací jazyky v z/OS
2 Programovací jazyky v z/OS
Vyvtvoˇrení spustitelného kódu
3 Vyvtvoˇrení spustitelného kódu
Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
4 Moduly 5 Programování v C/C++ v z/OS 6 Pˇrekladaˇc C/C++ 7 Linkování programu˚
ˇ programu v TSO/E 8 Spuštení 9 Použití katalogovaných procedur ˚ 10 Optimalizace pˇri programování v C/C++ 11 Práce se soubory v C/C++
Tomáš Oberhuber
Softwarový projekt
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu
(7. kapitola v Introduction to the New Mainframe)
Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• návrh aplikace • vývoj a testování • postupné nasazování, cˇ asto v soubehu ˇ s puvodním ˚
systémem
Tomáš Oberhuber
Programovací jazyky v z/OS
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• Assembler • umožnuje ˇ kontrolu nad kódem na úrovni bitu/byt ˚ u˚ • vhodný pro psaní subrutin volaných z jiných jazyku˚ • z/OS je napsaný v assembleru
Tomáš Oberhuber
Programovací jazyky v z/OS
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• 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
Vyvtvoˇrení spustitelného kódu
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
• velké programy se delí ˇ na menší logické celky - moduly
Programování v C/C++ v z/OS
• v C++ vetšinou ˇ jednu tˇrídu implementujeme v jednom
Pˇrekladaˇc C/C++
• z jednoho souboru mužeme ˚ volat funkce nebo metody
Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
souboru ˇ implementované nekde jinde jejichž kód není známý
Tomáš Oberhuber
Vyvtvoˇrení spustitelného kódu
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Pro urychlení vytváˇrení spustitelného kódu se proces ˇ na nekolik ˇ pˇrekladu delí kroku: ˚ • Preprocessing/prekompilace • Kompilace • Linkování • Spuštení ˇ programu
Tomáš Oberhuber
Preprocesing/prekompilace
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• jde o zpracování maker preprocesoru #include, #define • pˇri 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
Kompilace
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• zdrojový kód zpracovaný preprocesorem se pˇredá
pˇrekladaˇci • ten vytváˇrí strojový kód tzv. object modul - ten ješteˇ
ˇ nelze spouštet • pˇrekladaˇc 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
Linkování
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• linkování provádí tzv. LINKER, mainframe používá i tzv.
BINDER • binder je "modernejší" ˇ ˇ - umožnuje napˇr. uložit výstup
do PDSE • linker potom bere všechny objektové moduly a
nahrazuje symbolické odkazy skoky na skuteˇcné adresy nebo vloží patˇriˇcný binární kód • to, co delá ˇ linker se nekdy ˇ ˇ za chodu muže ˚ provádet
programu, kdy objektový modul linkuje dynamicky - DLL
Tomáš Oberhuber
Spoušt’ení programu˚
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
• dˇríve obstarával tzv. BATCH LOADER
Programování v C/C++ v z/OS
• dnes je nahrazen BINDERem
Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• naˇcítá dané moduly do VIRTUAL STORAGE a spouští
je
Tomáš Oberhuber
Moduly
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
• ukládájí se do PDS, tím dostáváme knihovnu
Programování v C/C++ v z/OS
• zdrojové texty - SOURCE (MODUL) LIBRARY
Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• objektové moduly - OBJECT (MODUL) LIBRARY • spustitelné programy - LOAD (MODUL) LIBRARY
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Programování v C/C++ v z/OS ˇ Je nekolik zpusob ˚ u, ˚ jak pˇrekládat a linkovat programy v C/C++ • v závislosti na adresování 16. bitové, 31. bitové a 64.
bitové • s využítím IPA = Interprocedural Analysis • pˇrekladaˇc bežn ˇ eˇ provádí jen optimalizace na úrovni
jednotlivých procedur • pomocí parametru IPA(NOLINK) provede pˇrekladaˇc
první fázi pˇrekladu, kdy do výsledného kódu pˇrídá dodateˇcné informace • druhá fáze se volá s parametrem IPA(LINK), kdy dojde k samotnému provedení optimalizací • s využitím XPLINK = Extra Performance Linking • jde o optimalizaci pro rychlé volání funkcí
Tomáš Oberhuber
Pˇrekladaˇc C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v 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
Pˇrekladaˇc C/C++
Softwarový projekt
Pˇrekladaˇc pro C/C++ se jmenuje CCNDRVR Parametry se pˇredávají pomocí PARM:
Programovací jazyky v z/OS
// PARM=’[run-time-options]/program-parameters’
Vyvtvoˇrení spustitelného kódu
• zdvojené ” se používá pro vložení apostrofu do
Moduly
• SEARCH(”CEE.SCEEH.+”) • kde jsou uloženy hlaviˇckové soubory - obdoba -I u gcc • LSEARCH se používá pro uživatelské hlaviˇckové soubory (ne systemové) • NOOPT - NOOPTMIZE/OPTIMIZE • žádné optimalizace, jiná možnost je OPT(2) nebo OPT(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
Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
ˇ pˇredávaného ˇretezce
Tomáš Oberhuber
Pˇrekladaˇc C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• DEBUG - pˇreklad s informacemi pro ladení ˇ • ARCH - architektura • 0 - spustitelné všude • 5 - na z/900 • CHECKOUT - varování pˇred 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
Pˇrekladaˇc C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• LP64/ILP32 - 64. bitový nebo 31. bitový pˇreklad • OPTFILE - udává data set s volbami pro optimalizace • PPONLY - spustit pouze preprocesor • RTTI - run-time type information - umožnuje ˇ použít
dynamic_cast • SQL - pro zpracování SQL maker • UNROLL - rozbalování smyˇcek • XPLINK - Extraperformance linking
Tomáš Oberhuber
Pˇrekladaˇc C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Použité DDNAMES: • SYSIN - zdrojový kód • SYSLIB - systemové hlaviˇckové soubory • SYSOUT - chybová hlášení • STEPLIB - run-time knihovny
Tomáš Oberhuber
Pˇrekladaˇc C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
V JCL pro pˇreklad je nutné pˇripojit následující knihovny: • CEE.SCEERUN - PDS knihovna obsahující run-time
rutiny pro C/C++, COBOL, PL/I, FORTRAN • CEE.SCEERUN2 - PDSE knihovna obsahující run-time
rutiny pro C/C++ a COBOL • CBC.SCCNCMP -
Tomáš Oberhuber
Linkování programu˚
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
K linkováni se používá tzv. BINDER. Existují tˇri zpusoby, ˚ jak linkovat program: 1
jedno jediné linkování
2
linkování jednotlivých objektových modulu˚
3
ˇ ený ˇ object modul pˇrelinkovat zmen
Program pro linkování se jmenuje IEWL.
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Linkování programu˚ - jedno jediné linkování
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Linkování programu˚ - linkování jednotlivých objektových modulu˚
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Linkování programu˚ ˇ ený ˇ object pˇrelinkovat zmen modul
Tomáš Oberhuber
ˇ programu v TSO/E Spuštení
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
V TSO/E lze použít pˇríkazy: CALL ’program-data-set-member-name’ [’parameters’] CALL ’obeto80.intro.load(hello)’
Tomáš Oberhuber
Použití katalogovaných procedur ˚
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu
Jazyk C EDCC
jazyk C++ CBCC
EDCCB
CBCCB
EDCQCB
CBCQCB
EDCCBG
CBCCBG
EDCQCBG
CBCQCBG
Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Význam pˇreklad 31-bitových a 64-bitových programu˚ pˇreklad a linkování 31-bitových programu˚ pˇreklad a linkování 64-bitových programu˚ ˇ pˇreklad, linkování a spuštení 31-bitového programu ˇ pˇreklad, 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
Program pro vypsání argumentu˚ pˇríkazové ˇrádky
Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
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
Program pro vypsání argumentu˚ pˇríkazové ˇrádky
Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
JCL kód pro pˇreklad a linkování - využívá katalogovanou proceduru ˚ 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
Program pro vypsání argumentu˚ pˇríkazové ˇrádky
Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu
ˇ JCL pro spuštení: INTRO.JCL(ARGSJOB)
Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
//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 Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Optimalizace pˇri programování v C/C++ Virtuální metody • svou funkcí cˇ asto nahrazují pˇríkaz switch • pˇríkaz switch lze pˇri pˇrekládání lépe optimalizovat • volání virtuálních metod je nároˇcnejší ˇ
Tomáš Oberhuber
Optimalizace pˇri programování v C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS
Virtuální metody • svou funkcí cˇ asto nahrazují pˇríkaz switch • pˇríkaz switch lze pˇri pˇrekládání lépe optimalizovat • volání virtuálních metod je nároˇcnejší ˇ
Výjimky
Pˇrekladaˇc C/C++
• tvoˇrí velkou pˇrekážku pro optimalizaci
Linkování programu˚
• je nutné generovat mnoho kódu navíc pro možnost
ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
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 by
ˇ zustat mely ˚ výjimeˇcné • zpomalují ale i v pˇrípade, ˇ kdy výjimka nevznikne
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
Optimalizace pˇri programování v C/C++ RTTI - dynamic_cast<> • Runtime Type Information - umožnuje ˇ ˇ typu za chodu zmenu programu
Programování v C/C++ v z/OS
• z toho plyne, že až za chodu programu se urˇcuje, jaký kód ˇ to znemožnuje optimalizaci se bude provádet,
Pˇrekladaˇc C/C++
• u kódu, kde hodneˇ záleží na výkonu je lepší RTTI odstranit
Linkování programu˚
• cˇ asto se lze RTTI vyhnout pomocí lepšího (jednoduššího) návrhu aplikace
ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
STL - standard template library • je dobré dobˇre znát, co se deje ˇ uvnitˇr a jakou tˇrídu použít na který problém - seznamy, vektory apod.
Tomáš Oberhuber
Optimalizace pˇri programování v C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++
ˇ New/delete - dynamické alokace pameti • dynamické alokace je VELMI nákladná • je lepší nešetˇrit pˇríliš pametí, ˇ alokovat si všechny
ˇ struktury dopˇredu a neuvolnovat je, když je budu brzy ˇ potˇrebovat opet • dynamická alokace muže ˇ a ˚ vést k fragmentaci pameti ˇ velkému užírání pameti
Linkování programu˚
• viz. cˇ lánek na root.cz - Jak funguje malloc a free • http://www.root.cz/clanky/jak-funguje-malloc-a-free
ˇ Spuštení programu v TSO/E
• nekdy ˇ je možné alokaci na haldeˇ nahradit alokací na
Použití katalogovaných procedur ˚
•
Optimalizace pˇri programování v C/C++
zá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 Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Optimalizace pˇri programování v C/C++ ANSI aliasing rules
• používat konstanty - const • promenná ˇ ˇ a není nutné ji pˇred se pak nemuže ˚ menit ˇ - staˇcí ji mít stále použitím vždy znovu naˇcítat v pameti uloženou v registru • pˇri pˇrístupu k datum ˇ ˚ pˇres ukazatel je lépe použít doˇcasnou promennou • používat lokální promenné ˇ místo globálních • každé volání funkce muže ˇ hodnotu globální ˚ zmenit ˇ promenné, u lokálních se to stát nemuže ˚ • pˇri cˇ astém pˇrístupu k globálním promenným ˇ je lépe ˇ lokální kopii udelat • IPA toto umí ˇrešit sama • je efektivnejší ˇ pˇredávat data jako argument, než pomocí ˇ globálních promenných • pro promenné ˇ v rámci modulu je dobré pužít oznaˇcení static • zaruˇcuje, že se nebudou menit ˇ pˇri volání funkcí mimo modul • omezit používání ukazatelu˚
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS
Optimalizace pˇri programování v C/C++ Zápis matematických výrazu˚ Pˇri zápisu: a = b * ( x * y * z ); c = x * y * z * d; je rozpoznán stejný výraz x * y * z, ale pˇrí zápisu
Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
a = b * x * y * z; c = x * y * z * d; již tomu tak není. • doporuˇcuje se, stejné výrazy psát vlevo nebo do
závorek • obzvlášt’ vhodné pro nemenný ˇ výraz uvnitˇr smyˇcky
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Optimalizace pˇri programování v C/C++ Pˇrevod float na int je nároˇcný: 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
Optimalizace pˇri programování v C/C++
Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
• je lepší používat násobení než delení ˇ
Programování v C/C++ v z/OS
• zápis x * ( 1.0 / 3.0 ) je rychlejší než x / 3.0
Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
ˇ nebot’ v prvním pˇrípadeˇ se delení provede v dobeˇ pˇrekladu • pro aritmetické operace je výhodnejí ˇ použít int, než
char nebo unsigned int
Tomáš Oberhuber
Optimalizace pˇri programování v C/C++
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• funkce memcpy nebo memcmp bývají efektivnejší ˇ než
cykly • memcmp muže ˇ pro porovnávání struktur, ˚ být výhodnejší
ˇ než je bežné porovnávání • memXXX jsou rychlejší než strXXX
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS
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
Pˇrekladaˇc C/C++
• Terminal files - práce s terminálem
Linkování programu˚
• Memory files - doˇcasné soubory
ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• Hiperspace memory files - doˇcasné soubory uložené v
ˇ - do 2 GB pameti • CICS Data Queus • z/OS LE Message File - soubor pro stderr/cerr
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Práce se soubory v C/C++ Tˇri 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 urˇcité 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 oˇríznou • pˇri zmen ˇ eˇ obsahu vety ˇ se nemení ˇ velikost (napˇr. u V,
VB), pouze se pˇrepíše pˇríslušná cˇ ást • velikost vety ˇ nelze menit, ˇ jakmile je jednou vytvoˇrena
Tomáš Oberhuber Softwarový projekt
Pˇríkaz fopen Lze použít stejneˇ jako v Unixu/Windows:
Programovací jazyky v z/OS
#include <stdio.h>
Vyvtvoˇrení spustitelného kódu
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; }
Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Tomáš Oberhuber
Pˇríkaz fopen
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Funkci fopen lze udat i atributy data setu - DCB = DATA CONTROL 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 naˇcteny z disku do bufferu pˇri
jedné operaci cˇ tení
Tomáš Oberhuber
Pˇríkaz fopen
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
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 (pˇri otevírání) - pomocí recfm=* defaultní hodnoty pro fopen() a freopen()
4
• 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
Pˇríkaz fopen
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu
Možné formáty RECFM:
Moduly
• F - fixed, V - variable, B - blocked, U - undefined
Programování v C/C++ v z/OS
• A - ASA znaky - pro formátování tisku na tiskárneˇ
Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• M - machine control characters • S - standard format • každý blok musí být zaplnen ˇ vetami, ˇ než se vytvoˇrí nový
Tomáš Oberhuber
Pˇríkaz fopen
Softwarový projekt
#include <stdio.h> Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
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=312 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
Fixed format record
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly
F, FB, FBS, FS, FM, FBA, FBM, FBS, FSA, FSM, FBSA, FBSM
ˇ muže ˇ S - spanned files = jedna veta ˚ být rozdelena do více bloku˚
Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• binární data • nezaplnené ˇ ˇ se doplnují ˇ nulami vety • data postupneˇ pˇretékají z jedné vety ˇ do druhé • nezaplnené ˇ ˇ bloky se nedoplnují
Tomáš Oberhuber Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Fixed format record • text non-ASA • zápis do nového záznamu se provede pomocí znaku \n nebo uzavˇrením a otevˇrení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á • pˇri cˇ tení se znak \n vloží na místo první mezery ˇ sekvence mezer na konci vety • pˇrepisování vety ˇ zmení ˇ jen pˇrepsané pozice, ne celou ˇ vetu • text ASA • obsahuje speciální znaky ASA • první pozice ve vet ˇ eˇ obsahuje speciální znak urˇcující, ˇ eˇ co se má provést pˇri pˇrechodu k nové vet • new line, carriage return, form feed
Tomáš Oberhuber
Variable-format record
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
V, VB, VBS, VS, VM, VBA, VBM, VBS, VSA, VSM, VBSA, VBSM
Obsahuje BDW a RDW. • binární data • data "pˇretékají" do dalších vet ˇ • veta ˇ muže ˚ mít maximálneˇ LRECL-4 bytu˚ • textová data • konec vety ˇ se urˇcuje pomocí \n • prázdná veta ˇ se uloží jako jedna mezera • pˇri zmen ˇ eˇ obsahu již nelze zmenit ˇ délku • pˇri zápisu více dat -> oseknutí • pˇri zápisu méneˇ dat -> doplnení ˇ mezerami
• text ASA - podobné jako u fixed
Tomáš Oberhuber
Undefined
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
• vše se zpracovává jako data - i BDW, RDW a ˇrídíci
znaky • 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
Udávání ddnames
Softwarový projekt Programovací jazyky v z/OS Vyvtvoˇrení spustitelného kódu Moduly Programování v C/C++ v z/OS Pˇrekladaˇc C/C++ Linkování programu˚ ˇ Spuštení programu v TSO/E Použití katalogovaných procedur ˚ Optimalizace pˇri programování v C/C++
Provádí se pomocí pˇredpony 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; }