Elke programmeur heeft zijn favoriete programmeertaal. Soms is het de taal die vertrouwd aanvoelt en soms is het de taal die de programmeur door zijn eerste project heeft geholpen. Maar de waarheid is dat programmeertalen tools zijn met sterke en zwakke punten die geschikt zijn voor specifieke taken. Tot nu toe heb ik nog niet de “one language to rule them all” gevonden, maar sommige talen komen aardig in de buurt.
Tijdens mijn reis als ontwikkelaar heb ik tijd besteed aan het verkennen van verschillende programmeertalen. Hierbij heb ik niet alleen hun syntax ontdekt, maar ook de manier waarop elke taal mijn manier van denken over software heeft beïnvloed. Het is niet verrassend dat hoe meer programmeertalen je leert, hoe makkelijker het wordt. Je zult de overeenkomsten en verschillen opmerken en de problemen beginnen te begrijpen die programmeertalen proberen op te lossen. Ik heb zeker niet alle programmeertalen geprobeerd, maar ik heb wel een mix van moderne en oudere (maar nog steeds relevante) programmeertalen. Ik laat een kort code voorbeeld zien om je een idee te geven hoe de programmeertaal er uit ziet.
Python
Python, de programmeertaal die mijn carrière en mijn liefde voor programmeren heeft gestart. Heb ik dit als mijn taal gekozen omdat de syntax vergelijkbaar is met Engels, of omdat het destijds enorm populair werd? Nee, de echte reden was dat de naam Python afkomstig was van Monty Python, een Britse comedygroep (mocht je dat nog niet weten), die ik hilarisch vind.
Nadat ik Python had geleerd, kon ik meteen echte projecten maken die problemen oplossen in het bedrijfsleven. Door zijn eenvoud is Python erg geschikt voor prototyping en het schrijven van scripts om taken te automatiseren. Dankzij de vele bibliotheken is het ook heel gemakkelijk om een website te maken, verbinding te maken met databases, Graphical User Interface (GUI’s) te maken en nog veel meer.
Omdat Python een geïnterpreteerde taal is, draait het ook op elk systeem waarop je de Python Interpreter installeert. Het nadeel van Python is de snelheid; het zal qua ruwe prestaties nog steeds achterblijven bij traditionele gecompileerde talen.
1def greet(name):
2 print(f"Hello, {name}!")
3
4greet("Job")
5greet(66) # werkt ook, python controleert geen types
C
De programmeertaal C is een van de belangrijkste programmeertalen uit de geschiedenis. De taal werd ontwikkeld in de jaren 70 en wordt nog steeds veel gebruikt. Door de jaren heen hebben programmeurs er talloze bibliotheken en tools voor gebouwd, waardoor C zeer krachtig en flexibel is.
Wat C bijzonder maakt, is hoe dicht het bij de hardware van de computer staat. Programma’s die in C geschreven zijn, worden direct omgezet in instructies die de processor van de computer kan begrijpen. Dit geeft C een groot snelheidsvoordeel en maakt het de taal achter veel besturingssystemen, apparaten en andere kritieke software.
Maar die kracht brengt ook verantwoordelijkheid met zich mee. In tegenstelling tot nieuwere talen beschermt C je niet veel tegen fouten. Als een programmeur niet voorzichtig is, kunnen geheugenfouten worden gemaakt die crashes veroorzaken of beveiligingsrisico’s creëren die hackers kunnen misbruiken. Toch is de invloed van C enorm en blijft het de ruggengraat van veel van de technologie die we dagelijks gebruiken.
Dit alles maakt C een uitstekende keuze voor beperkte omgevingen zoals embedded programmeren. Wat ik zo leuk vind aan C, is de mate van controle die het je geeft over het geheugen. Die controle kan op positieve manieren worden gebruikt, zoals het uitpersen van extra prestaties met slimme optimalisaties. Maar het brengt ook het risico met zich mee van ‘ongedefinieerd gedrag’, onverwachte resultaten die optreden wanneer je vergeet het geheugen correct te beheren. Met C neem je het goede met het slechte.
1#include <stdio.h>
2
3int main() {
4 int x = 66;
5 int *p = &x; // pointer naar x, een pointer is een variable die wijst naar het geheugen van een andere variable.
6
7 printf("x = %d\n", x);
8 printf("p points to address %p with value %d\n", (void*)p, *p);
9
10 *p = 600; // wijzig waarde via de pointer
11 printf("x is now %d\n", x);
12
13 return 0;
14}
Rust
Een moderne programmeertaal waarmee ik heb gewerkt is Rust. Rust is ontworpen met één hoofddoel voor ogen: veiligheid. In tegenstelling tot C dwingt het je om code te schrijven op een manier die veelvoorkomende fouten vermijdt, vooral op het gebied van geheugen. Als je code niet veilig is, compileert het simpelweg niet.
Dat gezegd hebbende, heeft Rust ook zijn nadelen. De regels die het veilig maken, kunnen het ook moeilijker maken om te leren, vooral voor beginners, omdat de syntax erg uitgebreid is. De compiler is strikt, en soms besteed je veel tijd aan het proberen om eraan te voldoen voordat je programma wordt uitgevoerd.
Om te laten zien waarom Rust’s focus op veiligheid belangrijk is: Microsoft meldde ooit dat ongeveer 70% van alle beveiligingsproblemen waarmee ze te maken hebben, wordt veroorzaakt door bugs in de geheugenveiligheid. Dit zijn de soort problemen die C en C++ makkelijk kunnen introduceren. Rust is specifiek ontworpen om dit te voorkomen.
Rust kan potentieel zeer interessant zijn voor bedrijven, hoewel er momenteel niet genoeg programmeurs zijn die het kennen of erin kunnen programmeren in vergelijking met de geharde C# en Java, meer bekend in het bedrijfsleven.
1fn main() {
2 let mut message = String::from("Hello");
3
4 let borrow1 = &message; // onveranderlijk lenen
5 println!("Borrowed once: {}", borrow1);
6
7 let borrow2 = &message; // tweede keer onveranderlijk lenen is ook prima
8 println!("Borrowed twice: {}", borrow2);
9
10 // let borrow3 = &mut message; // ❌ ERROR: kan niet veranderlijk lenen als er ook al onveranderlijk wordt geleend
11
12 println!("Final message: {}", message);
13}
C#
C# is ontwikkeld door Microsoft en is een van de belangrijkste talen die gebruikt worden in het .NET framework. Je schrijft je programma’s in C#, waarna de .NET runtime de code uitvoert. Vanwege deze opzet worden C# en .NET bijna altijd samen genoemd, de taal en de runtime werken als een paar.
C#/.NET is een zeer sterke keuze voor bedrijfssoftware, vooral in omgevingen waar Microsoft-technologieën al veel gebruikt worden. Van zakelijke applicaties tot webservices en zelfs gameontwikkeling (via Unity), C# heeft een reputatie opgebouwd als veelzijdig, krachtig en goed ondersteund.
Ik heb een beetje een haat-liefdeverhouding met C#. Aan de ene kant maakt het het gemakkelijk om schaalbare applicaties te bouwen dankzij het sterke objectgeoriënteerde programmeermodel (OOP) en kun je met het nieuwe .NET MAUI framework GUI’s maken voor Windows, macOS, iOS en Android vanuit één codebase. Dat is een enorm voordeel als je meerdere platformen wilt bereiken zonder je app te hoeven herschrijven.
Aan de andere kant kan de enorme hoeveelheid functies in C# en .NET samen overweldigend aanvoelen, en je kunt gemakkelijk verdwalen in het ecosysteem. Ook heb ik persoonlijk nog nooit een regel C# geschreven buiten Microsoft Visual Studio. Hoewel het een krachtige IDE is, is het niet mijn favoriete editor, en dat maakt het werken met C# soms wat beperkend.
1using System;
2
3class Greeter {
4 public string Name { get; set; }
5
6 public Greeter(string name) {
7 Name = name;
8 }
9
10 public void SayHello() {
11 Console.WriteLine($"Hello, {Name}!");
12 }
13 }
14
15class Program {
16 static void Main() {
17 var greet = new Greeter("Job");
18 greet.SayHello();
19 }
20}
Go (Golang)
Een andere moderne taal is Go (of Golang), die vooral populair is geworden in de wereld van cloud computing. Go is ontworpen met eenvoud in gedachten: het compileert direct naar machinecode, waardoor programma’s snel en efficiënt worden, maar het bevat ook een kleine runtime die zaken als geheugenbeheer en concurrency afhandelt.
Een van de sterke punten van Go is dat alle afhankelijkheden die je programma nodig heeft, direct in het uiteindelijke uitvoerbare bestand worden gecompileerd. Dat betekent dat wanneer je een Go-programma verzendt, het slechts één bestand is dat bijna overal kan draaien en dat je je geen zorgen hoeft te maken over externe bibliotheken of ingewikkelde configuratie. Dit maakt Go ongelooflijk flexibel en eenvoudig te implementeren, vooral in containeromgevingen zoals Docker en Kubernetes.
Ik werk erg graag met Go. Door de eenvoud voelt het soms bijna alsof je vals speelt. Hoewel het niet zoveel ingebouwde functies heeft als sommige andere talen, maakt Go het gemakkelijk om zelf te bouwen wat je nodig hebt. Die doe-het-zelf aanpak houdt de taal niet alleen overzichtelijk, maar geeft je ook de kans om te leren hoe verschillende programmeerconcepten onder de motorkap werken.
1package main
2import (
3"fmt"
4"strconv"
5)
6
7func main() {
8 num, err := strconv.Atoi("221b") // probeer een text om te zetten naar een nummber
9 if err != nil {
10 fmt.Println("Conversion failed:", err)
11 } else {
12 fmt.Println("Number is", num)
13 }
14}
Conclusion
Zoals je net hebt gelezen, heeft elke programmeertaal zijn eigen sterke punten en werkt het het beste voor het doel waarvoor het is ontworpen.
Natuurlijk hebben we in het echte leven niet altijd de perfecte tool tot onze beschikking. Soms komt dat simpelweg doordat we het nog niet goed genoeg kennen of omdat we een bestaand programma moeten aanpassen die nou eenmaal in een andere taal is geschreven. Maar dat is prima. Je kunt desktop-apps bouwen in Go, mobiele apps maken in Rust of Python gebruiken om een game te maken.
Uiteindelijk, vooral in zakelijke omgevingen, draait het er om het probleem op te lossen, niet welke taal of tool je hebt gebruikt om de oplossing te bereiken.
Als jij problemen hebt die opgelost moeten worden, neem dan gerust contact met mij op via hookprograms@outlook.com om mogelijke oplossingen te bespreken.
Bonus
In het hoofdgedeelte van dit artikel heb ik me gericht op de programmeertalen waarmee ik het meest heb gewerkt. Maar als je het interessant vind, volgen hier een paar korte notities over andere talen waarmee ik heb geëxperimenteerd:
Assembly: Vaak de laagste programmeertaal genoemd die nog leesbaar is voor mensen (voordat je bij enen en nullen komt). Assembly is specifiek voor de CPU-architectuur die je wilt gebruiken. Als je assembly kunt lezen, kun je elk stukje software begrijpen en zelfs reverse engineeren.
C++: Meestal in één adem genoemd met C. Het begon als C met klassen, maar is sindsdien uitgegroeid tot een enorme taal met veel geavanceerde functies. Dankzij de compatibiliteit met C wordt het nog steeds gebruikt in veel prestatie kritische systemen.
HTML/CSS: Ik noem deze twee samen, ook al zijn ze verschillend. HTML geeft een webpagina zijn structuur, terwijl CSS ervoor zorgt dat deze er goed uitziet. Samen met JavaScript (dat de logica regelt) zijn dit de drie fundamentele technologieën achter de moderne webbrowser.
JavaScript: De taal van het web. JavaScript is een dynamische scripttaal en essentieel voor het toevoegen van interactiviteit aan websites. Lange tijd werd het niet geschikt geacht voor grote zakelijke apps, maar die perceptie veranderde met de opkomst van TypeScript.
TypeScript: In wezen JavaScript met typen. Door type-annotaties toe te voegen, kunnen veel fouten vóór runtime worden opgemerkt. Dankzij TypeScript is de ontwikkeling van JavaScript gestructureerder geworden en heeft de taal zich breed verspreid naar backend- en zakelijk gebruik. Hoewel ik niet zeker weet of dat een goed idee was.
Lua: Een lichtgewicht, embedded scripttaal die niet genoeg erkenning krijgt. Lua kan worden geïntegreerd in andere talen/applicaties, waardoor het ideaal is voor het uitbreiden van systemen en het versnellen van de ontwikkeling. Het wordt vaak gebruikt in games zodat ontwerpers en modders (mensen die wijzigingen in games aanbrengen) hun eigen logica kunnen toevoegen.
Visual Basic Script (VBS): Nog steeds veel gebruikt in bedrijven, met name in Microsoft Office voor macro’s, waar het Visual Basic for Applications (VBA) wordt genoemd. VBS kan ook worden gebruikt om taken in Windows en andere apps te automatiseren via COM-objecten. Wees voorzichtig met het gebruik ervan, want er is een stappenplan voor het geleidelijk afbouwen van VBS in Windows.
Java: Nog steeds enorm populair in bedrijven, mede dankzij de objectgeoriënteerde aard en het enorme ecosysteem. Persoonlijk ben ik een groot fan van de JavaFX-bibliotheek, waarmee je mooie desktop-apps kunt bouwen voor Windows, macOS en Linux.
SQL: Er wordt gediscussieerd over de vraag of SQL wel echt een “programmeertaal” is, maar ik vind dat iedereen op zijn minst een beetje SQL zou moeten kennen. Zelfs een simpele databasequery is een waardevolle vaardigheid, niet alleen voor programmeurs, maar voor iedereen die met data werkt.
GDScript (Godot): GDScript is de scripttaal die speciaal is ontwikkeld voor de Godot-game-engine. Het is ontworpen om vertrouwd aan te voelen voor Python-gebruikers, waardoor Godot makkelijker te leren is in vergelijking met engines zoals Unreal (C++) of Unity (C#).
Zig: Een nieuwere systeem programmeertaal die vaak wordt gezien als een modern alternatief voor C. Zig geeft je nauwkeurige controle over het geheugen zonder verborgen gedrag. Het is nog steeds in ontwikkeling, maar als het uitgroeit tot een stabiele 1.0-versie, zou het een goede opvolger van C kunnen zijn.