Mode
Slides
Presentation
Remote control
Send
Listen
Press F11 to switch to fullscreen.
C: Cours 10
1
Compiler
2
Preprocesseur
3
Preprocesseur
4
Preprocesseur
5
Parser
6
Verification
7
IR
8
Optimisations
9
Optimisations
10
Optimisations
11
Optimisations
12
Executable
13
Linker
14
Linker
15
Plusieurs étapes
16
Semaine 10
Compilateur,
inclure des bibliothèques
SSIE Programmation en C, Thomas Lochmatter, 2019
1

Compiler un programme C

gcc -Wall projet.c image.c -lpng -lm -o projet
projet.c projet.h image.c image.h Bibliothèquestandard C BibliothèquePNG Bibliothèquelibm stdio.h, ... png.h math.h projet.o image.o libc.so libpng.so libm.so projet Dépendences:libpng.so, libm.so et libc.so
2
	#include <stdio.h>
	#include <math.h>

	int main(int argc, char * argv[]) {
		double resultat = sin(15.0 / 180.0 * M_PI);
		printf("%f\n", resultat);
		return 0;
	}
		// Dans math.h
		...
		#define M_PI 3.14159265358979323846
		...
	
3
	#define M_PI 3.14159265358979323846

	double resultat = sin(15.0 / 180.0 * M_PI);
	double resultat = sin(15.0 / 180.0 * 3.14159265358979323846);
	// Problématique
	#define M_PI 0 + 3.14159265358979323846

	double resultat = sin(15.0 / 180.0 * M_PI);
	double resultat = sin(15.0 / 180.0 * 0 + 3.14159265358979323846);
4
	#ifndef SIE_IMAGE
	#define SIE_IMAGE
	...

	struct Image {
		int width;
		int height;
		struct Pixel * pixels;
	};

	void image_create(struct Image * image, int width, int height);
	...

	#endif
C preprocessor sur Wikipedia
5
/ * 3.141 15.0 180.0 sin resultat Assignment Instruction double appel op op const const const main Function definition Expression Instruction printf appel argc int argv char * [] "%f\n" const resultat symbol return Instruction 0 const main.c, ligne 5 main.c, ligne 6
Erreurs de syntaxe
par ex. ";" oublié
Parsing sur Wikipedia
6
/ * 3.141 15.0 180.0 sin resultat Assignment Instruction double appel double double const const const main Function definition Expression Instruction printf appel argc int argv char * [] "%f\n" const resultat double return Instruction 0 const sin(x) de math.h printf(...) de stdio.h
Erreurs sémantiques
par ex. mauvais type
Name binding sur Wikipedia, Type safety sur Wikipedia
7
str0000 = constant "%f\n"

main:
  tmpA ← double div, 15.0, 180.0
  tmpB ← double mul, tmpA, 3.141
  resultat ← call sin, tmpB
  call printf, str0000, resultat
  return 0
GCC: RTL, LLVM: IR
8
	for (int i = 0; i < 360; i++) {
		double s = sin(M_PI / 180.0 * i);
		...
	}

	// Optimisé
	double tmpA = M_PI / 180.0;
	for (int i = 0; i < 360; i++) {
		double tmpB = tmpA * i;
		double s = sin(tmpB);
		...
	}
tmpA i tmpB s 180.0 3.14
9
	# Compiler avec optimisations
	$$ gcc -Wall -O2 ...
-O0 Pas d'optimisations (idéal pour débugger avec GDB)
-O1 Optimisations simples (low-hanging fruits)
-O2 Presque toutes les optimisations
-O3 Exécutable plus grand, mais encore plus rapide
-Os Optimiser la taille de l'exécutable (size)
10
	int gris(struct Pixel * pixel) {
		return pixel->r + pixel->g + pixel->b;
	}

	void traitement() {
		...

		for (int i = 0; i < image.width * image.height; i++) {
			int gr = gris(image.pixels + i);
			...
		}

		...
	}
11
a ← a + b * c

Processeur sans FMA

tmp ← b * c
a ← a + tmp

Processeur avec FMA

fma a, b, c
FMA = fused multiply-accumulate, Multiply–accumulate operation sur Wikipedia
12
0000000000001135 main
1135:	55                   	push   %rbp
1136:	48 89 e5             	mov    %rsp,%rbp
1139:	48 83 ec 20          	sub    $0x20,%rsp
113d:	89 7d ec             	mov    %edi,-0x14(%rbp)
1140:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
1144:	f2 0f 10 05 c4 0e 00 	movsd  0xec4(%rip),%xmm0
114b:	00 
114c:	f2 0f 11 45 f8       	movsd  %xmm0,-0x8(%rbp)
1151:	f2 0f 10 45 f8       	movsd  -0x8(%rbp),%xmm0
1156:	48 8d 3d ab 0e 00 00 	lea    0xeab(%rip),%rdi
115d:	b8 01 00 00 00       	mov    $0x1,%eax
1162:	e8 c9 fe ff ff       	callq  1030 <printf@plt>
1167:	b8 00 00 00 00       	mov    $0x0,%eax
116c:	c9                   	leaveq
116d:	c3                   	retq
116e:	66 90                	xchg   %ax,%ax
objdump -d programme pour afficher le code compilé
13
projet.c projet.h image.c image.h Bibliothèquestandard C BibliothèquePNG Bibliothèquelibm stdio.h, ... png.h math.h projet.o image.o libc.so libpng.so libm.so projet Dépendences:libpng.so, libm.so et libc.so
14
projet.o image.o libc.so libpng.so libm.so Fournit Utilise main image_readprintfsqrtimage_write_to_pngimage_free Fournit Utilise fprintffopenpng_create_read...png_get_image_w...png_get_image_h...png_get_color_typemallocfree... image_readimage_write_to_pngimage_free Fournit Utilise mallocfree... png_create_read...png_get_image_w...png_get_image_h...png_get_color_type... Fournit sqrtsincos... Fournit mallocfreeprintffprintffopen...
Erreurs du linker
par ex. fonction non trouvée
Linker (computing) sur Wikipedia, nm -D libX.so pour afficher les symboles d'une bibliothèque
15

Compiler fichier par fichier

Pour les grands projets
	# Compiler
	$$ gcc -Wall -O2 -c projet.c -o projet.o
	$$ gcc -Wall -O2 -c image.c -o image.o

	# Linker
	$$ gcc -Wall projet.o image.o -ljpeg -lpng -lm -o projet

	# Exécuter
	$$ ./projet
16