Un backend ADA ?
Ada est parmi ces anciens langages qui se sont trouvés aux frontières de l'impératif et de l'objet, et du garbage collector et de la gestion manuelle de la mémoire. Ce langage fournissait de nombreuses avancées en son temps. Proche du pascal, on aurait pu penser que l'implémentation du backend allait être un jeu d'enfant. Loin s'en faut...
Déclarations de types
Tout type utilisé en ADA doit être déclaré, même quand il s'agit d'un simple tableau d'int. De plus, on doit déclarer non seulement le type mais aussi un type pour le pointeur (sinon, on ne peut pas faire d'allocation dynamique). C'était proche du pascal mais moins permissif que pascal. C'était facile à faire dans le backend, mais ça a demandé pas mal de code.
Limite sur la taille des lignes de code
En ada, une ligne de code ne peut pas dépasser 65536 caractères. Vu la lourdeur du langage, pour du code généré, on peut atteindre cette limite. Le code du sudoku cassait. J'en ai profité pour faire un fix plus général sur les printers. Ils coupent maintenant les lignes quand ils le peuvent.
Des opérateurs louches
Certains langages ont deux opérateurs pour le and sur les booleans : l'opérateur paresseux, et celui qui évalue forcément les deux termes. Ada ne fait pas exception à la règle, sauf que le choix de ces deux opérateurs est assez étrange : l'opérateur que nous utilisons le plus souvent est le and paresseux, en ada il s'écrit "and then", tandis que celui qui est strict s'écrit : "and". Idem pour or : "or else" contre "or". Ce qui est étrange, c'est que la façon l'usage le plus courant (la paresse) est aussi le plus long à écrire...
Les formats de chaines et de char
Pas du tout C-like et pas compatible pascal non plus... \n ne fonctionne pas... Bref, ce langage est LOURD au possible
IO
Un bon point finalement pour ADA : les IOs ont été assez faciles à gérer, malgré le fait qu'en ADA, EOF s'ignifie \n+fin du fichier, on s'en sort plutot bien, je vous présente ma procédure qui permet de supprimer les espaces de stdin :
procedure SkipSpaces is
C : Character;
Eol : Boolean;
begin
loop
Look_Ahead(C, Eol);
exit when Eol or C /= ' ';
Get(C);
end loop;
end;
Ainsi que ma gestion des print :
String'Write (Text_Streams.Stream (Current_Output), Trim(Integer'Image(...), Left));
Character'Write (Text_Streams.Stream (Current_Output), ...);
String'Write (Text_Streams.Stream (Current_Output), ...);
Conclusion
Ce backend n'a pas été le plus simple à mettre en place, mais actuellement il fonctionne, l'association prologin en a donc profité pour proposer ses codes à compléter en ada cette année (en plus des autres langages).