coucou747

Ce blog présente principalement les évolutions du compilateur metalang : les nouveaux backends, les nouvelles corrections de bugs, les nouvelles features, nouvaux tests, son utilisation dans le cadre du concours prologin.

le 08/10/2014

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).

Dans Catégories/Metalang/Changelog.

Sujets : #backend #metalang #ada #pascal