presentation
This commit is contained in:
		
							parent
							
								
									bc8dc81b8e
								
							
						
					
					
						commit
						e981669522
					
				
							
								
								
									
										
											BIN
										
									
								
								cycle1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								cycle1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 256 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								cycle2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								cycle2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 356 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								cycle3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								cycle3.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 300 KiB  | 
@ -44,6 +44,7 @@ header-includes:
 | 
				
			|||||||
- \setbeamercolor{subsection in sidebar shaded}{fg=grey}
 | 
					- \setbeamercolor{subsection in sidebar shaded}{fg=grey}
 | 
				
			||||||
- \setbeamercolor{title}{fg=ori}
 | 
					- \setbeamercolor{title}{fg=ori}
 | 
				
			||||||
- \setbeamercolor{titlelike}{fg=brown}
 | 
					- \setbeamercolor{titlelike}{fg=brown}
 | 
				
			||||||
 | 
					classoption: "aspectratio=43"
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Programme
 | 
					# Programme
 | 
				
			||||||
@ -54,6 +55,15 @@ Dans quel sens un "programme" ?
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Neovim
 | 
					## Neovim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					$ fd --extension c . 'neovim/' | wc -l
 | 
				
			||||||
 | 
					174
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Exemple d'un programme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Neovim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```sh
 | 
					```sh
 | 
				
			||||||
$ fd --extension c . 'neovim/' | wc -l
 | 
					$ fd --extension c . 'neovim/' | wc -l
 | 
				
			||||||
174
 | 
					174
 | 
				
			||||||
@ -62,4 +72,68 @@ $ wc `fd --extension c . 'neovim/'` -l
 | 
				
			|||||||
 ...
 | 
					 ...
 | 
				
			||||||
 300347 total
 | 
					 300347 total
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					# Parsing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Regex
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					^(\**\w+\s+?\ ?){1,}\([^!@#$+%^]+?\)\s+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					([a-zA-Z_0-9]+)\(.*\)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Un algo ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des CC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* call
 | 
				
			||||||
 | 
					* vu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des cycles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des cycles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\tiny
 | 
				
			||||||
 | 
					## Exemple d'un cycle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					void bar(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						toto(1, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int foo(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						hello();
 | 
				
			||||||
 | 
						bar();
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int toto(int a, int b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (a != 1)
 | 
				
			||||||
 | 
							foo();
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							aurevoir();
 | 
				
			||||||
 | 
						return a + b;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					\normalsize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des cycles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des cycles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Recherche des cycles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Fin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					|**Demo**|
 | 
				
			||||||
 | 
					|:------:|
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										47
									
								
								prez.md
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								prez.md
									
									
									
									
									
								
							@ -8,4 +8,49 @@ interpreté sous forme d'un graphe orienté avec un vecteur de successeur et un
 | 
				
			|||||||
graphe a matrice compacte. 
 | 
					graphe a matrice compacte. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pour exemple, voici un programme avec plusieur fichiers (174) et plusieurs
 | 
					Pour exemple, voici un programme avec plusieur fichiers (174) et plusieurs
 | 
				
			||||||
milliers de lignes de code (300347)
 | 
					milliers de lignes de code (300347).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Le code est parsé ligne par ligne contre 2 regex. Le premier pour les
 | 
				
			||||||
 | 
					definitions des fonctions et le deuxieme pour les appels des fonctions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Apres la construction des graphes, une des taches etait de cherches des
 | 
				
			||||||
 | 
					composantes connex dans ces graphes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Une CC dans un code est une fonction qui appele plusieurs autres fonctions. Par
 | 
				
			||||||
 | 
					exemple la fonction main est une composante connexe. Et une fonction qui n'est
 | 
				
			||||||
 | 
					pas appelé par main ou ses successeurs est consideré comme une autre CC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Pour ce faire, je pensais d'abord faire un algo de recherche, car sur internet
 | 
				
			||||||
 | 
					si on cherche des info sur le sujet, ils parlent de faire un algo. Comme c'est
 | 
				
			||||||
 | 
					moi qui construit le graphe, je peux deduire qui est une CC et qui n'en est
 | 
				
			||||||
 | 
					pas. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					J'ai donc introduit une variable call dans mes stucture pour dire si une
 | 
				
			||||||
 | 
					fonction (noeud) a été appelé ou pas. Puis, j'ai une variable vu, qui dis si
 | 
				
			||||||
 | 
					lors de print d'un noeud (main), on a vu cette fontion. Et donc toute fonction
 | 
				
			||||||
 | 
					qui etait pas vu peut etre une CC.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					L'etape suivante etait de trouver des cycles des appels de fonctions. Voici un
 | 
				
			||||||
 | 
					exemple de cycle. On voit que la fonction bar appele la fonction toto qui appel
 | 
				
			||||||
 | 
					la fonction foo qui reappel la fonction bar. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Pour la recherche de cycles, j'ai utilisé l'algo DFS (Deep First Search /
 | 
				
			||||||
 | 
					recherche en profondeur).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					J'ai trouvé un pseudo-code sur internet que j'ai utilisé et adapté pour mes
 | 
				
			||||||
 | 
					structures. Dans le pseudo-code il y a 3 algorithmes. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dans le premier on parcour le graph, pour chaque noeud on crée une pile vide,
 | 
				
			||||||
 | 
					on push le noeud courrant dans la pile, on dis que le noeud est dans la stack
 | 
				
			||||||
 | 
					et on fait un DFS dedans.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Deuxieme algo est le DFS. Pour chaque successeur dans le noeud on regarde s'il
 | 
				
			||||||
 | 
					est visité ou dans la pile. Si le successeur est dans la pile, ca veut dire
 | 
				
			||||||
 | 
					qu'on a trouvé un cycle. Donc on affiche le cycle. Si le successeur est pas
 | 
				
			||||||
 | 
					encore visité, on le push dans la stack en indiquant qu'il est desormais dans
 | 
				
			||||||
 | 
					la stack, et on appele recursivement DFS pous ce successeur.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A la fin on indique qu'on a fini avec le noeud et on pop la derniere valeur de
 | 
				
			||||||
 | 
					la pile.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Dans le troisieme algo on print le cycle. 
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,7 @@ void find_funcs(const char *path, graph_vec *gv, graph_mco *gmc, double *tv, dou
 | 
				
			|||||||
	regmatch_t rm[2];
 | 
						regmatch_t rm[2];
 | 
				
			||||||
	bool in;
 | 
						bool in;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *re_func_decl = "^(\\**\\w+\\s+?\\ ?\\ ?){1,}\\([^!@#$+%^]+?\\)\\s+";
 | 
						const char *re_func_decl = "^(\\**\\w+\\s+?){1,}\\([^!@#$+%^]+?\\)\\s+";
 | 
				
			||||||
	const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)";
 | 
						const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	token = malloc(1024 * sizeof(char));
 | 
						token = malloc(1024 * sizeof(char));
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user