La réalisation des projets est très importante tout au long du curcus de l’étudiant, et ça lui permet de améliorer ses compétences en programmation. Dans cet article je vais essayer de répertorier un ensemble de projet en langage C et C++ que j’ai pu récupérer sur un site du nom de www.CodeWithC.com, le site liste plus d’une cinquantaine de projet en C et C++. La liste en bas retient que la liste des projets les plus faciles pour débuter.
La liste en bas est celle des projets les plus communs en C et en C++ :
La perspective d’un étudiant pour le langage C, en tout cas c’était le cas pour moi lorsque j’étais étudiant, c’est que c’est un langage différent très puissant, dans le sens où il contient des mécanismes qui ouvrent la porte sur d’innombrables possibilités, comme par exemple la dualité pointeur/tableau, ou-bien la structuration de la boucle for, les unions, les pointeurs de fonctions, le nombre variable d’arguments dans les fonctions…etc. C’était des mécanismes certes parfois difficiles à apprendre mais le potentiel acquit met le langage à des années-lumières des autres langages qu’on étudiais à la même époque en algorithmique, comme le Pascal et le Basic. J’étais toujours intrigué par l’ingéniosité des développeurs de ce langage, et la réalité comme vous allez le voir sur la vidéo en bas, c’est que le langage historiquement a passé par différentes étapes, de réussite et d’échec dans les locaux de la compagnie de recherche Bell Labs, et avec le temps le langage petit à petit a mûri et devenu ce qu’on connaît maintenant comme le langage C.
La personne sur la vidéo s’appelle Brian Kernighan, c’est le coauteur du livre en question pour cet article, mais avant d’en parler du livre il vaut mieux revoir un peu l’historique du langage C. Alors ce langage était développé par Dennis Ritchie quand il était dans les laboratoires de Bell Labs dans le but de développer avec Ken Thompson le système d’exploitation UNIX, et le rendre portable sur plusieurs machines dont le PDP11, le langage C et le système d’exploitation UNIX auront une grande influence après respectivement sur les langages de programmation et les systèmes d’exploitation. Le langage C comme mentionné préalablement, n’a pas était inventé du néant, on peut tracer sommairement son évolution en commençant par le langage CPL, suivi par BCPL, ensuite du langage B, et finalement le langage C.
Le livre en question est appelé The C Programming Language écrit conjointement avec Brian Kernighan, la personne interviewée sur la vidéo, et Dennis Ritchie le développeur du langage C, le livre est parfois nommé K&R d’après les initiales des noms des deux auteurs. Ce livre a été pour très longtemps un best-seller et jusqu’à maintenant ça reste un livre intéressent pour apprendre le langage C, la plupart des livres en C qui ont suivi se sont fortement inspirés de lui, moi personnellement j’ai appris le C sur deux livres en français qui sont quasiment identiques dans leurs structures à original K&R. La bonne nouvelle c’est que le livre par son âge (première édition en 1978) est tombé dans le domaine public et il est devenu accessible gratuitement sur internet, d’ailleurs je vous ai mis juste en haut la version PDF à lire sur le site, il y a aussi la version sur les archives d’internet.
Dans l’électronique numérique le transistor prend une importance capitale concernant la conception et la création des circuits intégrés, tous les composants informatiques électroniques dans les PC et ordinateurs actuels sont dans la quasi-totalité constitués que de transistors, comprendre son fonctionnement devient primordial pour un informaticien même-s’il faut bien savoir que l’utilisation du transistor dans les circuits numériques reste basique, puisqu’il est utilisé comme un simple interrupteur électrique. La vidéo suivante de la chaîne YouTube d’électronique The Engineering Mindset donne une explication très pédagogique de l’utilisation d’un transistor.
De l’autre côté, la compréhension du
fonctionnement du transistor pour un électronicien représente une
étape importante et conséquente dans sa maîtrise du domaine, car
il faut savoir que le transistor et souvent pointé comme un obstacle
intimidant lors de l’apprentissage de l’électronique, c’est comme
les pointeurs en programmation, ils sont difficile à comprendre mais
leurs maîtrises est aperçue comme un essor important en habilité
de programmation.
Il est toujours fascinant de voir à
quel point l’humain a su construire si petit et si complexe les
processeurs et les puces électroniques, c’est le domaine de la
technologie qui représente le mieux la maîtrise de la précision et
de la complexité que l’humain n’a jamais pu réaliser auparavant.
Pour rappel, les traces à l’intérieur des processeurs actuels
vont arriver bientôt à 2 nanomètres (nanomètre = 2-9
mètre), bientôt sur 1 nanomètre on pourra compter à peu près 10
atomes de silicium, la matière dont les puces sont construites. Et
une complexité pour combiner 1 trillion de transistors (1 trillion =
1000 milliards) sur une seule puce, tous soigneusement arrangés et
bien synchronisés pour un rôle bien défini, ça donne l’étourdi !
Appréciation du spectacle en image
dans la vidéo en bas.
Et la vidéo suivante est une visualisation d’une simulation électrique au niveau transistor du processeur 4 bits d’Intel le 4004, il contient 2300 transistors. Historiquement c’est le premier microprocesseur à avoir été vendu en 1971.
Le CPU (Central Processing Unit) est communément ce qu’on appel processeur, et GPU (Graphical Processing Unit) est le processeur spécifique de la carte graphique. La principale différence entre les deux, c’est le CPU est un processeur générique, et théoriquement il peut exécuter n’importe quel algorithme, de l’autre côté le GPU est spécifique pour le rendu graphique et la 3D, il n’est pas générique mais il est très puisant, beaucoup plus puisant que le processeur pour les rendus graphiques. La vidéo en bas est celle de la chaîne YouTube Computerphile est la différence entre ces deux unités de calcul est plus détaillée.
Il existe quelques types d’applications qui sont adaptées pour l’exécution sur GPU, et il même possible d’exécuter ces types de programmes qui ne sont pas graphiques sur le GPU, cette manière de programmer s’inclut dans l’appellation connue sous GPGPU (General Purpose GPU), dans laquelle le programme en question est exécute sur le GPU et pas sur le CPU. Pour le faire, les constructeurs de cartes graphiques comme Nvidia et AMD fournissent des API (des bibliothèques) aux programmeurs leurs permettant la déportation de leurs programmes du CPU vers le GPU. C’est sûr que pas tous les programmes sont adaptés pour l’exécution sur GPU, les plus adaptés sont généralement les programmes hautement parallélisables, comme par exemple la Crypto-monnaie, l’Imagerie, la Simulation Physique, une partie de l’Intelligence Artificiel…etc.
Ça fait un bout de moment maintenant que je travaille sur la conception et construction des processeurs, que ça soit dans le domaine de la recherche ou dans le domaine académique, voici le dépôt GitHub pour tous les processeurs construits jusqu’à maintenant, la plupart sont des processeurs minimalistes éducatifs, sauf peut-être le 6502 qui lui est une implémentation d’un processeur réel, et le Megatron qui est l’implémentation d’une machine réelle. Dans la plupart des cas la programmation sur ces processeurs se fait en langage machine, ça veut dire en binaire, néanmoins quelques-uns ont le privilège d’avoir un assembleur dédié, la création d’un assembleur pour un processeur donnée est trivial et très simple, elle est réalisée à l’aide d’un outil qui simplifie énormément le travail de construction d’un assembleur personnalisé, le nom de l’outil est CustomAsm, il permet de créer un assembleur pour la majeure partie des processeurs actuels, il suffit pour le faire de remplir un fichier de spécification du langage machine et de mettre en correspondance les nouvelles instructions assembleurs à créer.
Mais jusqu’à maintenant je n’ai jamais eu l’opportunité de dépasser cette étape, et passer à l’étape suivante et créer un compilateur distinct pour un processeur donné, la raison est que je n’ai pas trouvé jusque-là une méthode directe et simple pour le faire, crée un compilateur personnalisé n’est pas une simple tâche, ça doit demander beaucoup d’énergie et beaucoup de connaissances théoriques qui ne sont pas si simples. Heureusement à force de chercher et un peu de chance je crois avoir trouvé une solution qui semble relativement gérable, c’est justement un projet fait par une personne avec les mêmes objectifs, créer un compilateur C personnalisé et simplifié pour une architecture matérielle donnée. Le projet semble de difficulté moyenne, disons une estimation entre 5000 et 10000 lignes de code, peut-être plus, c’est très bien documenté, et c’est surtout plus orienté pratique que théorique. Le langage C implémenté n’est pas le langage C complet, mais un sous-ensemble de ce dernier, ça reste quand même d’après l’auteur un compilateur robuste puisqu’il appartient à la catégorie des compilateurs capables de compiler eux-mêmes.
L’infographie est définie comme étant le domaine de création d’image numérique assisté par ordinateur, le domaine dans lequel des logiciels spécifiques sont utilisés pour aider à modeler des images et des illustrations graphiques, la suite d’Adobe avec ses logiciels phares Photoshop et Illustrator est sans doute la plus célèbre dans le domaine. Mais le livre dont on va parler ici concerne une autre définition du terme infographie, en Anglais c’est appelé Computer Graphics, et c’est la discipline de l’informatique englobant les études de méthodes pour générer et synthétiser du contenu visuel par ordinateur, généralement de la 3D (3 dimensions) mais ça peut inclure aussi de la 2D (2 dimensions), en d’autres mots c’est l’étude des algorithmes utilisés pour reproduire les scènes en 3D comme ceux utilisées dans les jeux vidéo, la simulation 3d, les environnements virtuels, les films d’animation 3D…etc.
Le livre avec la couverture en haut est nommé Computer Graphics from Scratch, from scratch signifie à partir de zéro. L’auteur est un enseignant en infographie et il a avec le temps réussi à rassembler une collection d’articles sur les algorithmes du domaine, et qui a décidé un jour de tout mettre dans un livre, le livre est payant mais tous les articles dans le livre sont heureusement gratuits et disponibles sur le site de l’auteur. Le livre et le site sont subdivisés en 2 parties, une pour le Raytraycing, dans laquelle des techniques et des algorithmes sont expliqués pour générer de la 3D en images de synthèse, c’est généralement la 3D utilisée dans les films et les séquence vidéos en 3D, la particularité du Raytraycing c’est que ça permet de produire de la 3D réaliste et de très bonne qualité, mais elle n’est pas temps réel, son rendu doit passer par un processus très lent de précalcul pour générer une séquence vidéo. La deuxième partie est sur la Rasterization, ça concerne le rendu en temps réel de la 3D, c’est la technologie utilisée dans les jeux vidéo, le rendu est instantanément produit sans précalcul, mais la qualité de la 3D n’est pas aussi réaliste que le Raytraycing.
L’avantage de ce livre c’est qu’il traite les principaux concepts de mathématique et de la géométrie, qui sont généralement assez difficiles dans d’autres livres du même genre, et arrive à les simplifier au niveau d’un lycéen, les algorithmes sont aussi présentés d’une manière très simple et très claire, sans oublier de mentionner sa taille qui est de 200 pages, le rendant très accessible. J’ai eu par le passé l’occasion de travailler sur un Rasterizer, il est présenté sur la vidéo en haut, c’est un petit moteur de rendu 3D dans lequel j’ai implémenté les éléments de base dans un Rasterizer, à savoir la translation, la rotation, le changement d’échelle, la texture, l’élimination de faces cachées…etc, malgré qu’il lui manque encore beaucoup de choses comme, le chargement d’objet 3D, le shading, l’ombrage..etc. C’est l’un des projets que j’ai beaucoup apprécié la programmation et dont j’ai beaucoup appris, le code est très petit sur approximativement 3000 lignes de code en C, il est public et disponible sur mon dépôt GitHubet que vous pouvez tester par vous même par ce lien.
J’ai fait la découverte récemment sur un livre online sur rassemblant une collection d’exercices en C++ fait spécialement pour des étudiants universitaires, l’auteur du livre est un enseignant qui a réussi avec le temps à collecter une base d’exercice. Le site de l’enseignant et le lien source du livre peuvent être utile pour plus d’informations et de ressources. Pratiquement la collection dans le livre est subdivisée en chapitres, qui traitent différents aspects du langage, comme les bases de C++, les Classes, les Templates, les Bibliothèques, les Exceptions, la programmation concurrentielle…etc.
L’algorithme de Dijkstra est un algorithme très connu dans le milieu académique informatique, à un certain niveau il n’existe pas un étudiant qui ne connaisse pas l’algorithme de Dijkstra ou n’avoir jamais entendu parler, la raison est que c’est un algorithme très utilisé en pratique, la manifestation de son utilisation la plus simple est sans doute la recherche du plus court chemin sur les navigateurs GPS des voitures ou sur Google map, il est surtout aussi bien connu dans son utilisation dans les protocoles de routage dans les réseaux informatiques, ça permet aux données de prendre le plus court chemin sur la toile d’internet.
La vidéo de la chaîne YouTube Computerphile est une explication de la manière dans l’algorithme fonctionne, l’algorithme de Dijkstra est un algorithme qui permet de trouver le plus court chemin dans un graphe, d’une manière simple, mathématiquement un graphe peut représenter des villes avec le chemin entre ces villes, il peut représenter les routeurs sur un réseau avec leurs connexions…etc. Malgré que les étapes par lesquelles l’algorithme passe semblent informes et compliqués ils sont aux contraires cohérents, consistants et logiques, supposons on demande à une personne de trouver le plus court chemin entre deux villes sur une carte avec de multiples villes et multiples chemins, il va intuitivement suivre les mêmes étapes de l’algorithme, ainsi il va commencer par choisir le chemin le plus court vers les villes voisines, garder la trace de tous les chemins et avancer d’une ville à l’autre, revenir sur un supposé long chemin s’il s’avère qu’il peut mener vers une ville donnée par un autre cours chemins et ainsi de suite. La façon de revenir vers d’anciens chemins est bien connue en algorithmique, ça s’appelle le backtracking, et l’algorithme de Dijkstra d’en fait parti ces algorithmes.
Une image pour représenter le flow chart ou l’organigramme qui permet de suivre les étapes pour une personne, et de lui permettre de réparer tout seul son réseau wifi local à la maison ou au travail, cette image était faite par un professionnel dans le domaine dans laquelle il a réussi à résumer son expertise de réparation sur un seul diagramme. La source de l’article d’où l’image en question a été empruntée est par ici. Pour pouvoir utiliser le diagramme il suffit juste d’analyser le type de panne dans le réseau en répondant aux questions sur le diagramme et en avançant étape par étape jusqu’à pouvoir discerner le problème dans le réseau.
Il vaut mieux télécharger l’image pour pouvoir la visualiser en entier.