Академический Документы
Профессиональный Документы
Культура Документы
Programareprocedural
[suportdecurs]
Lect.univ.dr.HoreaOros [anuniv.20092010]
[LucrareareprezintsuportuldecurspentrudisciplinaProgramareProceduraldin planuldenvmntalstudenilordelaspecializrileInformaticiMatematicanulI.]
Cuprins
1.
Introducere ................................................................................................................ 5 Definiii ........................................................................................................................... 5 Paradigme de programare ............................................................................................... 7 Generaii de limbaje ........................................................................................................ 8 Istoria i evoluia limbajelor de programare ................................................................. 10 Tendine ........................................................................................................................ 16 2. Procesuldecreareasoftwareului ........................................................................ 17 Introducere .................................................................................................................... 17 Aspecte ale calitii software-ului ................................................................................. 18 Studiu de caz - Limbajul C ........................................................................................... 19 3. Traducereaiexecuiaprogramelor ..................................................................... 21 Specificarea sintaxei unui limbaj de programare .......................................................... 21 Traducerea programelor ................................................................................................ 28 Uniti de program ........................................................................................................ 32 Link-editarea ................................................................................................................. 33 Execuia programelor .................................................................................................... 34 Medii de programare i execuie ................................................................................... 35 Interpretarea .................................................................................................................. 35 4. Declaraii .................................................................................................................. 36 Rolul identificatorilor ntr-un program ......................................................................... 36 Semantica unei declaraii .............................................................................................. 37 Declaraii de constante .................................................................................................. 37 Declaraii de tipuri de date ............................................................................................ 40 Declaraii de variabile ................................................................................................... 47 5. Tipuridedate .......................................................................................................... 58 Tipuri fundamentale ...................................................................................................... 58 iruri de caractere ......................................................................................................... 60 Tipul pointer.................................................................................................................. 61 Tipuri procedurale......................................................................................................... 63 Tipuri structurate ........................................................................................................... 64 Tipul tablou ................................................................................................................... 66 Tipul de date nregistrare .............................................................................................. 68 Tipuri definite de utilizator ........................................................................................... 70 6. Expresii..................................................................................................................... 71 Generaliti.................................................................................................................... 71 ProritateaiasociativitateaoperatorilornlimbajulC: ................................................ 73 Clase de operatori i de expresii (dup tipul rezultatului) ............................................ 75 Modaliti de evaluare a expresiilor .............................................................................. 80 7. Instruciuniicontrolulexecuiei .......................................................................... 84 Instruciunea de atribuire .............................................................................................. 84 Instruciunea compus .................................................................................................. 86 Instruciuni condiionale (de ramificare, de selectare) .................................................. 86 Instruciuni de ciclare.................................................................................................... 88 Instruciuni de transfer .................................................................................................. 89
Programarea structurat i cum s-a ajuns la ea ............................................................. 90 Proceduriitransmitereaparametrilor ................................................................ 92 Abstractizare i specificare ........................................................................................... 92 Proceduri ....................................................................................................................... 96 Evaluarea i transmiterea parametrilor ......................................................................... 98 Specificarea parametrilor unei proceduri ...................................................................... 99 Noiunea de efect secundar ........................................................................................... 99 Proceduri mutual recursive ......................................................................................... 100 9. ANEXE .................................................................................................................... 101 8.
1. Introducere
PP este o paradigm de programare bazat pe conceptul de apel de procedur. Procedurile, numite i rutine, subrutine, metode sau funcii (a nu se confunda cu funciile matematice, dar similare cu cele folosite n programarea funcional) coninoseriedepaicomputaionalicaretrebuieparcuri.Oriceprocedurpoatefi apelat oriunde n timpul execuiei unui program inclusiv din interiorul ei (apel recursiv). PPestedemulteorioalternativmultmaibundectprogramareasecvenialsau programarea nestructurat n situaiile n care complexitatea problemei este moderatinunecesitunefortdentreinereridicat. BeneficiialePP: Posibilitateadearefolosiacelaicodnlocuridiferitencadrulprogramului fralcopia. Controlul execuiei programului este mai simplu n comparaie cu folosirea unorinstruciuniGOTOsauJUMP(instruciunicepottransformaunprogram marencevacesenumetecodsubformdespaghete). Abilitateadeafiputernicmodularistructurat.
Definiii
Limbajdeprogramare:notaiesistematicprincareestedescrisunprocesdecalcul. Rolul unui LP este de a pune la dispoziia programatorilor construcii sintactice pentruorganizareacalculelor.Procesuldecalculesteconstituitdintromulimede pai pe care o main i poate executa pentru a rezolva o anumit problem, pai care sunt exprimai n comenzielementare pe caremaina (calculatorul) tie s le execute.Pentrudescriereaprocesuluidecalculestenecesarcunoatereasetuluide comenzi(instruciuni)almainiilacarenereferim. Limbaj main: limbajul nativ al unui computer, reprezint notaia la care calculatorul rspunde n mod direct. Setul de comenzi elementare al unui calculatoresteconstituitdin:operaiiaritmeticeilogice,operaiideintrareieire i unele funcii speciale, numite funcii de control. Comenzile i instruciunile limbajului main sunt scrise ntro form codificat, foarte compact, fapt ce ngreuneazfoartemultnelegereatextuluisurs.Limbajulmainestefoartelegat de arhitectura fizic a mainii, el fiind constituit din codificri binare a cror semnificaieesteimposibildedescifratnmodrezonabildectreprogramator. 0000101011110000 0010111111111111 0010000000000101 5
Limbajul de asamblare: face un pas nainte ntruct atribuie nume simbolice (mnemonici) codificrilor operaiilor mainii, precum i locaiilor de memorie asociate. Secvena de coduri binare de mai sus are, pe o anumit arhitectur, echivalentulmnemonic: LOAD I ADD J STOREK Niciunadinceledouvariantenuestelafeldeclarisemnificativcaechivalentul lor: K:=I+J Din acestmotiv, limbajelemain i cele de asamblarese numesclimbaje denivel sczut. Acestelimbajesuntfoartedepartedelimbajulnatural,aacsacutatelaborarea altor limbaje, mai apropiate de exprimarea natural. Rezultatul a fost crearea limbajelor de nivel nalt (highlevel programming languages). Aceste limbaje utilizeaz notaii mai puin primitive dect limbajele de asamblare, n care exprimarea aciunilor de urmat devine uoar, clar i concis. Nivelul nalt are semnificaiauneidistanrisuficientdemarifadeniveluldeexprimarealmainii. Un limbaj de nivel nalt mrete considerabil numrul celor care vor programa calculatoare. Proiectarea i implementarea limbajelor de programare este activitateacapitaldeacreicalitatedepindelrgireacomunitiiprogramatorilor carespoatrealizaeficientdezvoltareaunoraplicaiidelarginteres. Orice notaie utilizat care este diferit de limbajul main nu poate fi executat direct, ea trebuind s fie tradus n limbajul main al calculatorului gazd. Activitatea de traducere (numit generic translatare) este preluat de programe specializatenumitecompilatore(dactextulsursestescrisntrunlimbajdenivel nalt)sauasambloare(dactextulsursestescrisnlimbajdeasamblare). Datorit interpunerii compilatoarelor i asambloarelor este evident c odat cu creterea claritii i accesibilitii, limbajele de programare de nivel nalt aduc cu ele i o scdere a performanei de execuie fa de variantele de program scrise directnlimbajmain.Acestescderisemanifestpedouplanuri: timpmaincerutdeprocesuldecompilare codul rezultat n urma translatrii este de obicei mai lung i necesit mai multtimpdeexecuiedectvariantacodificatdirectnlimbajmain. Trecerea la utilizarea LP de nivel nalt a adus cu sine o caracteristic foarte importantaprogramelorscrisenastfeldelimbajeianumeportabilitatea,adic posibilitatea de a rula programele fr modificri pe arhitecturi de calcul diferite (eventualmodificrilesuntcutotulminore).Acestmomentafostfoarteimportant 6
pentrudezvoltareauneicomunitideprogramatori,pentrurspndireasoftuluii pentrucreareadebibliotecideprogramereutilizabile.
Paradigme de programare
Paradigm de programare: colecii individualizate de caracteristici de evaluare i criterii de abstractizare care determin i difereniaz clasele de limbaje de programare. Astfel de criterii sunt: structura programului, noiunea de stare a execuiei,metodologiaprogramrii. Programarenestructurat:foloseteGOTO Programarestructurat:eliminGOTO(saureducefoartemultutilizareaGOTO) Programarea procedural: este caracterizat prin faptul c un program este privit caomulimeierarhicdeblocuriiproceduri.Exponent:ALGOL60 Programare funcional: un program este descris pe baza unor funcii de tip matematic utilizate de obicei recursiv. Funciile sunt considerate obiecte cu drepturiegale(firstclasscitizens)ncadrullimbajului,adiclafelcaelementele oricrui tip de dat ele pot constitui elementul de baz n structurarea unor date (putem avea de exemplu tablouri de funcii), pot fi returnate ca rezultat al unor funcii(funciacompuneredefunciireturneazoaltfuncie).Exponeni:Lisp(anii 60),Miranda(anii70),ML(anii80),Haskell(anii90). Programareimperativ:(opusulesteprogramaredeclarativ)esteoparadigmde programare care descrie procesul de calcul n termeni de stare a programului i instruciunicareschimbstareaprogramului.Programeleimperativepotfiprivite ca o serie de comenzi pe care calculatorul le execut. Limbajele imperative indic modulncarearelocprocesuldecalcul.Majoritatealimbajelordeprogramaresunt limbajeimperative.(Fortran,Algol,C,Pascal,Ada) Programare declarativ: este o abordare a programrii calculatoarelor ce implic creareaunuisetdecondiiicedescriuspaiulsoluieidarlasinterpretareapailor necesari pentru a ajunge la soluie unui interpretor nespecificat. Programarea declarativesteoabordarediferitfadeprogramareimperativtradiionaldin Fortran,Pascal,Ccarenecesitcaprogramatorulsfurnizezeolistdeinstruciuni ce se execut ntro ordine specificat. Soluiile declarative au dou faze independente:declaraiaiinterpretarea.(Prolog,Haskell,Oz,SQL,WSDL) Programare logic: un program este descris printrun set de relaii ntre obiecte precumiderestriciicedefinesccadrulncarefuncioneazaceleobiecte.Execuia nseamn aici activarea unui proces deductiv care va furniza concluzii posibile pe bazadatelordeintrare.Exponent:Prolog. Programare bazat pe obiecte i orientat pe obiecte: un program este constituit dintro colecie de obiecte care interacioneaz. Exponeni: Simula, Smalltalk, C++, Java,C#. Programare concurent i distribuit: execuia unui program este constituit din aciuni multiple posibil a fi executate n paralel pe una sau mai multe maini. Execuia aciunilor poate fi independent sau aciunile pot depinde una de alta, 7
situaie n care este nevoie de primitive de sincronizare i comunicare. Exponeni: CSP, extensii concurente ale limbajelor imperative (C, Pascal, FORTRAN), Linda, Occam Programare la nivelul bazelor de date: aciunile programului sunt dictate de cerinele unei gestiuni corecte i consistente a bazelor de date asupra crora acioneazprogramul.Exponent:SQL. Paradigmele prezentate nu sunt mutual exclusive. Exist limbaje de programare multiparadigm.
Generaii de limbaje
19541958Limbajeledeprogramaredeprimageneraie(FORTRANI,ALGOL58). Acesteaaumerituldeafifcutpasuldecisivdelalimbajuldeasamblarelalimbajele de nivel nalt. Rolul lor primordial a constat n promovarea i dezvoltarea conceptelor ce stau la baza limbajelor de programare de nivel nalt precum i a implementriilor. 19591961Limbajedegeneraiaadoua(ALGOL60,FORTRANII,Cobol,Lisp) Sunt considerate limbaje stabile, durabile, care se utilizeaz intens i astzi. Chiar dacALGOL60nuaatinsungradderspndiresuficientdemare,influenasaafost imensndezvoltarealimbajelorPascal,PL/1,SimulaiAda. 19621971Limbajedegeneraiaatreia(PL/1,ALGOL68,Pascal,Simula) Chiardacaureprezentatteoreticunpasnainte,succesullornusepoatecompara nicipedepartecucelallimbajelordegeneraiaadoua.ncercareaacestorlimbaje dealenlocuipeceledegeneraiaadouaafostsortiteecului,fcndulpeC.A.R. Hoare s remarce ALGOL60 reprezint un pas nainte fa de succesorii(!) si. Limbajul PL/1 a combinat elemente de FORTRAN, ALGOL i Cobol rezultnd un limbaj puternic, dar mult prea complex, deosebit de dificil de nvat i de implementat. ncercarea limbajului ALGOL68 de a generaliza limbajul ALGOL60 a fost caracterizat drept elegant dar neacceptat practic de marea mas a programatorilor. Limbajul Pascal, dei cu un enorm succes din punct de vedere didactic,nuesteconsideratniciastzisuficientderobustpentruutilizarealascar industrial. 19721979Limbajedegeneraiaapatra(CLU,CSP,Ada,Smalltalk) Au avut o rspndire i mai redus dect cele de generaia a treia, justificnd pe bun dreptate denumirea acestei perioade drept gol de generaie (generation gap).Aceastperioadafostnsoperioaddecercetareintensidereevaluarea obiectivelor proiectrii limbajelor de programare. Criza software de la sfritul anilor 60 a condus la o schimbare de optic n acest sens, accentul cznd pe structurare.Lanivelmicroacestlucrusafcutprineliminareainstruciunilorgoto inlocuirealorcuinstruciunidetipwhile,iarlanivelmacrosapusmareaccent pe modularizarea programelor prin utilizarea intensiv de funcii i proceduri i prinpromovareaconceptuluideabstractizareadatelor. 8
19801990Paradigmealelimbajelordeprogramare Aceast perioad se caracterizeaz printro intens activitate de cercetare, concentratnuattpestudiulidezvoltareaunorlimbajeparticulare,ctpestudiul paradigmelor asociate claselor de limbaje. n acest sens se remarc clasele de limbaje funcionale, logice, orientate obiect i distribuite, ele reprezentnd i cele patruparadigmedeprogramarecelmaiintensstudiatelaoraactual.
10
FortranII(1958)introducesubrutine,funcii,bucle,ostructurdecontrolprimitiv detipFOR.Identificatoriisuntlimitailaasecaractere Lisp19581960 LIStProcessing MacCarthy Limbaj funcional pentru procesarea listelor. Este recursiv, nu este iterativ. Nu existdiferenntrecodidate. Algol1960/AlgolW1966/Algol68 ALGOrithmicLanguage Definitdeunconsoriuinternaionalformatdinspecialitininformatic Primul limbaj universal independent de main. Introduce utilizarea gramaticilor BNF(BackusNaurForm)pentruacreaunanalizorsintactic.Introduceblocurilede instruciuni i variabilele locale n cadrul unui bloc. Recursivitatea a fost implementat cu reticen pentru c a fost considerat inutil! Folosete tablouri dinamiceceeacenseamnclimbajeleurmtoare(Pascal,C)auregresatfolosind tablouristaticepentruoperformanmaibun. AreinstruciuneaIFTHENELSE,FOR,simbolul:=pentruatribuire(folositmaiapoi nPascal),instruciuneaSWITCHcuGOTO,indicatoriBEGIN,ENDicicluWHILE. Algol W proiectat de Niklaus Wirth n 1966 folosea RECORD (structuri de date dinamice), CASE, transmiterea parametrilor prin valoare, precedena operatorilor. n acelai an, Niklaus Wirth a creat Euler, un limbaj ntre Algol i Pascal. Algol 60 limbaj orientat spre calcule matematice. Pentru a ncerca s se obin obiectivul iniialianumedeacreaunlimbajdeuzgeneral,sacreatncepndcu1964onou versiuneAlgolX,numitmaitrziuAlgol68.Algol68folosea=+pentruacontopi atribuireacuadunarea.IntroduceUNIONitipuriCAST.AreIFTHENESLEFI,CADE GOTO,operatoridefiniideutilizator.Compilareaincrementalnuestepermis. Cobol1960 COmmonBusinessOrientedLangage. DefinitdeCODASYL,COnferenceonDAtaSYsystemsLanguages. 11
Basic1964 BeginnersAllpurposeSymbolicInstructionCode JohnKemeny,ThomasKurtz Proiectat n1963,pentruafiuor denvatiafostimplementatn1964.Prima versiuneafostcompilat,dupcareadevenitinteractiviinterpretat.Fiecarelinie areunnumripermitesaltullaliniecuinstruciuneaGOTO. Bill Gates i Paul Allen au ctigat un concurs internaional prin proiectarea i implementareaunuiBasicrapidicompact,primadatpeAltair(4kbdememorie) imaiapoipealtemicrocomputere. Microcomputerele aufost furnizate cuBasicnROM pnla sfritul anilor80. n 1977, Appel II se vindea cu Basic pentru ntregi. Mai apoi Applesoft Basic de la Microsoft cu virgul flotant. Applesoft avea identificatori din dou litere. SubprogrameleerauapelateprinGOSUBnumrlinie. PrimulPCdelaIBM(1981)foloseasistemuldeoperareMSDOSdelaMicrosofti Basicinterpretat(Basica).n1982MicrosoftaprodusprimulBasiccompilat(Quick Basic) n acelai deceniu Pascal i C au nlocuit Basic. Microsoft folosete n continuare Basic(VBA). Logo66 WFuerzeig,SPapert,andothers Folositpentruainvapecopiiprogramare.AsemntorcuLispisebazeazpe micareauneibroateestoasepeecran. Pascal1970 BlaisePascal,matematicianfrancez NiklausWirth.
12
A fost proiectat pentru a simplifica crearea compilatoarelor i pentru ndruma procesuldenvareaprogramriispreprogramareastructurat.UCSDPascaleste prima versiune pentru microcomputere. Programele sunt compilate n Pcod, care este portabil i interpretat (la fel ca Java mai trziu). Includea un mediu pentru dezvoltare de aplicaii complet, un principiu folosit cu succes mai trziu n Turbo Pascal.n1981,joculWizardryscrisnPascalaavutunsuccesfoartemarepeApple. Turbo Pascal (proiectat deAnders Hejlsberg)a aprutn 1983.Erarapid, aveaun IDE complet aa c limbajul a avut un succes instantaneu i este folosit chiar i astzi.StructuriledecontrolsuntasemntoarecuceledinC. Smalltalk1972 AlanKay,SoftwareConceptGroup. Limbajdeprogramareorientatobiectcareruleazntotdeaunancadrulunuimediu grafic,cuferestre,mouseetc. C1973 CestesuccesorulluiB,carelarndulluiestesuccesorulluiBCPL DennisRitchie. A fost destinat pentru programarea sistemului de operare UNIX, dar a devenit repede un limbaj universal datorit portabilitii i vitezei. Permite compilare incremental. n 1965, programatorii AT&T foloseau BCPL pentru a implementa Unix.Nemulumiidelimbaj,laumbuntitisacreatlimbajulBiarmaiapoiC. EvoluiahardwareuluiadeterminatapariialimbajuluiC.BCPLiBfoloseauntregi pentru pointeri, dar aceasta nu funciona pe calculatoarele noi. BCPLnuare tipuri (lafelcaPHPsaualtelimbajescriptmoderne).Declaraiileinti,charbaufostcreate nC.Ulteriorauaprutialtetipuri.Operatorul+=vinedinAlgolundeerascris=+. nBCPL,unblocdeinstruciuniesteinclusntresimbolurile(*i*)iarcomentariile ntre /* i */ iar subexpresiile ntre ( i ). Limbajul C a simplificat scrierea prin folosirea acoldelor. ++ exista i n limbajul B. Cuvntul include venea din PL/1. Preprocesorulafostimplementatn1973idinacelmomentlimbajulCafostfolosit pentruscriereasistemuluideoperareUnix.Limbajulaevoluatpnn1980. Sql1970+
13
StandardQueryLanguage IBM Limbajpentruinterogareabazelordedaterelaionale. C++19811986 BjarneStroustrup. Versiune a limbajului C orientat pe obiecte. Introduce suprancrcarea operatorilor. Metodele pot fi inline. Comentarii // care vin din BCPL. Au fost implementatemotenireaiabloanele(clasesaufunciigenerice). Objective C, inventat de Brad Cox n 1984, este o alt versiune orientat obiect a limbajuluiCinspiratdinSmalltalk. Perl1987 PracticalExtractingandReportLangage. LarryWall,lingivstaustralian Destinat pentru nlocuirea limbajelor linie de comand Unix, Sh, Sed and Awk, a pstrataceeaisintaxgreoaie.Folositnprincipalpentruadministrareasistemului i scripturi CGI. Folosete liste i tablouri asociative. Exist structura de control FOREACHcarepermiteparcurgereaunorliste. Java1994 Java(coffee) JamesGosling,SunMicrosistems Proiectatn1991caunlimbajinteractivnumitOak.Lavremearespectivnuaavut succes.n1994afostrescrispentruInternetiredenumitJava.n1995seputeau crea appleturi. n ianuarie 1996, Javasoft distribui JDK 1.0. Kitul pentru dezvoltarea de aplicaii. Java este un limbaj clasic de programare procedural, apropiat de C++. Se compileaz n bytecode ce poate rula pe orice calculator. Este maisimpludectC++:fiecarefiierconineosingurclas,memoriaestegestionat automat, nu exist pointeri, motenire multipl, suprancrcarea operatorilor dar includemultitasking.SpredeosebiredeCiC++aredoartablouridinamice. 14
PHP1995 PersonalHomePagesHypertextProcessor RasmusLerdorf Limbajscript mutliplatform,ceseincludenHTML.AsemntorcuCdarnueste tipizat. Variabilele se prefixeaz cu $. Interpretorul prelucreaz pagina html ce include instruciuni php i o transform ntro pagin html pur. Biblioteca de funcii permite crearea de pagini web dinamice. Microsoft folosete ASP (asemntorcuBasic) UML1996 UnifiedModelingLanguage Standard (Object Management Group) Grady Booch, Jim Rumbaugh, and Ivar Jacobson Uml reprezint reunirea a trei limbaje de modelare proiectate de cei trei autori. Limbajulfoloseteonotaiegraficpentruaproiectasoftware.Sefacdiagramecare exprim obiecte i interaciunile dintre acestea. Un model este realizat din vizualizri i combinarea lor descriu un sistem complet. Modelul este abstract i independentdedomeniu. Este limbaj pentru specificarea, vizualizarea, construirea i documentarea proiectelorsotwareintense. C#2000 (Csharp),succesoralC++? AndersHejlsberg/Microsoft.
15
Principalul limbaj din platforma .NET , pentru crearea de software care s funcionezeprinInternet.LafelcaiJava,pstreazsintaxaC(unlimbajde30de ani!) i aduce mbuntiri: garbage collector, nu are pointeri, interfee, multi tasking C# se comileaz n limbaj intermediar MSIL (Microsoft Intermediate Language) i folsoeteobibliotecmultilimbaj,CLR(CommonLanguageRuntime).Originalitatea sistemului.NETestevarietateadelimbajecepotficompilatenMSILipartajarea claselor. Altefacilitioferitedeacestlimbaj: Structurilesuntspecialefiindtransmiseprinvaloare Identificatoriisuntobiectecumetode Atributele sunt obiecte descriptive ataate elementelor programului i folosite la execuie Proprieti(get/set) Foreachpentruparcurgereaunorlistedeobiecte Delegai(nlocuiescpointeriilafunciidinC) mbuntirifadeJava: Gestiuneaevenimentelorestembuntit Suprancrcareaoperatoriloresteprezent Accesmaisimplulasistemulnativ
Tendine
Limbajescript:NetRexx,Python,Ruby,Scriptol. LimbajepentruInternet:Php,Asp,JavaScript Limbajedemarcare:XML Platforma .NET sau altele similare vor simplifica introducerea de cod n interiorul datelor,darXMLpoatefioalternativ.C#vafiunliderpentruastfeldeplatforme iar succesul su va fi asigurat de faptul c programatorii de C, C++ i Java l vor adopta cu uurin. Datorit faptului c platforma .NET permite utilizarea oricrui limbaj va fi posibil apariia unor limbaje noi mai expresive. Platforma .NET foloseteXMLprinconvertireanobiecte.ViitorulestefolosireadirectaXMLului catipdedate.
16
2. Procesuldecreareasoftwareului
Introducere
Limbajele de programare sunt instrumente pentru scrierea de programe. Ele sunt componente ale procesului de creare a softwareului i prinurmare proiectarea i implementarea lor respect etapele componente ale acestui proces. Se poate considera c realizarea unui nou limbaj este structural identic cu realizarea unei aplicaii software complexe, ea trebuind s urmeze un anumit cadru general, ale cruifazesuntbinedefinite,cadruncareestepermislafiecarepasrevenirean fazaimediatanterioar. ncontinuarevomprezentafazeleprocesuluidecreareasoftwareului. Analiza i specificarea cerinelor. O aplicaie software este conceput pentru a veni n sprijinul unui anumit grup de utilizatori poteniali. Cerinele acestora sunt stabilitesubformaunuidocumentcaretrebuiesprecizezeceeacetrebuiesfac aplicaiarespectivinucum.Laelaborareadocumentuluiparticipattpotenialii utilizatori, ct i specialitii n dezvoltarea de software. Acest document conine specificaiiprivindmanualeleutilizator,studiidecostifezabilitate,cerineprivind performaneleetc. Proiectarea i specificarea softwareului. Plecnd de la cerinele specificate n faza precedent, echipa care realizeaz aceast etap (proiectanii software) realizeaz specificaiile de proiectare, care identific fiecare modul al sistemului, precum i interferenele dintre module. Metodologia de proiectare utilizat n aceast faz are o mare importan pentru alegerea limbajului de programare utilizatnfazaimediaturmtoare. Implementarea.Aceastfazestesingurancareesteutilizatexplicitunlimbajde programare. Implementarea nseamn scrierea de uniti de program corespunztoare modulelor descrise n specificaiile de proiectare i editarea documentaieicorespunztoare.Rezultatulacesteifazeesteunsistemimplementat idocumentatcomplet. Certificarea.Scopulacesteietapeesteverificareacerinelorimpusenprimaetap i se realizeaz de obicei prin testarea sistemului n raport cu fiecare cerin specificat, utiliznduse o baterie de teste, adic un set de programe (cnd este vorba de un limbaj de programare) sau un set de exemple (cnd este vorba de o aplicaieoarecare)careacopertoatenecesitileimpuse.Dinpunctuldevedereal testrii,nusepoatefaceodistincieclarntrefazele3i4.Astfel,estenormalcan fazadeimplementaresserealizezetestarealaniveldemodul,efectuatdefiecare programatoriparialtestareainterfeelorintermodule(testaredeintegrare),care serealizeazprinlegareactorvadintremoduleleaplicaiei.nfazadecertificarese realizeaz testarea sistemului, care verific sistemul n ansamblul su. Rezultatul acestei faze este un sistem verificat i certificat complet, livrabil utilizatorilor. n
17
afaratestrilorpropriuzise,totnaceastfazseincludtoateactivitilecaresunt legatedeverificareacorectitudiniiprogramelorscrise. ntreinerea. Dup intrarea n exploatarea a aplicaiei, pot s apar necesitatea unormodificri,provocatefiededetectareaunoreroricareauscpatdinfaza4,din dorina de ai aduga noi specificaii (cerine). De obicei, costul ntreinerii unei aplicaiintrececostultuturorcelorlaltefazeluatempreun. ngeneral,oriceprodussoftwaretrebuiessatisfacurmtoarelecerine: Sfiefiabil Sfieuordentreinut Sseexecuteeficient
18
Portabilitatea:esteuurinacucareproduselesoftwaresepottransferandiverse mediihardwareisoftware. Verificabilitatea: este uurina de elaborare a procedurilor de acceptare (n particular date de test) i a procedurilor de detectare i trasare (transformare n erori)acderilor(failures)ntimpulfazelordevalidareiexploatare. Integritatea: este abilitatea produselor software de ai proteja componentele (programe,date,documente)fadeacceseimodificrineautorizate. Uurinanutilizare:sereferlanvareautilizriisistemului,operarea,pregtirea datelordeintrare,interpretarearezultatelorirecuperareadinsituaiideeroare. Factorii interni de calitate sunt strns legai de natura intim a procesului de elaborareaproduselorprogram.Aicicontribuie:metodeledeanaliziproiectarea produselor program, facilitile oferite de limbajele de programare folosite la implementareiaspecteleorganizatoricealeindustrieisoft. Factoriiinterni: Modularitatea: structural produsul program trebuie s fie alctuit din module, urmrinduseprincipiuldescentralizrii. Documentareacomplet:presupuneexistenauneidocumentaiiclareiaduslazi pentrufiecarefazdincicluldeviaalprogramului. Unlimbajdeprogramaretrebuiesposedeurmtoarelecaliti: S permit o descriere ct mai natural a problemei care se rezolv, permind programatorului s se concentreze asupra problemei i nu asupra detaliilor de adresare,indexareetc. Saibungraddelizibilitatectmairidicat,adicunprogramspoatfiuorde descifrat(sintacticisemantic)deoricinelconsult. Spermitgestiuneaexcepiilor(depiriaritmetice,erorideintrareieireetc.)
programsimpluisuccint,efoarteprobabilcvarezultaunprogramexecutabiln limbaj main foarte eficient. Dac observai c programul executabil obinut nu este eficient, motivul este probabil modul de realizare al programului i nu compilatorul care ar fi fcut ceva, fr tirea programatorului, asupra cruia nu avemcontrol. Un limbaj de programare este o unealt, i nici o unealt nu poate realiza orice sarcin fr un ajutor. Limbajul C nu are toate trsturile necesare de care avem nevoie n programele noastre. Limbajul C impune un set mic de reguli programatorilor. Unele sarcini obinuite, cum ar fi manipularea irurilor, alocarea memorieiirealizareaoperailordeintrareiieire,suntexecutateprinapelulunor funcii de bibliotec. Alte sarcini de care am avea nevoie n programe cum ar fi: crearea de directoare, listarea coninutului acestora, interaciunea cu mouseul, afiareaferestreloretc.,nusuntdefinitedelimbajulC.Acesteoperaiibinenelesc potfifcutedintrunprogramC,darntrunmodspecificmediuluideprogramare pe care l folosim (mediu pentru dezvoltarea de aplicaii, compilator, procesor, sistemdeoperare),modcenuestedefinitdestandardulC. UnaltaspectallimbajuluiCcaretrebuiepunctataiciestecacestlimbajesteunul periculos, n sensul c limbajul nu ofer programatorului modaliti de protecie mpotriva erorilor. Dac scriei un program care face (din cauza unei greeli) cu totulaltcevadectaiintenionat(deexemplutergereadatelordepedisc),idac compilatorulpoatecompilaacelprogram,nuveipriminiciunmesajdeavertizare de genul: Vrei ntradevr s facei asta? sau Suntei sigur c vrei s facei asta?.Cesteadeseacomparatcuuncuitfoartebineascuit:sepoaterezolvacuel oproblemcupreciziechirurgical,darnacelaitimpvputeitiacueldegetulcu oprecizie chirurgical. Programatoruleste celcare trebuie sutilizezelimbajulcu grij.
20
3. Traducereaiexecuiaprogramelor
Unlimbajdeprogramareesteuninstrumentcucaresepoateexprimaunprocesde calcul,rezultndceeacenumimprogramsursnlimbajuldeprogramarerespectiv. Programul surs reprezint nivelul virtual al abstractizrii problemei de rezolvat. Pentru ca maina (calculatorul) s poat rezolva problema, aceasta trebuie exprimatntermeniilimbajuluimainiirespective,adictrebuieatinsnivelulfizic alabstractizrii,nivelcevafiatinsprinintermediulunuiprocesdetraducere. Rezolvareauneiproblemecucalculatorulparcurgedoumarifaze: formalizarea problemei i exprimarea ei ntrun limbaj de programare. n termeniicicluluideviaaprogramuluirezultat,aicisuntcuprinseetapelede definire, specificare, analiz, proiectare i implementare. Rezultatul obinut esteprogramulsurs.naceastfazrolulfactoruluiumanestehotrtor. traducereaprogramuluisursrezultatdinetapaprecedentntrunprogram executabil pe calculator i execuia acestuia. Aceast faz este mult mai automatizat dect prima, recurgnduse la programe de traducere din limbajuldeprogramarenlimbajulmain.
care are ca scop identificarea atomilor lexicali din care este compus programul respectiv. Exist urmtoarele categorii de tokeni: simboluri speciale, identificatori, etichete, literali. Doi tokeni succesivi trebuie separai de unul sau mai muli separatori. De obicei separatoriinusuntconsideraitokeni,cutoateceipotfacepartedinconstituenii unuiliteral. Deexempluinstruciunea: if(a>b)x=x+1elsey="Hello!"; conineurmtoriiatomilexicali: identificatori:if,a,b,x,else,y simbolurispeciale:(,),>,=,+ literali:1,"Hello!" Att atomii lexicali ct i separatorii se construiesc din caracterele coninute n alfabetullimbajului. Exist dou categorii de separatori: separatorii uzuali, comentariile. Ambele categoriisuntignoratenprocesuldeanalizlexical. Separatoriiuzualiservesclaseparareaadoitokeniconsecutivi,fiindnumiinunele limbaje spaiu alb (white space); n aceast categorie intr caracterele spaiu, tab, linienou. Comentariilenuausemnificaiepentruprocesuldecalculspecificatnprogram;ele servescnumailaobunnelegereatextuluisursdectrecelcarelcitete.Exist dou maniere de comentare a unui program: linie i text. n limbajul C, C++, C# comentariulliniencepecucombinaiadecaractere//,iarcomentariultextncepe cucombinaia/*isetermincu*/. Identificatori,cuvintecheieirezervate Un identificator este o secven arbitrar de litere i cifre din alfabetul limbajului, dincareprimulcaracterestelitersausemnuldesubliniere.Numruldecaractere din secven poart numele de lungime a identificatorului. Unele limbaje stabilesc limite superioare ale acestei lungimi altele las pe seama implementrii aceste restricii. Suntlimbajecarefacdistincientreliterelemariimici(suntcasesensitive):C,C++, Java iar altele care nu fac aceast distincie: Pascal, Modula2, FOTRAN. n C cuvintelerezervatesescriunumaiculiteremici(if,else,while,foretc.) Existdoucategoriideidentificatori: Predefinii: sunt precizai n definiia limbajului i ei se pot mpri n dou categorii: cuvinte cheie i cuvinte rezervate. Cuvintele cheie au un neles explicit ntrun context precizat. De ex. cuvintele DO, IF, CONTINUE au o semnificaie foarte clar cnd sunt folosite ntrun text surs FOTRAN, semnificaialorrezultnddincontextulncareapar.Elepotfifolositensi 22
canumedevariabil,frniciunfelderestricie.naltelimbajecumesteC acest lucru nu este posibil. Evident, c o astfel de situaie nu este indicat pentrucpoateducelaconfuziiingreuneaznelegereaprogramului.Spre deosebiredecuvintelecheie,esteinterzisfolosireacuvintelor rezervaten alt scop dect acela pentru careele sunt definite.ntabelul de mai josdm toatecuvintelecheiedinlimbajulC.Avantajeleutilizriicuvintelorrezervate sunt: programul devine mai uor de neles prin utilizarea lor, se mrete viteza de compilare (la cutarea n tabela de simboluri, simplificnduse analiza lexical, sintactic i semantic), este uurat depistarea erorilor. Dacnumrulde cuvinterezervatealunuilimbajestemare,atunci el nui maipstreazproprietilebenefice,devenindunbalast.Existenacuvintelor rezervate nu d un certificat de calitate unui limbaj. n universul de azi al limbajelordeprogramare,aceastmprirencuvintecheie/rezervatein identificatori/cuvinte(cheiesaurezervate)esterelativ. Definiideutilizator:suntidentificatoricreaideutilizatorpentruafifolosii ca nume de variabile, constante, proceduri, funcii, clase, obiecte, tipuri de datedefinitedeutilizator,metode,proprieti,evenimente,delegaietc. auto break case enum char const continue default do for signed goto sizeof if static
extern float
unsigned void
volatile while
CuvintelecheieC Simbolurispeciale Lafelcaicuvintelerezervate,simbolurilespeciale(numiteuneoriioperatorisau semne de punctuaie, delimitatori) au o semantic bineprecizat. n unele limbaje elesepotfolosidoarconformdefiniieilor,naltelesemanticasepoateextinde,prin ceeacesenumetesuprancrcareaoperatorilor. SimbolurilespecialenCsunt: Operatorisausemnedepunctuaie:!%^&*()+={}|~[]\;:<>?,./ Operatori(fiecareconsideratunsingurtoken):>++<<>><=>===!=&& ||*=/=%=+==<<=>>=&=^=|= Tokenifolosiidepreprocesor:# Literali Prin literal vom nelege o valoare constant de tip numeric sau caracter. Literalii, numiidemulteoriiconstantesepotmprin: Constantenumerice(ntregiireale) 23
Constantecaracter Constanteirdecaractere Trebuie fcut distincie ntre conceptul de constant (n sensul de literal) i constantsimbolic.Deasemeneatrebuiefcutdistincientretermenuldeliterali celdeidentificator.Termenulconsacratdeliteralpentruvalorileconstantearputea proveni de la adlitteram, adic are semnificaia unei valori precizate explicit. O definiie mai elaborat afirm c literalii exprim valori constante ale tipurilor de baz(numericeicaracter). Vom prezenta n continuare categoriile de literali din limbajul C (folosim notaia BNF). Literal::=constantntreag|constantcaracter|constantflotant|literalirde caractere Constantntreag:esteformatdiniruridecifre.Suntrecunoscutetreiconvenii de reprezentare: zecimal (dac nu ncepe cu 0), octal (dac ncepe cu 0) i hexazecimal (dac ncepe cu 0x sau 0X). Tipul constantelor ntregi depinde de forma,valoareaisufixulacestora(i,I,u,U). Constant caracter: este format din unul sau mai multe caractere incluse ntre apostroafe. Pentru un caracter, tipul constantei este char, iar valoarea lui este valoarea codului ASCII al caracterului; dac sunt mai multe caractere, tipul constanteiesteint,iarvaloareaacesteiadepindedeimplementare.Existconstante caracter predefinite, care se precizeaz cu ajutorul unor secvene escape (secvene deevitareprecedatedecaracterulbackslash\): CaracterASCII secvenaescape NLnewline \n HTtaborizontal \t VTtabvertical \v BSbcackspace \b CRcarriagereturn \r FFformfeed \f BELbell \a \ \\ ? \? \ nr.octal \ooo nr.hexa \xhhh Constantele reale: sunt compuse din: parte ntreag, marc zecimal, parte fracionar, marc exponent (e sau E) i exponent ntreg cu semn. Tipul lor este implicitdouble,carepoatefimodificatprintrunsufix(Fsauffloat,Lsaullong double).Parteantreagsauparteafracionarpotlipsi(darnuambele),lafelpot lipsiimarcazecimalsaumarcaexponenial(nuambele). 24
Constanteleirdecaractere:suntformatedintrunulsaumaimultecaractereincluse ntre ghilimele. Tipul lor este char[] i au clasa de memorie static. Reprezentarea unuiirdecaracteresefacepen+1octei,ultimuloctetconinndcaracterulNULL (cu codul ASCII 0). Constantele ir de caractere se mai numesc nullterminated strings. Sintaxaunuilimbajdeprogramare La fel ca n orice limb, i n limbajele de programare, succesiunile de cuvinte formeaz propoziii sau instruciuni. Prin sintaxa unui limbaj de programare se nelegeunansambludereguliprincaresedetermindacoanumitinstruciune estecorectalctuitsaunu. Conceptuldesintaxaparesubdouforme: Sintax abstract: identific rolul componentelor fiecrei construcii; descrierile de limbaj i implementrile sunt organizate n jurul sintaxei abstracte. Sintaxa concret (lexical): prezint modul de scriere a construciilor limbajului,coninnddetaliirelativlaplasareacuvintelorcheieiasemnelor depunctuaie. Spreexemplu,aceeaisintaxabstractstlabazasecveneideprogram: WHILEx<>A[i]DO i:=i1 END ScrisnModula2,precumiaurmtoareisecveneC: while(x!=A[i])i=i1; Existdiversemoduriprincaresepoatedescriesintaxaunuilimbajdeprogramare: BNF,grafeledesintax,gramaticiiautomateetc. BNF (BackusNaur Form = notaia BackusNaur) a aprut n 1963 n cadrul raportuluiALGOL60. nraportulALGOL60instruciuneaforeradefinitnfelulurmtor: <instr.for>::=<clauzfor>|<etichet>|<instr.for> <clauzfor>::=for<variabil>:=<listfor>do <listfor>::=<elementdelistfor>|<listfor>,<elementdelistfor> <elementdelistfor>::=<expr.aritmetic>| <expr.aritmetic>step<expr.aritmetic> until<expr.aritmetic>| 25
<expr.aritmetic>while<expr.bool> Simbolurile <, >, |, :: fac parte din mecanismul de descriere a limbajului, ele fiind numitemetasimboluri.Simbolul::=nseamnsedefineteastfel.Cuvintelefor,do, step,until,while,precumi caracterele{, :=,:,},careapar nproducii,senumesc simboluriterminale,pecnd<instr.for>,<clauzfor>suntsimbolurineterminale.n orice producie, la stnga metasimbolului ::= apare un neterminal, iar definiia acestuiaesteolistdeneterminale,terminaleimetasimboluri. Conformprimeiproducii,instruciuneafor aredoudefiniii alternative,separate prin |. Aceast producie utilizeaz ideea definirii recursive n a doua alternativ, deoarece <instr. for> este definit prin ea nsi. nelesul definiiei este c o instruciune for poate s nu aib etichet sau poate s aib un umr variabil de etichete,fiecareterminatprin:(doupuncte). Neterminalul <clauza for> este definit astfel: ncepe cu simbolul terminal for, care este cuvnt rezervat n ALGOL 60, urmat de o <variabil>, :=, o <list for> i cuvntul rezervat do. Definiia neterminalului <lista for> utilizeaz de asemenea recursivitatea(recursivitatelastnga),cuefectulco<listafor>poateconinede mai multe ori neterminalul <element de lista for>, folosind virgula ca separator. Ultimaproducieexpliciteaztreimoduridealctuireaelementelorlisteifor. Dea lungul timpului notaia BNF a suferit unele adugiri ajungnduse la ora actuallautilizareauneiaanumitenotaiiBNFextinse. Noileregulialeacesteinotaiisunt: Toate unitile sintactice ale limbajului sunt cuprinse ntre ghilimele; de exemplu,"<"desemneazsemnulmaimicinumetasimbolul< Entitileopionalesuntcuprinsentreparantezeledrepte[i]. Orice expresie repetabil (cu semnificaia c poate apare de zero sau mai multeori)estecuprinsntreaccolade Parantezele rotunde se folosesc n situaiile n care se dorete exprimarea unor grupri de aciuni: de exemplu (a | b) c desemneaz irul de caractere"ab"sau"bc". Gramatici NoamChomskyadezvoltatteoriagramaticilor(1959).Cuajutorulacestorapoatefi formalizatdefiniiaunuilimbaj,formalizareceseimpunepentruunstudiuintegrat i complet al proiectrii i implementrii limbajelor. Limbajele independente de context (generate de gramatici independente de context GIC) pot modela formal limbajele de programare. BNF i gramaticile independente de context sunt echivalentedinpunctuldevederealdescrieriiunuilimbajdeprogramare. Grafeledesintax Oaltmetoddedescrierea sintaxeiunuilimbaj deprogramareutilizeazgrafele de sintax, echivalente cu BNF (deci i cu GIC), dar mai sugestive. Regulile de 26
OproduciecumaimultealternativeA::=a1|a2||ansetranscrieastfel:
a1
a2
Oregulrecursiv{A::=a1}setranscrie:
an
Un automat de acceptare (sau de recunoatere) este folosit pentru a rspunde la ntrebarea:aparineunirxlimbajuluiLsaunu? Automatul este definit ca o main cu operaii extrem de simple, care primete iruldeanalizatpeunsuportoarecare(numitbanddeintrare),lparcurgefolosind un cap de citire i rspunsul final este dat de starea n care rmne unitatea de comand aautomatului. Maina poatefolosio memorie auxiliar pentru pstrarea unor informaii care so ajute n luarea de decizii la un moment dat. Funcionarea unitii centrale (evoluia) este o secven de micri, o micare constnd dintro modificare a configuraiei mainii. Prin configuraie se nelege ansamblul strilor componenteloracesteia.
a1
27
Modelulfizicdescrismaisusesteintuitiv,elstnd labazamodeluluimatematical automatului,modelnecesarpentruformalizareafuncionriimainiiidecipentru fundamentareaalgoritmilordeanalizimplementaicuajutorulacesteia. Automateleseclasificndeterministeinedeterministe.Existoseriedetipuride automate: automat finit determinist, automat finit nedeterminsit, automat push down determinist, automat pushdown nedeterminist etc. Exist o relaie ntre limbajeleacceptatedeautomateigramaticiledinierarhialuiChomsky. Automatele de acceptare se folosesc n analizoarele lexicale i semantice ale programelordetraducere.
Traducerea programelor
Programe traductor
Prin translator vom nelege un program ce traduce un program surs (PS), scris ntrunanumitlimbajdeprogramare(LP)ntrunprogramechivalentexprimatntr un alt limbaj, pe care l vom numi program destinaie (PD). Familia programelor translatoare are ca reprezentani compilatoarele, asambloarele i interpretoarele. Pentruuncompilator, PDsenumete program obiectsaucodobiect,fiindapropiat de codul main, iar asamblorul este compilatorul unui limbaj de asamblare. n ambele situaii, traducerea este urmat de obicei de editarea de legturi (link editarea),naintecaprogramulspoatfiexecutat.Linkeditareaestefazancare seproducecodulexecutabilprinlegareacoduluiobiect(rezultatdintraducere)cu altemoduleobiect(rezultatedincompilrianterioaresauexistentenbiblioteci).O alt modalitate de execuie a PS scrise n limbaje de nivel nalt este folosirea unui interpretor, care este tot un translator ce realizeaz execuia instruciune cu instruciuneaprogramuluisurs. npracticsentlnescialtetipurideprogramtranslatoare: Preprocesoarelesaumacroprocesoarele:traducPSdinlimbajedenivelnaltnPD scrisetotnlimbajedenivelnalt,compilabile.Deex.preprocesorulC. Crosscompilatoarelesaucrossasambloarele:seexecutpeuncalculatorgazdi genereaz cod obiect pentru o alt main obiect (de exemplu, maina gazd minicalculator sau calculator mare, iar maina obiect este un microcalculator cu memoriemic,pecarenusepoateimplementaprogramuldetraducere). Generatoareledeprograme:pleacdelaunPSscrisntrunlimbajdespecificarei genereazprogramesursscrisendiverselimbajedeprogramaredenivelnalt.
28
transformrincascad,dincencemaiapropiatedecodulobiect.Conceptual,un compilatorrealizeazdoumariclasedeoperaii: Analizatextuluisurs Sintezacoduluiobiect Acestedouoperaiisedescompunnsuboperaiispecializate,nlnuitentreelei caracterizate prin funcii bine precizate. n figura de mai jos prezentm schematic structuraunuicompilator. ANALIZ
Program surs ir de atomi lexicali
Analiz lexical
SINTEZ
Arbore sintactic
Analiz semantic
Cod intermediar
Analiz sintactic
Optimizare de cod
Cod obiect
Tratarea erorilor
Gestiunea tabelelor
Figur:Structuraunuicompilator Analiza lexical realizeaz prima parcurgere a PS (considerat ca ir de caractere), grupnd aceste caractere n subiruri, numite atomi lexicali: cuvinte cheie sau rezervate,operatori,constante,identificatori,separatori. Analiza sintactic depisteaz n irul atomilor lexicali structuri sintactice: expresii, liste, instruciuni, proceduri, genernd arborele sintactic (arborele de derivare), caredescrierelaiiledintreacestestructuri(deincluziune,deseparare). Analiza semantic folosete arborele sintactic pentru extragerea de informaii privind apariiile obiectelor purttoare de date din PS (tipuri de date, variabile, proceduri, funcii) i pentru verificarea consistenei utilizrii lor. Pe msura parcurgeriiarboreluisintactic,segenereazcodulintermediar.Acestaesteunide instruciunisimple,cuformatfix,ncare:codurileoperaiilorsuntasemntoarecu codurilemaincorespunztoare,ordineaoperaiilorrespectordineaexecuiei,iar operanziisuntreprezentaisubformavariabilelordinPSinusubformderegistre sauadresedememorie. Optimizarea codului intermediar are ca obiectiv eliminarea redundanelor, a calculelorinutile,nscopulrealizriiuneiexecuiieficienteacoduluiobiect.Pentru realizareaacestuiobiectivsencearc: Realizareatuturorcalculelorposibilencdinfazadecompilare(deexemplu nexpresiicuoperanziconstante) 29
Eliminareasubexpresiilorcomune(prinevaluarealorosingurdat) Factorizareainvariaiilordincicluri. Generareaprogramului(codului)obiectconstnalocareadelocaiidememoriei registre ale unitii centrale pentru variabilele programului i nlocuirea codurilor deoperaiidincodulintermediarcucelemain.Codulobiectrezultatpoatefi: absolut(directexecutabil) relocabil (care va face obiectul editrii de legturi, unde va fi legat de alte moduleobiect,rezultatedincompilrianterioaresaudinbiblioteci); n limbaj de asamblare, lucru ce asigur un efort mic de implementare a generatoruluidecod. naltlimbajdeprogramare,ncazulpreprocesoarelor. Generareadecoddifernfunciedearhitecturamainii. Cele cinci module de baz ale procesului de compilare sunt asistate de alte dou componente ale compilatorului, ale cror servicii sunt utilizate pe tot parcursul compilrii:modululdetratareaerorilorigestionarultabeleidesimboluri. Modululdetratareaeroriloresteconstituitdintrocoleciedeproceduricaresunt activateoride cteori estedetectatoeroarentimpuloperaiilorde analiz.Ele emitmesajedediagnosticrelativelaeroarearespectiviiaudeciziiprivindmodul decontinuareatraducerii: traducereasecontinucuignorareaelementuluiceconineeroarea; sencearccorectareaerorii seabandoneazprocesuldetraducere. Dup momentul de analiz n care apar, erorile pot fi lexicale, sintactice sau semantice. Un alt criteriu de clasificare a erorilor este gravitatea lor; distingem avertismente (de obicei omisiuni de programare), erori care se pot corecta de ctre un compilator mai inteligent i erori fatale, care provoac abandonarea procesuluidecompilare. Gestionarul tabelelor este o colecie de proceduri care realizeaz crearea i actualizarea bazei de date a compilatorului, care conine dou categorii de informaii: proprii compilatorului (generate la implementare i constituite din mecanismelededescriereaanalizeilexicale,sintacticeisemantice) caracteristice programului surs (identificatori, constante, cuvinte cheie), caredeobiceisememoreazntrotabeldesimboluri. n faza de analiz lexical (de obicei) la ntlnirea unui nume nou, acesta este introdusntabeladesimboluri,reinnduseadresaintrrii.Oridecteorinumele estereferit,informaiaprezentntabelesteactualizatcuinformaiisauatribute noi ale numelui respectiv, verificnduse totodat consistena utilizrii acestuia (analiza semantic). La generare de cod, atributele numelui determin lungimea zoneidememoriealocatacestuia.Atributelenumeluipotserviinfazadetratare aerorilor. 30
Analiza
Fazadeanalizcuprindetreietape:analizalexical,sintacticisemantic.Aceste treietapesepotimplementaseparatsauglobal. Analizalexical(scanningnengl.,analizorlexical=scanner)transformprogramul surs (considerat ir de caractere) ntrun ir de uniti lexicale, numite atomi lexicalisauparticulelexicale(tokensnengl.).Claseledeatomilexicali,considerate ca mulimi finite, corespund identificatorilor, constantelor ntregi, constantelor reale i operatorilor. Pe scurt, analizorul lexical realizeaz operaii de detectare, clasificareitraducere: detectarea n PS a subirurilor care respect regulile de formare aatomilor lexicali; clasificareaacestorsubiruri(identificareaclaseiacestora); traducereasubirurilornatomilexicali; memorareantabeladesimboluriaidentificatoriloriconstantelor. Deobicei,analizalexicalesteconsideratcaoetapaanalizeisintactice.Analizorul lexicalcontribuielacurareaPSdeoarecenumrulatomilorlexicaliestemaimic dectnumruldecaracteredinPS,seeliminspaiilealbesicomentariile,sepoate prelua n analiza lexical evaluarea unor construcii dificil de implementat n analizorulsintactic,rezultatulfiindreducereacomplexitiianalizeisintactice. Analizasintactic(parsingnengl.)esteunadinetapeleprincipalealeprocesuluide traducere.Prineaserealizeaztransformareairuluideintrare(formatdinatomi lexicali)n: descriereastructuralaacestuia,semanticechivalent(ncazulncareirul deintrareestecorectsintactic) mesajdeeroare(ncazcontrar). Analiza semantic structura sintactic poate fi folosit pentru specificarea semanticii unui limbaj. n general, semantica (nelesul) unei construcii poate fi exprimatprinoricecantitatesaumulimedecantitiasociateaceleiconstrucii.O astfel de cantitate asociat se numete atribut. Ca exemple de atribute putem meniona:omulimedeiruridecaractere,ovaloare,untip,oconfiguraiespecific dememorieetc.Aceastmodalitatedeabordareasemanticiisenumeteorientat de sintax. Regulile care definesc atributele unei construcii se numesc reguli semantice. O specificare de sintax mpreun cu regulile semantice asociate realizeazodefiniieorientatdesintax. De exemplu, dac dezvoltm un evaluator de expresii, semantica expresiei 2+3 poatefiexprimatprinvaloarea5.Dacdezvoltmuntranslatordinformainfixat n form postfixat semantica expresiei 2+3 ar putea fi exprimat sub forma tripletului(+23). 31
Conceputcaofinalizareaetapeideanalizatextuluisurs(pringenerareacodului intermediar), analiza semantic completeaz structurile sintactice cu valorile atributelor asociate fiecrei componente de structur. Cunoscnduse valorile atributelor,serealizeaz: validareasemanticaprogramuluisurs; generareacoduluiintermediarechivalent; naceastultimfazaanalizeisegenereazcodulintermediar.npractic,analiza semanticsedesfoarnparalelcuanalizasintactic,princompletareaaciunilor analizorului sintactic cu aciuni referitoarea la anumite structuri de date ce reprezintatributealecomponentelorsintactice.
Uniti de program
Structurageneralaunuiprogramscrisntrunlimbajdeprogramareconvenional (imperativ, dirijat de control) presupune existena unui program principal i eventual a unuia sau mai multor subprograme (proceduri, funcii sau subrutine) carecomunicntreelei/saucuprogramulprincipalprinintermediulparametrilor i/sauaunorvariabileglobale. Orice program sau subprogram surs, indiferent de limbajul n care este scris i indiferent de sintaxa concret a acestuia este divizat n dou pri (nu neaprat distincte din punct de vedere fizic): partea de declaraii i partea imperativ. Declaraiile, denumite uneori i instruciuni neexecutabile sunt informaii descriptiveadresatecompilatoruluicaredescriunprincipalatributealezonelorde datecumarfitipul,dimensiuneadereprezentare,eventualvaloriiniialeetc.Partea imperativ conine instruciunile ce se vor executa n cursul rulrii (sub)programului. Ideea reutilizrii codului precum i cea a reducerii dificultilor de proiectare i ntreinere a programelor mari au condus n mod natural la modularizarea dezvoltriiprogramelor.Corespunztor,carezultatalprocesuluideabstractizarei factorizare,aparastfellanivelulprogramelor,unitideprogramdistincte,numite module,curolbineprecizaticareaducodatcuapariialornumeroaseavantaje. Unuldincelemaiimportanteavantajeestecompilareaseparat. n majoritatea cazurilor activitile efectuate de subprograme sunt independente. Astfel, unul sau mai multe subprograme pot fi grupate n module, care, fiind la rndullorindependentepotficompilateseparatunuldecellalt,adiclamomente diferite n timp i combinate mai trziu de ctre editorul de legturi ntrun unic programexecutabil.Caurmare,dacunmodulnecesitmodificriicelelaltenu,va firecompilatdoarmodululmodificat,editoruldelegturirealizndapoicombinarea codului obiect rezultat cu versiunile deja compilate ale celorlalte module. Se economisete n acest fel un timp semnificativ de lucru, ideea compilrii separate fiindextremdeutillantreinereabibliotecilormarideprograme.
32
LimbajulCpermitecompilareaseparat,lucruposibildatoritexisteneiatributului clasdememorieexternpentruvariabileleC,ceeacepermiteexistenamodulelorn limbajulC.Acestemodulepotcomunicaprinvariabileleexterne. Prinmodulvomnelegeounitatesintacticcenglobeazproceduri,tipuridedate, constanteivariabile.Dinpunctuldevederealutilizriisalemodulularedoumari pri: interfaa iimplementarea. Fiind proiectat de lanceput n ideeareutilizrii, modululspecific,prininterfaasa,aceleentitiprincareelcomuniccuexteriorul su (cu alte module sau programe). n partea de implementare a modulului se definesc procedurile declarate n interfa i sunt precizate alte entiti locale necesareimplementrii. Informaia din interfa este necesar procesului de compilare: spre exemplu, compilare unui modul A care are nevoie de servicii din modulul B va necesita cunoaterea i includerea n codul obiect rezultat a informaiei din interfaa modulului B (declaraii de tipuri, proceduri, variabile i constante), care va trebui decisfiecompilatnainte.ExempledemodulearfiunituriledinTurboPascalsau fiiereleheaderifiiereledeimplementaredinC.
Link-editarea
Linkeditorul sau editorul de legturi este o component a mediului pentru dezvoltareadeaplicaiicaregrupeazunulsaumaimultemoduleobiect,rezultate din compilare sau asamblare, mpreun cu subprograme de servicii din diverse biblioteci,ntrunprogramexecutabil. ngeneral,unprogramexecutabilestecompusdinmaimultesegmente.Editorulde legturioferposibilitateacadousaumaimultesegmentediferitealeunuiacelai program s poat ocupa n execuie, la momente diferite de timp, aceeai zon de memorie(procesnumitesegmentareoverlay),proprietatefoarteutilncontextul rulrii de programe foarte mari care depesc capacitatea memoriei RAM disponibile. Pedealtparte,linkeditareantroaceeaicomandamaimultorfiiereobiectva avea ca rezultat un singur fiier executabil ce va fi alocat ntro zon contigu de memorie.Laacestnivel(aleditriilegturilor)arelocoprimajustare(relocare)a adreselordinmoduleleobiect,ajustarecaresreflecteraportareatuturoracestora lanceputulfiieruluiexecutabil. Deoarece un program executabil poate fi ncrcat n majoritatea cazurilor la orice adresdesegment,pentruoexecuiecorectestenecesarcalancrcaressefac o relocare a majoritii referinelor din program. Relocarea este efectuat la lansareanexecuieaprogramuluidectreocomponentasistemuluideoperare numitncrctordeprograme(loader)icarearenprincipiuurmtoarelesarcini: citireaunuiprogramexecutabildepeunanumitsuport; ncrcareaprogramuluirespectivnmemorie; lansarealuinexecuie. 33
Execuia programelor
Dup linkeditare, programul executabil obinut se poate lansa n execuie. Exist diferene n ceea ce privete execuia unui astfel de program, n funcie de caracteristicile de utilizare ale sistemului de operare al calculatorului gazd i de mediul de programare folosit pentru scrierea de programe. Pornind de la un text (program) surs, programatorul are la dispoziie trei opiuni pentru a ajunge la execuiaacestuia: operare la nivelul liniei de comand: se introduc pe rnd comenzile de compilare,linkeditareilansarenexecuie; asistat de un mediu de programare: comenzile de mai sus sunt lansate i executatedininteriorulunuiastfeldemediu; sistembatch(prelucrarenloturi):scriereaunorfiieredecomenzicarevor automatizanlnuireafazelordelapunctul1. ntrun sistem de operare interactiv, utilizatorul comunic cu sistemul de operare de la terminalul su propriu printrun limbaj de comenzi sau printro interfa vizual.ncazulinterfeelorutilizatorvizuale,peecranulterminaluluisuntdesenate elemente vizuale sugestive (iconuri). Exemple sugestive sunt Microsoft Windows sauXWindows.Fiecareiconareasociatocomand,careesteactivatnmomentul cnd utilizatorul acioneaz asupra iconului cu mouseul. Orice comand tastat sau asociat unui icon este preluat de interpretorul de comenzi al sistemului de operare,careotraduceioexecut(dacesteocomandcorect). Unsistemdeoperareinteractivaredoumariclasedecomenzi:interne(engl.built in) i externe. Comenzile interne sunt rezidente n nucleul sistemului de operare respectiv, iar comenzile externe, dup cum le arat i numele, au corespondent n fiiere executabile. ntre comenzile externe, un loc aparte revine comenzilor utilizator,croralecorespundfiiereleexecutabilepropriialeutilizatorului,fiiere realizateprinprocesuldecompilarelinkeditare.Fiiereleexecutabilerealizatede utilizator sunt noi comenzi care extind limbajul de comenzi al sistemului su de calcul.Sistemuldeoperarealunuicalculatormodernestenacestsensunexemplu adecvatdeextensibilitateasoftului. Sistemele de operare moderne permit rularea concomitent (n paralel) a mai multor programe proprietate numit multitasking. Aceste programe pot fi independente sau nu i ocup zone de memorie distincte. Sistemele multitasking sunt implementate n principal pe sisteme monoprocesor, ceea ce pune problema alocrii timpului CPU aplicaiilor ce se ruleaz. Din acest punct de vedere multitaskingul poate fi preemptiv sau cooperativ. n cazul multitaskingului preemptiv sistemul de operare ia decizia ntreruperii aplicaiei curente (pe baza unor algoritmi de planificare) indiferent de stadiul i dorina acesteia. Exemplu clasicnacestsensnconstituiesistemuldeoperareUnix.Multitaskingulcooperativ
34
Interpretarea
Esteoactivitateprincareseexecutpeuncalculator(realsauomainvirtual)un programscrisntrunlimbajsurs.Interpretorulesteunprogramcareexecutpas cu pas instruciunile descrise n limbajul respectiv. Viteza de interpretare a unui programestemultmaimicdectexecuiacoduluigeneratdectreuncompilator pentru acelai program. Cu toate c aceast vitez este cam de 10 ori mai mic, interpretareaestefolositpescarlargdatoritimplementriimultmaisimplea unuiinterpretordectaunuicompilator.Unaltavantajestefaptulcinterpretarea asiguromultmaimareflexibilitateaexecuiei,nsensulposibilitiideefectuarea mai multor verificri dinamice (la execuie), de urmrire a evoluiei valorilor variabilelorncursuletapelordeexecuie,posibilitidecolaborarecuutilizatorul ntimpulexecuieietc.
35
4. Declaraii
Rolul identificatorilor ntr-un program
Identificatoriiservesccanumepentrudiverseentitialeunuiprogram: constantesimbolice tipuridedate variabile subprograme module programe cmpurinnregistrri Daclimbajuldeprogramareoferunsistemdenotaiigeneralepentruexprimarea unuiprocesdecalcul,iarunprogramsursesteconcretizareaunuiastfeldeproces decalcul,identificatoriifolosiideprogramatornrespectivulprogramvorreflecta particularitile algoritmului descris (constantele necesare, tipurile de date utilizator introduse, variabilele care pstreaz date de intrare, rezultate intermediareifinaleisubprogramelecarecorespundsubalgoritmiloretc.) ntrun sens mai larg, identificatorii declarai i folosii de programator constituie unsistemdenotaii:odatdeclarat,identificatorulvareferiunicoanumeentitate din program i simpla prezen a numelui su (nsoit eventual de alte elemente suplimentare) va reprezenta pentru programul traductoro referire neambigu la entitateancauz. npridiferitealeaceluiaiprogramsurssaunmodulediferitecareconcurprin compunerelaalctuireaunuiprogramexecutabilsepotfolosiidentificatoriidentici. Rezolvareaeventualelorconflictedenumecarepotaparesefacepebazaregulilor devizibilitateanumelor. Noiunea de domeniu de vizibilitate (engl. scope) a aprut odat cu limbajele cu structurdebloc.Fiecaredeclarareaunuinumestabiletedomeniuldevizibilitate al numelui. Domeniul de vizibilitate ncepe de obicei imediat dup punctul de declararealnumeluirespectivisencheielasfritulblocului,procedurii,fiierului surs etc., dup caz. Un nume local, declarat n interiorul unui subprogram are domeniuldevizibilitatetoatsecvenadedeclaraiiiinstruciunideduppunctul de declarare i pn la sfritul subprogramului respectiv (inclusiv blocurile sau subprogramelenglobatenelincarenusaredeclaratnumelerespectiv);pentru numele globale declarate n corpul programului principal, domeniul de vizibilitate inededuppunctulde declarare pnlasfritulfiierului surs(curespectarea observaieianterioarenlegturcuredeclararea). Definiia de mai sus se refer la domeniul de vizibilitate lexical. Din observaiile fcute,rezultcacestdomeniunuesteneapratcontinuu,cnelpotaparepete albepentruunnume. 36
Universulunuilimbajdeprogramare(ULP)esteconstituitdinobiectelespecificepe carelimbajullepuneladispoziiaprogramatoruluipentrumodelareaproblemelor sale.Prinacesteobiecte,utilizatorulsimuleazcomportamentulobiectelorsalesau realizeaz noi obiecte, mai complexe, cu proprieti noi. Odat cu aceste obiecte, care sunt specificate prin declaraii, limbajul pune la dispoziia programatorului operaiiasupraacestora,pecarelenumimdeobiceiinstruciuni.
Declaraii de constante
Spredeosebiredevariabile,constantelesimbolice(numitencontinuareconstante) i pstreaz valoarea pe tot parcursul execuiei unui program. Utilizarea lor permite o mai uoar scriere a programelor i le asigur acestora o mai mare expresivitate.Deexemplu,esteconvenabilssescrie:
PI:=3.1415
ntrun program care face calcule trigonometrice i peste tot n program unde ar trebuissescrieconstantareal3.1415sevapunePI.Rostulacestorconstanteeste nunumaiuurinanexprimareinnelegereatextuluisurs,ciiasigurareaunei maimariflexibilitiaprogramului.Deexemplu,dacnuestesuficientfolosirealui PIcupatruzecimaleisedoretePIcu12zecimaleexacte,doarliniadeiniializare aconstanteisevaschimba:
PI:=3.141592653595
37
iarreferirilelaPIdinprogramvornsemnafolosireanoiivaloripentruacestnumr transcendent. nmodnormal,nlocuireaconstanteisimbolicecuvaloareasaareloclacompilare. Dinpunctuldevederealunuilimbajdeprogramare,oconstantsimbolicesteun cuplu format din nume i valoarea asociat. Nu toate limbajele de programare suport constante (FORTRAN, PL/1, Basic, C nu posed acest obiect n universul lor).Pentrulimbajelecesuportacestconcept(Pascal,C++,C#),sepotdistingecel puinurmtoareleclasededeciziecetrebuiediscutateiadoptatelaproiectare. cumsefacedeclaraiadeconstant? limbajul admite numai constante de tipuri simple sau este permis i folosireaconstantelordetipuristructurate? valoareaconstanteisedprintrunliteralsauprintroexpresieevaluabil(i cnd:lacompilaresaulaexecuie)? cnd se face substituirea numelui constantei cu valoarea asociat (la compilaresaulaexecuie)? admitelimbajulconstantepredefinite? Limbajul C nu posed conceptul de constant simbolic. Folosirea constantelor se simuleaz prin macrodefiniii, care sunt tratate de preprocesorul C. Din punctul nostru de vedere, dezavantajul major al folosirii macrodefiniiilor este acela c pentruelenu suntvalabilereguliledevizibilitatealenumelordinC.Chiardacse pot simula constante prin macrodefiniii, numele acestora vor fi globale. De exemplu,primadintremacrodefiniiile:
#defineTBLSIZE100 #defineTBLMAX(TBLSIZE1)
vaasociaidentificatoruluiTBLSIZEvaloarea100,iaradouamacrodefiniievaasocia identificatoruluiTBLMAXvaloarea99.Dacacesteasuntsingurelemacrodefiniii,n ntreg textul surs parcurs de preprocesor, apariiile acestor identificatori vor fi nlocuite (textual) cu valorile asociate lor. Dac ns ntro funcie ulterioar ar apreamacrodefinia
#defineTBLSIZE50
identificatorulTBLSIZEvaprimivaloarea50,cucaresevanlocuioriceapariiealui dinacelloc,nunumaidincorpulfunciei,ciidupterminareaacesteia.Analog,la determinareavaloriiluiTBLMAXsevafolosivaloareaactualaluiTBLSIZE. Un alt dezavantaj al simulrii constantelor prin macrodefiniii este acela c nu se poate declara tipul constantei i, dac parantezele nu sunt puse corect, pot apare probleme legate de interpretarea macrodefiniiei. Mai mult expresiile de definire trebuieevaluatelafiecarentlnireanumeluimacroului,numecaresepierden 38
Declaraia de constant este deci prefixat de cuvntul rezervat const. Ea conine precizarea tipului, numelui i a valorii asociate constantei, printrun iniializator. Tablourile,pointeriiireferinele const auointerpretare special.Dac un tablou este declarat const nseamn c fiecare element al acestuia este const, iar un pointerconstnseamncvariabilareferitdeelesteconst. ntermeniilimbajuluiC++,constnunseamnnicialocatntrozondememorie readonly i nici constant stabilit la compilare. Mecanismul const a fost conceput pentru a preveni eventualele accidente (ca de exemplu modificarea nedoritaunorvaloricareseconsiderconstante)inufraudele. Proteciaoferitdeacestmecanismpoatefieludatprintroconversieexplicitsau prinaliere.Deexemplu:
inti=1;//inuesteconst constint*p=&i;//inusevaputeamodificaprinp int*q=(int*)p;/*aliereacantitii*qcuiprinconversieexplicitdetipechivalentcuint*q=&p; iniializareaint*q=parfiilegaldincauzaincompatibilitiicaracteristicilordetip;*/ voidf() { p; i++; //ok:nuiesteconstcip (*p); //eroare:*pesteconst (*q)++;/*ok:qnuesteconst,decicantitateareferitadeaceastanuestesupusarestrictiilor demoficare*/ } voidg() { (*(int*)p)++//ok:conversieexplicita }
Dac un specificator const sau volatile apare ntro declaraie, el va modifica declaratorulcareurmeazimediatdupel.
constchar*step[3]={left,right,hop};
declaruntabloudepointerilairuridecaracterecaresuntconstante.Pointeriise potmodifica;iruriledecaracterenusepotprinintermediulacestorpointeri. 39
step[2]=skip;//ok:semodificapointerlaconstchar step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/
Dac se dorete declararea unui tablou de pointeri constani la iruri de caractere constante,definiiarespectivsescrie:
constchar*conststep[3]={left,right,hop};
cazncarenusepotmodificaniciiruriledecaractereinicipointerii(elementele tabloului):
step[2]=skip;/*eroare:nusepoatemodificaunpointerconstant*/ step[2][1]=i;/*eroare:nusepoatemodificasirdecaractereconstant*/
Definiia limbajului nu specific constante predefinite. Pentru asigurarea compatibilitii tipurilor numerice cu ANSI C, limitele (minim i maxim) ale domeniilor acestor tipuri se gsesc (sub forma unor macrodefiniii) n fiierele header<limits.h>i<float.h>.
Sisteme de tipuri
Unsistemdetipuri pentruunlimbaj deprogramareesteomulime dereguli prin care unei expresii i se asociaz un tip al limbajului respectiv. Un sistem de tipuri respingeoexpresiedacnuipoateasociauntip. Respingerea expresieiarelocde obicei la compilare (se emite un mesaj de eroarea corespunztor) sau, mai rar, la execuie(programulterminndusecuuncoddeeroare). Limbajeleactualeimpundeclarareaexplicitavariabilelor,unadintreinformaiile debazprezentendeclaraiefiindtocmaitipulvariabilei. Sarcinileprincipalealeunuisistemdetipurisunt: 1. declararea de tipuri de date utilizator (extinderea mulimii tipurilor recunoscutedelimbaj),prinfolosireadeclaraiilordetip; 2. asociereadetipurilavariabile,realizateprindeclaraiiledevariabile; 40
3. verificareaconsisteneifolosiriiexpresiilor,careserealizeazprin: a. determinareatipuluioricrei expresii(saurespingereaacesteia dac nuisepoatedeterminatipul); b. verificareaconsisteneiinstruciunilor(deatribuire,apeletc.)pebaza regulilorprivind: compatibilitateatipurilor; egalitateatipurilor,includereatipurilor; echivalenatipurilor; concordanalistelordeparametri(formaliiactuali)napelulde subprograme. Regulile unui sistem de tipuri precizeaz utilizarea adecvat a fiecrui operator n limbaj. Verificarea tipurilor (engl. type checking) are ca scop garantarea folosirii corecteaoperaiilorntrunprogram.Prinaceastaseprevineroriledeexecuie.O eroaredeexecuieapareatuncicndooperaieseaplicincorect,deexemplucnd un operand numr ntreg este considerat altceva (caracter, ir de caractere, boolean). Mai precis, o eroare de tip (engl. type mismatch) apare cnd o funcie f declaratcuunargumentformaldetipulScarentoarceunrezultatdetipulTeste apelatcuunargumentactualdetipulAcarenuestedetipulS.Unprogramncare nuapareroridetipsenumetesigurdinpunctuldevederealtipurilor(engl.type safe). Verificareatipuluisepoatefacestaticsaudinamic.Verificareastaticatipurilorse face n timpul procesului de traducere, iar verificarea dinamic de tip se face n timpul execuiei, prin inserarea n programul executabil (la compilare i link editare) a unor poriuni de cod care realizeaz acest lucru. Desigur, verificarea dinamic nseamn costuri suplimentare de execuie (dimensiunea programului executabil crete, la fel i timpul de execuie, o parte din el fiind dedicat verificrilorspecifice),deciestepreferabilverificareastatic.Deobicei,verificarea static nseamn numai verificare de tip, iar verificarea dinamic cuprinde att verificareadetip,cti verificarea unorvaloricalculate ntimpulexecuiei(indici detablou,mprirelazeroetc.). Senumeteexpresiesigur(engl.safeexpression)oexpresienacreievaluarenu apareoeroaredetip.Existdoucategoriidesistemedetipuri:puterniceislabe (engl. strong, respectiv weak type system). Un sistem puternic de tipuri este acela care accept numai expresii sigure, iar un sistem slab de tipuri este unul care nu esteputernic. Unlimbajdeprogramaresenumeteputernictipizatdacelareunsistemdetipuri puternic i slab tipizat n cazul cnd are un sistem slab de tipuri. O definiie alternativ a conceptului de limbaj puternic tipizat este dat de urmtoarele trei cerine: 1. fiecareexpresiesaibunsingurtip; 2. determinarea tipului s fie posibil n timpul procesului de traducere, din sintaxalimbajului; 41
3. variabilelesfiememoratelaadresedistincte. Oaltdefiniiepentrulimbajputernictipizatestedatdeurmtoarelecaracteristici: 1. fiecareobiectestecreatcuuntipspecificat; 2. fiecareobiectestefolositntromanierconsistentcutipulsu. Limbajul puternic tipizat static este acela pentru care detectarea inconsistenei folosiriiobiectelorsefacelacompilare.
dupcareputemdefiniovariabildetipStudentastfel:
structStudents;
Aceai secven de definire a tipului i variabilei se poate face mai compact cu ajutorulunuitipanonim:
struct { char*nume; intvarsta; }s;
Dinpunctuldevederealdefiniieilimbajului,distingemdoucategoriidetipuri: tipurifundamentale,careaucanumeidentificatoripredefinii; tipuri derivate, care au numele (identificator) dat de utilizator ntro declaraiececuprindeunconstructordetip. Dinpunctuldevederealmomentuluiverificriitipului,distingemdoucategoriide tipuripentruoexpresie: tipstatic(verificatlacompilare); tipdinamic(verificatlaexecuie). Unadincaracteristicileesenialealelimbajelordeprogramareorientatpeobiecte estelegareadinamicaprocedurilor,pebazatipuluidinamicalobiectelor. Un alt criteriu de clasificare este natura comportamentului reprezentanilor (obiectelor) unui anumit tip. O privire sumar asupra caracteristicilor instanelor ducelaidentificareaurmtoarelorclasedetipuri: simple sau scalare: ordinale (ntreg, boolean, caracter, enumerare, subdomeniu)ireale; irdecaractere; structurate(tablou,nregistrare,mulime,fiier,clas,uniune); pointer; procedurale. n limbajul C numele unui tip se d printrun numedetip, care este, din punct de vedere sintactic, exact ca o declaraie pentru o variabil sau o funcie de acel tip, numaicnuaparenumelevariabileisaufunciei. Exemple: 43
Numedetip
int int* int*[3] int(*)[3] int*() int(*)(double)
Declaraia
inti int*pi int*p[3] int(*p3i)[3] int*f() int(*pf)(double)
Tipul ntreg Pointerlantreg Tabloude3pointerilantregi Pointerlatabloude3ntregi Funcie fr argumente care returneaz pointerlantreg Pointerlafunciecuunargumentdetip doublecarereturneazntreg.
Notaia de declarare din C i din C++ oglindete sintaxa expresiilor bazat pe precedena i asociativitatea operatorilor. Limbajele C i C++ exceleaz prin multitudineadeoperatori(fiindlimbajeorientatepeexpresii),pentrucareordinea de prioritate pare de multe ori nenatural; pentru a se obine prioritatea dorit trebuie folosite parantezele. De exemplu, declararea tipului anonim pointer la un tabloude10pointerilafunciiceauargumentintintorcunpointerlachar(chiar dac literar expresia este relativ rezonabil) este greu de exprimat n C++ i nu avantajeazlizibilitatea(festedeclaratcaovariabildeacesttip):
char*(*(*f)[10])(int);
Tocmaideaceea,cndselucreazcutipurinetriviale,serecomandssefoloseasc numedetip. Tipul mai sus exprimat se poate descrie suficient de clar folosind notaiileoferitedenumeledetip,peetape,nfelulurmtor: 44
aceste echivalene de tip exist o relaie de incluziune, n sensul c echivalena de numeoimplicipeceastructural,iarechivalenadedeclarareleimplicautomat peamndoucelelalte. Limbajul C folosete echivalena structural pentru toate tipurile. Motivul pentru care sa prevzut n C echivalena structural este minimizarea problemelor de ntreinere. EchivalenadenumeestepiatraunghiularasistemuluidetipuriallimbajuluiC++. Regulile de compatibilitate ale reprezentrii garanteaz folosirea conversiilor explicitepentruaseobineserviciidenivelmaisczutcarenaltelimbajeseobin prin echivalena structural. Sa preferat echivalena de nume n locul celei structuraledeoareceeaareunmodelmaisimpluimaiclar.ndefiniialimbajului C++, echivalena de nume nseamn regula definiie unice: orice funcie, variabil, tip,constantetc.trebuiesaibosingurdefiniie: Declaraiile:
structA{intx,y;}; structB{intx,y;};
definesc dou tipuri diferite, ambele cu numele D (att n C ct i n C++). Dac compilatorul face verificarea celor dou fiiere (uniti de traducere) 1 i 2, se obineeroareadefiniiedubl. Dinpunctuldevederealimplementrii,attnCctiC++garanteazcstructuri similare (cum sunt A, B i D din exemplu anterior) au reprezentare identic n memorie,decielesepotconvertiexplicitifolosidreptstructuricompatibile:
externf(structA*) structA{intx,y;}; structB{intx,y;}; voidg(structA*pa,structB*pb) { f(pa);/*correct*/ f(pb);/*eroareC++:enecesarargumentA*datoritechivaleneidenume,nscorectnC conformechivaleneistructurale*/ pa=pb;/*eroareC++:trebuieA*;corectnC*/ pa=(structA*)pb;/*corect:conversieexplicit*/ pb>x=1; if(pa>x!=pb>x) error(implementaregresita); }
46
Declaraii de variabile
Dac unei constante i se asociaz un obiect din ULP, acelai pe tot parcursul execuieiprogramului,uneivariabileicorespundeolocaiedememoriecarepoate, launmomentdat,sconinunobiectdintromulimedeobiecte(valoriposibile) dinULP.Aceastmulimeformeazdomeniuldedefiniiealvariabilei,iarlocaiade memorie este neleas n sensul de poziia de la care ncepe alocarea variabilei respective. Creareadevariabileilucrulcuacesteaestecaracteristicadebazalimbajelorde programareimperative. Denumireadevariabilarepentrulimbajeledeprogramarealtsemnificaiedect ceafolositnmatematic.Dacnsensmatematicovariabilesteonedeterminat sauunparametrudintrunsistemformalcepoateluaoricevaloaredintromulime cunoscut de valori (domeniul de definiie al variabilei), pentru ULP noiunea de variabil este legat de localizarea acesteia n memoria calculatorului i de modificabilitateaconinutuluilocaieirespective.
secvenadedeclaraiiiinstruciunideduppunctuldedeclarareipnla sfritul subprogramului respectiv; pentru variabilele globale, declarate n corpul programului principal, domeniul de vizibilitate ine de dup punctul dedeclararepnlasfritulfiieruluisurs. duratadeviaestedefinitcaintervalul(detimpdeexecuie)ncarezona de memorie alocat variabilei respective este utilizat pentru aceast variabil.Existvariabilelocale,globaleidinamice:variabilelocale,numite ivariabileautomatice,declarateninteriorulblocurilorsausubprogramelor, suntalocatenstivdoarlaactivareaunitiirespectivedeprogram,avnd duratadeviaegalcuperioadactesteactivatbloculsausubprogramuln careelesuntdeclarate;variabileleglobalesuntdeobiceialocatensegmentul de date nc de la compilare, aa c au durata de via egal cu timpul de execuiealprogramului;variabiledinamiceauduratadeviacontrolatde utilizator: alocarea i dealocarea se face prin instruciuni specifice fiecrui limbaj. tipulvariabileipoatefiprecizatnmodurilespecificeanterior.Majoritatea limbajelor de programare posed tipuri predefinite (tipuri numerice, caracter,boolean),iarcelemaievoluateau,pelngacestea,mecanismede definire a tipurilor utilizator (typedef, struct, union n C, class n C++), cu ajutorulcroraprogramatorulpoateconstruipropriilesalestructuridedate. Mecanismelededeclararedenoitipurisuntextinseprinceeacesenumete abstractizare datelor i programarea orientat pe obiecte, n care accentul este pus pe definirea operaiilor prevzute pentru un anumit tip de dat definitdeutilizator. Odat cu noiunea de tip apare problema definirii tipului, care se poate face static (n timpul compilrii, pentru limbajele puternic tipizate), sau dinamic (n timpul execuie, atunci cnd tipul exact al variabilei nu este cunoscut n momentul compilrii). Tipul unei variabile determin domeniul de definiie al variabilei respectiveigamadeoperaiipermisepentruvariabilarespectiv. Referina este informaia adres, adic locul unde este memorat variabila. Stabilireareferineiserealizeazprinceeacenumimalocareavariabileirespective. Alocareauneivariabilesepoatefacestaticsaudinamic,nfunciedemomentuln careserealizeazacestlucru.Dacalocareasefacenfazadecompilareestevorba de alocare static, iar dac alocarea se face la execuie este vorba de alocare dinamic. Douvariabilecareauaceeaireferinsenumescvariabilealiate,iaroperaiaprin caresepoaterealizaacestlucrusenumetealiere(engl.aliasing).nCiC++alierea sepoateobineprinmecanismulunion. Valoareaasociatuneivariabilesepoateschimbantimpulexecuieiunuiprogram dar,petoatduratadeviaavariabileirespective,nlocaiadememorieprecizat 48
prinreferinsevagsiovaloare.Mulimeavalorilorasociatevariabilelordintrun program formeaz spaiul strilor sau mediul programului. Determinarea valorii uneivariabilelaunmomentdatsefaceprinoperaiadederefereniere.Prinaceasta, pe baza referinei se returneaz valoarea variabilei. n general operaia de derefereniereesteimplicit,neexistndonotaieconsacratpentruea. Celepatrucomponentealevariabileisepotreprezentaschematicastfel:
Nume Set de atribute Referin valoare
Referina, mpreun cu valoare formeaz un obiect. n cazul variabilelor aliate, acestea vor avea aceeai referin, dar nu neaprat vor desemna acelai obiect, deoarece, dac sunt de tipuri diferite, ele vor avea valori diferite (datorit, de exemplu,diferitelormoduridereprezentareinternaleacestora).Schematic,dou variabilealiateXiYseprezintastfel: X Atribute X
valoare
Atribute Y
Legarea variabilelor
Termenul de legare a variabilelor este folosit n mai mult accepiuni. Urmrind structura unei variabile, prezentat n seciunea precedent, putem distinge dou punctentrecareaparelegarea:ntrenumeisetuldeatributepedeoparteintre perechea (nume, set de atribute) i referin pe de alt parte. Legarea variabilelor poatefidiscutatidinpunctuldevederealprocesuluidecompilare.Exist,nacest context,legareinterniexternacestuiproces.Daclegareainternavariabilelor se face n interiorul procesului de compilare a textului surs, legarea extern este sarcina editorului de legturi, care rezolv legarea unei variabile folosit ntrun modul i declarat ntrun alt modul (modulele respective fiind supuse unor compilri separate). n sfrit, termenul de legare a variabilelor are accepiuni diferite n traducerea efectuat de compilatoare fa de cea efectuat cu
49
interpretoare. n ultima situaie vorbim de o legare dinamic a variabilelor, efectuatchiarntimpulexecuiei. Din schemele de mai sus se observ c legarea variabilelor (engl. binding) implic punerea n coresponden a variabilelor cu atributele acesteia. Momentul legrii (engl.bindingtime)estemomentullacaredevincunoscuteatributeleuneivariabile. Existdousituaiidistincte: 1. atributele se cunosc la compilare: se poate face n acest caz, tot la compilare, toate verificrile necesare privind compatibilitatea i corectitudinea utilizrii variabilei, prin urmare codul generat este mai compact,permindoexecuieeficientaacestuia. 2. atributele se cunosc numai la execuie: rezult c n codul generat la compilare vor trebui introduse i secvene care s realizeze verificrile de corectitudineautilizriivariabilei,ceeaceconducelauncodmaimare,deci maiineficient.Pedealtparte,acestlucruconduce,deaceastdatnsens pozitiv,laomaimareflexibilitateaprogramelorscrise. nfunciedemomentullegrii,sedistingdouclasedelimbaje,curepercusiunin ceea ce privete deciziile de implementare. n prima clas sunt acele limbaje care permit legarea static, adic pentru care momentul legrii coincide cu momentul compilrii.Pentruacestelimbaje(cuvariabilepentrucaremajoritateaatributelorse cunosc la compilare) este caracteristic eficiena n execuie. A doua clas conine acele limbaje pentru care legarea este dinamic, adic momentul legrii este momentul legrii este momentul execuiei. Pentru acestea, soluia de implementarea optim este cea interpretativ, cu alocarea dinamic a memoriei, verificareadinamicacorectitudiniifolosiriivariabilelor,aexecuieioperaiiloretc., ceeaceconducelaflexibilitatenexecuie. Decizia privind tipul programului traductor (compilator sau interpretor) depinde de muli ali factori (resurse hardware, pre de cost, criteriul de eficien stabilit pentru limbaj timp sau memorie, domeniul de aplicare etc.). De obicei limbajele imperative posed compilatoare iar limbajele aplicative posed interpretoare. Aceasta nu este o regul general, existnd compilatoare i pentru limbajele aplicative.Deosebireantrelimbajelecompilateiceleinterpretatedevinemultmai estompat n cazul limbajelor moderne. De exemplu, pentru un limbaj (cum este Ada)carepermitelucrulcutablouridedimensiunicunoscutenumailaexecuie,la compilaresevainserancodunapellarutinespecialecevorfiactivatelaexecuie. Alte faciliti cum sunt alocarea dinamic a irurilor de caractere, procedurile recursive,facilitilegenerice,lucrulcuvariabileledinamiceaccesateprinpointeri, legareadinamicaprocedurilor,folosireabibliotecilorncrcatedinamic(DLL)ia mediilor de execuie necesit de asemenea includerea n codul generat de compilator a unor apeluri de rutine specifice, ceea ce transform codul obiect mai degrab ntrun cod intermediar dect n cod main, apropiindul de ceea ce realizeazuninterpretor.
50
Punctul de declarare a unei variabile poate fi definit att pentru limbajele cu declaraiicompletexplicite,ctipentrucelecarepermit ideclaraiiimplicitede variabile. n primul caz, orice variabil necesar trebuie n prealabil declarat printroinstruciunededeclarare,iarpunctuldedeclarareseconsiderafiimediat dupterminareadeclaraieinumeluivariabilei.naldoileacaz,punctuldedeclarare este prima instruciune de atribuire care conine n membrul stng numele variabilei. Punctul de declarare marcheaz nceputul domeniului de vizibilitate al variabilei. ntlnirea unei instruciuni de declarare nseamn pentru compilator legarea numeluivariabileidesetuldeatribute.ntradevr,nmodnormaloinstruciunede declararespecificdouinformaii: numelevariabilei; tipulacesteia. Celelalte atribute ale variabilei se determin dup cum urmeaz. nceputul domeniuluidevizibilitateestedefinitdepunctuldedeclarare,adicdeloculncare apare respectiva declaraie n textul surs al programului, iar sfritul domeniului estedeterminattotdepunctuldedeclarare,astfel: a. Punctul de declarare este intern unui bloc sau subprogram: domeniul de vizibilitateinepnlasfritulblocului(subprogramului),inclusivblocurile (subprogramele)locale(dacnuexistredeclarrialenumeluininteriorul acestora), situaie n care vor fi valabile redeclarrile aa numitele pete albe hole in scope; respectiva variabil este deci local unitii n care a aprutpunctuldedeclarare. b. Punctuldedeclarareestenafaraoricruiblocsausubprogram:domeniulde vizibilitate al variabilei este ine pn la sfritul fiierului surs respectiv, variabilafiindglobalnfiierulceconinedeclaraia. c. Punctul de declarare este n partea de interfa a unui modul: domeniul de vizibilitate al variabilei este, pe de o parte cel stabilit la (b), variabila fiind global modulului, iar pe de alt parte orice alt modul sau program care specificexplicitfolosireamodululuidedeclarare. d. Punctuldedeclarareestenparteadeimplementareaunuimodul:domeniul de vizibilitate este cel stabilit la (b), cu precizarea c numele este invizibil modulelor sau programelor care specific explicit folosirea modulului de declarare,iarvariabilaestelocalmodulului. Punctul de declarare determin indirect i durata de via a variabilelor. Acest atributestenstrnslegturcuadouavariantdelegare,anumelegareaperechii (nume, set de atribute) de referin, legare numit de obicei alocarea variabilei. Astfel, variabilele globale (n program sau modul) sunt alocate la compilare n segmentul de date, deci durata lor de via coincide cu durata de execuie a programului,fiindalocatestatic,iarvariabilelelocalesuntalocateautomatdectre mecanismul de execuie (bazat pe principiul stivei (ele se mai numesc i variabile automatice). n cazul variabilelor globale, la ntlnirea instruciunii de declarare 51
compilatorulpoatealocansegmentuldedatespaiupentrurespectivavariabil(pe baza informaiei de tip). Pentru variabilele locale compilatorul determin locul variabileinnregistrareadeactivarearespectivuluiblocsausubprogram,carevafi alocat automat n stiva de execuie cnd blocul sau subprogramul sunt activate, respectivdealocat(totautomat)laterminareaexecuieilui.Prinurmare,duratade via a unei variabile locale este definit de timpul de activare a blocului sau subprogramuluidedeclarare. Deobiceivariabileledinamicesuntanonime,iaraccesarealorsefaceprinvariabile de tip pointer (a cror valoare reprezint adresa variabilei dinamice referite). Declararea unei variabile pointer nu are efect dect asupra duratei de via a variabileipointer(tratatlafelcaoricealtvariabil).Variabiladinamicreferitde pointervaaveaduratadeviacontrolatdeutilizator,carepoatefolosiinstruciuni specifice dealocarei dealocare.Variabileledinamicesealocnzonadememorie dinamic(heap). Prin urmare, variabilele au nc un atribut, care determin modul lor de alocare, numit clas de memorie. Acest atribut este de obicei implicit (fiind determinat de localizarea punctului de declarare). n limbajele C i C++ exist posibilitatea declarriiexpliciteaclaseidememoriepentruoricevariabil.
Clase de memorie C
n limbajul C funciile nu se pot include unele n altele, deci nivelul de nglobare staticaltuturorfunciiloresteacelai.nCexistattinstruciunicompuse,cti blocuri se permit definiri de obiecte n cadrul blocurilor. O alt caracteristic a limbajului este compilarea separat, rezultnd segmente diferite care sunt legate mpreundectreeditoruldelegturi. Pentrudeterminareadomeniuluidevizibilitateiadurateideviapentruvariabile, limbajulCintroduceunnouatributpentruacestea: clasadememorie.Existpatru astfel de clase, care se declar cu cuvintele rezervate: auto (declaraie implicit pentruvariabileledeclarateninteriorulfunciilor),register,staticiextern(clasa implicit pentru variabilele declarate n afara funciilor). Precizarea clasei de memorieiatipuluivariabileisefacentrodeclaraiedeforma: <nume_clas><tip><list_nume_variabile>; unde: <list_nume_variabile> conine identificatorii ce reprezint numele variabilelor,separaiprinvirgule. Variabilele auto sunt declarate n interiorul funciilor. O astfel de variabil este activattatimpctesteactivunitateadeprogram(funciasaublocul)lanceputul creia a fost declarat pierzndui valoarea la terminarea execuiei respectivei uniti de program, la o nou apelare nemaifiind disponibil vechea ei valoare. n 52
afarauneideclaraiideclasdememorie,toatevariabileleseconsiderimplicitn clasaauto. Variabilele register se constituie ntro subclas a clasei auto, declaraia register anunndcompilatorulcacestevariabilevorfiutilizatefoartefrecvent.Daceste posibil,compilatorullevaalocacteunregistrumain,pentrumicorareatimpului deacceslaacestevariabile(nacestcaznumaitrebuiefcutcalcululdeadresic, ngeneral,regitriimainautimpideaccesmaimicidectmemoriaintern).Dac se folosete un numr mare de variabile register, care depete numrul de regitrii main disponibili, compilatorul va ncadra variabilele register rmas n clasaauto(deaceeasespunecclasaregisteresteosubclasaclaseiauto).Oalt limitareautilizriiclaseiregisterestedatdecapacitateaunuiregistrumain,care estengeneraldoisaupatruoctei,prinurmarenumaivariabiledetipurilentreg, caractersaupointerpotaparineacesteiclase. O utilizare uzual a acestei clase de memorie este pentru memorarea ntrun registruavariabileidecontrolpentruosecvenrepetitiv:
voidmain() { registerinti; for(i=0;i<1000;i++)a[i]=i; }
Variabilele static sunt de dou categorii: static interne i static externe. Nu este necesarfolosireadecuvintecheierezervatenacestsens,ncadrareauneivariabile static n categoria corect fcnduse n funcie de locul n care apare declaraia: static interne dac se declar n interiorul unei funcii i static externe dac se declarnafarafunciilor: Dacsedeclarnafarafunciilor,acelevariabilestaticevorfiaccesibilemaimultor funcii.Domeniuldevizibilitatealuneiastfeldevariabileestedinloculdeclarriiei ipnlasfritulmodululuirespectiv,decidomeniuldevizibilitateestelimitatla fiierul ce conine declaraia. Valoarea unei variabile statice poate fi modificat de funciile care au acces la ea. n momentul n care un segment care conine o declaraiedevariabilstaticdevineinactiv,variabilastaticrespectivivapierde valoarea,lareactivareasegmentuluieaprimindvaloareainiialdeladeclarareaei (cunoscutlacompilare).SepoateconsideracvariabilelestaticexternedinCsunt similare variabilelor globale (declarate n programul principal), ele alocnduse la compilarensegmentuldedate. Dac se declar n interiorul unei funcii o variabil static va avea regim de variabil local din punct de vedere al domeniului de vizibilitate, ns ea nu se va aloca n stiv ci tot n segmentul de date globale, avnd astfel o proprietate 53
staticinta[20];//variabilaaestedetipstatic
interesant: valoarea acesteia se va pstra ntre dou apeluri consecutive ale aceleiaifuncii,iniializareaeifcndusedoarlaprimulapelalfunciei. Pentrucomunicareantresegmentediferite,compilateseparat,nCsuntprevzute variabiledinclasaextern.Lafelcavariabileledinclasastatic,elesuntdeclaraten afarafunciilor,iardomeniuldevizibilitatealuneivariabileexternestedelalocul declarriiipnlasfritulsegmentuluincareaparedeclararea.Spredeosebire de variabilele static, care sunt locale unui segment, variabilele extern pot aparine maimultorsegmente(rolullorfiindcomunicareantresegmente),aceeaivariabil externavndacelainumenfiecaredintresegmentelencareesteutilizat.Sarcina stabiliriilegturilornecesarepentruovariabildeclasexternrevineeditoruluide legturi, o referire la ea n oricare dintre segmentele unde este declarat traducnduseprinaceeaiinformaiedeadres. FunciileCauimplicitclasadememorieextern,eleputndfiapelatedinoricepunct alprogramului.Pentruafacecaofunciespoatfiapelatnumaidinsegmentuln careeaestedefinit,isevaatribuiclasastatic.
pentru c are iniializarea implicit (cu 0), i declaraia este local unitii de traducerencareeaapare,iarurmtoareaestenumaideclaraie:
externinta;//nfiierul2
deoarecevariabilantreagaseconsiderdefinitnaltunitatedetraducere(de exemplunfiierul1,undesefaceiniializareaei),iarnfiierul2estedoarfolosit. Declaraiilepentruvariabilepotspecificaitipullegrii(internsauextern,maniera de alocare specificat n C i C++ prin clasa de memorie). Declaraiile static corespundlegriiinterne,iarceleexterncorespundlegriiexterne(lalinkeditare). O declaraie sau definiie poate conine i calificatori (const sau volatile), care definesc modificabilitatea obiectelor precizate. O particularitate a acestora este moduldeaplicarelapointeri:atributulconstsauvolatileprefixatcuoperatorulde derefereniere*seaplicpointeruluiinuobiectuluipunctatdeacesta. Deexemplu,definiiile:
constci=10,*pc=&ci,*constcpc=pc; inti,*p,*constcp=&i;
iarcaexempledeoperaiiilegaleavem: 55
ci=1; //cinusepoatemodifica ci++; //idem *pc=2; //artrebuisasemodificeci cp=&ci; //cpnusepoatemodifica cpc++; //cpcnusepoatemodifica p=pc; //arpermitemodificareulterioaraaluiciprinp
Exemple:
inti=1; //isepoatemodifica constint*p=&i;//pointerlaobiectconstant //pointerulsepoatemodifica,nuinsasi //obiectulreferit int*constvp=&i; //pointerconstantlaunobiect //obiectulsepoatemodifica, //nuinsasipointerulcarelrefera constint*constcp=&i;//pointerconstantlaun //obiectconstant //niciobiectulnusepoatemodifica, //nicipointerulcarelrefera. voidf() { i++; //OK:inuesteconst p; //OK:pnuesteconst (*vp);//OK:*vpnuesteconst cp++; //eroare:nusepoatemodificaunobiectconst (*cp);//eroare:nusepoatemodificaunobiectconst (*p)++;//eroare:nusepoatemodificaunobiectconst vp++;//eroare:nusepoatemodificaunobiectconst }
Variabilele pointer sunt iniializate implicit la NULL (echivalentul valorii 0 pentru tipulpointer). Iniializarea Una dintre condiiile naturale pe care trebuie s le ndeplineasc un program este stabilitatea sa, care se poate defini intuitiv astfel: cu aceleai date de intrare, programul produce aceleai rezultate. Problema stabilitii este rezolvat n cazul programelorsimple,careconindeclaraiidedate(variabile)deintrareirezultate: variabilele de intrare se iniializeaz prin operaii de intrare (citire) i rezultate: variabileledeintrareseiniializeazprinoperaiideintrare(citire),iarvariabilele rezultat(deieire)prinoperaiideatribuire.nschimb,dacnprogramsefolosesc ivariabileauxiliare(necesarepentruomaibunstructuraprocesuluidecalcul), nimeni nu mai garanteaz iniializarea acestora. Prin urmare, din definiia stabilitii (dat mai sus) rezult o prim condiie de stabilitate: toate variabilele 56
auxiliare din program s fie iniializate cu aceleai valori, la fiecare execuie a programuluicuacelaisetdedatedeintrare. Iniializarea unei variabilesepoatefacenurmauneiinstruciunideatribuiresau prininstruciunispecifice.nceeacepriveteiniializareauneivariabileaceastase poate face n momentul alocrii ei (variabila primete o valoarea predefinit, n funcie de tipul ei sau stabilit printro instruciune sau clauz) sau imediat dup momentulalocrii(valoareavariabileiestenedefinitseconsidervaloareagsit nlocaiadememoriedefinitdereferinaei,valoareanumitvaloarearezidual). Limbajeledeprogramaremoderneacordoateniesporitiniializriivariabilelor. De regul se aplic iniializarea implicit, elibernd programatorul de o activitate suplimentar. Referireavariabilelorsefaceprintroexpresiedeidentificarecarepoatefi: identificator(numelevariabileirespective); expresieindexat(cndvariabilaestedetiptablou); expresie de selectare (dac variabila este component a unei date structurate); expresiedeindirectare(cndvariabilaestedetippointer);
57
5. Tipuridedate
Printipdedatesenelegeomulimedeobiectensoitdeomulimedeoperaiipe mulimea acestor obiecte. Operaiile realizeaz crearea, construirea, distrugerea, modificareasaucopiereainstanelor(realizrilor)obiectelor.Operaiiledefinitepe mulimea obiectelor reprezint un set minim de operaii primitive, cu ajutorul crora, prin compunere, se pot descrie operaii mai complexe. Fiecare limbaj de programare are stabilite, n momentul specificrii lui, tipurile de dat proprii, numiteitipurifundamentale.
Tipuri fundamentale
Fiecare limbaj de programare i definete tipurile fundamentale, numite i tipuri baz, care de obicei corespund tipurilor main. Pentru aceste tipuri, definiia limbajuluiintroduceidentificatoripredefinii. Dinpunctuldevederealcomportamentuluilor,tipurilefundamentalesepotmpri n tipuri aritmetice, caracter i boolean. Despre precizarea detaliat a operatorilor vomdiscutantrunaltcapitol. Tipurile aritmetice (ntregi i reale) sunt apropiate de maina fizic. n general exist mai muli reprezentani ai acestor tipuri, tipuri care difer unele de altele prin: maniera i lungimea de reprezentare, prezena semnului etc. Operaiile de bazsuntcelearitmetice(rezultnd expresiiaritmetice)idecomparare (expresii relaionale). Domeniultipuluidedatbooleanarenumaidouvalori:trueifalse.Existcinci operaii definite pe acest tip: and, or, not, imp (implicaia logic) i equiv (echivalenalogic).Definireaoperaiilordemaisussepoatefaceastfel(utilizndu seoinstruciuneifelseipresupunndcxiysuntvariabilebooleene): xandy=ifxthenzelsefalse xory=ifxthentrueelsey notx=ifxthenfalseelsey ximpy=ifxthenyelsetrue xequivy=ifxthenyelsenoty LimbajulCconsideroriceirbiiceconinnumai0cafalse,respectivtrueoriceir debiintrecareesteunulnenul. Operanzii de tip boolean se folosesc la formarea expresiilor logice, cu ajutorul operatorilorlogici. n C++ exist dou mari clase de tipuri fundamentale: aritmetice i void (cu domeniuldevalorivid).Tipurilearitmeticesuntformatedintipurintregi(char,int n toate variantele i enumerrile) i tipuri reale (flotante). Valorile minim i 58
maxim din domeniul fiecrui tip sunt precizate, pentru fiecare implementare, n fiierulheader(antet)<limits.h>. Tipulchararecadomeniusetuldecaracteredebazallimbajului.Fiecareinstan asaestememoratntrovariabildetipcaracter,carearecavaloarecodulntreg alcaracterului.Caracterelesepotdeclaracusemnsaufrsemn(declarareexplicit signed sau unsigned); exist deci trei tipuri distincte: char, signed char i unsigned char. Fiecare va ocupa acelai spaiu de memorie (determinat de operatorul sizeof()). Existtreitipurintregidistincte:int,shortilongint.Tipurilesignedchar,short,int ilongaucorespondentuntipunsigned,careocupacelaispaiudememorie. Tip sizeof (n Aliniere (multiplu de, n octei) octei) char 1 1 short 2 2 int 2sau4 2sau4 long 4sau8 4sau8 n C++ (ca i n C) nu este predefinit tipul boolean. Orice expresie cu valoarea diferit de zero (sau diferit de echivalentul lui 0 n cazul domeniului oricrui alt tip)esteconsiderattrue,iaroriceexpresiecuvaloarea0esteconsideratfalse. Tipul enumerare este un tip ntreg distinct ce are constante cu nume. Numele su devine un aa numit numeenumerare, care este cuvnt rezervat n domeniul de vizibilitatepropriu.Identificatoriidintrolistenumeraresuntdeclaraiconstantei pot apare oriunde pot apare constante. Dac nu apar enumeratori cu =, valorile respectivelor constante ncep de la 0 i cresc cu 1, de la stnga la dreapta. Un enumeratorcu=vadaidentificatoruluivaloareaindicat,carermnecavaloare destartpentruurmtoriienumeratori.Valoareaunuienumeratortrebuiesfiede tipintsaudetipcesepoateconvertilaint. Numeleenumeratorilortrebuiesfiedistinctedecelealevariabilelorordinaresau alealtorenumeratorinacelaidomeniudevizibilitate.Deexemplu:
enumculori= {rosu,orange,galben,verde,albastru}; enumfruct= {mar,para,orange,kiwi};//eroare:orangeesteredefinit enumpasare= {strut, dodo, lebada, kiwi};//eroarekiwiesteredefinit intlebada;//eroare:lebadaredefinit
59
Valorileenumeratorilornutrebuiesfiedistincte.Unenumeratoresteconsideratc se definete dup ce sa citit numele (i eventual iniializatorul, dac exist). De exemplu:
enum{a,b,c=0}; enum{d,e,f=e+2};
definetea,c,dcuvaloarea0,biecuvaloarea1ifcu3. Fiecare enumerator definete un tip ntreg diferit de toate celelalte tipuri ntregi. Tipulunuienumeratoresteenumerareasa. Tipurilerealedistinctesunt:float,doubleilongdouble.Caracteristicilelorsunt precizatenfiierulantet<float.h>. Tip sizeof (n Aliniere (multiplu de, n octei) octei) float 4 4 double 8 4sau8 long 12sau16 4,8sau16 double Tipulvoidaredomeniulvalorilorvid.Estefolositpentruaprecizatipulrezultatului ntors de funciile cu semantic de procedur. Nu se declar obiecte de tip void; orice expresie se poate converti explicit la tipul void, iar rezultatul conversiei se poatefolosinumaipepostde:instruciuneexpresie,operandstng,expresievirgul saualtreileaoperanddinexpresiacondiionalconstruitcuoperatorul?:.
iruri de caractere
Tipulirdecaractere(numitistring)arecavaloareunirdecaractereculungimea variabil (modificabil dinamic). Lungimea irului de caractere este numrul de caractereconinutnel.Caracterelecarepotconstituiirulsunt,deobicei,celedin setul de caractere acceptat de limbaj. Operaiile care se pot efectua cu iruri de caracteresunt:construirea,inserareaunuiirdecaracterenaltul,extragereaunui subir, tergerea unui subir, cutarea unui subir, concatenarea a dou iruri de caractere. Acest tip de date sa impus din cel puin dou motive: imposibilitatea accesrii globaleaunuitabloudecaractereprecumirigiditateautilizriitablourilorstatice (de dimensiune fixat). Astfel, pentru tipul tablou sunt definite doar operaiile de atribuire i test de egalitate; pentru tipul ir de caractere sunt necesare n plus operaiiledeintrare/ieireicelespecificatemaisus.Prinacesteoperaii,lungimea irului de caractere se poate modifica, prin urmare o reprezentare fix (pe numr prestabilitdecaractere)nuesteadecvat.
60
nCsefoloseteurmtoareaconveniepentrureprezentareairurilordecaractere: unirdencaracteresereprezintpen+1octei,numerotaidela0lan,astfel: octetuli(dela0lan1)conineali+1leacaracterdinirulconsiderat octetul n conine un caracter terminator de ir: caracterul NULL (\0) din ASCII;rezultcacestcaracternupoatefacepartenCdintrunirdecaractere. Includerea ntrun limbaj de programare a unor operaii specifice prelucrrii irurilordecaracterepresupuneurmtoarele: existenatipuluidedateirdecaractere(string); prelungireautilizriioperatorilorrelaionalipeiruridecaractere; stabilireauneireprezentripentruiruriledecaractere; stabilireauneimulimiminimaledeoperaiipeiruridecaractere. nC,C++tipulirdecaracterenuestepredefinit.Tratareairurilordecaracterese poatefacefolosinddeclaraiadetablou: char[n](sauchar[]) Indiciiacestortablourincepcu0,iarreprezentareasefacenconveniaC. Pentru a prelucra iruri de caractere folosim funcii din biblioteca standard C: strcpy,strcmp,strstr,strchr,strlenetc.
Tipul pointer
Tipuldedatepointeraredomeniulformatdinadreselealtorentiti(reprezentabile nmemorie)dintrunprogram.Lucrulcupointeripermitecreareaiutilizareaunor structuridedatecomplexe,darfolosirealuingreuneaznelegereaunuiprogram, putnd genera erori deosebit de greu de detectat. n general, adresa unei entiti este caracterizat de dou informaii: adresa segmentului de memorie n care se gseteentitateaideplasamentulacesteiansegment(distanafadenceputul acestuia). Exist dou tipuri de pointeri: cu tip i fr tip. Pointerii cu tip conin adrese de entiti deacelaitip,fiind integrain sistemele de tipuri. Pointerii fr tiprefer oriceentitatedememorie,indiferentdetipulacesteia. Variabilele pointer constituie o alternativ de accesare a entitilor din memoria unuiprogram,prinintermediulunuiaanumitmecanismdeindirectare.Unpointer care nu refer nimic are valoarea echivalent cu 0 (pointer null); n caz contrar, valoarea sa este adresa entitii respective, iar informaia de tip al pointerului exprimitipulentitiireferitedepointer. Uzual,odeclaraiedetippointerspecific,printrunconstructordetip: numelenouluitippointer(opional); numeletipuluireferitdepointer(obligatoriu). ncazulcndentitateaesteovariabil,pointerularecavaloareadresaacesteiadin memorie.ncazulvariabileloralocatenmemoriadinamic,acesteanuauunnume 61
explicit (se i numesc variabile anonime), ele putnduse referi numai prin intermediul unui pointer asociat: alocarea i dealocarea lor se vor face cu operaii specificedealocare,respectivdedealocare,aplicatepointerului.Operaiilespecifice pentru pointeri sunt atribuirea i dereferenierea (indirectarea, referirea entitii punctate de pointer). Unele limbaje posed i operaii aritmetice (adunare i scdere)cuoperanzipointerii/sauntregi. Pointerii asigur flexibilitatea n execuia unui program, ns trebuie gestionai cu atenie. Programatorul controleaz durata de via a variabilelor i i gestioneaz singuroanumitparteamemorieicalculatorului.Aceastafacepartedinlibertile democratice pe care le are programatorul n lumea democrat a informaticii. Practica a artat ns c nu sunt puine situaiile cnd libertile greit nelese se ntorc mpotriva aceluia care beneficiaz de ele. Apare de multe ori problema referinelorambigue,careapareatuncicndsefoloseteunpointeracruivaloare refercevacenumaiestealocatnmemorie. Osoluielagestionareamemorieidinamiceestegarbagecollectorcarecolecteaz toatelocaiilecarenumaisuntreferiteileelibereaz. Pointeriiauurmtoareleavantaje: libertatea oferit programatorului n controlarea duratei de via a variabilelor; flexibilitatea sporit a programelor realizate, prin folosirea structurilor de datedinamice; actualizarea selectiv a structurilor complexe, fr recopierea ntregii structuri; compactitateacoduluiscrisprinfolosireapointerilorlafuncii. n lipsa unei riguroase discipline n programare, utilizarea pointerilor poate fi un comar,eroriletipicefiind: ncercarea de a accesa o entitate printrun poitner nainte de iniializarea pointeruluiceorefer,lucruceconducelaerorideexecuie; ncercarea de a accesa o locaie dup ce aceasta a fost eliberat, lucru ce conducelarezultateimprevizibilenexecuie. C++motenetedelalimbajulCabilitideosebitendeclarareailucrulcutipurile pointer.nplusfadeC,C++introduceitipulreferindesprecarenuvomdiscuta aici. Un tip pointer la tipul T se precizeaz printro declaraie T*. Uzual, stilul de programare C nu recurge la nume proprii pentru tipurile de date pointer; sintaxa limbajului este deosebit de flexibil n a permite declararea de tipuri pointer la tipuri de date complexe. Prin urmare, astfel de tipuri de date pointer anonime se folosescfrecventndeclaraiile(idefiniiile)devariabilesauparametriformali.Am prezentatdejaexemplededeclaraiidevariabiledetippointer. (Nusepotdeclarapointerilareferineipointerilairuridebii.) Operaiileasupratipurilorpointersunt: 62
*(indirectarea)*parecarezultatobiectuldetipTreferitdepdacpestede tipulpointerlaT. &(adresalui)&parecarezultatobiectuldetippointerlaT(Tfiindtipullui p)carereferpep,decicualtecuvinte,adresaluip. ++,incrementareaidecrementareavalorilordetipadres. Operaiidecomparare Operatorii new i delete (doar n C++) pentru alocarea i eliberarea variabilelordinamicereferitedepointeri. Limbajul posed numai semantica apelului prin valoare pentru transmiterea parametrilor actuali ai funciilor. Apelul prin referin se poate simula folosind explicit pointerii. De multe ori este suficient prima metod de transmitere prin valoare,maialespentrutipurilefundamentalealelimbajului.Eapoatedevenins neconvenabil pentru parametri de tipuri de date utilizator de dimensiune mare. (Observaie:oinconsistensemanticalimbajuluiCestectablourilesetransmit ntotdeauna prin referin) i devine un impediment serios n calea definirii unei notaiiconvenionalepentrutipdedateutilizatordinC++.
Tipuri procedurale
Un tip procedural este un tip de date cu domeniul format din mulimea tuturor procedurilorsaufunciilorcerespectunanumitablon,definitncadruldeclarrii tipuluiproceduralncauz. Uzual, o declaraie de tip procedural specific, printrun constructor de tip un aa numitablon(pattern)ceconine: Numelenouluitipprocedural(opional); Tipul i numele (nume care sunt ns fr semnificaie n contextul declarrii) eventualilor parametri formali ai procedurilor sau funciilor ce vor respectaablonul; Tipulrezultatuluintors(dacevorbadesprefuncii). O variabil procedural are i ea un nume, un tip i o valoare. Tipul variabilei conine informaia ce servete la verificarea consistenei folosirii ei (tipul argumentelor i, eventual tipul rezultatului ntors), iar valoarea unei variabile procedurale este de fapt adresa codului proceduriin cauz ncadrul programului executabil.Valorilecesepotatribuincursulexecuieiunuiprogramuneivariabile de tip procedural sunt (sintactic vorbind) numele procedurilor/funciilor ce sunt declarate n acel program sau numele procedurilor/funciilor externe de tip compatibilcutipulproceduralalvariabileicareesteiniializat.Acestenumejoac aadar rolul unor constante relativ la tipul procedural respectiv. Invocarea unei variabiledetipprocedural(folosindparametricorespunztori)arecaefectapelarea procedurii/funcieireferitedeaceasta.
63
n limbajul C un nou tip se declar prin prefixarea unei declaraii de variabil cu cuvntulrezervattypedef,numelevariabileidevenindnumedetip.Aadar,ncazul definiriidetipurifuncionalevomaveaformageneral: typedef<declaraie_de_funcie> Exemple:
typedefvoidffp();//definiiedetip ffppfp;//definiiedevariabil typedefvoidfpr(floata,floatb,floatc); typedeffloatfreal(floatx); typedeffloatffunc(floatp1,floatp2,frealf);
n limbajul C numele unei funcii este evaluat n cadrul programelor la adresa de nceput a funciei n cadrul codului compilat, deci variabila pfp de mai sus va reprezenta o cantitate de tip adres compatibil cu orice valoare reprezentnd numeleuneifunciifrparametriidetipvoid. Adresa unei funcii se obine deci prin simpla specificare a numelui funciei fr parantezeiaceastadrespoatefiatribuitunuipointerdefunciecurezultati parametricompatibili.Pointerulpoatefifolositapoipentruapelulfunciei:
intf(int,char);//declaraiafuncieif int(*pf)(int,char);/*sedeclarpfcapointerlafunciededouargumente(intichar)centoarce unntreg*/ inti,j;charc; pf=f;//atribuiredeadrese j=(*pf)(i,c);//apelulfuncieiffolosindpf
Limbajul C cere ca la apelul unei funcii chiar i fr parametri s fie utilizate parantezelerotunde.Sepotscrieurmtoarelesecvene:
if(f1()!=f()){}//testasupravalorilorreturnate
sau Tipul ntors i tipurile argumentelor sunt considerate parte a tipului funciei; argumentele implicite nu. Funciile nu pot ntoarce tablouri de funcii, dar pot ntoarcepointerilaastfeldeobiecte.Nuexisttablouridefuncii,darexisttablouri depointerilafuncii.
if(f1!=f){}//testasupravaloarilorprocedurale
Tipuri structurate
Limbajele de programare dispun de modaliti de agregare a datelor care permit apoi tratarea global a acestora. Este vorba n general de date care corespund nivelului de abstractizare al limbajului, deci care nu au corespondent direct n 64
tipurile main. Pentru ca aceste date definite de utilizator conform nevoilor sale concretespoatfiintegratenmecanismuldetipuriallimbajului,acestadinurm puneladispoziiaprogramatoruluiconstructoriidetipuri.nparagrafeleprecedente am discutat despre dou clase de tipuri construite prin asemenea constructori: pointeriiitipurileprocedurale. Spredeosebiredetipurilesimplecaresuntatomice,indivizibile,datelestructurate (compuse, agregate) se descompun n componente sau elemente, fiecare de un tip precizat (simplu sau structurat). O dat structurat poate fi accesat fie ca ntreg (global),fiepecomponente.Structurauneidatestabileterelaiilecareexistntre componenteleacesteia. Existpatrulegturistructuralefundamentale: Mulime(niciolegturntrecomponente); Liniar(legtur1:1); Arbore(legtur1:n); Graf(legturm:n) Dinpunctuldevederealuniformitiistructurale,datelestructuratesempartn: Omogene(toatecomponenteleauacelaitip);tipurilededateaferentesunt numitetablou(engl.array)imulime(engl.set); Heterogene(elementeleuneidateaudeobiceicomponentediferitedetip); eleaparintipuluidedatenregistrare(engl.record). Tablourile i nregistrrile au o structur liniar: exist o prim i o ultim component, iar toate celelalte au fiecare att predecesor, ct i succesor. Prin urmare, un element al tabloului sau un cmp al nregistrrilor se pot localiza. Un tablou este un agregat de elemente de acelai tip, un element fiind localizat prin poziia pe care o ocup n cadrul acestuia (indicele elementului de tablou) iar o nregistrare este un agregat care grupeaz de obicei elemente de tipuri diferite numitecmpuriilocalizateprinnumelelor.Mulimeaesteostructuramorf:ea conine elemente de acelai tip, care ns nu pot fi localizate explicit, neexistnd informaiadeapartenenaunuielementlaea.nlimbajulCnuexistsuportpentru tipulmulime,existnsaltelimbajecumestePascal,ncaresepoatefolositipul mulime. Pentru tipurile structurate, exist dou operaii de baz: construirea i selectarea componentelor. Operaia de construire a unei variabile de tip structurat se face dupregulilepropriifiecruilimbaj.Pentrutablouriinregistrriexistioperaia deselectareauneicomponente,careesterealizatnmanierediferite. ncazulunuitablou,selectareaunuielementsefacepebazauneiexpresiideindice, ataat numelui variabilei tablou. Pe baza expresiei de indice i a informaiilor despretablouseefectueazcalcululadreseielementuluincauz.Expresiadeindice nu se poate evalua la compilare (ea conine de regul identificatorii), valoarea ei fiindobinutlaexecuie. Domeniul de vizibilitate al numelor cmpuriloruneinregistrri ncepe cu punctul lordedeclarareiseterminlasfrituldeclaraieitipuluinregistrare.Selectarea 65
unei componente (cmp) se face pe baza unei expresii de selectare, care conine numele cmpului calificat cu numele variabilei nregistrare. n acest caz, adresa relativacmpuluincauzsepoatedeterminalacompilare.
Tipul tablou
Elementeledefinitoriialetipuluidedatetablousunt: Numele(opional) Listadimensiunilor Tipulelementuluidetablou Domeniulpentrumulimeaindicilor Numele unui tip tablou este un identificator, construit pe baza regulilor proprii fiecrui limbaj. Lista dimensiunilor precizeaz numrul de dimensiuni al tabloului respectiv, existnd restricii de la limbaj la limbaj privind numrul maxim de dimensiuni permis. Tipul elementului de tablou definete natura acestui element, preciznd reprezentarea lui,iardomeniulpentrumulimeaindicilorestedeobicei detipsubdomeniu. Criteriiledeclasificareatablourilorsunt: Numruldedimensiuni Tipulelementului(carepoateinduceoperaiispecifice) Momentulalocrii Posibilitatearedimensionrii Dinpunctuldevederealnumruluidedimensiuni: Tablourimonodimensionale(vectori) Tablouribidimensionale(matrici) Tablouritridimensionale ngeneral,tablouriddimensionale Din punctul de vedere al momentului alocrii, exist dou categorii de tablouri: statice i dinamice. Tablourile statice se aloc la compilare (sau cel puin trebuie cunoscute dimensiunile la compilare). Pentru tablourile dinamice, dimensiunile acestorasedeterminabialaexecuie.Ocategoriespecialdetablouridinamiceo reprezinttablourileflexibile,caresepotredimensionantimpulexecuiei. Referirealaunelementaltablouluisefaceprinprecizareanumeluitablouluiurmat deoexpresiedeindice.Expresiadeindiceconine,nparantezerotundesaudrepte (n C) valorile efective ale indicilor tabloului. Exist dou modaliti de referire: punctualidesubtablouri.Ambelemodalitisebazeazpecalcululdeadres. Calcululdeadresrealizeaz,pentruoexpresiedeindicedat,determinarealocaiei de memorie (a adresei) ce conine elementul de tablou referit. Deoarece memoria calculatoruluipoateficonsideratcatabloumonodimensionaldelocaiiadresabile, problemacalcululuideadressereduceladeterminarea,pebazainformaieiasupra indiciloriasupratablouluingeneral,aunuinumrcereprezintadresacutat. 66
Pentrufiecaretabloudeclarat,sememoreazndescriptoruldetablouurmtoarele informaii: numenumeletabloului tiptipulelementuluidetablou lunglungimeareprezentriiunuielementdetablou(nunitidealocare) adrsadresadeundencepememorareatabloului nrdnumruldedimensiunialtabloului pentrufiecaredimensiune,limiteleliiilsi(1<=i<=nrd). Sepresupunectablouluiisealoclocaiiconsecutivedememorie,decielocupo zon compact. Fiecare element de tablou va ocupa, n zona respectiv, o locaie unicdeterminat.Existdoumodalitidememorareaunuitablou: pelinii(cndultimulindicevariazmairepede) pecoloane(cndprimulindicevariazmairepede) Notnd cu loc o funcie ce ntoarce adresa locaiei de memorie a unei referine de tablou, pentru dou tablouri A(li:ls) i B(li1:ls1, li2:ls2), calculele de adres se scriu astfel: loc(A(i))=adrs+(ili)*lung sau loc(A(i))=adrsli*lung+i*lung Memorareapelinii: Toateelementeleliniiloranterioarelinieiiplusprimelej1elementealelinieii loc(B(i,j))=adrs+(ili1)*(ls2li2+1)*lung+(jli2)*lung sau loc(B(i,j))=adrsli1*(ls2li2+1)*lungli2*lung+ (constant) +j*lung+i*(ls2li2+1)*lung Memorareapecoloane: Toate elementele coloanelor anterioare coloanei j plus primele i1 elemente ale coloaneij loc(B(i,j))=adrs+(jli2)*(ls1li1+1)*lung+(ili1)*lung sau (constant) loc(B(i,j))=adrsli2*(ls1li1+1)*lungli1*lung+ +i*lung+j*(ls1li1+1)*lung n expresiile de mai sus, ultimele relaii corespund unor calcule optime de adres, pringruparealanceputatermenilorconstani(termeniicenuconinindiciiiijca factori). Elementelecetrebuietratatecndsediscutprezenatipuluitablounlimbajelede programaresunt:
67
regulile sintactice de definire a tablourilor i de referire a elementelor acestora; familiadetipuridedatecepotficonsideratecaelementedetablou; familiadetipuridedatecepotfiutilizatecaindicidetablou; cndtrebuiecunoscutedomeniileindicilor:lacompilaresaulaexecuie; numrul maxim de dimensiuni permis (care este legat de complexitatea calcululuiadreseiunuielement); posibilitatearefeririilasubtablourileunuitabloudat; cumsefaceiniializareatabloului; operaiilepredefinitepetablouri.
68
Dei numele asociat structurii i variabilele de structur declarate sunt elemente opionaletrebuiesaparmcarunadinceledou. Exemplu:
struct{charnume[30]; intvarsta;floatgr;}cineva;
declarvariabilacinevacafiindostructurcegrupeaztreitipurideinformaii. Pentru a se putea declara mai multe variabile de aceeai structur exist dou posibiliti: atribuireaunuinumepentruansamblulcmpurilorstructurii:
structpersoana{charnume[30]; intvarsta;floatgr;}; structpersoanacineva,altcineva[20]; structpersoanaNoi[],*Voi[]; typedefstruct{charnume[30]; intvarsta;floatgr;}persoana; persoanacineva,altcineva[20];
definireaunuinumedetippentruspecificaiastructurii:
Notaiaps>campesteechivalentcu(*ps).camp. Deexemplu:
struct { intx; int*y }*p;
declarpcafiindpointerlaostructurformatdindoucmpuri:unntregiun pointerlantreg.Atunci,inndcontideprioritateaoperatorilor,vomavea: ++p>xincrementeazpex,operatorul>avndprioritatemaimaredect++; (++p)>x incrementeaz mai nti pe p i apoi acceseaz elementul x din structuranoupointat; (p++)>xseacceseazntixapoiseincrementeazp; 69
unionnume_uniune{[tipnume_var]}[decl_variabile];
Uniunile permit utilizarea n comun a unei zone de memorie de ctre mai multe obiecte(numitemembri)detipuridiferiteiaresintaxa:
Exemplu:
unionamestec{inti;floatf;char*psir;}X;
Avndnvederespaiulcomuntuturorvariantelor,atribuireaunuiadintrecmpuri vaafectaimplicitivaloareacelorlalte.ntreagarspundereacontroluluiuniunilor revine programatorului. O uniune este o structur n care toi membri au deplasamentul zero, structura fiind suficient de mare pentru a putea pstra pe cel maimaremembru.
70
6. Expresii
Expresiile sunt elementele de baz prin care se precizeaz calculele. Din punct de vederesintactic,expresiaesteosecvendeoperanziioperatori,careexprimun proces de calcul. O expresie poate avea o valoare, determinat prin procesul de evaluare. n decursul evalurii exist posibilitatea modificrii i altor valori din contextulevalurii,fenomenedenumiteefectesecundare(engl.sideeffects). ncontinuarevomprezenta: Notaiilefolositepentruexpresii; Domeniuldevizibilitateaalnumelor; Stabilireatipului(conversii); Evaluareaexpresiilor.
Generaliti
Sintaxa unei expresii
O expresie este format din operanzi i operatori. ntre criteriile de clasificare a expresiilorenumerm: Numruldeoperanzi; Poziiaoperatoruluinraportcuoperanzii; Tipulrezultatului; Semantic. DefiniiaexpresieinC.
Operatori
nfunciedenumruldeoperanzi,expresiileseclasificn: Expresiiunareunsinguroperand; Expresiibinaredoioperanzi; Narenoperanzi. Numrul de operanzi necesar este o caracteristic a unui operator i se numete aritatearespectivuluioperator.Existoperatoricuaritateafixatioperatoricare au aritatea variabil. De exemplu, n Lisp, operatorul + poate avea unui, doi sau maimulioperanzi. Duppoziiaoperatorilornraportcuoperanzii,expresiileseclasificn: Expresiiinfixoperatorulsepunentreoperanzi; Expresiiprefixoperatorulsepunenainteaoperanzilor; Expresiipostfixoperatorulsepunedupoperanzi. Pentru cazul operatorilor binari, expresiile binare formate cu operatorul op i operanziiE1iE2sescriuastfel: 71
Notaiainfix:E1opE2 Notaiaprefix:opE1E2 Notaiapostfix:E1E2op De exemplu, dac operatorul op este cel de adunare, adic +, iar operanzii sunt douexpresiisimple(variabile),notatecuxiy,atunciexpresiacaredenotsuma acestorasescrie: Notaiainfix:x+y Notaiaprefix:+xy Notaiapostfix:xy+ Analog,oexpresiescrismatematicnforma(x+y)*zsevatranscrieastfel: Notaiainfix:(x+y)*z Notaiaprefix:*+xyz Notaiapostfix:xy+z* nnotaiainfix(notaieuzualnmatematic),unoperandEsepoateincludentre paranteze,nforma(E)pentruclaritateaexprimrii;valoarealuinusemodificn prezenaparantezelor.nnotaiaprefixipostfixnumaisuntnecesareparantezele, deoareceoperanziifiecruioperatorsepotdeterminaframbiguiti. Regulilenotaieiprefixsunt: Pentrufiecareoperatorsecunoatearitatealui; Notaiaprefixpentruoconstantsauvariabilesteconstantasauvariabilan cauz; Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia prefixnformaopE1E2. Aplicareaoperatoruluinar(dearitaten>=0)opnlasubexpresiileE1,E2,,En sescriennotaieprefixcaopnE1E2En. Dacsenlturprimaregulatuncicelelaltedouregulideconstruireaexpresiilor semodific:estenecesarprezenaparantezelorpentruadelimitaoexpresie,deci expresiileconstruitevoraveaforma:(opE1E2)respectiv(opnE1E2En). Regulilenotaieiinfixsunt: Pentrufiecareoperatorsecunoatearitatealui; Notaiapostfixpentruoconstantsauvariabilesteconstantasauvariabila ncauz; Aplicarea operatorului binar op la subexpresiile E1 i E2 se scrie n notaia postfixnformaE1E2op. Aplicareaoperatoruluinarar(dearitaten>=0)opnlasubexpresiileE1,E2,, EnsescriennotaieprefixcaE1E2Enopn
72
Precedena operatorilor
Rezolvareaambiguitilorncazulnotaieiinfixsefaceprindoureguli,privind: Precedenaoperatorilor; Asociativitateaoperatorilor(pentruoperatoriicuaceeaipreceden). Acesteambiguitiapardeobiceilaexpresiilearitmetice,lacareoperatoriibinarise grupeaz pe trei niveluri de preceden (prioritate), prezentai n continuare n ordineadescresctoareaprioritii: Operatorulridicarelaputere(^prezentnunelelimbaje); Operatoriimultiplicativi(*,/i%) Operatoriiaditivi(+i). Fiecarecategoriedeoperatoriarepreceden(prioritate)maimaredectceicare urmeazdupea. Astfel,expresia:a+b*csevaevaluacaa+(b*c),iara*b+csevaevaluaca(a*b) +c(parantezeleindicordineancareseefectueazaplicareaoperatorilor). n exemplele de mai sus sa folosit numai precedena operatorilor. Dac ntro expresieaparedemaimulteoriacelaioperatorsauoperatoricuaceeaiprioritate, acioneazaldoileagrupderegulicarestabileteasociativitateaoperatorilor.Exist doutipurideasociativitate:lastngailadreapta. Unoperatoresteasociativlastngadacsubexpresiilecareconinapariiimultiple aleluisegrupeazdelastngaladreapta.Astfel,sumaa+b+cesteinterpretatca (a+b)+c,deciprimadatseefectueazsumaa+biarapoirezultatulsevaadunala valoarealuic. Unoperatoresteasociativladreaptadacsubexpresiilecareconinapariiimultiple aleluisegrupeazdeladreaptalastnga.Astfel,expresiaa=b=cesteinterpretat caa=(b=c). Asociativitatea operatorilor se aplic doar n situaia cnd acetia au aceeai prioritate. Majoritatea limbajelor de programare posed astfel de reguli de preceden i asociativitate. LimbajeleCiC++posedceamaimarecoleciedeoperatori. ProritateaiasociativitateaoperatorilornlimbajulC:
1. Operatorul () [] > . ! ~ ++ + Descriere Apeldefuncie Accesareelementtablou Selectare membru structur prin pointer Selectaremembrustructurdirect Negarelogic de la dreapta Complementpebii lastnga Preincrementare sau postincrementare Predecrementare sau postdecrementare Asociativitat e de la stnga ladreapta
2. Unari
73
de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la stnga ladreapta de la dreapta lastnga de la dreapta lastnga de la stg. la dr.
74
operatorii,iarsubarboriireprezintoperanzii.Constanteleivariabilele(expresiile simple)suntfrunzele(nodurileterminale)aleunuiastfeldearbore. Pentruunoperatoropndearitaten>=0,expresieiconstruitcuel,caresescrieopn E1 E2En (n notaie prefix), respectiv E1 E2En opn (n notaie postfix) i va corespundearborele:
Arborii de sintax sunt abstraci, reprezentarea lor fiind aceeai, independent de notaiafolositpentruexpresie.nfapt,denumireanotaiei(infix,prefixsaupostfix) provinedelamanieradeparcurgere(vizitare)anodurilorarborelui: Prefix(rccin,subarboridelastngaladreapta):*+ab**cde/4f Afix (subarbore stng, rdcin, subarbore drept; numai pentru arbori binari):a+b*c*d*e4/f Postfix(subarboridelastngaladreapta,rdcin):ab+cd*e*4f/*
Peiruridebii Pepointeri Operatoruldedeterminareadomeniuluidevizibilitate(engl.scoperesolution operator) Conversieexplicit Atribuire Condiional Operatorulvirgul. Tipul expresiei se stabilete pe baza tipurilor operanzilor i operatorilor ce formeazexpresia.
Operatori aritmetici
Operatorii aritmetici se folosesc la construirea expresiilor aritmetice. Operanzii unor asemenea expresii trebuie s fie de tipuri numerice, iar rezultatul evalurii expresieiestetotdetipnumeric.Fiecarelimbajposedpropriileregulideefectuare acalculeloridestabilireatipuluirezultatului.
Operatori relaionali
Operatorii relaionali se aplic unor operanzi de tipuri variate, producnd un rezultatBoolean.nCnuexisttipulboolean.Oricevaloarentreagdiferitdezero este tratat ca true i valoarea ntreag zero este tratat ca false. Operatorii relaionalisunt:<,>,<=,>=,==(egalitate),!=(inegalitate).
Operatori logici
Operatorii logici au de regul operanzi de tip boolean i ntorc un rezultat de tip boolean. Operatorii logici n C sunt: && (i logic), || (sau logic), ! (negaie logic operator unar).Opereazasupraunorntregiiarrezultatulestezero(false)sauunu(true).
Operatori pe mulimi
Operatorii pe mulimi au operanzi de tip mulime i ntorc un rezultat de tip mulime.Acetioperatoriexistdoarnlimbajelecesuporttipulmulime.Limbajul Cnusuportacesttipdedate.
76
sunt 0, i are valoarea 1 n caz contrar. Operatorul unar ~ aplicat unei expresii a,schimbnreprezentareavaloriiluiafiecarebit 0n1i fiecare bit 1 n 0. Din punct de vedere al operrii practice este bine de reinut c operaiileprezentatesuntutilepentruurmtoarelesituaii: & permite izolarea valorii unui anumit bit sau forarea unor bii la valoarea zero. | permiteforareaunorbiilavaloarea1. ^ permitecomplementareavaloriiunorbiifrativaloarealor. ~ realizeazcomplementareatuturorbiilorvaloriiargumentului. n general, pentru realizarea unor astfel de scopuri se folosete ca un al doilea operandomasc(aceastafiindoconfiguraiedebiialeasdeprogramatorntrun modadecvat).
efectueazconversiantregului1nvaloareanvirgulflotant1.0fnaintedease efectua operaia de atribuire. Rezultatul unei conversii de tip nu este o lvaloarea, decinupoatefiatribuit(cuexcepiatipuluireferin). Existdounotaiipentruconversiaexplicitdetip:notaiaCtradiional,numit cast,deex.(double)ainotaiafuncionaldouble(a).Ultimanusepoatefolosi pentrutipuricarenuaunume simplu.Astfel,pentru aconvertiovaloarelauntip pointeranonim,sevafolosinotaiacast: sausepoatedefiniunnounumedetipiatuncisepoatefolosinotaiafuncional: O conversie de tip trebuieevitatdac nueste necesar. Programele care folosesc conversii explicite de tip sunt mai greu de neles dect programele care evit conversiile prin recurgerea la tipuri pentru a reprezenta concepte de nivel nalt. Corectitudineaconversiilorexplicite detipdepindenmodcritic demodulncare programatorulnelegemanierancareobiectelediferitesuntgestionatedelimbaj, precumidedetaliiledeimplementareacompilatorului.Deexemplu: 78
typedefchar*Pchar; char*p=Pcahr(0777); char*p=(char*)0777;
Peunelemaininuvorfiprobleme,nspealtelepotaparerezultatedezastruoase. n cel mai bun caz, acest cod este portabil. De obicei este normal (i sigur) s se presupuncpointeriiladiferitestructuriauaceeaireprezentare.Maimult,orice pointersepoateatribui(frconversieexplicitdetip)launvoid*,iarunvoid*se poateconvertiexplicitlaunpointerdeoricetip. Conversiaimplicitaparecelpuinnurmtoarelesituaii: laoperaiadeatribuire; laapelulunuisubprogram,ncadrulprocesuluideevaluareaaparametrilor; laevaluareauneiexpresiimixte.
Operatorul condiional
LimbajeleCiC++dispundeunoperatorcondiional(?:)caresepoateutilizan cazurilecndinstruciuniledeexecutatsuntexpresii.Sintaxageneraleste: expr_logic?expr_adev:expr_fals echivalentsemanticcu: if(expr_logic)expr_adev;elseexpr_fals; Expresia expr_logic trebuie s fie de tip aritmetic sau pointer. Dac evaluarea ei furnizeazovaloareadiferitdezero,rezultatulexpresieicondiionaleestevaloarea expresiei expr_adev, n caz contrar fiind valoarea expresiei expr_fals. Eventualele efecte secundare introduse de evaluarea expresiei expr_logic au loc nainte de evaluarealuiepxr_adevsauexpr_fals. Determinarea maximului a dou valoria a i b se poate face prin expresia codiional:
max=(a>b)?a:b;
79
Operatorul virgul
nCiC++virgulaesteconsideratoperatorcuurmtoareasemnificaie:osecven deexpresiideforma epxr1,expr2,,exprN reprezinteansioexpresiencareseevalueazsuccesiv,delastngaladreapta expresiile. Valoarea final atribuit expresiei secven este cea a expresei exprN. Expresiile componente trebuie s fie atribuiri, incrementri sau decrementri, n afardeexprNcarepoatefioarecare,deoareceaceastadvaloareantregiisecvene. Efectele primelor N1 expresii sunt de fapt efectele secundare ale unei astfel de expresiisecveniale.Deexemplu,dupefectuareaatribuiriidemaijos: intx=6,y=7,z,w;
w=(z=y+x,y=yx,x=x*yz,x+y+z);
vomobine
x=7;y=1;z=13;w=7;
n listele de parametri actuali sau de iniializatori, operatorul virgul trebuie s apar n cadrul unei expresii secveniale cuprins ntre paranteze. De exemplu, apelul
f(a,(b=3,b+4),c);
aretreiparametriactuali,aldoileaavndvaloarea7.
80
dac x este diferit de zero atunci rezultatul ei este true, indiferent ce valoare de adevraraveasubexpresiay/x>5.Iarncazulexpresiei:
x!=0&&y/x>5
81
dac x este zero atunci rezultatul ei este false, dar dac se ncearc i evaluarea subexpresiei y/x>5, ctul y/x este nedefinit, prin urmare nu se poate face aceast evaluare.Dinexempluprezentatrezultposibilitateaevaluriiscurtcircuitncazul expresiilorlogice,cuefectebeneficeattpentrutimpuldeexecuie(seeliminunele operaii inutile) ct i pentru fiabilitatea programului (se evit unele situaii de excepie).Evaluareascurtcircuitsepoatedefiniprindoureguli: 1. fiinddatexpresiae:=xandy,dacx=false,atuncie:=false 2. fiinddatexpresiae:=xory,dacx=true,atuncie:=true n C++, expresiile care conin operatorii relaionali <, >, <=, >= folosesc asociativitatealastnga.Definiiaexpresieirelaionaleeste: expresierelaional::= expresiededeplasare expresierelaional>expresiededeplasare expresierelaional<expresiededeplasare expresierelaional<=expresiededeplasare expresierelaional>=expresiededeplasare Operanziitrebuiesfiedetiparitmeticsaupointer.Operatorii<,>,<=,>=produc rezultatul 0 dac relaia specificat se evalueaz la false i 1 dac se evalueaz la true.Tipulrezultatuluiesteint. Pentru operanzii aritmetici se efectueaz conversiile aritmetice uzuale, iar pentru operanziipointerseefectueazconversiidepointer.Deaicirezultc: Oricepointersepoatecomparacuoexpresieconstantceseevalueazla0. Oricepointersepoatecomparacuunpointerdetipulvoid*(nacestcazse faceprimadatconversialavoid*). Pointerii la obiecte sau funcii cu acelai tip (dup efectuarea conversiilor de pointeri)sepotcompara:rezultatuldepindedepoziiilerelativealeobiectelorsau funciilorpunctatedepointerinspaiuladreselor. Reguliledecomparareapointerilorsunt: 1. doipointerilaacelaiobiectsuntegalidinpunctuldevederealcomparrii; 2. cnddoipointeripuncteaz spremembrinonstaticiaiaceluiaiobiect, pot existaurmtoarelesituaii: a. Dac cei doi membri sunt separai de o etichet de specificator de acces i dac clasa obiectelor nu este uniune, atunci pointerul la ultimul membru declarat (dintre cei doi membri referii) este mai maredinpunctuldevederealcomparrii. b. Dac cei doi membri sunt separai de o etichet de specificator de acces,rezultatulestenedefinit; c. Dacpointeriipuncteazspremembriaiaceleiaiuniuni,eisuntegali dinpunctuldevederealcomparrii.
82
3. dacdoipointeripuncteazspreelementeleaceluiaitablou,sauunuldintre eipuncteaz spresfritultabloului,pointerulspreobiectul cuindicelemai mareestemaimaredectcellalt. 4. celelaltecomparridepointerisuntdependentedeimplementare. nceeacepriveteexpresiilecareconinoperatorilogici,operanziinutrebuiesfie de acelai tip, dar trebuie sfie de tiparitmetic sau pointer. Rezultatuleste de tip int.toateefectelesecundareprovocatedeprimaexpresieaulocnaintedeevaluarea celeideadoua.
83
7. Instruciuniicontrolulexecuiei
Diferiteleoperaiicetrebuieexecutatedeunanumitprogramscrisntrunlimbajde programare (imperativ) oarecare sunt date sub forma unor instruciuni sau comenzi. n afara instruciunilor, un program surs mai poate conine declaraii i eventual,directivedecompilare.nfunciedesemanticalor,instruciunilepotfi: deatribuire; deintrareieire; decontrol. Instruciunile de intrareieire sunt instruciunile de transfer ntre memorie i dispozitiveleperiferice.ngeneral,existunniveldevirtualizare,nsensulcnuse realizeazoperaiiledeintrareieiredirectpesuport,cipefiiere.Acesteoperaii suntdependentedemain. Instruciuniledecontrol:execuiaunuiprogramscrisntrunlimbajdeprogramare imperativnu estealtceva dectun ir de transformri ale valorilorunor locaii de memorie. Aceast execuie este controlat de mecanisme ale cror rol este de a determina ordinea de execuie a instruciunilor dintrun program. Aceste mecanisme se numesc instruciuni de control i, mpreun cu instruciunile de atribuire,vomdiscutadespreelencontinuare. Putemclasificainstruciuniledecontrolastfel: instruciunicondiionale; instruciunideciclare; instruciunidelucrucusubprograme(realizeazdoulucruri:declarareade subprogrameiapelareasubprogramelorinclusivrevenireadinacestapel); instruciunidetransfer(salt) Din punctul de vedere al structurrii lor, instruciunile sunt simple i compuse. O instruciunesimplrealizeazoaciunebineprecizatsemantic,iaroinstruciune compus este format din mai multe instruciuni simple, grupate mpreun prin folosireadeobiceiaunorcuvintecheiecuroldedelimitatori(beginendnunele limabje).
Instruciunea de atribuire
Instruciuneadeatribuireareformageneral: expridopatrexpr unde: exprid esteoexpresiedeidentificare; opatr esteoperatoruldeatribuire; expr esteoexpresie. 84
De obicei, ntro instruciune de atribuire, numele unei variabile are dubl identitate: valoare stng (lvaloare engl. leftvalue), cu semnificaie de referin (adresa zonei de memorie asociat variabilei) i valoare dreapta, rvaloare, cu semnificaiedevaloare(valoareamemoratnzonarespectivdememorie). Deexempluninstruciunea
x=x+1;
se face apel la lvaloarea lui x n stnga operatorului = i la rvaloarea lui x n dreaptaoperatorului=. n limbajele actuale exist operatori prefix care produc adresa unei variabile (operatorul@nPascal)sautipuri(tipulreferinnC++).Deexemplu:
inti; i=5; int&ri=i;//inC++ ri=7;
85
Aadar trebuie fcut distincia ntre atribuirea de valori i atribuirea de adrese. Pentruascoatenevidensemanticadiferitacelordoutipurideatribuire,unele limbaje prevd operatori distinci pentru aceste operaii. Dac p i q sunt pointeri atuncinCiC++ p=qnseamnatribuiredepointeri; *p=*qnseamnatribuiredevalori; p>cmp este sintaxa pentru selectarea componentei unei structuri (dac p estepointerlaostructur).
Instruciunea compus
Instruciuneacompusspecificfaptulcinstruciunilecareocompunseexecutn aceeai ordine n care apar. Instruciunile componente sunt tratate ca o singur instruciune, lucru esenial n contextele n care sintaxa limbajului cere o singur instruciune. Termenul de instruciune compus este similar, n unele limbaje, celui de bloc. Deosebirea dintre cele dou noiuni este urmtoarea: instruciunea compus nu conine declaraii, pe cnd blocul poate conine declaraii. Un bloc poate fi consideratcaunitateadevizibilitate(declaraiileceaparneldefinescdomeniide vizibilitatepentrunumelecareaparnele). nC,C++,termeniideinstruciunecompusiblocsuntidentici.Motivulesteacela c orice declaraie este considerat instruciune. Delimitatorii folosii pentru marcarea nceputului i sfritului blocului sunt acoladele, iar instruciunile se termincupunctivirgul,inclusivultima. Existlimbajedeprogramarecareposedattblocurictiinstruciunicompusei, deasemenea,existlimbajecarenuposedinstruciunicompuse:Fortran,Basici ngenerallimbajelefrstructurdebloc.
86
undeexpresietrebuiesfiedetiparitmeticsaupointer.Dacexpresieseevalueaz la o valoare diferit de zero atunci se execut instruciune1, altfel se execut instruciune2.Parteaelseesteopional. nlimbajeledeprogramarencareexisttipuldedateboolean,expresietrebuies fieoexpresielogicacreivaloareestetruesaufalse. A doua instruciune condiional este instruciunea de selectare, instruciune care este o soluie mai elegant pentru situaiile de programare n care se folosesc instruciuni ifelseif n cascad. Rolul semantic al instruciunii de selectare este alegereauneialternativedintromulimedevariantereciprocexclusive.Eapoatefi simulat printro cascad de instruciuni ifelse, dar avantajul ei const ntro expresivitatesporitaexprimrii.Deducereaalternativeicareseexecutsefacepe baza unei expresii numite selector, iar valorile luate n considerare se numesc etichete case. Cnd se discut despre instruciunea de selectare trebuie avute n vedereurmtoareleaspecte: tipulexpresieiselectoare; tipuletichetelorcase; esteposibilexistenaetichetelorreciprocneexclusive; eticheteleacopertoatmulimeavalorilorexpresieiselectoare. posibilitateaexprimrilorninteriorulsauexteriorulcorpuluiinstruciunii. InstruciuneadeselectareanlimbajeleCiC++esteinstruciuneaswitch.Expresia selectoaretrebuiesfiedetipntregsaudetipclaspentrucareexistoconversie neambigu la tip aritmetic sau pointer. Orice instruciune din corpul lui switch poatefietichetatcuunasaumaimulteetichetecasedeforma: caseexpresieconstant: unde expresieconstant se convertete la tipul expresiei selectoare. ntro instruciuneswitchnupotexistadouconstantecasecuaceeaivaloare.Corpullui switchpoatesconinicelmultoetichetdeforma: default: La execuia instruciunii switch, se evalueaz expresia selectoare i se face comparaiacufiecareconstantcase.Dacunadintreconstantelecaseesteegalcu valoareexpresiei,setransfercontrolullainstruciuneacuetichetacaserespectiv. Dacvaloarenucorespundeniciuneiadintreconstantelecaseidacexisteticheta default,setransfercontrolullainstruciuneacuaceastetichet,iardacnuexist default,nuseexecutniciunadininstruciuniledincorpulluiswitch. Etichetele case i default nu altereaz fluxul de control, care continu n corpul lui switch.Pentruaprsicorpulluiswitch,sefoloseteinstruciuneabreak.Deobicei instruciunile care fac obiectul lui switch sunt instruciuni compuse, dar nu este obligatoriuacestlucru. 87
Instruciuniledincorpulluiswitchpotfiideclaraiidartotuinuesteindicatsse facastfeldedeclaraii.
Instruciuni de ciclare
Instruciuniledeciclare(repetitive,iterative)realizeazspecificareaunorprocesede calcul iterative. Aceste procese pot fi cu numr cunoscut de pai sau cu numr necunoscut de pai (iteraii). Secvena de instruciuni care specific procesul de calculiterativsenumetecorpalacestuia(corpulciclului). Nu se tie dinainte de cte ori se repet execuia unui proces iterativ cu numr necunoscut de pai. La un moment dat decizia privind reluarea execuiei corpului ciclului (continuarea cu o nou iteraie) se face prin testarea valorii unei anumite expresii. Din punctul de vedere al locului unde se face aceast testare, se disting douclasedeastfeldeprocese,cutestiniialicutestfinal. Specificarea formal a unui proces de calcul iterativ se poate face folosind delimitatori,caremarcheazcorpulacestuia.Continuarea(repetarea)procesuluide calculestedecisdevaloareadeadevrauneicondiiideterminare,careestedat explicit sub forma unei expresii booleene. Dup momentul n care se evalueaz expresiasedistingdouconstrucii:cutestiniialicutestfinal.Atuncicndtestul este la finalul ciclului corpul se execut cel puin o dat indiferent de valoarea de adevracondiieideterminare. InstruciuniledeciclarenCiC++suntwhile,doifor.Sintaxaloreste:
instruciunedeciclare::= while(expresie)instruciune; doinstruciunewhile(expresie); for(instruciuneiniializarefor;expresie;expresie) instruciune; instruciuneiniializarefor::= instruciuneexpresie instruciunedeclaraie
Corpuluneiinstruciunideciclarenupoatefiodeclaraie. La instruciunea while corpul se execut repetat pn cnd valoarea lui expresie devine0.Testulsefacenaintedefiecareexecuieacorpului.Expresietrebuiesfie detiparitmeticsaupointer. Lainstruciuneadocorpulseexecutrepetatpncndvaloarealuiexpresiedevine 0. Testul se face dup fiecare execuie a corpului. Expresie trebuie s fie de tip aritmeticsaupointer. Instruciuneaforaresintaxa:
for(instruciuneiniializarefor;expr1;expr2) instruciune;
88
iesteechivalentcu:
cu excepia faptului c ntlnirea unei instruciuni continue n instruciune va provoca evaluarea lui expr2 nainte de evaluarea lui expr1. Prin urmare, prima instruciune nseamn iniializarea ciclului, expr1 este condiia de continuare a ciclrii,testatnaintafiecreiiteraii(seterminciclareacndexpr1devine0),iar expr2 specific de obicei o aciune care modific ceva (de obicei incrementarea variabilei de ciclare care se face dup fiecare iteraie). Expr1 trebuie s fi de tip aritmetic. Attexpr1ctiexpr2suntopionale.Daclipseteexpr1,seobineoconstrucie echivalentcuwhile(1)
for(;;)//cicluinfinit
Instruciuni de transfer
Instruciunile de transfer (salt) ntrerup execuia secvenial (instruciune cu instruciune) a unei secvene de program, permind continuarea execuiei programului dintrun loc precizat. Forma general a instruciunii de salt este goto etichet. Unde etichet este un identificator care apare naintea unei instruciuni, instruciunecucaresevacontinuaexecuiaprogramului.Nuvomintrandetaliin legturcuaceastinstruciunentructnuesterecomandatafifolosit. n 1968, Dijkstra a publicatn Communication of ACM, articolul GO TO statement considered harmful n care discuta problema proastei utilizri a acestei instruciuni, rezultnd programe greu de neles i nefiabile. Acest articol a declanatoseriedediscuiicareauduratanintregi,discuiiprivindutilitateasau inutilitatea acestei instruciuni (condiiile n care se poate renuna la GOTO; transformarea programelor cu instruciuni GOTO n programe echivalente fr GOTO; eficiena algoritmilor fr GOTO). Dup un timp discuiile sau potolit i GOTOarmascainstruciunenlimbajeledeprogramareimperativemoderne.Au aprut i construcii auxiliare (break, continue, exit) care servesc la o mai bun structurareaunuiprogramilaomaiuoarnelegerealui. Majoritatealimbajelormodernepstreazinstruciuneadesaltnecondiionatdoar dinmotivedecompatibilitatecuversiunileanterioare. nCinstruciuniledesaltsunt:goto,break,continueireturn.Sintaxaloreste:
instruciunedesalt::= break; continue;
89
Instruciuneabreakpoatesaparnumaincorpuluneiinstruciunideciclaresau ntro instruciune switch; ea are ca efect terminarea celei mai interioare instruciunideciclaresauswitch,iarcontrolulestetransferatlainstruciuneacare urmeazinstruciuniideterminareaciclului(dacexist). Instruciuneacontinuepoatesaparnumaincorpuluneiinstruciunideciclarei are ca efect transferarea controlului la poriunea de continuare a celei mai interioare instruciuni de ciclare, adic la sfritul ciclului, unde se face testul de continuareaciclrii. O funcie red controlul apelatorului ei la ntlnirea instruciunii return. Instruciuneareturnfrargumentesepoatefolosinumainfunciicentorctipul void. Formareturnexpresiesepoatefolosinumainfunciilecarentorcovaloare(detip diferit de void); valoarea expresiei este ntoars n apelatorul funciei. Dac este nevoie,expresiantoarsesteconvertit,lafelcalainiializare,latipulrezultatului ntors de funcie. ntlnirea sfritului unei funcii este echivalent cu return fr valoare,lucruilegalncazulfunciilorcentorcovaloare.
execuie). Respectarea unei discipline de programare i folosirea riguroas a structurilor de calcul introduse au dus la posibilitatea elaborrii de algoritmi uor deurmrit,clariicoreci. Un rezultat foarte important pentru ajungerea la programarea structurat la constituitarticolulluiBohmiJacopini,careaudemonstratcoricealgoritmpoate ficompusdinnumaitreistructuridecalcul: structurasecvenial; structuraalterntiv; structurarepetitiv. Programare structurat a fost caracterizat ca fiind: programare fr goto, programaredetiptopdowniomanierdeaorganizaicodificaprogrameastfel nct ele s fie uor de neles i de modificat, scopul ei fiind de a controla complexitateaprinteorieidisciplin. Knuth consider programarea structurat ca un mijloc de a face programele mai uordecitit. La nivel micro, programarea structurat se poate ntlni la nivelul elaborrii unui (sub)algoritm,undeseimpuneclaritate,ordineiscriereirespectareastructurilor decalculdemaisusncadrulfiecruimodulnparte.Lanivelmacroeasemanifest la nivelul ntregului produs program, prin practicarea proiectrii topdown, a programelormodulareiaaltormetodedeprogramareceimpunordinenntreaga activitate. De asemenea, este necesar existena unei structuri clare a ntregii aplicaii,precizatprintrodiagramdestructur. n ceea ce privete claritatea unui algoritm sau a unui program, indentarea (paragrafarea) precum i inserarea de comentarii reprezint tehnici de lucru ce nsoescdeobiceiavantajeledejamenionatealeprogramriistructurate. Chiardacmajoritatealimbajelorimperativeactualedispundeinstruciuneagoto, necesitateafolosiriieiadisprut,iarprogramatoriiauacumamaibunnelegerea modului n care trebuie utilizat o instruciune de acest tip precum i asupra situaieincareoastfeldeutilizareesteadecvat.
91
8. Proceduriitransmitereaparametrilor
Abstractizare i specificare
Practica a demonstrat viabilitatea principiului machiavelic divide et impera. n proiectarea aplicaiilor pe calculator, acest principiu se regsete sub termenul de descompunereauneiprobleme,princaresenelegefactorizareaeinsubprobleme disjuncte,cuurmtoareleproprieti: 1. fiecare subproblem este situat la acelai nivel de detaliere; ea poate fi tratatulteriorcaoproblemdistinct; 2. fiecaresubproblemsepoaterezolvaindependent; 3. soluiile subproblemelor se pot combina pentru a obine soluia problemei iniiale. Descompunerea unei probleme este strns legat de termenul de abstractizare. n general,procesuldeabstractizareesteprivitcaoaplicareauneifuncii(ngeneral neinjectiv), numit funcie de abstractizare, prin care se neglijeaz unele informaii, considerate nesemnificative, pstrnduse doar acelea considerate eseniale din punctul de vedere al contextului aplicaiei. Ideea de baz a abstractizriiesteaceeaclucruridiferite(nstotuinrudite)sepottrataidentic. Ca metod de proiectare a programelor, abstractizarea se poate realiza prin parametrizaresauprinspecificare. Abstractizarea prin parametrizare presupune identificarea, pentru o problem dat, a intrrilor i ieirilor acesteia, care vor constitui parametrii formali ai problemei respective. Se poate discuta ce pot fi parametrii unei probleme: numai date(adicrealizrialeunortipuridedatcunoscute)sauitipuridedat. Abstractizarea prin specificare se realizeaz prin asocierea unei specificri la fiecaresubproblemcaretrebuierezolvat,considernduseapoicoricecererede rezolvare a subproblemei se bazeaz pe aceast specificare, mai mult dect pe un algoritm de rezolvare a ei. Realizarea specificrii se face printrun cuplu de aseriuni,acrorfolosiresebazeazpedoureguli.Aseriunile: a. necesit (precondiia) ce specific proprietile ce trebuie satisfcute cndsedoreterezolvareasubproblemeirespective; b. realizeaz (postcondiia) ce specific proprietile presupuse a fi ndeplinitelaterminarearezolvriiproblemei. Regulilespecificriiafirmc: a. duprezolvareauneisubproblemesepoatepresupunecpostcondiiaeste adevrat b. sepotadmitenumaiaceleproprieticarederivdinpostcondiie. Prima regul statueaz c utilizatorul nu trebuie s se gndeasc la algoritmul de rezolvare a subproblemei, adic el trebuie s fac abstracie de detalii, iar a doua afirm c rezolvarea subproblemei ofer rezultate ce satisfac postcondiia, 92
subproblema fiind o abstractizare ce reprezint mulimea calculelor necesare realizrii postcondiiei. Astfel, o subproblem poate fi neleas ntrun sens mai larg,caonouoperaiepemulimeadatelorcesatisfacprecondiia. Sepoatevorbideabstractizareladouniveluri:proceduraliprintipuriabstracte dedate. Abstractizarea procedural este o abstractizare de tip operaional prin care se realizeazonouoperaie,utilizabildupdefinireaei.Eapermiteadugareadenoi operaii(extinderea)unuilimbajdeprogramare(consideratcamainvirtual). Abstractizarea prin tipuri de date abstracte presupune definirea de noi clase (structuri)dedateidefinireadeoperaiipeacesteobiecte,carerealizeazcrearea, actualizarea sau distrugerea acestor obiecte sau ofer informaii asupra comportamentului acestora. Acest nivel de abstractizare utilizeaz abstractizarea procedural. Abstractizarea prin proceduri combin metodele abstractizrii prin parametrizare cu cele ale abstractizrii prin specificare. Procedura este o unitate sintacticisemanticcaredescrietransformareaargumentelorfurnizatelaintrare nargumentedeieire.Dinpunctdevederesemantic,procedurasepoateidentifica ntro oarecare msur cu subproblema. Ea se poate considera abstract ca o aplicaiepemulimeaargumentelordeintrare,cuvalorinmulimearezultatelor,cu eventualamodificareaintrrilor. Abstractizare prin proceduri trebuie s satisfac trei cerine: minimalitate, generalitate i simplitate. Minimalitatea este caracterizat prin faptul c, comportamentul unei proceduri trebuie precizat numai n limitele realmente necesare.ngeneral,caracterulminimalaluneiproceduriimplicnedeterminismul (soluii multiple), care de obicei se rezolv la nivelul implementrii, obinnduse unicitatea soluiei. Generalitatea se obine prin utilizarea parametrilor n locul variabilelor sau al ipotezelor specifice. Simplitatea nseamn c procedura trebuie saibunscopbinedefinitiuordeexplicat,caresnudepinddecontextuln careesteutilizat.Seafirmcoprocedurestebinegnditatuncicndsepoate descrie scopul ei prin numele acesteia (adic se folosesc ct mai puine cuvinte pentruaexplicamenireaei).Simplitateaimplic,deobicei,caoprocedursaib uncoddeimplementareredus(deordinulzecilordeliniisurs). Abstractizareaprinparametrizareservetelaidentificareadatelorutilizate.Eaeste definit cu ajutorul parametrilor formali. Ori de cte ori se apeleaz o procedur, parametrii de apel (efectivi) trebuie n general s corespund ca numr i semnificaiecuceiformali.Distingemdejadoumomentedeosebitedinviaaunei proceduri: proiectarea i utilizarea ei. Lista de parametri, stabilit la proiectarea uneiproceduri,realizeazinterfaacualteproceduri,conferinduinacelaitimpo mai mare generalitate (aplicabilitatea n mai multe situaii, prin setarea corespunztoare a parametrilor efectivi), cu efect n realizarea de aplicaii compacte,maiuordescrisidentreinut. 93
Abstractizarea prin specificare presupune concentrarea asupra comportamentului procedurilor scrise, cu neglijarea detaliilor de implementare, altfel spus trebuie gndit ce trebuie s fac procedura, i nu cum trebuie s fac. Pentru o aceeai specificare se pot realiza mai multe implementri, diferite ntre ele (n limbaje diferite,cualgoritmidiferii).Laschimbareaimplementrii,programeleapelantenu vor trebui modificate dac specificarea procedurii nu se schimb. Abstractizarea prinspecificareoferometoddeproiectareaprogramelorcearedouproprieti importante:localizareimodificabilitate. Localizarea nseamn c implementarea unei abstractizri se poate face independent de implementarea altora. Avantajele oferite de aceast proprietate sunt: posibilitatea lucrului n echip (proceduri diferite pot fi implementate de persoanediferite)icreterealizibilitii(lanelegereascopuluiuneiprocedurinu estenecesarcunoatereaalgoritmilorfolosiipentrualteproceduriapelatedeea, cidoarasemanticiiacestora). Modificabilitateanseamnlimitareaefecteloruneimodificri.Dacimplementarea unei proceduri se modific fr ca s se modifice i specificarea acesteia, atunci apelulrespectiveiprocedurinusemodific,deciefectulmodificriiuneiproceduri se reduce numai la implementarea ei. Aceast proprietate ofer i o metod de controlaperformaneiprogramelor,careconstn: 1. se realizeaz specificarea corect i complet a tuturor procedurilor unui programiseimplementeazceimaisimplialgoritmi; 2. se execut programul, detectnduse locurile nguste (engl. bottlenecks), adicaceleproceduricareconsummajoritateatimpuluideexecuie; 3. se rescrie codul pentru procedurile respective, folosinduse algoritmi mai performani. Proiectarea unei proceduri presupune dou etape distincte: specificarea i implementarea. Specificarea unei proceduri definete ce au n comun diversele implementrialeacesteia.Implementrileuneiprocedurisuntechivalentesemantic dac reprezint aceeai abstractizare; ele pot diferi din punctul de vedere al algoritmilorfolosii.Ocondiienecesarceseimpuneimplementriiestecaaceasta srealizezecomportamentuldefinitprinspecificare.Deasemenea,estededoritcao implementaresfiectmaiinteligibil,ctmailizibil.ntretehniciledesporirea lizibilitiiuneiimplementrimenionm: 1. utilizareanotaiilordelaspecificareaunorparametri; 2. utilizareacomentariilor(attpentruprecizareaalgoritmuluiutilizat,ctin codulpropriuzis); 3. folosirea indentrii, aezarea n pagin ce faciliteaz nelegerea structurii codului. Specificarea abstractizrii prin proceduri: abstractizarea trebuie realizat prin definiii precise. Ea se definete cu ajutorul specificaiilor scrise ntrun limbaj de specificare. Acestlimbajpoatefi forma, specificaiileavnd unsensprecis,riguros 94
matematic, sau informal, cnd specificaiile au un caracter descriptiv, suferind n precizieirigoare,darfiinduordeneles. Specificareauneiproceduriconineantetulacesteia(parteasintacticaspecificrii) idescriereaaciunii(parteasemantic).Antetulconine:numeleproceduriiilista de argumentelor (parametrilor), caracteriznd numele, tipul i ordinea acestora. Descriereaaciuniiproceduriisefaceprinaseriunile: necesit(condiiilesaurestriciiledeutilizare; modific(parametriideintrarecaresemodific); realizeaz(comportamentulprocedurii). Din punctul de vedere al modului n care furnizeaz rezultatul aciunii lor, procedurile sunt de tip subrutin sau funcie. Procedurile de tip subrutin i materializeazefectulnmodificareaparametrilordeieire(eventualiaunorade intrare), pe cnd funciile furnizeaz un rezultat de un tip precizat, determinat de parametri. Schemadespecificareauneiprocedurieste: nume=proc(listaargumentelor)[returns(rezultat)] necesitseprecizeaztoaterestriciiledeutilizareaprocedurii. modificseprecizeazargumentelecaresemodific. realizeazdescriecomportamentulprocedurii. Dmncontinuarectevaexempledespecificareaprocedurilor. concat=proc(a,b:string)returns(ab:string) realizeaz la terminarea execuiei, ab este un nou ir de caractere ce conine caractereledinirula(nordineaapariiei),urmatedeceledinirulb. elim_dubl=proc(a:array[int]) modifica realizeazsuprimareaapariieimultiplealeelementelordina.Indiceleinferioral lui a rmne acelai, darordineaelementelor inumrul deelementedin a se pot modifica. caut=proc(a:array[int],x:int)returns(i:int) necesitatableordonatcresctor realizeazdacexistunindiceipentrucarex=a[i],rezultatulestei,altfelivafi unntregcuvaloareamaimaredectindicelesuperioralluia. Dinpunctuldevederealspecificriilor,procedurilepotfitotale(lipseteaseriunea necesit), deci nu exist restricii de utilizare a lor, sau pariale (este prezent aseriunea necesit). Termenii total sau parial trebuie considerai n raport cu domeniuldedefiniiealprocedurii:oprocedurtotalestedefinitpetotdomeniul su(consideratcaproduscartezianaldomeniilortipurilordedatceformeazlista 95
deparametri,nordineaspecificriiacestora),pecndlaunaparialdomeniuleste restrns n conformitate cu cerinele impuse de aseriunea necesit. Pentru exemplele de mai sus, concat i elim_dubl sunt proceduri totale, iar caut este parial.
Proceduri
Procedurapoatefiprivitcaomodalitatedeaajungedelaoinformaiedeintrarela o informaie de ieire. Specificarea unei proceduri trebuie s stabileasc relaiile ntre mulimea datelor de intrare i cea a rezultatelor de la ieire, dar (conform principiuluicutieinegre)nutrebuiesdeainformaiiasupramoduluincaresunt obinuteieirile.PrimullucrucareneintereseazlaoproceduresteceeaCEface aceastainuCUMface. Funcional,oprocedurpoateficonsideratcaonouoperaiedefinitdeutilizator prinintermediuloperaiilorprimitivealeunuilimbajdeprogramare. Conceptual,oprocedurestecompusdinpatruelemente: numeleprocedurii; olistdedefinireaparametrilor; corpulprocedurii; mediulprocedurii. Sintaxa unei proceduri se refer la modul concret de specificare a celor patru constitueni.Ingeneral,eaaratastfel:
ProcedureNUME(listdeparametri) Declaraii Corpulprocedurii EndNUME.
Evidentcdelaunlimbajlaaltulexistuneledeosebirinceeaceprivetesintaxa procedurilor.nlimbajulC,putemdefinidoarfuncii. Oprocedurncepedeobiceiprintruncuvntcheie(procedure)caredeclartextul care va urma ca fiind o procedur. Dup cuvntul cheie urmeaz numele acesteia, dupcare,nparantez,urmeazolistdeidentificatori,numiiparametriformali. Aceti identificatori sunt nume care joac rolul argumentelor reale din momentul apelului (nu sunt variabile). Este nevoie de acetia pentru a putea descrie procedura.Variabileleiexpresiilecevorfipreluatedeprocedurpentruanlocui parametrii formali se numesc parametri actuali. Exist o coresponden direct ntre parametrii formali i cei actuali, bazat de regul pe ordinea n care acetia apar n list. Orientarea n limbajele de programare moderne este de a da ct mai mult informaieladefinire,ncadrullisteiparametrilorformali.Astfel,lrgindusepuin noiuneadelistdeparametri,vorbimdesprespecificareaparametrilor,carepoate coninepelngnumeleparametrilor,tipulacestora,precumimodalitateancare vorfifolosiilaexecuie. 96
Decelemaimulteoridefinireauneiproceduridelimiteazidomeniulunorobiecte din program. Declaraiile descriu atributele variabilelor, constantelor, etichetelor, toate acestea fiind locale procedurii despre care vorbim. Corpul procedurii const dintro instruciune (simpl sau compus) care controleaz procesul de calcul. De asemenea, o procedur poate referi variabile globale ei care provin dintrun bloc exterior. Mediul procedurii const din acele variabile care sunt definite n afara corpuluiprocedurii, darcarepotfiutilizateieventualmodificatelaexecuieprin intermediulinstruciunilorprocedurii. nprincipal,procedurilesempartndoucategorii:subrutineifuncii. Osubrutinesteprocedurcarendeplinetesarcinafieprinatribuirearezultatelor unuia sau mai multor parametri, fie prin modificarea mediului procedurii, fie prin amndouacestemetode.Caracteristicsubrutineiestefaptulcapelulacesteiaeste interpretatcaoinstruciune. Ofuncieesteoprocedurcareestecaracterizatdefurnizareauneivalori.Astfelse permitecaapeluluneifunciisfiecomponentauneiexpresii.nmultelimbajede programare o funcie poate s modifice valoare unei variabile din mediu, aceasta fiind una din caracteristicile principale ale programrii imperative i implicit deosebireamajorntrenoiuneadefunciematematic(carenupermiteastfelde modificri i pe care se bazeaz programarea funcional) i cea de funcie din informatic. O modalitatea de stabilire a valorii unei funcii este atribuirea valorii numelui funciei,construciecevafitratatcaivariabillocal(nPascal,ALGOL,FOTRAN ).Pedealtparte,altelimbaje(cumesteC)cercavaloareadetransmissfieplasat imediatdupoinstruciunereturn. Laexaminareauneiproceduridistingemtreiclasedenume: numeleparametrilorformali; numelevariabilelorlocale; numelevariabilelorglobale. Relativlaacestecategoriiilamodulncareseraporteazoprocedurlaacestea,se ridic problema evalurii parametrilor actuali i a modului de punere n corespondenaacestoracuceiformali. Scopulfinalalcreriiproceduriloresteutilizarealor,etapcareaparelamomentul execuiei,icuprindetreifaze: 1. CALLmomentulapelului.Setransmitecontroluldelaprogramulapelantla procedur 2. ENTRYcuprindeaciunileceaulocnmomentulintrriinprocedur. 3. RETURN cuprinde aciunile ce se execut la trecerea controlului de la procedurlaprogramulapelant.
97
98
Pentrucavalorilecelordouvariabilessemodificetrebuiesfolosimapelulprin referinceeacenCsesimuleazcuvariabiledetippointer:
#include<stdio.h> voidswap(int*a,int*b) { intt; t=*a;*a=*b;*b=t; } voidmain() { inta=1,b=2; printf(%d%d,a,b);/*sevaafisa12*/ swap(&a,&b);/*Functieiisetransmitadreseleluiasib*/ printf(%d%d,a,b);/*sevaafisa21*/ }
unor variabile globale. Aceste modificri asociate calculului valorii funciei se numescefectesecundare. Astfel de efecte pot crea anumite probleme. De exemplu, n cadrul evalurii unei expresii unde apare o astfel de funcie ce produce efecte secundare nu se va ti precis ce valori vor avea alte variabile din expresie nainte i dup evaluarea funciei.
100
9. ANEXE
Codspaghetti
Cod sub form de spaghete este un termen peiorativ pentru un cod surs complex cu o structur de control nclcit,cefolosetemulteinstruciuniGOTO,excepii,fire deexecuieialteelementederamificarenestructurate.Un termen sinonim dar mai puin folosit este cod cangur pentrucsuntmultesalturincadrullui. MaijosdmunexemplutrivialdecodscrisnlimbajulBASICcepoateficonsiderat subformdespaghete.Programulafieaznumereledela1la10iptratullorpe ecran.Codulnutrebuiesfiealiniat(indentat).Liniileprogramuluisuntnumerotate i instruciunile GOTO se bazeaz pe aceste numere de linii. Controlului execuiei programuluisaredelaozonlaaltantrunmodnufoarteprevizibil.nprogramele adevrateastfeldesecvenedecodsuntmultmaicomplexeipotducelacreterea foartemareacosturilordentreinerealeunuiprogram.
10dimi 20i=0 30i=i+1 40ifi<>10thengoto90 50ifi=10thengoto70 60goto30 70print"Terminat." 80end 90printi&"lapatrat="&i*i 100goto30
Aceeaisecvendecoddarscrisntrunstildeprogramarestructurat(nlimbajul C):
inti; for(i=1;i<=10;i++) printf(%dlapatrat%d,i,i*i); printf(Terminat.); intpatrat(inti) { returni*i; }
i n acest program se fac salturi de la o zon la alta dar aceste salturi sunt predictibileiformaledeoarecefolosireainstruciuniiforiafunciilorsuntmetode 101
standarddeacontrolaexecuiaunuiprogram.Acesteprogramestefoartescurt,dar programele reale au foarte multelinii de cod i sunt dificil de ntreinut dac sunt scrisesubformdespaghete.
Teoremadestructur
n mai 1966, Bhm i Jacopini au publicat un articol n Communications of the ACM n care au artat c orice program care conine instruciuni GOTO poate fi transformat ntrun program fr instruciuni GOTO care s conin doar instruciuni de selecie (IF THEN ELSE) i instruciuni repetitive (WHILE condiie DO xyz), eventual cu cod duplicat i/sau cu adugarea de variabile booleene suplimentare (indicatori true/false). Ulterior sa demonstrat c instruciunea de selecie poate fi i ea eliminat i c orice program se poate scrie doar cu instruciunirepetitiveicuadugareadealtevariabilebooleene. Faptul c un astfel de minimalism este posibil nu nseamn c este i indicat. Teoretic,calculatoareleaunevoiedoardeosingurinstruciunemain(operaie) pentruafuncionaianume:scadeunnumrdintraltuliramificdacrezultatul estenegativ.nrealitate,calculatoareleauzecisaupoatechiarsutedeinstruciuni main. CeeaceaudemonstratBhmiJacopiniafostctoateprogramelepotfiscrisefr instruciuni GOTO. Ali cercettori au demonstrat c structurile de control cu o singurintrareiosingurieiresuntmultmaisimpludenelespentrucacestea potfifolositeoriundecaosingurinstruciunefrainfluenacontrolulexecuiei.
102