presentation

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
presentation [2026/07/27 20:16] – [Liste des instructions] rootpresentation [2026/08/02 12:35] (Version actuelle) – [Structures de contrôles] root
Ligne 1: Ligne 1:
 ===== Langage W description ===== ===== Langage W description =====
-Le langage W est un langage procédural, à typage dynamique et avec des structures de données souples et puissantes.\\+ 
 +Le langage W est un langage procédural, à typage dynamique et avec des structures de données souples et puissantes. 
 ==== Commentaires ==== ==== Commentaires ====
 +
 Les commentaires sont écrits à la suite du caractère '';'' Il peut être soit tout seul sur une ligne, soit en fin de ligne après une instruction.\\ Les commentaires sont écrits à la suite du caractère '';'' Il peut être soit tout seul sur une ligne, soit en fin de ligne après une instruction.\\
-Les lignes vides sont considérées comme des commentaires.\\+Les lignes vides sont considérées comme des commentaires. 
 <code wlang> <code wlang>
 ; Premier commentaire ; Premier commentaire
Ligne 9: Ligne 13:
  
 ; c'est fini ! ; c'est fini !
 +
 </code> </code>
 +
 ==== Structure d'un programme ==== ==== Structure d'un programme ====
 +
 Le langage W ne supporte qu'UNE seule instruction par ligne, exception faite du commentaire qui peut apparaître à la fin de la ligne, après l'instruction.\\ Le langage W ne supporte qu'UNE seule instruction par ligne, exception faite du commentaire qui peut apparaître à la fin de la ligne, après l'instruction.\\
 Un programme est constitué de l'instruction de début, du bloc de code du traitement, du bloc d'exception, et une instruction de fin.\\ Un programme est constitué de l'instruction de début, du bloc de code du traitement, du bloc d'exception, et une instruction de fin.\\
Ligne 19: Ligne 26:
 Lors de l'exécution, toute exception provoque automatiquement le saut au début du bloc exception du programme ou sous-programme en cours. C'est l'équivalent d'un ''try/catch'' systématique.\\ Lors de l'exécution, toute exception provoque automatiquement le saut au début du bloc exception du programme ou sous-programme en cours. C'est l'équivalent d'un ''try/catch'' systématique.\\
 Reprenons le classique //Hello world// : Reprenons le classique //Hello world// :
-<code wlang hello.w>+ 
 +hello.w 
 + 
 +<code wlang>
 ; exemple classique ; exemple classique
 begin hello   ; instruction de début, marquant le début du bloc principal begin hello   ; instruction de début, marquant le début du bloc principal
Ligne 28: Ligne 38:
    ; bloc exception    ; bloc exception
 end           ; fin du programme hello end           ; fin du programme hello
 +
 </code> </code>
 +
 A l'exécution, le traitement démarre à l'instruction de début du bloc principal, puis exécute toutes les instructions jusqu'à l'instruction //except//. A ce moment là, le traitement passe directement à l'instruction de fin puis il se termine.\\ A l'exécution, le traitement démarre à l'instruction de début du bloc principal, puis exécute toutes les instructions jusqu'à l'instruction //except//. A ce moment là, le traitement passe directement à l'instruction de fin puis il se termine.\\
 La deuxième instruction de début possible est ''background <nom>'' : le traitement fonctionne de manière identique à celui avec ''begin'' à la seule différence que le traitement s'exécute en tâche de fond, et donc qu'il rend la main immédiatement. Dans ce mode, toutes les écritures et lectures depuis la console sont automatiquement inhibées par l'exécuteur (''echonl'' ''echo'' ''input'').\\ La deuxième instruction de début possible est ''background <nom>'' : le traitement fonctionne de manière identique à celui avec ''begin'' à la seule différence que le traitement s'exécute en tâche de fond, et donc qu'il rend la main immédiatement. Dans ce mode, toutes les écritures et lectures depuis la console sont automatiquement inhibées par l'exécuteur (''echonl'' ''echo'' ''input'').\\
-La troisième et dernière instruction de début possible est ''library <nom>(<parametres>)''. Elle permet au programme d'être appelé depuis n'importe quel autre programme ou library, mais la bibliothèque ne peut pas être le premier programme lancé. Lors de l'appel, le chargement de la bibliothèque se fait à la volée, à l'exécution uniquement.\\+La troisième et dernière instruction de début possible est ''library <nom>(<parametres>)''. Elle permet au programme d'être appelé depuis n'importe quel autre programme ou library, mais la bibliothèque ne peut pas être le premier programme lancé. Lors de l'appel, le chargement de la bibliothèque se fait à la volée, à l'exécution uniquement.
 ==== Include et appels externes ==== ==== Include et appels externes ====
 +
 L'instruction //include// permet d'inclure un autre source dans le flux du source courant. La récursion n'est pas autorisée et provoquera une exception.\\ L'instruction //include// permet d'inclure un autre source dans le flux du source courant. La récursion n'est pas autorisée et provoquera une exception.\\
-Le fichier source à inclure doit se trouver dans l'arborescence [[install|WSRC]].+Le fichier source à inclure doit se trouver dans l'arborescence [[:install|WSRC]]. 
 <code wlang> <code wlang>
 ; ;
Ligne 40: Ligne 54:
 ; ;
 </code> </code>
-Les appels de bibliothèque et méthode se font avec les instructions ''do'' ''call'' ''invoke'' :  + 
-  * appel de sub/méthode d'objet : ''do <var>(param1, param2, ...)'', écrits en W et déclarés dans le même source que le source courant (fichiers //include// compris). +Les appels de bibliothèque et [[#appel_de_methode|méthode]] se font avec les instructions ''do'' ''call'' ''invoke''
-  * appel de bibliothèque, externe au source en cours : ''call <nom biblio>(param1, param2, ...)'', bibliothèque écrite en W, bloc principal de type //library//, et disponible dans le répertoire [[install|WLIB]] (le compilé). + 
-  * appel de module, type plugins : ''invoke <module>&<fonction>(parametre)'', écrits en C et dont le binaire se trouve dans [[install|WBIN]]. 3 paramètres maximum. +   * appel de sub/méthode d'objet : ''do <var>(param1, param2, )'', écrits en W et déclarés dans le même source que le source courant (fichiers //include//  compris). 
-  +  * appel de bibliothèque, externe au source en cours : ''call <nom biblio>(param1, param2, )'', bibliothèque écrite en W, bloc principal de type //library//, et disponible dans le répertoire [[:install|WLIB]] (le compilé). 
 +  * appel de module, type plugins : ''invoke <module>&<fonction>(parametre)'', écrits en C et dont le binaire se trouve dans [[:install|WBIN]]. 3 paramètres maximum. 
 Tous les passages de paramètres se font par référence : dans les sous-programmes appelées, les accès aux variables agissent sur la variable origine. Tous les passages de paramètres se font par référence : dans les sous-programmes appelées, les accès aux variables agissent sur la variable origine.
 +
 +
 ==== Types de données ==== ==== Types de données ====
 +
 Les variables se déclarent obligatoirement, mais sans type, et à n'importe quel endroit du code. Elle ne deviennent utilisable qu'à partir de leur déclaration, sous peine de déclencher une exception. Attention à ne pas mettre une déclaration de variable dans un corps de boucle, car la re déclaration de la même variable génèrera une exception. Les variables se déclarent obligatoirement, mais sans type, et à n'importe quel endroit du code. Elle ne deviennent utilisable qu'à partir de leur déclaration, sous peine de déclencher une exception. Attention à ne pas mettre une déclaration de variable dans un corps de boucle, car la re déclaration de la même variable génèrera une exception.
 +
 <code wlang> <code wlang>
 ; declaration de 3 variables ; declaration de 3 variables
 declare x, y, tmp declare x, y, tmp
 ; ;
 +
 +
 </code> </code>
 +
 Le typage de chaque variable se fait lors de leur affectation. Il existe 7 types utilisables : Le typage de chaque variable se fait lors de leur affectation. Il existe 7 types utilisables :
 +
   * Null : variable déclarée mais pas encore utilisée   * Null : variable déclarée mais pas encore utilisée
   * Number : nombre en virgule fixe, 13 chiffres avant la virgule et 5 décimales   * Number : nombre en virgule fixe, 13 chiffres avant la virgule et 5 décimales
   * Dynamic : stockage de chaines de caractères, structurées, ou de tout contenu binaire   * Dynamic : stockage de chaines de caractères, structurées, ou de tout contenu binaire
-  * Hashtable : //map// de type clé/valeur, chaque valeur étant elle même une autre variable parmi les types de disponible, Hashtable comprise+  * Hashtable : //map//  de type clé/valeur, chaque valeur étant elle même une autre variable parmi les types de disponible, Hashtable comprise
   * Subroutine : mémorise l'adresse d'une sub   * Subroutine : mémorise l'adresse d'une sub
   * Object : identique à Hashtable et permet de stocker/gérer des classes et objets   * Object : identique à Hashtable et permet de stocker/gérer des classes et objets
-  * Param : les paramètres passés aux sub étant tous par référence, chaque paramètre est de ce type, pointant sur la //vraie// variable : chaque action sur le paramètre agira en fait sur la variable passée en paramètre.+  * Param : les paramètres passés aux sub étant tous par référence, chaque paramètre est de ce type, pointant sur la //vraie//  variable : chaque action sur le paramètre agira en fait sur la variable passée en paramètre. 
 Un 8ème type, Buffer, sert uniquement en interne à l'exécuteur W (gestion de la pile d'expression et d'appel). Un 8ème type, Buffer, sert uniquement en interne à l'exécuteur W (gestion de la pile d'expression et d'appel).
 +
 === Portée === === Portée ===
-Les variables déclarées dans le bloc principal (begin/background) du programme ont une portée globale.\\ + 
-Les variables déclarées dans les bibliothèques (library) et sous-programmes (sub) ont une portée locale au sous-programme.\\ +Les variables déclarées dans le bloc principal (begin/background) du programme ont une portée globale. \\ Les variables déclarées dans les bibliothèques (library) et sous-programmes (sub) ont une portée locale au sous-programme. \\ Les //sub//  et classes ont une portée globale, même si ils apparaissent dans un sous-programme (**__A Préciser__**  quand créés depuis une //library//). \\ Les variables appartenant à une hashtable ne sont accessible que via la hashtable, sauf les classes et //sub//  accessibles globalement. 
-Les //sub// et classes ont une portée globale, même si ils apparaissent dans un sous-programme (**__A Préciser__** quand créés depuis une //library//).\\ +
-Les variables appartenant à une hashtable ne sont accessible que via la hashtable, sauf les classes et //sub// accessibles globalement.+
 === Utilisation === === Utilisation ===
-Les variables s'affectent avec l'instruction ''let''. Il est possible de //dés-affecter// une variable avec l'instruction ''delet''. Dans ce cas, le contenu de la variable est supprimé mais elle reste déclarée, sans type (même état qu'après sa déclaration avec ''declare''). L'ajout de variables dans une Hashtable n'a pas besoin de déclaration, mais elles s'affectent et se dés-affectent comme les autres ; cependant l'instruction ''delete'' d'un membre d'une hashtable supprime la variable de la hastable (contrairement aux autres). La syntaxe à utiliser est ''<varht>.<membre>''+ 
 +Les variables s'affectent avec l'instruction ''let''. Il est possible de //dés-affecter//  une variable avec l'instruction ''delet''. Dans ce cas, le contenu de la variable est supprimé mais elle reste déclarée, sans type (même état qu'après sa déclaration avec ''declare''). L'ajout de variables dans une Hashtable n'a pas besoin de déclaration, mais elles s'affectent et se dés-affectent comme les autres ; cependant l'instruction ''delete''  d'un membre d'une hashtable supprime la variable de la hastable (contrairement aux autres). La syntaxe à utiliser est ''<varht>.<membre>''. 
 <code wlang> <code wlang>
 declare h, n, d declare h, n, d
Ligne 78: Ligne 105:
 let h.x = 10 let h.x = 10
 let h.y = 20 let h.y = 20
 +
 +
 </code> </code>
 +
 +L'instruction ''let''  permet d'effectuer des opérations (liste des [[:reference#operateurs|opérateurs ]]et leur priorité) et d'affecter le résultat à la variable indiquée. De nombreuses [[:reference#fonctions|fonctions ]]sont disponibles dans les expressions.
 +
 +
 ==== Exceptions ==== ==== Exceptions ====
-Chaque programme et sous-programme contient obligatoirement une instruction [[reference#except|except]]. Lorsque qu'une exception survient, l'exécuteur saute automatiquement au bloc exception, c'est à dire à la première instruction qui suit la ligne ''except''.\\ + 
-Dans le bloc de traitement, il est possible de forcer la levée d'une exception avec l'instruction [[reference#throw|throw]].\\ +Chaque programme et sous-programme contient obligatoirement une instruction [[:reference#except|except]]. Lorsque qu'une exception survient, l'exécuteur saute automatiquement au bloc exception, c'est à dire à la première instruction qui suit la ligne ''except''. \\ Dans le bloc de traitement, il est possible de forcer la levée d'une exception avec l'instruction [[:reference#throw|throw]]. \\ 
-Dans le bloc exception, par défaut si rien n'est codé, l'exception se propage au programme appelant, et remonte ainsi jusqu'au programme principal. Dans ce cas, l'exception remonte un code exit au shell correspondant au code exception (en gérant le code retour sur 8 bits).\\ +Dans le bloc exception, par défaut si rien n'est codé, l'exception se propage au programme appelant, et remonte ainsi jusqu'au programme principal. Dans ce cas, l'exception remonte un code exit au shell correspondant au code exception (en gérant le code retour sur 8 bits). \\ 
-Toujours dans le bloc exception, il est possible d'annuler l'exception en cours par l'instruction [[reference#catch|catch]] : le programme sort immédiatement du bloc sans exception. Il est également possible de lever une autre exception avec l'instruction ''throw'' : le programme sort aussi immédiatement du bloc, avec le code exception indiqué dans ''throw''.\\ +Toujours dans le bloc exception, il est possible d'annuler l'exception en cours par l'instruction [[:reference#catch|catch]] : le programme sort immédiatement du bloc sans exception. Il est également possible de lever une autre exception avec l'instruction ''throw''  : le programme sort aussi immédiatement du bloc, avec le code exception indiqué dans ''throw''. \\ Enfin, la variable système [[:reference#varsys|@except]] contient l'exception en cours et [[:reference#varsys|@exceptline]] donne le numéro de ligne du source qui a provoqué l'exception. \\ 
-Enfin, la variable système [[reference#varsys|@except]] contient l'exception en cours et [[reference#varsys|@exceptline]] donne le numéro de ligne du source qui a provoqué l'exception.\\ +A tout moment, l'instruction [[:reference#return|return]] permet de sortir du bloc en cours, soit le bloc de traitement soit le bloc exception, sans changer les conditions de sortie (exception). Lorsque le bloc courant est le bloc principal, ''return''  provoque la fin du programme et le retour à l'appelant (le shell, etc.) avec comme retour le code exception courant (sur 8 bits), 0 si pas d'exception. \\ Exemple 
-A tout moment, l'instruction [[reference#return|return]] permet de sortir du bloc en cours, soit le bloc de traitement soit le bloc exception, sans changer les conditions de sortie (exception). Lorsque le bloc courant est le bloc principal, ''return'' provoque la fin du programme et le retour à l'appelant (le shell, etc.) avec comme retour le code exception courant (sur 8 bits), 0 si pas d'exception.\\ +
-Exemple+
 <code wlang> <code wlang>
 begin test begin test
Ligne 97: Ligne 129:
    echonl "Exception"     ; cette ligne n'apparaîtra pas dans la console    echonl "Exception"     ; cette ligne n'apparaîtra pas dans la console
 end end
 +
 </code> </code>
-===== Structures de contrôles =====+====   ==== 
 + 
 +==== Structures de contrôles ====
  
 Il y en a trois : Il y en a trois :
  
-  * condition ''if-then-elseif-else-endif'' : même fonctionnement que dans les autres langages +  * condition ''if-then-elseif-else-endif''  : même fonctionnement que dans les autres langages 
-  * boucle ''loop-endloop'' : boucle inconditionnelle (infinie). La sortie se fait avec les instructions ''break'' et ''breakon <condition>'', à n'importe quelle endroit dans la boucle. De manière similaire, il est également possible de forcer le retour au début de la boucle avec les instructions ''continue'' et ''continueon <condition>'' +  * boucle ''loop-endloop''  : boucle inconditionnelle (infinie). La sortie se fait avec les instructions ''break''  et ''breakon <condition>'', à n'importe quelle endroit dans la boucle. De manière similaire, il est également possible de forcer le retour au début de la boucle avec les instructions ''continue''  et ''continueon <condition>'' 
-  * itérateur ''foreach-endfor'' : permet d'itérer de trois manières différentes selon le type de la variable itérée : +  * itérateur ''foreach-endfor''  : permet d'itérer de trois manières différentes selon le type de la variable itérée : 
-      * numérique : pour compter en boucle+      * numérique : pour compter
       * dynamic (chaîne) : pour extraire de manière séquentielle chaque champ       * dynamic (chaîne) : pour extraire de manière séquentielle chaque champ
       * hashtable : pour lire la clé de chaque élément de la hashtable       * hashtable : pour lire la clé de chaque élément de la hashtable
  
  
-===== Appel de méthode =====+==== Appel de méthode ====
  
 Il y a un seul type de méthode, déclarée par ''sub-except-endsub'', avec la même structure que le programme principal. La portée est globale pour les noms de méthode simple. Les méthodes déclarées dans une hashtable sont //locales// à la hashtable. C'est également le fonctionnement des méthodes de classes et d'objets.Tous les paramètres sont passés par référence (maximum 8). Il n'y a pas de //fonction// retournant une valeur : pour renvoyer des valeurs avec les méthodes, il faut utiliser un des paramètres de la méthode. Il y a un seul type de méthode, déclarée par ''sub-except-endsub'', avec la même structure que le programme principal. La portée est globale pour les noms de méthode simple. Les méthodes déclarées dans une hashtable sont //locales// à la hashtable. C'est également le fonctionnement des méthodes de classes et d'objets.Tous les paramètres sont passés par référence (maximum 8). Il n'y a pas de //fonction// retournant une valeur : pour renvoyer des valeurs avec les méthodes, il faut utiliser un des paramètres de la méthode.
 +
 +A l'intérieur d'une méthode, comme dans le programme principal, il est possible de forcer la fin de la méthode (du programme principal) et donc le retour à l'appelant, avec les instructions ''return'' et ''returnon <condition>''
 +
 +
 +==== Interactions console ====
 +
 +  * affichage dans la console : les instructions ''echo <expression>''  et ''echonl <expression>''  envoient le résultat de l'expression dans la console, comme le fait ''printf''  en C. ''echonl''  écrit à la fin de l'expression un saut de ligne (''\n''), ce que ne fait pas ''echo''.
 +  * lecture depuis la console : l'instruction ''input <variable>''  permet de récupérer dans la variable les caractères tapés au clavier dans la console. La variable est de type //dynamic//.
 +
 +==== Debugger ====
 +
 +Le langage dispose d'un debugger intégré à la machine virtuelle qui exécute le pcode W. Le mode s'active en exécutant un programme w avec l'option ''-d''. Il peut aussi être déclenché pendant l'exécution d'un programme, en envoyant un signal au processus, différemment sous Linux et Windows (**A PRECISER**). Le debugger dispose de nombreuses [[:debugger|commandes ]](pas à pas, points d'arrêt, visualisation des variables,etc.).
 +
  
 ===== Liste des instructions ===== ===== Liste des instructions =====
  
 Par ordre [[:reference|alphabétique]] Par ordre [[:reference|alphabétique]]
- 
  
 ===== Exemples ===== ===== Exemples =====
-  * une [[sample:calc|calculatrice]] en mode console, travaillant en RPN+ 
 +  * une [[:sample:calc|calculatrice]] en mode console, travaillant en RPN 
 ===== Fonctionnement interne ===== ===== Fonctionnement interne =====
-Le code source W est compilé sous forme de //p-code//.\\ + 
-Ce p-code est une série d'instructions élémentaires spécifique au langage W.\\ +Le code source W est compilé sous forme de //p-code//. \\ Ce p-code est une série d'instructions élémentaires spécifique au langage W. \\ C'est le même programme qui analyse le code source W et le découpe en instructions p-code. Les instructions sont écrites dans le fichier assembleur de sortie. A la fin, ce fichier assembleur est converti en //binaire W//, traduction numérique des instructions du p-code. \\ L'exécuteur de p-code peut également être appelé depuis un autre traitement, le p-code servant de langage/bibliothèque de type //plugins//. Un module FastCGI fourni facilite l'utilisation du W comme langage serveur de sites Internet. \\ Le format binaire du p-code est en big-endian et est interprété par l'exécuteur W de telle manière qu'un même fichier binaire W peut être utilisé sur tout type d'OS et d'architecture, sans recompilation. \\ Les expressions ne concernent que les variables de type Dynamic et Number, et sont gérées dans une pile en //notation polonaise inverse//. \\  \\ Liste des instructions du [[:referencepcode|p-code]] W. \\ 
-C'est le même programme qui analyse le code source W et le découpe en instructions p-code. Les instructions sont écrites dans le fichier assembleur de sortie. A la fin, ce fichier assembleur est converti en //binaire W//, traduction numérique des instructions du p-code.\\ + \\ 
-L'exécuteur de p-code peut également être appelé depuis un autre traitement, le p-code servant de langage/bibliothèque de type //plugins//. Un module FastCGI fourni facilite l'utilisation du W comme langage serveur de sites Internet.\\ +Règles de [[:compilation|transformation]] du source W en p-code (assembleur W). 
-Le format binaire du p-code est en big-endian et est interprété par l'exécuteur W de telle manière qu'un même fichier binaire W peut être utilisé sur tout type d'OS et d'architecture, sans recompilation. + 
-\\ +
-Les expressions ne concernent que les variables de type Dynamic et Number, et sont gérées dans une pile en //notation polonaise inverse//.\\ +
-\\ +
-Liste des instructions du [[referencepcode|p-code]] W.\\ +
-\\ +
-Règles de [[compilation|transformation]] du source W en p-code (assembleur W).+
  • presentation.1785183360.txt.gz
  • Dernière modification : 2026/07/27 20:16
  • de root