Kris van Rens (Trainer)
Ondanks een groot aantal opkomende alternatieven is C++ nog steeds een kracht om rekening mee te houden, zeker in de door legacy geplaagde high-tech industrie. In een serie artikelen plaatst High Tech Institute trainer Kris van Rens de taal in een modern perspectief. In onze nieuwe 4-daagse training laat Kris van Rens deelnemers kennismaken met de basisprincipes van de taal en essentiële best practices.
“Er zijn maar twee soorten programmeertalen: de talen waar mensen over klagen en de talen die niemand gebruikt.” Dit is een beroemde uitspraak van Bjarne Stroustrup, de bedenker van C++. Er zitten een paar waarheden in verborgen.
Ten eerste en meest voor de hand liggend: geen enkele programmeertaal is perfect voor het oplossen van elk probleem in elk domein. Vooral wanneer een taal wordt aangeprezen als “universeel”, zoals C++, kan deze bijna overal worden toegepast, maar de kans is groot dat er een mismatch is tussen het gebruikte gereedschap en het vereiste gereedschap. Het is bijvoorbeeld heel goed mogelijk om een complete webapplicatie in C++ te schrijven, maar is het ook het juiste gereedschap voor deze taak? Persoonlijk zou ik zeggen van niet.
Dan, als een taal evolueert en veroudert, is het erg belangrijk dat er een duidelijk proces is om om te gaan met (brekende?) veranderingen. Een conservatieve en veilige aanpak is het handhaven van achterwaartse compatibiliteit vanaf de eerste stabiele release. Dit is de aanpak die C++ al tientallen jaren volgt en naleeft – wat helaas ook de adoptie van sommige taalverbeteringen blokkeert.
Nog een verborgen waarheid uit het openingscitaat: de gebruikersbasis is extreem belangrijk. Je kunt de mooiste, veiligste, veiligste en prettigste programmeertaal ooit ontwerpen. Maar wat heb je daaraan als maar een paar mensen het gebruiken?
Goede kanshebbers
Een goed model voor het belang van programmeertaal is een mechanisch vliegwiel; hoe groter de gebruikersbasis, hoe groter het vliegwiel en de rotatiesnelheid. De grootte van de gebruikersbasis wordt bepaald door het aantal actieve ontwikkelaars, bestaande codebases, onderlinge afhankelijkheid van afzonderlijke codebases en andere factoren zoals integratieondersteuning door derden. Voor C++ heeft dit vliegwiel tenminste nog een enorm momentum. Toch zijn er krachten aan het werk die dit momentum langzaam wegvreten. Andere talen op het gebied van systeemprogrammering zijn delen van de C++ gebruikersbasis aan het overnemen.
Eerder schreef ik over de aankondiging van de programmeertaal Carbon, een C++ opvolger gestart door Google, maar er zijn veel meer alternatieven. Sommige daarvan, zoals Zig, Odin en Go, zijn meer gericht op C dan op C++ – die ga ik hier niet behandelen. Verder sla ik, om pragmatisch te zijn, talen over die te klein of experimenteel zijn, zoals Nim, Val, Vale, Cpp2 en Jakt. Dan blijft er slechts een handvol ‘serieuze’ alternatieven over, waaronder Rust, Swift, D en Circle.
''A good model for programming language significance is a mechanical flywheel.''
Wat maakt een taal een goede kanshebber voor grootschalige adoptie door gebruikers van C++? We kunnen beginnen met te kijken naar de eigenschappen waar C++ over het algemeen tekortschiet. Heeft het alternatief bijvoorbeeld een ‘moderne syntaxis’? Heeft het een soort ingebouwde gegarandeerde veiligheid, zoals veiligheid van geheugen of wiskundige bewerkingen? Wordt het geleverd met een tooling/packaging ecosysteem? C++ interoperabiliteit is een ander zeer belangrijk aspect. Een C-stijl foreign function interface (FFI) is leuk, maar het voelt als een downgrade als we onze C++ interfaces daaraan moeten aanpassen.
Het hebben van één van deze eigenschappen is echter niet genoeg. Een moderne en schone syntax is erg mooi, maar is op zichzelf niet genoeg. Een geweldig tooling ecosysteem is fantastisch maar, nogmaals, niet goed genoeg op zichzelf. Naar mijn mening, als je enige kans van slagen wilt hebben in C++, heb je op zijn minst de volgende drie ingrediënten nodig: een 10x verbetering op een bepaald aspect van de taal, gegarandeerde geheugenveiligheid en goede interoperabiliteit met bestaande C++ code.
De vakjes aanvinken
Als we kijken naar onze serieuze alternatieven, dan mist een taal als D de 10x verbetering. Daarom denk ik dat het nooit echt van de grond is gekomen, ook al is het al 20 jaar oud. Het eenmansproject Circle is erg indrukwekkend, vooral vanwege de experimenteermogelijkheden op het gebied van taalontwikkeling. En bovenal, met uitzondering van het nemen van feature flags om taalverbeteringen mogelijk te maken, is het volledig compatibel met C++. Helaas is Circle niet openlijk bestuurd en mist het gegarandeerde geheugenveiligheid. Swift wordt geleverd met uitstekende tooling, maar het is te veel gericht op het Apple-platform en het heeft slechts gedeeltelijke/werk-in-uitvoering interoperabiliteit met C++.
Rust voldoet aan de meeste eisen. Het heeft zelfs al een behoorlijke gebruikersbasis. Hoewel het ook echte, volwassen C++ interoperabiliteit mist, is het vandaag de dag de meest veelbelovende mededinger. Meer over Rust in mijn volgende bijdrage.