Sunteți pe pagina 1din 13

Utilizarea Sistemelor de Operare

Compilarea programelor n Linux

- Curs 6 10.11.2005

Universitatea POLITEHNICA Bucureti

Compilarea programelor - Plan


Program vs. Executabil Interpretare vs. Compilare
Interpretor Compilator/Asamblor (+LinkEditor)

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

Biblioteci
Introducere Clasificare

Compilarea cu GCC
Introducere Optimizarea executabilelor Utilizarea bibliotecilor cu GCC-ul

GNU Make
Utilizarea Sistemelor de Operare 2

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
Utilizarea Sistemelor de Operare 3

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

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

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
Utilizarea Sistemelor de Operare 6

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 bytecode (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
Utilizarea Sistemelor de Operare 7

Interpretarea vs. Compilarea Just-in-Time Interpretoare


BASH PHP JavaScript Python Ruby Basic etc.

Compilatoare JIT
Java (Sun) .Net (Microsoft)

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)

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

Utilizarea Sistemelor de Operare

10

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

Utilizarea Sistemelor de Operare

11

Procesul de compilare

Utilizarea Sistemelor de Operare

12

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
Utilizarea Sistemelor de Operare 13

Schema de functionare a unui link-editor

Utilizarea Sistemelor de Operare

14

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)

Utilizarea Sistemelor de Operare

15

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.

Utilizarea Sistemelor de Operare

16

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

Utilizarea Sistemelor de Operare

17

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.
Utilizarea Sistemelor de Operare 18

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
Utilizarea Sistemelor de Operare 19

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
Utilizarea Sistemelor de Operare 20

10

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>
Utilizarea Sistemelor de Operare 21

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

Utilizarea Sistemelor de Operare

22

11

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
Utilizarea Sistemelor de Operare 23

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

Utilizarea Sistemelor de Operare

24

12

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)

Utilizarea Sistemelor de Operare

25

13