Compilarea programelor n Linux Utilizarea Sistemelor de Operare - Curs 6 - 10.11.2005 2 Utilizarea Sistemelor de Operare Compilarea programelor - Plan Program vs. Executabil Interpretare vs. Compilare Interpretor Compilator/Asamblor (+LinkEditor) Biblioteci Introducere Clasificare Compilarea cu GCC Introducere Optimizarea executabilelor Utilizarea bibliotecilor cu GCC-ul GNU Make Workshop Studiul unui executabil Analiza timpilor de execuie Studiul bibliotecilor GNU Make exemplu Studiul apelurilor de sistrem comanda strace Code proofing Memory leak detection Call analysis 2 3 Utilizarea Sistemelor de Operare Programul Programul este o list de instruciuni pas-cu-pas scrise ntr-un anumit limbaj de programare, instruciuni ce au ca scop ndeplinirea unui task n general, programele se prezint ntr-un format uor de neles Computerul poate executa programele doar dac le nelege Pentru nelegere, programele pot fi Aduse ntr-o form intermediar prin traducere (compilare) ntr-un limbaj uor accesibil sistemului de operare i procesorului Interpretate n momentul n care se execut 4 Utilizarea Sistemelor de Operare Executabilul Executabilul (fiierul executabil) conine (de cele mai multe ori) o reprezentare binar de instruciuni masin Coninutul executabilelor binare: Date (constante) Codul efectiv ce urmeaz a fi rulat Informaii pentru debugging Apeluri de sistem Exist cazuri cand executabilul conine o form intermediar de cod ce necesit prezena unui interpretor pentru a putea fi rulat 3 5 Utilizarea Sistemelor de Operare Interpretare vs. Compilare Interpretare = traducerea (pe loc) i execuia unui program (n general numit script) Compilare = traducerea unui program (n general numit cod surs) ntr-un limbaj uor de nteles de ctre maina (numit cod obiect), pentru a fi ulterior executat de ctre sistemul de operare 6 Utilizarea Sistemelor de Operare Interpretare vs. Compilare (pros & cons) Interpretare Pros: Cod uor de ineles de ctre progamator (human-readable - nivel de abstractizare ridicat) Debugging facil Cons: Execuia este lent comparativ cu execuia codului compilat Compilare Pros: Viteza mare de execuie Cons: Procesul de debugging poate fi ncet 4 7 Utilizarea Sistemelor de Operare Interpretarea vs. Compilarea Just-in-Time Interpretorul este un executabil (aplicaie) care execut un program (script) care nu poate fi ineles direct de catre sistemul de operare i de procesor. Uneori se apeleaz la o etap intermediar n procesul de interpretare - compilarea programului n format byte- code (o reprezentare intermediar optimizat). Acest cod este ulterior interpretat de catre un program pe maina gazd Compilarea Just-in-Time (sau compilarea dinamica) este o tehnic folosit pentru mbuntirea performanelor la rularea de byte-code ntr-un mediu JIT, programele sunt iniial compilate n format byte-code (format ce este n general portabil), dupa care acest cod este compilat pentru maina pe care se dorete rularea programului 8 Utilizarea Sistemelor de Operare Interpretoare BASH PHP JavaScript Python Ruby Basic etc. Compilatoare JIT Java (Sun) .Net (Microsoft) Interpretarea vs. Compilarea Just-in-Time 5 9 Utilizarea Sistemelor de Operare Compilator vs. Asamblor Att compilatorul ct i asamblorul au ca scop producerea de cod obiect (cod main), ce urmeaz a fi rulat pe o anume main Spre deosebire de compilator, asamblorul utilizeaza un set restrns de instruciuni, n mare parte fiind doar instruciunile procesorului n format literal (human readable), nu binar Programarea n assembler reprezint cel mai sczut nivel de programare (se programeaz direct resursele procesorului) 10 Utilizarea Sistemelor de Operare Compilatorul Compilatorul traduce codul sursa (de obicei scris intr-un limbaj evoluat de programare high-level language) in cod obiect Aceasta traducere se poate realiza intr-unul sau mai multi pasi Rezultatul traducerii este pus intr-un fisier executabil, folosind un anumit format 6 11 Utilizarea Sistemelor de Operare Design-ul unui compilator De obicei un compilator are 2 componente principale: Front-end Analiza lexical spargerea sursei n unitati atomice (cuvinte cheie, variabile etc.) Analiza sintactic identificarea structurilor sintactice (a.k.a. parsing) Analiza semantic sunt detectacte inelesurile cuvintelor Reprezentare intermediar (o structura de date, de obicei arbore sau graf) Back-end (de obicei multi-pas) Analiza de compilare (analiza reprezentrii intermediare pentru optimizri ulterioare, graful apelurilor etc.) Optimizari Generarea codului 12 Utilizarea Sistemelor de Operare Procesul de compilare 7 13 Utilizarea Sistemelor de Operare Link-editare Un linker sau link-editor are ca sarcin s asambleze mai multe fiiere obiect ntr-un singur program executabil Fisierele obiect sunt module ce conin cod maina i informaii pentru linker. Aceste informaii sunt reprezentate n mare parte prin definiii de simboluri, ce pot fi de doua feluri: Simboluri definite (exportate) sunt funcii/variabile ce se gsesc n modul, pentru a fi utilizate de catre alte module Simboluri nedefinite (importate) sunt funcii/variabile ce nu se gsesc n modul i trebuie cutate n alte module Astfel, principalul task ce trebuie ndeplinit de ctre un linker este s rezolve simbolurile nedefinite, nlocuind referinele ctre acestea cu adresele simbolurilor din alte module 14 Utilizarea Sistemelor de Operare Schema de functionare a unui link-editor 8 15 Utilizarea Sistemelor de Operare Biblioteci Bibliotec = library librarie O bibliotec este o colecie de funcii des utilizate de ctre programe Bibliotecile se disting de executabile prin faptul ca ele nu sunt independente n prezent, o mare parte din codul programelor se regsete in biblioteci Exista 3 tipuri majore de biblioteci: Biblioteci statice (static libraries) Biblioteci partajate (shared libraries) Biblioteci dinamice (dynamic libraires a.k.a. DLLs) 16 Utilizarea Sistemelor de Operare Biblioteci de functii Bibliotecile statice (static libraries) sunt colecii de functii care la link-editare sunt incluse complet n executabilele obtinute Avantaje: nu exista posibilitatea apariiei de incompatibiliti ntre library i aplicaie, din moment ce sunt compilate mpreun; sunt utilizate doar la compilare, deci nu sunt critice pentru funcionarea sistemului Dezavantaj: aplicaiile pot deveni mari, att ca executabile ct i ca surs. 9 17 Utilizarea Sistemelor de Operare Biblioteci de functii Bibliotecile partajate (shared libraries) sunt colectii de funcii care n momentul link-editrii sunt referite (reffered) n codul executabil rezultat i incrcate de ctre sistem n momentul apelrii programului. Avantaje: aplicaiile sunt mici, simplu de ntretinut Dezavantaje: la modificri semnificative aplicaiile dependente trebuie recompilate; sunt necesare la rularea aplicaiilor, deci sunt critice pentru stabilitatea sistemului 18 Utilizarea Sistemelor de Operare Biblioteci de functii Bibliotecile dinamice (dynamic libraries) sunt colectii de funcii care sunt ncarcate de ctre sistemul de operare n momentul n care sunt cutate. Dynamic load libraries = biblioteci dinamice ncarcate la cerere de ctre programe Exemplu de utilizare: programarea plugin-urilor pentru diferite aplicaii Bibliotecile dinamice sunt cunoscute n Windows sub numele de DLL-uri. 10 19 Utilizarea Sistemelor de Operare Compilarea cu GCC GNU Compiler Collection Ada (GCC for Ada a.k.a. GNAT) C C++ (GCC for C++ a.k.a. G++) Fortran (GCC for Fortran a.k.a. GFortran) Java (GCC for Java a.k.a. GCJ) Objective-C = o colecie de compilatoare produse n proiectul GNU, colecie distribuita de Free Software Foundation (FSF) sub licen GNU GPL and LGPL 20 Utilizarea Sistemelor de Operare Compilarea cu GCC Sintaxa: $ gcc <sursa> -g -Wall -o <fexecutabil> -g = include simboluri pentru debugging n fisierul rezultat -Wall = afieaza toate warning-urile -o <fexecutabil> = rezultatul compilrii este pus n fiierul <fexecutabil> n absena lui o <fexecutabil>, n mod implicit fiierul rezultat este a.out Pentru rularea programului rezultat n directorul curent, n Linux se utilizeaz comanda $ ./fexecutabil 11 21 Utilizarea Sistemelor de Operare Optimizarea programelor la compilare Se poate modifica gradul de optimizare al unui executabil prin utilizarea parametrului Ox -O0: nici o optimizare -O1 (acelai rezultat este obtinut i cu -O fr numr dup): -O2: timp de compilare mai mare decat in cazul anterior, performan mbuntita; aproape toate optimizrile sunt activate, mai puin loop unrolling si function inlining -O3: toate optimizrile activate Exemplu: $ gcc <sursa> -O2 -o <fexecutabil> 22 Utilizarea Sistemelor de Operare Utilizarea bibliotecilor cu GCC (exemple) Link-editarea implicit n procesul de compilare a bibliotecii de funcii standard C++ $ gcc <prog.cpp> -Wall -lstdc++ -o <executabil> $ g++ <prog.cpp> -Wall -o <executabil> Link-editarea implicit a bibliotecii de funcii matematice $ gcc <mat.c> -Wall lm -o <executabil_math> n mod asemntor, alte biblioteci pot fi link-uite n procesul de compilare folosind parametrii l 12 23 Utilizarea Sistemelor de Operare Automatizarea compilarii GNU Make Make este un utilitar care utilizeaz un script, numit Makefile, pentru a determina automat secvena de pai ce trebuie repetai deoarece nite fisiere s-au modificat. n principal este utilizat pentru: (re)compilarea programelor compuse din mai multe fiiere testarea programelor. Script-ul Makefile este de obicei generat de ctre un alt script n funcie de configuratia masinii curente O compilare standard, pe o main Linux, are urmtoarele etape: $ ./configure $ make $ make install 24 Utilizarea Sistemelor de Operare Un Makefile Un Makefile simplu gccopt=-Wall optimizare=-O2 ccompiler=gcc cppcompiler=g++ progc: $(ccompiler) m.c $(gccopt) $(optimizare) -o progc progcpp: $(cppcompiler) n.cpp $(gccopt) $(optimizare) o progcpp all: progc progcpp clean: rm progc rm progcpp 13 25 Utilizarea Sistemelor de Operare Workshop Studiul unui executabil, studiul unei biblioteci file, ldd, nm Analiza timpilor de execuie time Studiul system-call-urilor strace Code proofing (valgrind) Memory leak detection tool=memcheck, tool=addrcheck Call analysis tool=callgrind, kcallgrind (application)