Sunteți pe pagina 1din 42

Cursul 6

Compilarea programelor

Utilizarea Sistemelor de Operare (USO) 5 noiembrie 2012


Departamentul de Calculatoare

CSE Dep

Cursul 6, Compilarea programelor

1/48

Moto

There are only two kinds of programming languages: those people always bitch about and those nobody uses. Bjarne Stroustrup One of the main causes of the fall of the Roman Empire was that lacking zero they had no way to indicate successful termination of their C programs. Robert Firth

CSE Dep

Cursul 6, Compilarea programelor

2/48

Interfat n linia de comand a ,a

CLI

prompt

comenzi

terminal

interfa

shell variabile de mediu

operatori

expandare

escapare

variabile

expresii regulate globbing grep

CSE Dep

Cursul 6, Compilarea programelor

3/48

Unix shell

http://www.fireboxtraining.com/blog/wp-content/uploads/2012/02/Unix.png

CSE Dep

Cursul 6, Compilarea programelor

4/48

Suport curs

Suport (Introducere n sisteme de operare)


Capitolul 11 Compilare s , i linking

CSE Dep

Cursul 6, Compilarea programelor

5/48

Programe

Ce este un program?
s a) , ier executabil binar (cont , inutul este cod mas , in

Care este faza init a n care se g ases , ial , te un program?


s a s , ier cod surs , ier text ce cont , ine implementarea programului ntr-un limbaj de programare C app.c, app.h C++ Java app.cpp, app.cxx, app.C, app.hpp Application.java

Perl, Python, Lisp etc. se mai numes a (surs a C, surs a Java, etc.) , te simplu surs scriere de cod surs a sau scriere de cod

la nceput programele erau scrise direct n cod mas a (binar) , in (cartele perforate)

CSE Dep

Cursul 6, Compilarea programelor

7/48

Editoare

scrierea de s n particular cod surs a) , iere text ( editoare


simple one tool for the job
vim, Emacs, nano, joe notepad++, notepad2, UltraEdit, Crimson Editor

integrate (IDE)
Visual Studio 2010 (varianta Visual Studio Express Edition este free) Eclipse, NetBeans Emacs, Kdevelop

facilit at ,i
syntax higlighting, auto indentation, utilitare pentru debugging integrate code folding, code completion (autocompletion)

CSE Dep

Cursul 6, Compilarea programelor

8/48

Emacs

CSE Dep

Cursul 6, Compilarea programelor

9/48

Eclipse

CSE Dep

Cursul 6, Compilarea programelor

10/48

Compilare s , i interpretare

un s a poate compilat sau interpretat , ier cod surs deosebirea ntre compilare s , i interpretare
compilare: codul surs a este translatat de un program denumit compilator n cod mas a, dup a care poate executat , in interpretare: un program este executat direct din cod surs a prin intermediul unui interpretor

multe limbaje au at at compilatoare, c at s , i interpretoare: C, Lisp


GCC (GNU Compiler Collection) compilator de C, C++, Ada, Fortran MSVC (Microsoft Visual C) compilator de C, C++ GCL (GNU Common Lisp) interpretor de Common Lisp

CSE Dep

Cursul 6, Compilarea programelor

12/48

Compilare s , i interpretare

limbaje tradit , ional compilate


C, C++, Objective-C, Pascal, Java, Ada

limbaje tradit , ional interpretate (limbaje de scripting)


Perl, PHP, Python, Lisp, Ruby, shell scripting (bash, csh, ksh)

avantaje/dezavantaje
interpretare
limbaje, n general, mai us nt , or de , eles de programator debugging facil execut a , ie lent

compilare
debugging greoi (folosirea unui depanator debugger) vitez a reidicat a de execut , ie

CSE Dep

Cursul 6, Compilarea programelor

13/48

My codes compiling

http://xkcd.com/303/

CSE Dep

Cursul 6, Compilarea programelor

14/48

Compilare
un compilator este un translator
translateaz a codul surs a n cod obiect; de la un limbaj de nivel nalt n cod mas a , in

un compilator va genera de obicei un executabil


Compilare n Windows
F:\code>cl simple.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. simple.c Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. /out:simple.exe simple.ob

CSE Dep

Cursul 6, Compilarea programelor

15/48

Compilare (cont.)

Compilare n Linux
n@asgard:~/code$ ls main.c razvan@asgard:~/code$ gcc main.c razvan@asgard:~/code$ ls a.out main.c razvan@asgard:~/code$ file a.out a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped

CSE Dep

Cursul 6, Compilarea programelor

16/48

Fazele compil arii

component a/utilitar specializat pentru ecare faz a preprocesare: cpp


nlocuirea directivelor de preprocesare (#include, #define) nu este specic tuturor limbajelor

compilare efectiv a: gcc


translatarea codului surs a (preprocesat) n limbaj de asamblare

asamblare: as
translaterea s n limbaj de asamblare ntr-un modul , ierului obiect (cod mas a) , in

linking: ld
legarea mai multor module obiect s ntr-un modul de , i biblioteci sine st at ator (de obicei un s , ier executabil)

CSE Dep

Cursul 6, Compilarea programelor

18/48

Fazele compil arii

CSE Dep

Cursul 6, Compilarea programelor

19/48

Fis a , ier cod surs

componenta vizibil a programatorului declarat , ii de variabile, funct , ii, clase etc. sintaxa impus a de limbajul respectiv s ier text ( ntr-un limbaj de programare) ,
memcap.c btdownloadheadless.py checkpatch.pl dispatch.rb

De ce i se spune cod surs a?


pentru c a nu este limbaj natural; nu este us , or inteligibil

CSE Dep

Cursul 6, Compilarea programelor

20/48

I Write Code

http://i1.cpcache.com/product/19460466/i_write_code_mousepad.jpg

CSE Dep

Cursul 6, Compilarea programelor

21/48

Fazele compil arii preprocesare

CSE Dep

Cursul 6, Compilarea programelor

22/48

Preprocesare

CSE Dep

Cursul 6, Compilarea programelor

23/48

Fazele compil arii compilare

CSE Dep

Cursul 6, Compilarea programelor

24/48

Compilare
t , ine cont de sintaxa s , i semantica programului
sintax a: programul respect a un set de reguli (o anumit a gramatic a)
operatorul + poate avea doi operanzi sau poate avea unul singur

semantic a: instruct a aib a sens , iunile din program trebuie s


se adun a un num ar cu un alt num ar, nu un num ar cu un s , ir de caractere

se obt sier in limbaj de asamblare , ine program incorect din punct de vedere sintactic sau semantic erori la compilare:
Erori de compilare
razvan@asgard:~/code$ gcc main.c main.c: In function `main: main.c:6: error: `i undeclared (first use in this function) main.c:6: error: (Each undeclared identifier is reported only once main.c:6: error: for each function it appears in.)

CSE Dep

Cursul 6, Compilarea programelor

25/48

Compilare (2)
#include <stdio.h> #define ITERATIONS 10 #define INITIAL 1 #define HEADER_STRING "Number sum:" int main (void) { int i; int sum; sum = 0; printf (HEADER_STRING); for (i = INITIAL; i < INITIAL + ITERATIONS; i++) sum += i; printf ("%d\n", sum); return 0; }

razvan@asgard:~/code$ gcc -S simple.c razvan@asgard:~/code$ cat simple.s .file "simple.c" .section .rodata .LC0: .string "Number sum: " .LC1: .string "%d\n" .text .globl main .type main, @function main: pushl %ebp movl %esp, % ebp subl $24, %esp andl $-16, %esp ... movl $0, -8(%ebp) movl %,LC0, (%esp) call printf ...
26/48

CSE Dep

Cursul 6, Compilarea programelor

Fazele compil arii limbaj de asamblare

CSE Dep

Cursul 6, Compilarea programelor

27/48

Limbaj de asamblare

form a de reprezentare a instruct , iunilor procesorului


foloses , te mnemonici (movl, cmpl, addl)
movl $0, %eax ; stocheaz a valoarea 0 in eax

extensia .asm (Windows) sau .s (Unix) o instruct n limbaj de asamblare , iune


operatori (add, mul, cmp, mov) operanzi pus , i la dispozit , ie de procesor (registre, locat , ii de memorie)

CSE Dep

Cursul 6, Compilarea programelor

28/48

Folosire limbaj de asamblare

construire unor module pure integrare n programe C inline assembly


__asm__ ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo" : /* no outputs */ : "g" (from), "g" (to) : "r9", "r10");

limbaj depedent de arhitectur a


greu extensibil dicil de ment , inut

C and folosim limbajul de asamblare?


limbajul de nivel nalt nu ne ofer a un suport pentru anumite instruct , iuni ale procesorului anumite p art an a , i din cod trebuie optimizate de m

CSE Dep

Cursul 6, Compilarea programelor

29/48

Fazele compil arii asamblor

CSE Dep

Cursul 6, Compilarea programelor

30/48

Asamblare
Asamblare
razvan@asgard:~/code$ as -o simple.o simple.s razvan@asgard:~/code$ objdump --disassemble simple.o simple.o: file format elf32-i386 Disassembly of section .text: 00000000 <main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 18 sub $0x18,%esp 6: 83 e4 f0 and $0xfffffff0,%esp 9: b8 00 00 00 00 mov $0x0,%eax e: 29 c4 sub %eax,%esp 10: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp) 17: c7 04 24 00 00 00 00 movl $0x0,(%esp) 1e: e8 fc ff ff ff call 1f <main+0x1f> 23: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp) ... 4f: e8 fc ff ff ff call 50 <main+0x50> 54: b8 00 00 00 00 mov $0x0,%eax 59: c9 leave 5a: c3 ret
CSE Dep Cursul 6, Compilarea programelor 31/48

Asamblare (2)

translatarea s n limbaj de asamblare n s , ierului , ier cod obiect instruct n limbaj de asamblare se traduc una c ate una n , iunile echivalentul lor binar (cod mas in a ) , asamblor
Exemplu rulare as
razvan@asgard:~/code$ as -o simple.o simple.s

Exemplu rulare cl (MSVC)


F:\code>cl /Fasimple.asm simple.c

CSE Dep

Cursul 6, Compilarea programelor

32/48

Fazele compil arii modul obiect

CSE Dep

Cursul 6, Compilarea programelor

33/48

Fis , iere cod obiect


extensia .obj (Windows) sau .o (Unix) cont , in, codicate, variabilele (zona de date) s , i instruct , iunile programului (zona de cod)
objdump investigarea unui modul obiect (dezasamblarea)
razvan@asgard:~/code$ objdump -s simple.o simple.o: file format elf32-i386 Contents of section .text: 0000 5589e583 ec1883e4 f0b80000 000029c4 0010 c745f800 000000c7 04240000 0000e8fc [...] Contents of section .rodata: 0000 4e756d62 65722073 756d3a20 0025640a [...]

U.............). .E.......$......

Number sum: .%d.

nm identicarea simbolurilor dintr-un modul obiect


razvan@asgard:~/code$ nm simple.o 00000000 T main U print
CSE Dep Cursul 6, Compilarea programelor 34/48

Biblioteci

bibliotec a = library = libr arie colect atre programe stocate , ie de funct , ii des utilizate de c ntr-un singur s , ier (modul)
e fapt, o colect siere binare) , ie de module obiect (

nu sunt independente (precum executabilele)


module ce pot ajuta la crearea unui executabil

n prezent, o parte important a din codul programelor se reg ases n biblioteci , te


libc (biblioteca standard C), libpurple (Pidgin), libpng /lib/*, /usr/lib/*

CSE Dep

Cursul 6, Compilarea programelor

36/48

Biblioteci (cont.)

biblioteci statice (static libraries )


funct a apelate de un program sunt atas , iile de bibliotec , ate codului executabil la linking codul executabil se m ares , te eventuale modic ari ale bibliotecii din sistemul de operare nu afecteaz a n nici un fel programul

biblioteci dinamice (dynamic libraries /shared object )


la linking se creeaz a referint atre funct ar aa , e c , iile apelate f incluse efectiv n executabil biblioteca va nc arcat a n momentul execut , iei programului (loading) cod executabil minim este nevoie de recompilare dac a modic am biblioteca extensia .so n Linux s i .dll n Windows ,

CSE Dep

Cursul 6, Compilarea programelor

37/48

Fazele compil arii linker

CSE Dep

Cursul 6, Compilarea programelor

38/48

Linking

mai multe module obiect (inclusiv biblioteci) sunt grupate ntr-un modul de sine st at ator (de obicei executabil) la legare/linking se rezolv a referint , ele
un modul apeleaz a o funct a) dintr-un alt , ie (sau o variabil modul n urma compil arii se creeaz a o referint a c atre acea funct , , ie (f ar a a se s n ce modul se g ases , ti , te) linker-ul rezolv a aceste referint asind funct , e, g , iile (variabilele) apelate din alte module dac a se apeleaz a o funct ases , ie dintr-un modul ce nu se reg , te la linking, apare eroare la linking

CSE Dep

Cursul 6, Compilarea programelor

39/48

Crearea de biblioteci
s a funct , ierul add.c implementeaz , ia add, iar sub.c implementeaz a funct , ia sub biblioteca va cont a module , ine cele dou
Crearea s , i legarea unei biblioteci statice
razvan@asgard:~/code$ razvan@asgard:~/code$ razvan@asgard:~/code$ razvan@asgard:~/code$ add.o sub.o razvan@asgard:~/code$ gcc -Wall -c add.c gcc -Wall -c sub.c ar cr libsimple.a add.o sub.o ar t libsimple.a

gcc -Wall -L. -o lib_main lib_main.c -lsimple

Crearea s , i legarea unei biblioteci partajate


razvan@asgard:~/code$ razvan@asgard:~/code$ razvan@asgard:~/code$ razvan@asgard:~/code$ razvan@asgard:~/code$
CSE Dep

gcc -Wall -fPIC -c add.c gcc -Wall -fPIC -c sub.c gcc -fPIC -shared -o libsimple.so add.o sub.c export LD_LIBRARY_PATH=. gcc -Wall -L. -o lib_main lib_main.c -lsimple
Cursul 6, Compilarea programelor 40/48

Compilers: Principles, Techniques and Tools

The Dragon Book Aho, Sethi, Ullman 2nd Edition, 2006 cartea de baz a pentru toate cursurile de compilatoare din universit at ,i expunere exhaustiv a a analizei sintactice, semnatice s ,i parserelor

CSE Dep

Cursul 6, Compilarea programelor

42/48

Guido van Rossum

inventatorul limbajului de programare Python Benevolent Dictator for Life (BDFL) pentru Python activeaz a la Google

CSE Dep

Cursul 6, Compilarea programelor

43/48

Google

google.com cel mai folosit site din lume fondat a de Larry Page s , i Sergey Brin lansat a n 1998 init , ial: search engine + advertising aplicat , ii web Android Chrome YouTube

CSE Dep

Cursul 6, Compilarea programelor

44/48

Valgrind

http://valgrind.org detectarea de probleme la rulare (runtime ) n principal folosit pentru probleme de lucru cu memoria Linux s , i Darwin (Mac OS X) un engine peste care ruleaz a componente dedicate: memcheck (implicit), cachegrind, callgrind, helgrind

CSE Dep

Cursul 6, Compilarea programelor

45/48

Cuvinte cheie

program cod surs a editor IDE compilator interpretor preprocesare compilare

limbaj de asamblare asamblare cod obiect bibliotec a linker executabil cpp, gcc, gas, ld objdump, nm

CSE Dep

Cursul 6, Compilarea programelor

46/48

Resurse utile

http://en.wikipedia.org/wiki/List_of_text_editors http://en.wikipedia.org/wiki/Comparison_of_integrated_development_ environments http://www.microsoft.com/express/ http://en.wikipedia.org/wiki/Source_code http://www.oualline.com/style/index.html

CSE Dep

Cursul 6, Compilarea programelor

47/48

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

  • Lab7 USO
    Lab7 USO
    Document12 pagini
    Lab7 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab6 USO
    Lab6 USO
    Document10 pagini
    Lab6 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab4 USO
    Lab4 USO
    Document11 pagini
    Lab4 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab9 USO
    Lab9 USO
    Document9 pagini
    Lab9 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab11 USO
    Lab11 USO
    Document12 pagini
    Lab11 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab 10 USO
    Lab 10 USO
    Document11 pagini
    Lab 10 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Culegere de Ghicitori PT Copii
    Culegere de Ghicitori PT Copii
    Document70 pagini
    Culegere de Ghicitori PT Copii
    riana 77
    100% (2)
  • Lab8 USO
    Lab8 USO
    Document8 pagini
    Lab8 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab3 USO
    Lab3 USO
    Document13 pagini
    Lab3 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab5 USO
    Lab5 USO
    Document9 pagini
    Lab5 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 13 Handout
    Curs 13 Handout
    Document38 pagini
    Curs 13 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 05 Handout
    Curs 05 Handout
    Document37 pagini
    Curs 05 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Lab2 USO
    Lab2 USO
    Document13 pagini
    Lab2 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab12 USO
    Lab12 USO
    Document5 pagini
    Lab12 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Lab1 USO
    Lab1 USO
    Document5 pagini
    Lab1 USO
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 11 Handout
    Curs 11 Handout
    Document37 pagini
    Curs 11 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 12 Handout
    Curs 12 Handout
    Document36 pagini
    Curs 12 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 02 Handout
    Curs 02 Handout
    Document39 pagini
    Curs 02 Handout
    Sarah Hernandez
    Încă nu există evaluări
  • Curs 09 Handout
    Curs 09 Handout
    Document40 pagini
    Curs 09 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 04 Handout
    Curs 04 Handout
    Document43 pagini
    Curs 04 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 10 Handout
    Curs 10 Handout
    Document41 pagini
    Curs 10 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 00 USO Facultatea Politehnica Bucuresti
    Curs 00 USO Facultatea Politehnica Bucuresti
    Document26 pagini
    Curs 00 USO Facultatea Politehnica Bucuresti
    Daniela Dragan
    Încă nu există evaluări
  • USO Curs 07 Handout
    USO Curs 07 Handout
    Document38 pagini
    USO Curs 07 Handout
    Alexandru Grigore
    Încă nu există evaluări
  • Curs 03 Handout
    Curs 03 Handout
    Document41 pagini
    Curs 03 Handout
    Sarah Hernandez
    Încă nu există evaluări
  • Comenzi Latex
    Comenzi Latex
    Document2 pagini
    Comenzi Latex
    mari_eu
    Încă nu există evaluări
  • Latex Prin Exemple
    Latex Prin Exemple
    Document212 pagini
    Latex Prin Exemple
    Denis Ibram
    Încă nu există evaluări
  • Curs 08 Handout
    Curs 08 Handout
    Document36 pagini
    Curs 08 Handout
    Mihai Stanescu
    Încă nu există evaluări
  • Curs 01 Handout
    Curs 01 Handout
    Document28 pagini
    Curs 01 Handout
    Sarah Hernandez
    Încă nu există evaluări
  • CV Tip Simplu
    CV Tip Simplu
    Document1 pagină
    CV Tip Simplu
    AnNe MaRie
    100% (1)