Introduction
La création et l'analyse formelle de langages est une vaste branche de la programmation informatique et bien que de solides connaissances en programmation et une bonne expérience dans différents langages soient indispensables pour appréhender au mieux cette discipline, je me propose aujourd'hui de rédiger une série d'article sur les différentes étapes de création d'un langage. Le but de ces articles sera de familiariser le lecteur avec une vision très théorique et abstraite des langages qu'il utilise afin d'élargir ses possibilités en terme de réflexion et de mise au point d'algorithmes complexes.
Nous travaillerons en deux temps : la théorie et la pratique. Dans un premier temps, les nouveaux concepts seront expliqués et la thèse développée de manière abstraite et très précise. Le but sera de faire connaître le côté théorique de manière générique afin de pouvoir transposer le contenu du cours vers un exercice autre que le TP de la deuxième partie. Dans un deuxième temps, nous appliquerons le cours précédemment acquis par la création d'un petit langage de script qui pourra, par la suite, être utilisé par le lecteur dans ses propres programmes. Je tiens tout d'abord à préciser que les algorithmes utilisés pour le TP ne seront pas ou peu optimisés et leur code se voudra clair pour le lecteur.
Une fois le cours terminé, le lecteur aura un interpréteur pour le langage de script suivant :
HackScript - Le langage de script de l'académie
Tout au long du cours, le lecteur aura l'occasion d'écrire un interpréteur pour le langage de script défini plus bas. Afin d'assurer la plus grande cohérence entre le cours et le TP, je décrirai personnellement les spécifications du langage, amenant ainsi tous les lecteurs à pouvoir travailler autour d'un seul et même langage. Ce cours étant rédigé pour hackademics, j'ai trouvé de bon ton de nommer le langage en question "HackScript". Ce sera un langage impératif de haut niveau à typage dynamique (termes expliqués plus tard) supportant trois types de données simples : le vide, l'entier et le caractère et un type de données complexe : la liste chaînée.
La syntaxe du HS (HackScript) est simple et essentiellement basée sur le Ruby. L'indentation est très fortement conseillée, mais contrairement au Python, elle sera loin d'être obligatoire. On trouvera 3 niveaux hiérarchiques de constructions syntaxiques :
Parmi les directives, nous trouverons les instructions, les définitions de fonctions et les directives de préprocesseur. Les instructions représenteront les blocs, les boucles, les conditions et les macros secondaires. Les expressions seront quant à elles des calculs (numériques ou sur des listes, appel de fonctions...).
La syntaxe d'un bloc est simple, il constitué d'un en-tête, d'une séquence d'instructions et du mot-clé "end", exemple :
Le dernier point me paraissant assez important reste ce que j'ai appelé les "macros secondaires" qui, contrairement aux macros de préprocesseur, sont interprétées pendant l'éxecution. Au risque de ne pas être original, je n'en ai pensé que quatre :
Le fait que le retour de read soit une chaîne de caractère et rien d'autre permet une bien plus grande stabilité du code et éviter toute ambiguité quant au type de la variable après sa lecture. Pour pouvoir lire des entiers, nous créerons une fonction qui utilisera read et se chargera de convertir les données contenues dans la chaîne en le type désiré.
La macro secondaire return sera bien particulière puisque celle-ci ne pourra être utilisée que dans une fonction. Une fonction n'ayant pas de return explicite renverra un unit (unit = variable de type vide) implicitement. Ainsi le code suivant est valide :
Afin de profiter du shebang (sous Linux), nous utiliserons les # comme balise de commentaire. Nous verrons au cours de notre étude que nous ne limiterons pas à ça et qu'une multitude de types de commentaires différents peuvent être implémentés de manière très simple et réutilisable.
Conclusion
Après une brève description de notre projet, je vais conclure sur quelques détails qui me paraissent importants. Tout d'abord, je ne donnerai que des morceaux de code, aucun code complet ne sera donné dans le cours, ce projet est à but éducatif et comprendre ce qui y sera dit est d'une importance capitale. Je tenterai de créer un interpréteur "officiel" pour que chacun sur le forum puisse profiter pleinement des résultats du projet en suivant le cours à son rythme, je recommande cependant de ne pas trop compter sur les sources que je distribuerai pour avancer dans le cours, le code que je mettrai sera le plus performant possible et non voué à être support du cours. Je ne saurais trop recommander de pratiquer et ce, pour des projets autre que HackScript, le but est d'acquérir la maîtrise des concepts exposés et non de réussir le TP.
Je tiens par ailleurs à dire que je vais rédiger ce cours dans mon temps libre, malgré un emploi du temps assez chargé et qu'en plus je vais écrire beaucoup de code sur ce projet, c'est pourquoi je demanderai indulgence quant au temps que prendra un article à paraître. Je jure cependant que je garderai la plus grande qualité qu'il m'est possible de fournir dans l'écriture de mes articles.
Sur ces quelques mots, je vous laisse la parole et suis tout ouïe des commentaires que vous émettrez.
Bisou,
Docteur Lalla.
La création et l'analyse formelle de langages est une vaste branche de la programmation informatique et bien que de solides connaissances en programmation et une bonne expérience dans différents langages soient indispensables pour appréhender au mieux cette discipline, je me propose aujourd'hui de rédiger une série d'article sur les différentes étapes de création d'un langage. Le but de ces articles sera de familiariser le lecteur avec une vision très théorique et abstraite des langages qu'il utilise afin d'élargir ses possibilités en terme de réflexion et de mise au point d'algorithmes complexes.
Nous travaillerons en deux temps : la théorie et la pratique. Dans un premier temps, les nouveaux concepts seront expliqués et la thèse développée de manière abstraite et très précise. Le but sera de faire connaître le côté théorique de manière générique afin de pouvoir transposer le contenu du cours vers un exercice autre que le TP de la deuxième partie. Dans un deuxième temps, nous appliquerons le cours précédemment acquis par la création d'un petit langage de script qui pourra, par la suite, être utilisé par le lecteur dans ses propres programmes. Je tiens tout d'abord à préciser que les algorithmes utilisés pour le TP ne seront pas ou peu optimisés et leur code se voudra clair pour le lecteur.
Une fois le cours terminé, le lecteur aura un interpréteur pour le langage de script suivant :
Code:
def prog = "cat" if args <> [] def file = args !! 1 exec prog, [file] else print "You need a file to cat." end
Tout au long du cours, le lecteur aura l'occasion d'écrire un interpréteur pour le langage de script défini plus bas. Afin d'assurer la plus grande cohérence entre le cours et le TP, je décrirai personnellement les spécifications du langage, amenant ainsi tous les lecteurs à pouvoir travailler autour d'un seul et même langage. Ce cours étant rédigé pour hackademics, j'ai trouvé de bon ton de nommer le langage en question "HackScript". Ce sera un langage impératif de haut niveau à typage dynamique (termes expliqués plus tard) supportant trois types de données simples : le vide, l'entier et le caractère et un type de données complexe : la liste chaînée.
La syntaxe du HS (HackScript) est simple et essentiellement basée sur le Ruby. L'indentation est très fortement conseillée, mais contrairement au Python, elle sera loin d'être obligatoire. On trouvera 3 niveaux hiérarchiques de constructions syntaxiques :
- la directive
- l'instruction
- l'expression
Parmi les directives, nous trouverons les instructions, les définitions de fonctions et les directives de préprocesseur. Les instructions représenteront les blocs, les boucles, les conditions et les macros secondaires. Les expressions seront quant à elles des calculs (numériques ou sur des listes, appel de fonctions...).
La syntaxe d'un bloc est simple, il constitué d'un en-tête, d'une séquence d'instructions et du mot-clé "end", exemple :
Code:
while var == 1 foo("bonjour") bar(1, 2) var = baz(1, 2, 3) end
- print (affiche le contenu d'une variable)
- read (lit une entrée clavier et la stocke dans une variable sous forme de chaîne de caractère)
- return (permet le retour d'une valeur dans une fonction)
- exec (permet d'exécuter un autre programme)
Le fait que le retour de read soit une chaîne de caractère et rien d'autre permet une bien plus grande stabilité du code et éviter toute ambiguité quant au type de la variable après sa lecture. Pour pouvoir lire des entiers, nous créerons une fonction qui utilisera read et se chargera de convertir les données contenues dans la chaîne en le type désiré.
La macro secondaire return sera bien particulière puisque celle-ci ne pourra être utilisée que dans une fonction. Une fonction n'ayant pas de return explicite renverra un unit (unit = variable de type vide) implicitement. Ainsi le code suivant est valide :
Code:
fun test(): print "bonjour" end def i = 0 # i :: Int def u = test() # u :: Unit def ti = [ 0 ; 1 ; 2 ] # ti :: [Int] def s = "" # s :: [Char]
Conclusion
Après une brève description de notre projet, je vais conclure sur quelques détails qui me paraissent importants. Tout d'abord, je ne donnerai que des morceaux de code, aucun code complet ne sera donné dans le cours, ce projet est à but éducatif et comprendre ce qui y sera dit est d'une importance capitale. Je tenterai de créer un interpréteur "officiel" pour que chacun sur le forum puisse profiter pleinement des résultats du projet en suivant le cours à son rythme, je recommande cependant de ne pas trop compter sur les sources que je distribuerai pour avancer dans le cours, le code que je mettrai sera le plus performant possible et non voué à être support du cours. Je ne saurais trop recommander de pratiquer et ce, pour des projets autre que HackScript, le but est d'acquérir la maîtrise des concepts exposés et non de réussir le TP.
Je tiens par ailleurs à dire que je vais rédiger ce cours dans mon temps libre, malgré un emploi du temps assez chargé et qu'en plus je vais écrire beaucoup de code sur ce projet, c'est pourquoi je demanderai indulgence quant au temps que prendra un article à paraître. Je jure cependant que je garderai la plus grande qualité qu'il m'est possible de fournir dans l'écriture de mes articles.
Sur ces quelques mots, je vous laisse la parole et suis tout ouïe des commentaires que vous émettrez.
Bisou,
Docteur Lalla.
Commentaire