Sunteți pe pagina 1din 13

1

Universitatea POLITEHNICA Bucureti


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)

S-ar putea să vă placă și