Langage de programmation GT
This document is also available in English
Présentation
GT est un langage de programmation impératif fortement basé sur le langage C. Il ajoute à ce dernier les notions de :
- classe, héritage, attribut, méthode
- template
Il garde néanmoins l'esprit du C. En particulier, un grand soin a été apporté à ne pas nuire aux performances d'exécution du C (en utilisant des astuces basées sur les pointeurs de structures et de fonctions par exemple).
GT est donc un langage de programmation système au même titre que C, C++, D et ObjectiveC.
GT est un langage. Il ne fournit pour l'instant aucune bibliothèque de classes prédéfinies ni "runtime": pas de garbage collector, de gestionnaire de sécurité...
Compilation
La compilation d'un programme GT produit un code source C plutôt qu'un exécutable. Les motivations de ce choix sont les suivantes:
- le code C résultant peut être compilé par n'importe quel compilateur C...
- ... sur n'importe quel système d'exploitation
- ce code peut aussi être inclus/lié à d'autres parties d'un logiciel implémenté en C, C++ ou ObjectiveC
Implémentation du compilateur
GT a été réécrit plusieurs fois. Sa dernière implémentation repose sur un générateur d'automates à états finis basé sur les expressions rationnelles: Ragel. Elle est plus rapide et plus maintenable que son implémentation précédente (un "recursive descent parser").
Plus précisément, GT utilise 5 machines à état principales qui déclenchent chacune plusieurs sous-machines en pile:
- inclusion de fichiers et analyse des seules templates
- instanciation des templates
- analyse structurelle (classes, attributs, méthodes et macros)
- analyse du corps des méthodes
- génération du code C
Avantages comparés
GT apporte au C
- certaines notions objet: classes, héritage d'attributs et de méthodes, polymorphisme sur type apparent
- un moteur de templates simple et léger
GT diffère du C++ par
- la rapidité de son compilateur, qui, couplé à TCC, permet d'évaluer immédiatement un programme entier
- l'absence de mécanismes complexes et coûteux à l'exécution (exceptions, RTTI, polymorphisme sur type réel via les VTables...)
- la compatibilité à 100% avec le langage C. GT peut même inclure directement du code C qui sera compilé d'une traite par un même compilateur (pas de nécessité de compilation séparée)
GT n'est pas un nouveau D, Vala, Genie...
Le compilateur GT a une architecture originale. Son code est assez technique car basé sur Ragel, mais assez concis pour rester maintenable et permettre corrections et évolutions rapides.
GT ne cherche pas à réinventer ce que le C sait très bien faire; dans certains cas, il se comporte quasiment comme un "passe plat": les expressions arithmétiques et opérations sur pointeurs sont identiques en C et en GT par exemple.
GT suit simplement l'esprit du C++ originel, lorsqu'il s'appelait encore "C with Classes"
GT n'est pas un concurrent de Java, C#, VB.NET...
GT, comme le C et le C++, permet de développer des logiciels de tous types sans restriction, sans lourdeur ni besoin de machines surpuissantes pour s'exécuter correctement. Il ne repose pas sur un runtime, n'a pas besoin de "finir de compiler son code" au chargement des classes. Il n'a pas de dépendance avec des bibliothèques pesant plusieurs Mo. GT est aussi léger que le C.
Exemple
La syntaxe d'un programme GT semblera assez classique aux développeurs C, C++, D, C# et Java. Voici une illustration des principales facettes du langage:
programme.gt #include <stdio.h> #include <string.h> class int{ void autoincrement(){ *this = *this+1; // this est un int* } } class Compte{ int numero; void ouvrir(){ puts("Compte.ouvrir"); numero.autoincrement(); } } class CompteCheque: Compte{ int numChequier; void ouvrir(){ puts("CompteCheque.ouvrir"); super.ouvrir(); } } class Compte{ // toutes les classes sont "partielles" void fermer(){ puts("Compte.fermer"); } } template Vector<T,size,format>{ ${T}* start; ${Vector}* add(${T} t){ printf("${T}.add.${size}(${format})\n", t); return this; } }<> using VectorInt4 = Vector<int, 4, %d> class VectorTest{ static void test(){ VectorInt4 ints; ints.add(3); } } class Test{ void main(int argc, char** argv){ VectorTest.test(); Compte cpt; cpt.ouvrir(); CompteCheque cc; cc.ouvrir(); cc.fermer(); } }
Licence et téléchargement
GT 3.5 est Open Source. Son code appartient au Domaine Public
Exécution
gt.exe exemple.gt exemple.gt.c analyse exemple.gt et si aucune erreur n'est détectée, produit exemple.gt.c.
gt.exe exemple.gt -run exécute en mémoire le code compilé à partir de exemple.gt. Ce mode nécessite d'avoir installé TCC dans le répertoire c:\tcc et d'y avoir ajouté la bibliothèque partagée c:\tcc\tcc.dll (qui peut être téléchargée ici en version Windows 32 bits)
Bugs, critiques, suggestions, demandes de nouvelles fonctionnalités, customisation
GT n'a pas de forum dédié. Les demandes et autres réactions peuvent être adressées à [email protected].
thomasgil.com est à votre disposition pour réaliser des adaptations, customisations, intégration ou développements sur mesure autour de GT.