Skip to content

Le langage de programmation de Gaspard Courchinoux

J'ai créé ce langage pour le fun, car cela m'amuse de faire des choses complexes.

Et puis, je veux maîtriser l'API C++ de LLVM IR.

Telecharger : Télécharger

Comment le compilateur Gaspard fonctionne-t-il ?

Très simplement :

  • FLEX pour les lexèmes.
  • Bison (en mode C++, ultra pénible) pour générer la grammaire.

On construit un AST → l'AST est converti en LLVM IR → puis on compile vers un fichier objet.

Le fichier objet est ensuite traduit en exécutable avec le linker disponible sur le système hôte.

Quelles sont les spécificités de GaspardOS LANG ?

Déjà :

  • 100 % compilé.
  • Bas niveau.

Ensuite :

  • Syntaxe comportant peu d'ambiguïtés.
  • Verbeux.
  • Très strict sur les types : pas de conversion implicite de type (en vrai, un peu trop peut-être...).
  • Facile à apprendre.
  • Amusant, mignon et KAWAII.
  • Incite les développeurs haut niveau (genre Java) à passer au bas niveau pour les performances.
  • Très peu orienté objet (les seuls objets sont les struct. Je ne veux pas tomber dans le délire qui consiste à tout transformer en objet).
  • Même mes potes de la fac de droit peuvent l'apprendre très simplement (c'est du droit des obligations version Gaspard LANG 🙂).

La programmation orientée objet, c'est bien, mais seulement dans certains cas précis.

La plupart du temps, elle est utilisée par des gens qui ne connaissent pas grand-chose à la machine.

Par « moutonnisme », ils font de la programmation orientée objet sans véritable opinion personnelle.

JE NE SUIS PAS ANTI-PROGRAMMATION OBJET, JE SUIS SEULEMENT PRAGMATIQUE.

Introduction au code GaspardOS LANG

Premier parti pris :

Les variables sont définies avant les fonctions :

global uint32_t MB_OK = 0x00000000;
global uint64_t hwnd;
global wstring titre = L"éééé ください";
global wstring texte = L"WoW GaspardOS ééé Bonjour MIAM MIAM !!!!!";
global string ascii = "string ascii, GaspardOS prend en charge Unicode et ASCII nativement";

En réalité, sous Windows, wstring correspond à :

global ptr uint16_t string_unicode_win .....

Totalité des types de GaspardOS LANG

TYPE Note Exemple
uint8_t Entier non signé sur 8 bits global uint8_t d = cast uint8_t 4;
uint16_t Entier non signé sur 16 bits global uint16_t d = cast uint16_t 16;
uint32_t Entier non signé sur 32 bits global uint32_t d = cast uint32_t 32;
uint64_t Entier non signé sur 64 bits global uint64_t d = 32; NOTE : plus besoin de cast, car dans Gaspard LANG un entier est toujours codé sur 64 bits
int8_t Entier signé sur 8 bits global int8_t d = cast int8_t -4;
int16_t Entier signé sur 16 bits global int16_t d = cast int16_t -16;
int32_t Entier signé sur 32 bits global int32_t d = cast int32_t -32;
int64_t Entier signé sur 64 bits global int64_t d = -32; NOTE : plus besoin de cast, car dans Gaspard LANG un entier est toujours codé sur 64 bits
float Flottant simple précision (32 bits) global float d = cast float 32.4;
double Flottant double précision (64 bits) global double d = cast double 32.4;
string Chaîne ASCII global string str = "Bonjour ASCII";
wstring Chaîne Unicode global wstring str = L"Bonjour Unicode WOW";

Comme vous pouvez le constater, les types s'inspirent du C. Vous remarquerez également la nécessité d'effectuer un cast, sauf pour int64_t et uint64_t.

Pour les professionnels de la sécurité système (ou de la « cybersécurité », en langage marketing), mon système de typage est tout à fait nécessaire et permet d'éviter les overflows silencieux (notamment sur x86, entre autres).

Où télécharger le compilateur, le compiler et voir des exemples ?

Sur GitHub, c'est open source :

https://github.com/gcourchinoux/GaspardOSLang

J'écrirai d'autres articles thématiques sur GaspardOS LANG.

Gaspard COURCHINOUX

11/06/2026

petit bonus un exemple !!!!

Voici du code GaspardOS LANG. En gros , il appelle une seule fonction de la STDLIB GASPARDOS

Pour créer une fenetre avec CreateWindowExW

on peut avoir la boucle EVENT WndProc qui est WindowHandler1.

Le résultat :

drawing

le code :

// on compile  avec :   -Lwin32 stdlib/Win32.o

global uint32_t width ;
global uint32_t height ;
global uint64_t ret_un = 0x1;
global uint64_t status2 = 0;
global string message2 = "addr glang func 0x%lx : \n";

global string message1 = "Gaspard CALL HWND :  0x%x \n";


// #define WM_DESTROY                      0x0002

global uint32_t WM_DESTROY = cast uint32_t 0x0002;

global uint32_t ZERO = cast uint32_t 0;

global uint64_t addr_func = 0;


prototype procedure GaspardOSCreateWindow return uint32_t = begin 

argument begin 


argument uint64_t hInst;
argument uint32_t nCmdShow;
argument uint32_t width;
argument uint32_t height;
argument ptr uint64_t HandlerFunc;

end


end


prototype procedure DefWindowProcW return int64_t = begin 


//DefWindowProc
argument begin 


argument uint64_t hwnd;
argument uint32_t msg;
argument uint64_t wParam;
argument int64_t lParam;



end

end

prototype procedure PostQuitMessage = begin

argument begin 


argument int32_t exit_code;


end

 end


procedure WindowHandler1 return int64_t = begin 


//typedef int (*GaspardOSH)(HWND hwnd,unsigned int msg,uint64_t wParam,uint64_t lParam);

argument begin 


argument uint64_t hwnd;
argument uint32_t msg;
argument uint64_t wParam;
argument int64_t lParam;



end


if hwnd == 0 begin 

return 0;

end


if msg == WM_DESTROY begin 


call PostQuitMessage  ZERO;


return 0;
end 


call printf message1 hwnd;

call DefWindowProcW return status2  hwnd msg wParam lParam ;
return status2;
end


procedure WinMain = begin 


argument begin 


argument uint64_t hInst;
argument uint64_t hPrev;
argument ptr uint8_t cmd;
argument uint32_t show;



end

width = cast uint32_t 400;
height = cast uint32_t 800;

addr_func = WindowHandler1;
call printf message2 addr_func;

call printf message1;
call GaspardOSCreateWindow hInst show width height WindowHandler1;


end