La programmation d’un émulateur

Étant actuellement un enseignant en architecture des ordinateurs, et un enseignant de programmation et structures de données dans le passé. Je peux sereinement suggérer aux étudiants en informatique, que le meilleur exercice pour maitriser les 2 disciplines est de développer soi-même un émulateur. Alors c’est quoi un émulateur ? L’émulateur par définition est un logiciel qui va reproduire ou répliquer exactement le même comportement d’une machine donnée sur une machine hôte différente. Vous pouvez par exemple émuler une console du type Nintendo sur un PC de bureau. L’émulateur va se comporter exactement comme une console Nintendo le ferait réellement. Vous aurez ainsi l’équivalent d’une console installé sur un PC et vous pourrez jouer à cette console. 

Le fait de programmer un émulateur est très enrichissant pour un étudiant. Ça va premièrement, le faire investir en programmation sur un projet relativement de grande envergure, à la différence des petits exercices et travaux pratiques qu’il a l’habitude de faire dans lequel il doit planifier au préalable et construire une architecture logicielle qu’il doit suivre et soutenir tout au long du projet. Et deuxièmement, il doit bien maîtriser l’architecture de la machine à émuler. Il doit effectivement reproduire en logiciel les composantes hardwares de la machine. Ainsi, il va reconstruire le processeur avec toutes ses instructions et ses caractéristiques, il doit aussi reproduire les mémoires de la machine, le système vidéo, le système de son, les entrées/sorties… etc. Sur la vidéo en bas de la chaîne YouTube Computerphile, un émulateur pour la célèbre machine Atari 2600 est grossièrement décrit par le docteur Steve Bagley.

L’émulateur de machines

Il faut savoir que les consoles de jeux sont principalement les émulateurs les plus connus parmi les émulateurs de toutes les machines. Pour la simple raison que ça va permettre aux utilisateurs de jouer à ces machines sur leurs propres ordinateurs. Malheureusement, ces consoles de jeux sont parmi les machines les plus dures à émuler, en raison de la complexité de leur système graphique. Cependant, pour un étudiant avec un bon niveau en programmation et en architecture des ordinateurs, Il lui est possible de développer des émulateurs jusqu’à la 4e génération des consoles de jeux, même si que pour faire tourner de simple démo ou homebrew, incluant ainsi des consoles comme la Nintendo NES, SNES, Sega Mega Drive, Master System…etc. Ce qu’on appelle les consoles à 16 bits. À partir de la 5e génération, ou les consoles dites 32 bits, ça devient difficile pour un simple étudiant de développer tout seul un émulateur pour une machine de ce type, en raison que ces machines sont devenues beaucoup plus puissantes que les précédentes, principalement à cause de l’intégration de la technologie 3D. On peut compter parmi ces consoles, la Sony Playstation 1, La Sega Saturn, La Nintendo 64. Jusqu’aux dernières générations de consoles. 

La complexité d’un algorithme

Pour concevoir des logiciels bien optimisés, il est souvent nécessaire de pouvoir distinguer les algorithmes optimaux des algorithmes trop gourmands en ressources. D’où l’entrée en jeu de l’étude de la complexité d’un algorithme, qui devient primordiale pour reconnaître son optimalité dans le monde réel. En d’autres mots, ça permet de prédire le comportement d’un algorithme avec un nombre très élevé de données.

Pour avoir une compréhension de c’est quoi la complexité d’un algorithme, appelez aussi le grand-O (Big-O en anglais), on va imaginer un exemple simple, supposons qu’un algorithme nécessite une seconde pour calculer 10 données, sa complexité est monotone (O(n)) s’il lui faudrait 10 secondes pour finir 100 données. Par contre si c’est un algorithme optimal il lui faudrait moins de temps. Ou inversement si c’est un algorithme gourmand il lui faudrait plus. La complexité permet plus ou moins de prédire ce temps. 

Notion du Big-O (par www.geeksforgeeks.org)

À vrai dire, l’étude de la complexité est une méthode mathématique relativement difficile à appréhender à première vue. La principale raison est que cette méthode ne ressemble à aucun domaine mathématique vu auparavant dans le cursus de l’étudiant. On peut grossièrement la qualifier comme un point d’intersection entre le calcul arithmétique et le calcul des limites dans l’analyse mathématique. D’une part, malgré que le but de la méthode soit le calcul du temps nécessaire pour l’exécution en rapport avec les données exercées sur l’algorithme, elle ne va pas faire un calcul arithmétique exacte de ce temps comme on avait vu sur l’exemple, mais elle va plutôt nous fournir une approximation. Et d’autre part la méthode tend à évaluer le temps pour un nombre très grand de données, et s’appuyer sur des procédés mathématiques qui sont similaires au calcul des limites, comme par exemple négliger les fonctions les moins rapides (comme par exemple : 2X2 + 4X +1 tend vers X2). Mais en même temps, ce n’est pas un calcul de limite. La complexité va réellement nous retourner une fonction parmi les fonctions illustrées sur le graphe en haut. Cette fonction va nous donner une estimation de la rapidité en complexité de l’algorithme en rapport avec le nombre de données. La vidéo en bas de la chaîne YouTube du site web éducatif www.freecodecamp.org illustre cette notion de complexité sous format d’un cours de courte durée pour appréhender plus ou moins cette notion du Big-O. 

Cours sur la complexité d’algorithme

John Carmack le meilleur programmeur au monde !

On va présenter là l’un des meilleurs programmeurs au monde, en tout cas selon les dires de nombreux acteurs de l’industrie du software. John Carmack est un développeur qui a su affirmer sa notoriété au fil du temps sur différents projets. Tout observateur de la carrière de John Carmack peut constater que John avait toujours un pas en avance en technologie par rapport à tout le monde, c’était ce qu’on appelle un précurseur dans son domaine.

La carrière de John avait commencé dans l’industrie des jeux vidéo, avec la société Id Software, cofondé entre autres, avec un très grand nom de l’industrie aussi nommé John Romero. Leur premier grand hit était le jeu vidéo Commander Keen, dans lequel la première fois où les PC implémentaient les jeux en side scrolling 2D (semblable au jeu comme Super Mario Bros), réservé auparavant aux consoles de jeux vidéo équipées du hardware spécifique pour le faire. John Carmack a réussi par des petits hacks à implémenter la même technique sur PC. Le 2-ième hit est Wolfenstein 3D, là encore John Carmack réussit à introduire et à populariser une technologie jusque-là très marginale, et qui va bouleverser le monde vidéoludique après, “la 3D”. À la base, le PC dans les débuts des années 90 n’avait ni la puissance suffisante ni le hardware spécifique pour implémenter la 3D. Pour cela, il fallait aussi utiliser des techniques précises pour le réaliser, car le moteur du jeu Wolfenstein 3D est très particulier, ça permettait de rendre la 3D, mais avec beaucoup de restrictions. Par exemple, tous les murs de l’environnement doivent être construits avec des ongles de 90° suivant le schéma d’une matrice. C’était le prix à payer pour afficher de la 3D sur des machines à quelques mégahertz de puissance. Le 3-ème hit est Doom, et là encore c’est une grande révolution, puisque historiquement c’est le jeu qui a lancé le genre des FPS (First Person Shooter), et toujours avec des restrictions sur le moteur pour pouvoir afficher de la 3D avec quelques dizaines de mégahertz maintenant sur les machines et sans utiliser de l’accélération hardware 3D. Le 4-ème hit et le jeu Quake, est encore une fois une nouvelle révolution dans le domaine vidéoludique, c’est l’apparition du multijoueur online.

John Romero le cofondateur de Id Software, travaillant sur Doom (1993)

En 2013 Carmack rejoint la société d’Oculus VR pour entamer une nouvelle orientation dans sa carrière. Pour rappel la société Oculus VR est une société spécialiste dans la réalité virtuelle et la réalité augmentée. C’est une société qui a été acquise par Meta (anciennement Facebook) et ces produits représentent maintenant le fer de lance de Meta pour son projet de réalité virtuelle appelée Metaverse. Entre-temps Carmack a aussi l’occasion de toucher diverses technologies dans sa carrière, dont la technologie aérospatiale des diffusés, l’énergie de la fusion nucléaire, et récemment la technologie de l’intelligence artificielle. Plus précisément, de l’Intelligence Artificielle Générale (ou AGI). C’est de l’intelligence artificielle pour la création d’agent autonome qui a la capacité d’apprendre ce que peut apprendre un humain normal. C’est le genre d’intelligence artificielle qu’on voit dans les films de science-fiction. Apparemment c’est la technologie que Carmack consacre le plus de temps actuellement.

John Carmack reçu dans le Podcast de Lex Fridman

Sur la vidéo en haut, on peut voir un podcast ou interview de 5h de Camark fait par Lex Fridman (voici sa chaîne YouTube et le lien de son site web), un enseignant-chercheur dans l’université d’MIT, et une figure bien connue dans le domaine de l’intelligence artificielle. La discussion est très enrichissante, ça permet de mettre en lumière la manière de penser de l’un des meilleurs programmeurs au monde, et aussi avoir un aperçu sur l’univers de la haute technologie. 

Apprendre le Python

Sans exagération ni de subjectivité, actuellement le langage Python et l’un des langages les plus utilisés en informatique. C’est un langage plutôt orienté vers les applications de bureau, les serveurs web, le calcul scientifique, script et automatisation des tâches, l’intelligence artificielle, data science…etc. D’un point de vue pédagogique, on peut clairement distinguer deux écoles de formation de programmation. L’école classique, comprenant entre autres le langage C et C++. C’est l’école dans la manière de formation se focalise sur une compréhension bas-niveau de la programmation, l’étudiant généralement, assimile en profondeur le fonctionnement de la machine. En contrepartie, il lui est très difficile de réaliser une application complète et finie. La deuxième école se focalise sur un apprentissage haut-niveau, et ça implique généralement le langage Python ou Javascript. Dans lesquels les concepts de programmation sont étudiés d’une manière générique, mais avec l’accès à un arsenal d’outils prêts à être utilisés à la volée. Avec cette dernière école, il devient plus facile de concevoir des applications complètes et prêtes à être utilisées, même si elles sont le plus souvent des applications ballonnées et peu optimisées. La vidéo en bas présente un cours très structuré, et très abordable pour les débutants concernant le langage Python. Ça a été réalisé par l’académicien Mosh Hamedani, possédant une chaîne YouTube et ainsi site web CodeWithMosh.com avec plusieurs vidéos et cours pour apprendre différents langages de programmation. 

Cours en Python

C++ cheat sheet

Voici un cheat sheet pour le langage C++, avec en plus un quick reference qui est plus détaillé et plus approfondie. Pour rappel un cheat sheet est un résumé concis pour un langage ou une librairie ou une technologie donnée. Son principal intérêt est de permettre aux programmeurs de se rappeler rapidement de tous les mécanismes avec leurs syntaxes, utilisés par le langage ou la bibliothèque. Il est de coutume de voir les cheat sheet imprimés en grand format et plaqués sur le mur du bureau de travail, à raison avoir l’accès à coups d’œil. Voici en bas sous format PDF le cheat sheet (la source du PDF).

Cpp_Quick_Referece

Les quick reference sont à peu près la même chose, parfois ils sont plus détaillés et présentent des définitions un peu plus approfondies. Mais il faut bien savoir que les cheat sheet et les quick reference ne sont pas utilisés pour apprendre un langage. Ils sont le plus souvent utilisés comme un appui mémoriel pour une personne qui maîtrise déjà le langage. Mine de rien, sur une certaine mesure, ça peut être bénéfique pour une personne qui veut apprendre le langage, ça lui permettra d’avoir une vision globale, ou une carte globale du langage, qui peut utiliser pour s’orienter et cadrer son processus d’apprentissage. Le PDF du quick reference est présenté en bas (la source du PDF).

CPP_Cheatsheet

Les meilleurs langages de programmation à apprendre en 2022

Faire un classement des meilleurs langages de programmation n’est pas une mince affaire, le problème c’est qu’il est impossible d’appliquer une métrique universelle pour comparer les langages. Chaque langage possède ses propres avantages et ses propres inconvénients, et souvent ils diffèrent les uns des autres selon le type d’applications visées ou en rapport avec un domaine technologique précis. Par exemple, il y a des langages pour le développement web, le cloud, les systèmes embarqués, les systèmes distribués, les systèmes d’exploitation, les bases de données, les jeux vidéo, les applications scientifiques…etc.

Pour exclure toute subjectivité, on va se servir des résultats d’un sondage fait par le site web StackOverflow. Ce site web est très connu pour les informaticiens, il est fort probable que si vous faites du codage et que vous avez cherché la solution d’un problème en programmation sur Google, de le trouver parmi les premières réponses. Ce sondage a été fait sur la communauté de StackOverflow, et le nombre de participants est vraiment conséquent, le sondage aurait inclus pas moins de 70000 participants.

La liste des langages les plus utilisés pour l’année 2022 est comme suite (Lien du sondage pour plus de détails) : 

  1. JavaScript
  2. HTML/CSS
  3. SQL
  4. Python
  5. TypeScript
  6. Java
  7. Bash/Shell
  8. C#
  9. C++
  10. PHP
  11. C
  12. PowerShell
  13. Go
  14. Rust
  15. Kotlin

L’algorithme d’encodage de Huffman

L’algorithme de Huffman et l’un des algorithmes les plus connus dans le domaine de la compression de données comme ceux utilisés dans Winzip ou Winrar, il représente principalement l’un des premiers algorithmes de compression textuel. Le plus drôle dans la naissance de cet algorithme est qu’il a été inventé par Huffman lorsqu’il était encore étudiant à MIT, leur enseignant à cette époque leur a donné le choix de choisir entre faire l’examen ou de rédiger un rapport sur un sujet donné, Huffman a choisi d’écrire le rapport qui a ensuite en 1952 produit ce célèbre algorithme de compression.

L’algorithme se base sur le principe de donner un code binaire réduit pour les caractères les plus répandus dans un texte, et inversement de données un code plus long pour les caractères les moins fréquents. D’autre part, l’algorithme de Huffman, permet indirectement de conceptualiser les principes de la théorie de l’information créer par Shannon, une partie de la théorie stipule que l’information la plus importante est celle qui a la probabilité ou (la fréquence) la plus basse, et inversement, l’information la moins importante possède la probabilité la plus élevée dans un texte ou un bloc de données.

Compression par l’encodage de Huffman.

On peut clairement distinguer sur la vidéo en haut l’utilisation d’un arbre binaire, qui permet principalement la synthèse des codes binaires pour chaque caractère. Cet arbre va être créé, premièrement, en affectant la fréquence d’apparition de chaque caractère dans le texte, où chaque caractère va représenter les feuilles de l’arbre, les feuilles avec les fréquences les plus basses vont composer les nœuds avec une fréquence égale à la somme des fréquences des 2 feuilles, d’une manière récursive et ascendante les nouveaux nœuds créent dans l’arbre vont aussi être créés par la somme des 2 nœuds (ou feuilles) avec la plus basse fréquence, jusqu’à ce que tout l’arbre soit construit. 

L’algorithme de Huffman.

Cet algorithme est très important à maîtriser pour les étudiants en informatique, ça permet premièrement de comprendre les principes de la compression, et deuxièmement, d’assimiler les concepts de la théorie de l’information. La première vidéo en haut et celle de l’excellente chaîne YouTube de Tom Scott, une chaîne principalement destinée à la science. Et la deuxième vidéo pour mieux expliquer la création de l’arbre de l’algorithme de Huffman. 

Google Carbon, le nouveau remplaçant du langage C++

Tout le monde en parle, il n’y a pas longtemps des ingénieurs de Google ont fait l’annonce d’un nouveau langage qui pourrait remplacer le langage C++. Pour rappel, le langage C++ est un langage très reconnu, depuis très longtemps il est ancré dans la production de plusieurs types de logiciels. C’est un langage réputé pour sa robustesse et sa rapidité, il est particulièrement populaire dans des logiciels comme les systèmes d’exploitation, les gestionnaires de base de données, les moteurs de jeux vidéo, les systèmes embarqués, la commande industrielle…etc. Malheureusement comme tout autre langage, il possède quelques défauts intrinsèques à ses objectifs de performance et de rapidité, les deux principaux défauts sont, son manque de sécurité comparé aux autres langages, puisqu’il permet d’offrir un accès direct aux entrailles de la machine. Et deuxièmement, le bagage technique que le langage a accumulé à travers les années de sa longue vie, ce qui le rend charger avec des fonctionnalités qui sont devenues aujourd’hui obsolètes, mais le langage doit les conserver pour des soucis de rétrocompatibilité avec les anciennes applications. 

Justement, le langage de programmation proposé par Google nommé Carbone, propose des solutions pour ces deux problèmes mentionnés, plus d’autres améliorations qui sont inspirées des autres langages modernes. En réalité, les ingénieurs de Google, d’après leur déclaration, ne visent pas à remplacer le C++, mais plutôt de proposer une alternative plus flexible et plus sécurisée pour les besoins de la production logicielle moderne, visant même à avoir une interopérabilité bidirectionnelle avec le code du langage C++. L’annonce du langage Carbone s’est faite dans la conférence internationale du langage C++ à Toronto, Canada. Le visionnage de la présentation est disponible sur la vidéo en bas. Il est clair que le langage est encore dans la phase expérimentale, mais les ingénieurs sont suffisamment avancés pour proposer une nouvelle syntaxe pour le langage, que vous pouvez même tester à travers une démo sur le site de compilation online Compiler Explorer. L’un des points positifs du langage Carbone est d’embrasser une approche de développement open source beaucoup plus flexible que la standardisation ISO du C++, d’ailleurs le dépôt github et un serveur Discord sont déjà mis à la disposition à quiconque veut participer à son développement.

L’annonce du langage Carbone

L’automatisation avec Python

On a souvent tendance à l’oublier mais il faut se rappeler que le but initial de l’informatique dans les années 60 et 70 était l’automatiser des tâches administratives répétitives et ennuyeuses pour les employés des entreprises, de nos jours l’informatique a un tout autre visage, puisqu’un PC, une tablette ou un smartphone sont généralement utilisés pour communiquer, naviguer sur internet, voir des vidéos, lire les news, réviser ses cours…etc. Mine de rien, l’informatique reste toujours aujourd’hui le meilleur moyen d’automatiser les tâches administratives, et c’est surtout plus facile avec ce qu’on appelle le langage Python. 

Le langage Python est un langage réputé pour sa facilité d’appréhension et sa versatilité, contrairement aux langages C/C++ qui sont souvent évoqués dans ce blog, le python touche plusieurs horizons, avec premièrement tout d’abord les applications normales de bureau, les applications web, et plus récemment les applications mobiles, il est aussi très convoité pour l’intelligence artificielle et le data science, et pour ce qui nous concerne dans cet article l’automatisation des tâches informatiques. Le python et le langage idéal pour automatiser les tâches comme lire les données des fichiers Excel, de les transcrire sur une page web, d’extraire les tables des sites web, de générer des rapports automatiques de données, faire l’agrégation de plusieurs sources de données, l’extraction et génération automatique de l’information des fichiers PDF…etc. La vidéo en bas de la chaîne YouTube du site web éducatif www.freecodecamp.org est un cours de courte durée pour maitriser les capacités d’automatisation proposées par Python. 

L’automatisation avec Python

La différence entre codeur et programmeur selon Lamport

Avant d’entamer cette question de différence entre programmeur et codeur, il est important de présenter la personne de Lamport. Lesli Lamport est un scientifique mathématicien informaticien très connu, considéré parmi les chercheurs les plus influents dans les sciences de l’information, il a même été récompensé du titre Turing Award en 2013 (l’équivalent du prix Nobel en informatique) et plusieurs autres titres. Il est surtout connu pour le développement dans les années 80 de la première version de LaTeX, un logiciel de traitement de texte très répondu, au même titre que Microsoft Word, avec comme axe d’orientation le formatage automatique du texte. Lamport est surtout très bien connu académiquement par 3 algorithmes très populaires dans les cours universitaires spécifiques au domaine des Systèmes Distribués, qui sont l’Horloge de Lamport, la Cohérence séquentielle, et la Tolérance aux fautes Byzantines. Il travail actuellement chez Microsoft. Le site personnel de Lesli Lamport est accessible en suivant cette adresse www.lamport.org.

La différence entre programmeur et codeur

En résumé sur la vidéo en haut, « la différence entre programmeur et codeur, c’est comme la différence entre l’écriture (L’écriture littéraire) et taper sur une machine à écrire », c’est l’expression de Lamport lui-même. C’est une différence énorme, essentiellement une personne doit d’abord apprendre à programmer avant de coder.