Le code source de Windows (C++)

Windows est fait en C/C++.

A partir de là, on peut rentrer dans le détail. Les plus jeunes pourraient penser que Windows utilise NET mais il n’en ai rien. La lutte entre l’ancienne Windows Division et la Developer Division n’est pas terminée. Pour ceux qui veulent des détails, voici l’article qu’il faut lire:

https://arstechnica.com/information-technology/2011/06/windows-8-for-software-developers-the-longhorn-dream-reborn/

Windows est entièrement fait en C/C++ avec une légère précision:

  • le kernel est fait en C
  • le reste est fait en C++

Pourquoi ?

Pour Microsoft et ce depuis 25 ans, le C++ c’est naturel, c’est l’électricité. On veut faire un logiciel, un produit, on utilise C++. Microsoft fait 95% de ses produits en C++ car c’est fiable, robuste, puissant et rapide.

En tant que MVP, j’ai signé avec Microsoft un NDA pour avoir accès au code source de Windows 10 et Windows Server 2019. le code est clean, truffé de C++ Moderne et ce n’est pas près de s’arrêter.

C++ renaissance dixit Channel 9. https://channel9.msdn.com/Shows/Going+Deep/Craig-Symonds-and-Mohsen-Agsen-C-Renaissance

Avec l’avènement des technologies dites productives comme NET ou Java, les légendes urbaines se multiplient. Windows fait en NET, Linux en Java… Des foutaises ! Linux est faite en C/C++. Windows est fait en C/C++. Le reste c’est de la littérature.

Les grands logiciels sont faits en C++ ! Vive C++ !

J’étudie le code de Windows depuis 2001 date à laquelle j’ai mis la main sur le leak de Windows NT4 puis en 2003 sur le leak de Windows 2000. 2GB de source code, la mine d’or. Puis j’ai eu accès au Windows Research Kernel XP et Windows Server 2003. j’ai rebuildé le kernel et monté une VM Windows Server 2003. Génial!

Windows Research Kernel était une initiative pour les universités qui faisaient des cours sur les systèmes d’exploitation. Fabuleux. Et livré avec Windows Internals, la bible.

Le job de mes rêves : Développeur Windows chez Corp. Mais bon je suis français, faut pas rêver ! 🙂

C++ unsafe et unsecure ?

Mes collègues du monde Microsoft et autres me disent que C++ est dépassé, trop difficile, trop vieux, trop dur à maîtriser et y en a même qui me dise qu’il est unsafe et unsecure !

Je rigole.

Si C++ était porteur de tous ces défauts, Microsoft ne ferait pas 95% de ces produits avec. Je vais revenir sur unsafe et unsecure car c’est très intéressant. Mais avant un rappel: TOUT CE QUE VOUS AVEZ SUR VOS PC et MAC EST FAIT EN C++. Windows, Office (Word, Excel, PowerPoint, Outlook), IE, Chrome, VLC, Notepad++, Calc, MSPaint, Photoshop, File Explorer, Process Explorer, etc…

Pour vendre .NET le Marketing a essayé de décrédibiliser C++ car trop riche, trop puissant et qui n’a pas besoin de publicité ni de marketing, lui. Dans les années 2000, le marketing a essayé de vendre l’idée qu’un langage qui manipule finement la mémoire est susceptible de planter et que la panacée c’était le Garbage Collector. Ce raisonnement est une arnaque intellectuelle.

Ce n’est parce que un langage comme C ou C++ permettent de manipuler la mémoire finement à l’octet près que cela signifie plantage ou corruption de mémoire. Le Marketing, qui est un contingent de personnes qui sortent d’écoles de commerce ne connait rien à la technique et donc ces gens font des raccourcis grossiers. Il faut le dire.

Pour ceux qui sont curieux, la machine virtuelle NET ou CLR (Common Langage Runtime) est faite en C++ donc voilà, la boucle est bouclée. Si C++ était si pourri que ça, le CLR ne serait pas fait en C++. Le garbage collector et le JIT non plus ! Le problème c’est que NET doit luter contre un adversaire qui était là avant lui, à savoir Java et que la concurrence fait rage. Java est beaucoup plus implanté en entreprises que NET et cela malgré des milliards investis en marketing et publicité.

Donc je pose la question: est-ce que d’essayer de décrédibiliser C++ a été une bonne méthode pour vendre NET au monde des développeurs ? Je ne crois pas. C++ est standardisé à l’ISO et compte des millions de développeurs. Le langage C++ n’a pas besoin de publicité, c’est le langage de l’industrie, du médical, de l’édition logicielle, des jeux, etc. C++ est là depuis 40 ans et s’est renouvelé en profondeur. Ce n’est plus le C++ à Papa, le fameux C++98 ou C+03. On est passé au C++ Moderne, celui qui libère la mémoire automatiquement via les pointeurs intelligents ou smart pointers, celui des lambdas, celui de la move semantic. Le Marketing n’en parle pas, bien sur… Le marketing ce n’est pas des mathématiques, ce n’est pas scientifique et c’est pour cela qu’il faut s’en méfier.

Dans le domaine de la conception logicielle, il ne faut jamais croire le marketing et toujours s’en remettre à un raisonnement scientifique. Il faut tester les technologies et se faire sa propre opinion et toujours être factuel.

Moi j’ai accès au code source de Windows et tout est fait en C/C++. C’est du C++ moderne et c’est clean. Windows sera toujours écrit en C++.

La dernière news du moment c’est de pousser Rust comme langage kernel pour résoudre les problèmes mémoire. C’est un faux débat car le kernel comprend un Memory Manager (mm) qui gère la mémoire virtuelle et seule C++ permet d’écrire un tel module. Certains chercheurs n’ont aucune connaissance des systèmes d’exploitation et essaient de faire le buzz autour de Rust avec une démarche marketing… ça y est, ils remettent le couvert. Laissons les parler, Microsoft ne réécrira jamais Windows en Rust. Il y a des millions de ligne de code. Et contrairement à ce que disent les journaux pour les managers comme 01 Informatique, Microsoft ne réécrit pas les OS from scratch. Cela se saurait. Microsoft fait évoluer Windows depuis 25 ans. Et c’est du C++. N’en déplaise au Marketing.

Les grands logiciels sont faits en C++. Un Nième exemple ? Chrome et NodeJS. On ne peut pas saluer la révolution JavaScript sans penser à C++. NodeJS c’est du pur C++ et Chrome aussi. Microsoft en a fait son nouveau browser avec Chromium. Chrome est un logiciel (browser) qui équipe des milliards d’ordinateurs et c’est rapide, fiable et puissant. Vive C++ !

C++ RENAISSANCE

POWER AND PERFORMANCE

“THE WORLD IS BUILT ON C++”, Herb Sutter.

Envoyez moi vos commentaires sur mon email: christophep@cpixxi.com.

Mon Prochain Livre sur C#/NET

Prévu pour Juillet 2020, mon prochain livre sera sur C#/NET, à savoir le langage C# 8, NET Framework et NET Core. Mon éditeur est DUNOD.

Le projet est né sur une constatation simple: il n’existe pas beaucoup de livres en français sur C#/NET. La plupart des livre sont en anglais… Avec mon expérience d’écriture d’articles techniques pour la revue Programmez, je me lance dans le défi d’un deuxième livre en 2020. Après “Aide-Mémoire C++ Moderne”, voici “Aide-Mémoire C++/NET”.

Pour moi, ce livre est très important. Il est directement en lien avec mon activité professionnelle, à savoir le conseil en entreprises sur le Microsoft NET Framework (et NET Core). Pour un client, avoir un consultant qui fait autorité, c’est un gage de sécurité. Cela ouvre des portes et pour ma société (Infeeny, groupe Econocom), c’est un moyen de communiquer sur l’expertise de ses consultants. Titulaire du titre MVP Developer Technologies depuis 2 ans, ce livre fera partie de ma contribution au programme MVP pour être éventuellement renouvelé. C’est une motivation supplémentaire.

Voici la couverture que j’ai imaginé:

Ce livre sur C#/NET sera orienté comme un livre de cuisine, un véritable cookbook. Il sera truffé d’exemples de code pour rendre la lecture facile et ludique. Le but est d’être un expert de terrain avec les trucs et astuces essentielles. Cela ne sera pas un pavé de 1000 pages (pour caler une armoire) mais plutôt un ouvrage de 300 pages, dense et concis.

L’important, c’est de maîtriser le langage C# 8. Ensuite, il y a le Framework alias la BCL pour Base Class Library. On va aborder les grands thèmes comme:

  • les classes collections
  • le multithreading
  • la gestion des documents XML et JSON
  • l’accès aux données ADO.NET
  • LINQ
  • le développement Windows avec Windows Forms
  • le développement Web API avec ASP.NET et ASP.NET Core

Le livre fait aussi un focus sur le système CLR (le Common Language Runtime alias le runtime) et WinRT.

Certains thèmes ne seront pas abordés dans le livre:

  • WPF
  • Xamarin

Pourquoi ne pas parler de WPF ? WPF ne fait pas autorité dans le monde NET. WPF est l’objet de plusieurs controverses et le monde XAML n’est pas adopté par l’ensemble des développeurs NET. On préférera aborder la programmation Windows avec Windows Forms, plus standard et plus répandue car elle représente le monde traditionnel Windows avec ses contrôles GDI, sa rapidité et son essence.

Xamarin est aussi un sujet spécial. C’est réservé aux applications mobiles et fait l’objet d’ouvrages spécialisés qui dépassent le cadre de mon livre.

En fin de livre, j’aborderais les librairies tierces et les Frameworks comme DevExpress, SyncFusion ou Infragistics.

A suivre…

MyDesktop : un autre menu Démarrer pour Windows

Voici mon nouveau développement: MyDesktop. Cet outil permet de visualiser les applications installées sur le poste. Sur la partie gauche, on y trouve les différents groupe et les liens. La première partie droite présente le lien en détail avec son icone. Le deuxième panneau présente la totalité des applications. L’autre visualisation permet de voir les applications sous forme de carrés de couleur. Il y a une fonctionnalité de recherche aussi.

Le code est disponible sur GitHub: https://github.com/ChristophePichaud/MyDesktop

L’application est réalisée en C++ avec les MFC. Pourquoi les MFC ? Parce que les MFC permettent de développer rapidement et de manière efficace. De plus, j’avais des classes de dessin à réutiliser d’un autre projet. En effet, les carrés de couleur sont des “shapes” graphiques qu’il est possible de déplacer et de retailler en dimension. Ces classes tirent parties des MFC.

Il ne me reste plus qu’une fonctionnalité à ajouter : le lancement des applications. Ce n’est pas très dur, il suffit de faire un CreateProcess du lien…

Stay tuned.

Développer comme un pro en France, c’est possible

En tant que développeur C/C++/NET et plus généralement Microsoft, il est possible de participer à des projets open-source tout en restant en France. Il n’y a pas besoin de s’expatrier pour participer à des projets complexes. Exemple:

  • Windows Terminal
  • Microsoft NET CoreCLR
  • Microsoft NET CoreFx
  • Windows UI

Le portail GitHub.com et sa section Microsoft contient des dizaines de projets. De plus, il existe ailleurs de nombreux autres projets open-source de classe internationale comme :

  • Google Chromium
  • Mozilla Firefox

Il y a de quoi étudier et contribuer. Vous allez me dire, ah oui mais il faut du temps pour rentrer dedans ! Ben oui, tout à un prix.

Dans le cadre de mon partenariat avec Programmez, je vais essayer de faire un ou deux articles sur les contributions open-source de ce style. Pour mon MVP, le plus important pour moi est de creuser le projet Microsoft NET CoreCLR. Pour Microsoft c’est un projet important et cela peut permettre d’avoir une bonne visibilité de contribuer. Il y a des étapes à franchir pour NET et la roadmap va nous mener de NET Core 3 à NET 5.0 en 2021. Il va y avoir des évolutions.

L’avantage des projets open-source C++ tient dans le fait que les librairies third-party ne sont jamais deprecated. Les projet grandissent et avancent. Il n’y a pas de Marketing qui impose telle ou telle feature ou telle lib qui change tout. Le langage ISO C++ évolue, la STL évolue mais les fondamentaux sont toujours là. Le style “Modern C++” s’est imposé partout et c’est super pro.

En comparaison dans le monde C#/NET, avant il n’y avait pas Linq, avant il n’y avait pas async/await. Quand vous regardez le code des nouveaux projets .NET, c’est n’importe quoi avec leur async/await. Le Marketing a essayé de nous faire croire que async/await était la panacé car ça exploitait mieux la batterie. C’est une arnaque intellectuelle.

Rappel sur cette arnaque: Pour vendre des tablettes Surface sous ARM, Microsoft nous explique qu’il faut économiser la batterie et que les programmes actuels consomment trop de CPU donc de batterie et que la solution c’est WinRT et les API async. Moralité, on nous bride la possibilité de faire du Win32 en ARM. On a vu le succès de l’effet. Pas de tablettes à la vente, fiasco de WinRT. Ensuite, on nous dit disponibilité que des applications du store mais pas C++. Donc il n’y a que des applications de misère… Résultat: Le fiasco, again. Ensuite on ouvre à Win32. Trop tard, le store et WinRT sont à la ramasse. L’utilisation des API WinRT est de 2% dans les applications Windows. WinRT étant un subset des API Win32 qui n’apportent rien et qui est async/await avec un modèle d’état fini mêlé de threading et de blocage qui est pénible à utiliser et qui ne résout en rien l’usage de la batterie. Oui pour les programmes de bourrin en C# mal écrit, ça peut poser problème mais pour les vrai développeurs C++, on sait ce qu’on fait, on n’a pas besoin de créer un thread à chaque fonction. On sait faire pipi sans en foutre partout sur la cuvette !

Moralité, les petits jeunes y croient et développe de la m…. en barre. Ils créent des fonctions qui créées 3 strings qui se battent en duel et retourne une Task et la méthode est marquée async/await ! C’est n’importe quoi. La programmation C#, c’est devenu un truc très bizzard. Au niveau de la plateforme, les CoreFX et le CoreCLR c’est nickel mais les développeurs C#/NET sont instables. Ils utilisent les nouveautés du langage a chaque nouvelles évolutions, il changent de librairies de bases tous les ans, un coup c’est ADO.NET, un coup c’est Dapper, un coup c’est EF, un coup c’est EF Core ; ils se laissent balader par le Marketing et ne réfléchissent pas par eux-mêmes. Ils font du code jetable qui est réécrit à chaque changement de framework ou de Visual Studio. Y a rien de pérenne. Bref, la roadmap NET va secouer le cocotier j’espère. A croire que ce n’est pas assez technique et compliqué. Il sont besoin ce complexifier les choses. Je vois énormément de développeurs C# qui sont frustrés car il n’y a rien à optimiser en C# ou si peu. Il sont sur une boite noire. Ils ne voit pas l’OS, le processeur. Il ont un Framework et ils jouent avec. Venez faire du C/C++, chez nous on build on the metal, on n’a pas besoin de complexifier le code pour se rendre intéressant.

Pour bien mener sa barque en développement C#/NET, il ne faut pas écouter le marketing et se poser les bonnes questions:

  • ais-je besoin de cette Nème nouvelle fonctionnalité du langage C#
  • ais-je besoin de mettre mon logiciel en risque pour utiliser la dernière libraire à la mode ?
  • qu’elle est l’intérêt de mettre à niveau ces satanés paquets Nuget qui sont tous plus incompatibles les uns que les autres avec leur dépendances foireuses ?
  • est-ce utilise que je mette le doigt dans le monde UWP quand on sait le succès (c’est de l’humour) que cela a ?
  • on me dit que l’avenir c’est le cloud ? Dois-je tout casser et tout réécrire ?
  • j’ai une interface UI faite en WinForms ; on me dit de passer à WPF ; ça casse tout. Dois-je y passer ?
  • j’ai une application UI WinForms ou WPF qui fonctionne nickel. On me dit que Angular c’est la mode ; dois-je y passer ? Angular c’est du TS/JS.

Pour toutes ces questions, il faut s’entourer de gens d’expériences qui sauront pour éviter les pièges. Il faut des experts en développement logiciel : des Architectes.

Le développement logiciel, c’est un métier.

Applications multi-plateformes ? HOWTO ?

Pour développer des applications multi-plateformes, il n’y a pas cinquante choix possibles, il n’y en a qu’un seul qui est gratuit et performant : c’est C++.

Seul le C++ permet de tirer partie des dernières nouveautés des SDK Windows, Linux, Android et iOS car le système et son environnement sont faits avec. L’avantage de C++ est qu’il <<build on the metal>> : il n’y a pas plus rapide. C++ tire partie de l’architecture logicielle des systèmes d’exploitation et matérielle des derniers processeurs x86, x64 et ARM. Cela fait quarante ans que les optimiseurs de code C++ garantissent la meilleur qualité de code possible.

C est le nouvel assembleur. C++ permet l’orientée objet : abstractions, héritage et polymorphisme (fonctions virtuelles), surcharge d’opérateurs, templates. Avec sa librairie STL (Standard Template Library) et conjointement avec une librairie comme Boost (boost.org), le C++ possède une boite à outil universelle qui gère les strings, containers (collections), algorithmes, les I/O, les threads, les smart pointers, les communications, etc.

Passez le pas. Installez Visual C++ sous Windows, GCC sous Linux, XCode sous Mac et partagez du code métier. Réalisez des interfaces graphiques riches et tirez partie du meilleur langage de développement qu’est C++.

Vous allez me dire il existe des solutions hybrides comme NET ou Java ? Ces solutions sont un ensemble de mille feuilles lourds et lents qui ne permettent pas de créer des applications de classe mondiale. En automobile, y a les Fiat 500 et les Ferrari. A prix égal (voir moins cher), vous prenez quoi? Y a pas photo…

Questions Techniques – le vrai monde

Voici le genre de choses que j’aborde avec un client pour gagner sa confiance et lui montrer que je pourrais lui être utile…

Comment migrer une application legacy procédurale en OOP (Object Oriented Programming / Programmation Orientée Objet) ? Les techniques, les choix…

Comment migrer une application legacy client-serveur en .NET à base de Web-services REST ou de micro-services ?

Vous disposez d’une énorme solution IT avec des technologies plurielles de la stack Microsoft (le temps fait sa loi). Il faut tout remettre à jour. Vous n’avez pas le droit ni le temps ni le budget de tout réécrire. Comment faite vous ?

J’ai une solution IT de 4.000.000 de lignes de code. Vous devez auditer la solution et me donner un axe. On garde, on jette, on factorise, on réoriente, on fait quoi ??? Comment faite vous : donnez moi des pistes ?

Je possède de l’ASP.NET Forms, de l’ASP.NET MVC (plusieurs versions), du VB.NET, du WinForms, du WPF, y en a partout, que dois je garder ? Comment m’en sortir avec les technologies Microsoft ?

Je veux passer de Oracle à SQL Server pour des raisons de coût. . Comment faire ? Best practices ?

Je veux migrer un ensemble d’applications sur Azure, comment faire ? Par ou commencer ?

Je veux mettre du Docker dans mon infrastructure legacy pour la conserver un peu plus longtemps. Comment faire ? Est-ce une bonne idée ? Dois-je tout migrer en l’état dans Docker ou dois-je moderniser les dernières évolutions ?

Docker ou Kubernetes ?

Je peux faire un audit de votre SI en juste regardant votre code en 1h30 ? Cela vous tente ? Ok on y va…

Ce sont de vrais questions complexes dont vous ne trouverez pas la réponse sur StackOverflow. C’est autrement plus sérieux que coding games et ses test bidons dont la solution est sur n’importe quel moteur de recherche…