RSS

Waarom Ada?

Waarom zou je in een archaïsche programmeertaal willen werken? Eentje die geassocieerd wordt met Fortran, Cobol, bandplooibroeken en verstandige leren schoenen? Aan Ada kleven een hoop vooroordelen, maar onder haar lange geschiedenis gaat een verrassend moderne taal schuil die is meegegroeid met de tijd en een hoop te bieden heeft aan programmeurs in de jaren twintig.

Ada werd ontworpen in de jaren zeventig in opdracht van het Amerikaanse ministerie van defensie (DoD). Er zweefden in die tijd zoveel verschillende talen rond bij het DoD rond dat het onwerkbaar werd en daarom groeide de wens om met een gemeenschappelijke taal te gaan werken. Na jaren soebatten, vergaderen en het doornemen van voorstellen kreeg het plan dat was ingediend door Honeywell de voorkeur. Ada was geboren en kreeg in 1983 een formeel stempel met een ISO standaard. In de jaren daarna groeide de populariteit van de taal en werd het ook buiten het militaire domein veel toegepast in gebieden waar veiligheid en betrouwbaarheid van essentieel belang waren: de luchtvaart, ruimtevaart, spoorwegsystemen en bij medische toepassingen. In andere sectoren was het korte tijd populair, maar het werd snel ingehaald door andere talen en verdween langzamerhand op de achtergrond. Ada bleef echter niet stilstaan. In 1995, 2005 en 2012 werden vernieuwde ISO standaarden gepubliceerd met toevoegingen die aansloten bij de programmeerstijlen die toen “en vogue” waren. In ’95 werd het de eerste ISO-gecertificeerde taal met uitgebreide ondersteuning voor objectoriëntatie, in 2005 werden er veel verbeteringen toegevoegd voor parallelle en realtime taken en in 2012 kwam er ondersteuning voor contractgestuurd programmeren bij. Op het moment zijn vergadertijgers bezig met het ontwerpen van Ada 202x die ook allerhande hips en vernieuwends moet toevoegen zoals veilige pointers die geïnspireerd zijn op Rust.

Ada is kortom niet in de steentijd blijven hangen en als je een switch naar een nieuwe taal overweegt, omdat de oude begint te vervelen of niet meer voldoet dan is het de moeite waard om haar iets beter te bekijken.

Ada heeft de volgende eigenschappen waar ik erg gelukkig van word

  • Het uitgangspunt van Ada is dat je er betrouwbare, veilige software mee moet kunnen bouwen die ook nog eens goed presteert. In de cultuur rond Ada tref je geen “move fast and break stuff”, maar meer een bedachtzame en zorgvuldige manier van werken.

  • Ada heeft een sterk en statisch typesysteem. Het gaat echter verder dan de meeste talen, want het leunt aanmerkelijk minder op een handvol primitieve types die je kunt gebruiken. Je kunt eigen types beschrijven, en ook restricties meegeven. Je kunt bijvoorbeeld zeggen dat een type een natuurlijk getal moet voorstellen dat een vooraf gedefinieerd bereik heeft. Deze verfijnde aanpak is erg krachtig en wekt veel vertrouwen in de code die je ermee opbouwt.

  • De syntax van Ada is gebaseerd op de Algol/Pascal-familie van talen. Dit is puur smaak natuurlijk, maar als iemand met sterke Turbo Pascal roots word ik wel gelukkig van de expliciete “begin” en “ends” in de code, in plaats van alle accolades die je bij de C-achtige talen ziet.

  • Ada heeft geen garbage collector. Geheugenbeheer gaat dus handmatig. In de ogen van veel moderne programmeurs is dit een deal breaker, maar het helpt bij de prestaties van je programma’s. In tegenstelling tot bij C/C++ betekent het ontbreken van een GC echter niet dat je maar de hele tijd geheugen aan het alloceren en het bevrijden bent. Ada heeft door middel van het “access” type ruime mogelijkheden om op een betrouwbare manier met geheugen om te gaan. Daarnaast is het mogelijk om objecten van dynamische grootte op de stack te definiëren waarna ze automatisch verdwijnen als ze uit de scope raken. Er zijn dus ook aanmerkelijk minder situaties waarin geheugenbeheer een zorg is.

  • Je kunt in Ada bij functies en procedures aangeven of je variabelen als input, output of beide wil gebruiken. Hier heb je ook geen pointers voor nodig.

  • Ada heeft in de taal zelf door middel van “tasks” hele goede ondersteuning voor parallel programmeren. Je kunt ook objecten aanmerken als “protected”, wat gemene problemen kan voorkomen zoals je die vaak tegenkomt als je met meerdere threads dezelfde data wil benaderen.

  • Ada heeft vrij goede prestaties, vergelijkbaar met C++. Het heeft ook goede ondersteuning voor embedded programmeren. Als je dat wil kun je heel specifiek zijn over geheugenlayout en de hoeveelheid bits die je variabelen innemen. Dit opent ook mogelijkheden voor datageörienteerd programmeren zoals dat gebruikt wordt bij moderne game-ontwikkeling.

  • Vanaf Ada 2012 kun je ook contractgestuurd programmeren. Je kunt pre- en postcondities definiëren en deze worden automatisch gecheckt door de compiler. Deze zijn ook een belangrijk middel voor de ultraveilige Spark subset van Ada. Deze zustertaal van Ada wordt gebruikt voor uiterst kritieke software en kan ook samenwerken met software die formele eigenschappen van je code kan bewijzen.

  • Ada heeft een levendige online gemeenschap en er zijn veel open source bibliotheken beschikbaar. Het blijft echter een niche en veel van het echte werk gebeurt achter de schermen bij bedrijven die gesloten software maken. Desalniettemin wordt er veel gedeeld en is ook de leidende compiler (Gnat) beschikbaar als vrije en open source software.

  • Er is geen standaard package manager beschikbaar voor Ada. Het is misschien maf om dit als voordeel te noemen, maar we hebben aan de NodeJS wereld gezien waar een wijdverbreid ecosysteem vol packages met onderlinge afhankelijkheden toe kan leiden. Vaak betekent het toevoegen van een afhankelijkheid aan een package het installeren van talloze. Al snel raak je dan het overzicht kwijt over welke software nou eigenlijk jouw project aansturen en voel je je al snel als een kapitein op het topje van een drijvende ijsberg des doods. Vergeef me de hyperbool, maar ik geloof echt in het beteugelen van je software en een populair package systeem kan dit aardig dwarszitten. Als de taalcultuur niet een standaard package manager voorschrijft en mensen gewend zijn om afhankelijkheden handmatig te beheren, dan zal je nooit de explosie van complexiteit zien zoals bij Node.

Er kleven natuurlijk ook wat nadelen aan Ada

  • Het Adawereldje blijft een niche. Eentje die al lang bestaat en een focus op veiligheid en betrouwbaarheid heeft, maar toch kan dit een nadeel zijn. Er zijn minder online bronnen beschikbaar met info over hoe je bepaalde dingen aanpakt en er zijn minder softwarebibliotheken te vinden voor alles wat je wil kunnen doen in je software en je niet per se zelf wil programmeren.

  • Ada is een grote taal. Als je Ada wil leren dan betekent dit dat je je wat moet schrapzetten. Ze is gelukkig wat minder schijnbaar lukraak en organisch gegroeid dan veel andere talen, maar toch kan de omvang van alle taalconstructen wat intimiderend zijn.

  • De syntax zijn voor mensen die gehecht zijn aan het typen van accolades nogal teleurstellend. Je toetsenbord verslijt ook een stuk sneller dan bij de meeste andere talen, want Ada is nogal verbaal. Het leidende argument binnen de Ada-scene is natuurlijk dat broncode vaker wordt gelezen dan geschreven en dat leesbaarheid daarom voorop moet staan. Mij is het persoonlijk om het even en ligt het meer aan smaak.

  • Ada heeft toch wel een zweem van grootvaders technologie. Hoezeer er ook gemoderniseerd is, gebeurt de meeste Ada-ontwikkeling toch in vrij conservatieve sectoren. Persoonlijk prefereer ik mijn technologie wat aan de saaie en betrouwbare kant, maar je gaat met Ada geen hipheidspunten scoren. Je kunt dan beter afslaan richting Rust. Die taal deelt veel van de waardes van Ada, maar daarmee kun je aanmerkelijk de beter de blits maken op de “socials”.

  • Ada compilers zijn vrij streng. Met de Franse slag programmeren zit er niet in. Je wordt gedwongen exact te zijn over wat je wil zeggen. Hier loop je zeker tegenaan als je met Spark gaat werken. Voor de fans van Harry Potter: Ada is meer een professor Anderling dan een Hagrid.

Ergo

Ada is een interessante moderne programmeertaal die veel probeert te doen om je leven als programmeer zo prettig mogelijk te maken. Prettig betekent in deze zin wel iets meer het soort van verstandige prettig dat je krijgt nadat je braaf je groentjes eet en iets minder van het soort Dukes of Hazzard soort cowboyprettig, maar laten we wel wezen: kwaliteit en betrouwbaarheid van onze software is ontzettend belangrijk. Onze leefwereld wordt bevolkt door steeds meer software en niet allemaal software van goede kwaliteit. Ada is geen panacea tegen slechte software, maar biedt wel heel veel aanknopingspunten om goede code te schrijven.

Ik ben geen evangelist en geloof dat het mogelijk is goede software te maken in bijna elke programmeertaal. Toch denk ik dat het gebruik van een taal als Ada enorm kan helpen. In toekomstige blogberichten wil ik een aantal eigenschappen verder napluizen en ook verwijzen naar wat anderen allemaal voor boeiende dingen over Ada gezegd hebben.