Il est difficile de répondre à des questions de type « est X un Y », si les participants de l'utilisation de débat différentes définitions de X et Y . Il se pourrait que pour certaines définitions, la réponse soit «oui», et pour certaines définitions, la réponse soit «non». Surtout si la réponse dépend de détails techniques où les différentes définitions diffèrent. Cette discussion contient également des informations erronées, alors veuillez patienter avec une réponse plus longue.
Qu'entend-on par « langage de programmation »?
Une réponse simple pourrait être "un langage utilisé pour créer des programmes". Bien sûr, mais: quel genre de programmes? Qu'en est-il d'un langage qui pourrait être utilisé pour créer certains types de programmes, mais pas d'autres types de programmes? Voici deux exemples spécifiques pour illustrer les cas extrêmes:
1) Un langage imaginaire appelé M fonctionne comme ceci: Si le programme contient la seule lettre "m", il crée un jeu de Démineur. Tout le reste est une erreur de syntaxe.
Intuitivement, ce n'est pas ce que nous entendons par dire "un langage de programmation". Mais le service marketing de M pourrait faire valoir qu'il répond techniquement à la définition, car il peut être utilisé pour créer un programme. Bien sûr, le compilateur fait certaines parties critiques pour vous, mais c'est ce que font les compilateurs, n'est-ce pas? Un compilateur du langage C traduit également quelques mots simples en dizaines d'instructions de processeur. Le compilateur M va juste plus loin et rend votre travail encore plus simple.
2) Si vous installez la version originale du célèbre Turbo Pascal, vous pouvez écrire de nombreux types de programmes. Mais vous ne pouvez pas écrire un jeu qui s'exécute dans le navigateur Web, car l'API nécessaire n'est tout simplement pas là.
Alors, quelle est exactement la chose qui fait de Turbo Pascal un langage de programmation, mais M ne l'a pas? En termes simples, vous pouvez faire plus en Pascal qu'en M. Mais imaginez que nous avons un M.NET, qui crée un jeu de démineur fonctionnant dans un navigateur Web. Alors maintenant, nous avons quelque chose que Pascal peut faire et M.NET ne peut pas, mais nous avons aussi quelque chose que M.NET peut faire et Pascal ne peut pas. Pourquoi devrions-nous considérer les avantages de Pascal importants et les avantages de M.NET non pertinents?
La réponse est que vous pouvez écrire toutes sortes d' algorithmes en Pascal, mais vous ne pouvez pas écrire d' algorithmes en M ou M.NET. Bien sûr, M compile votre commande "m" et C compile votre commande "strcmp". Mais vous pouvez placer "strcmp" dans un contexte plus large, par exemple comparer deux fichiers ligne par ligne, ou lire des milliers de chaînes et les trier par ordre alphabétique, ou ... enfin, des millions d'autres choses. Et c'est précisément cette capacité à utiliser des commandes données dans n'importe quel algorithme qui fait l'essence d'un langage de programmation.
Qu'est-ce qu'un algorithme et, plus important encore, qu'est-ce qu'un "algorithme"? En informatique, nous utilisons les mots Turing-complete . L'idée est qu'il existe un ensemble de langages informatiques, où chacun est capable de les simuler tous. L'un de ces langages est la machine de Turing, c'est pourquoi ils sont appelés ainsi. Pascal est là, C est là, Java est là, Python est là, Lisp est là, Smalltalk est là, même XSLT est là. Nos hypothétiques M et M.NET ne sont pas là. Vous pouvez en apprendre davantage à ce sujet dans n'importe quelle université offrant un cours d'informatique décent, mais l'idée est qu'un langage complet de Turing peut faire n'importe quoiqu'un autre langage complet de Turing peut faire, si vous leur donnez l'API minimale nécessaire. (Si vous donnez une API de navigateur Web à Pascal, vous pouvez créer toutes sortes de jeux dans le navigateur Web. Si vous donnez l'API de navigateur Web à M, vous ne pouvez toujours créer que Démineur.) On pourrait dire métaphoriquement que si vous supprimez toutes les API d'un langage de programmation, l'essentiel est ce qui reste.
Qu'entendons-nous par « expressions régulières »?
Différents langages de programmation les implémentent légèrement différemment. Mais l'idée originale était que les expressions régulières expriment des langues dites régulières . Notez que nous ne parlons pas ici de langages de programmation, mais de langages (pseudo-) humains. Imaginez que vous trouviez une tribu exotique parlant une langue composée uniquement de mots "ba", "baba", "bababa" et ainsi de suite. Vous pouvez décrire cette langue verbalement comme "une syllabe 'ba' répétée une ou plusieurs fois" ou en utilisant une expression régulière comme "(ba) +".
Les expressions régulières sont censées exprimer: "rien", "cette lettre", "ceci, suivi de cela", "ceci ou cela", "ceci, répété une ou plusieurs fois", et "pas ceci". - Telle est la définition mathématique . Tout le reste n'est qu'un raccourci pratique construit à partir des composants précédents. Par exemple, "ceci, répété deux ou trois fois" peut être traduit par "ceci, suivi de ceci, suivi de (ceci ou rien)", mais il pourrait être plus pratique d'écrire "ba {2,3}" que "baba (ba)? ".
Dans la vie réelle, une implémentation typique des "expressions régulières" implémente plus que cela. Par exemple, en utilisant la définition mathématique, une langue de "aba", "aabaa", "aaabaaa" et ainsi de suite - n'importe quel nombre de "a" s, suivi d'un "b", suivi du même nombre de "a "s - n'est pas une langue régulière. Cependant, de nombreuses "expressions régulières" utilisées aujourd'hui pourraient le détecter, en utilisant le concept supplémentaire de "la même chose que nous avons trouvée auparavant", écrit "(a +) b \ 1". En utilisant ce concept supplémentaire, nous pouvons faire des choses intéressantes, par exemple détecter des mots composés d' un nombre premier de lettres. Pourtant, nous ne pouvons faire aucun algorithme ... pour une explication pourquoi,
Donc, revenons au sujet d'origine: les expressions régulières (définies soit comme: des expressions décrivant des langages réguliers dans la hiérarchie Chomsky; soit comme: l'ancien, plus l'opération \ 1) un langage de programmation (défini comme: Turing-complete)? La réponse est non . Non, vous ne pouvez implémenter aucun algorithme à l' aide d'expressions régulières, et la capacité d'implémenter n'importe quel algorithme est ce que les personnes qui étudient en informatique comprennent généralement comme l'essence du langage de programmation.
Bien sûr, n'importe qui peut changer la réponse en insistant sur une définition différente . Comme je l'ai écrit au début, les détails techniques sont importants ici. Si vous vous trompez, vous obtenez une mauvaise réponse.
Et si vous n'êtes pas intéressé par les détails techniques, la réponse pourrait être: pouvez-vous utiliser des expressions régulières (et rien d'autre) pour créer un programme? Alors pourquoi l'appeler un langage de programmation? (Cependant, une réponse comme celle-ci a été téléchargée et supprimée ici, c'est pourquoi j'ai écrit cette version plus longue.)
EDIT: En outre, n'importe qui peut créer une bibliothèque implémentant sa propre nouvelle variante d '"expressions régulières" avec de nouvelles fonctionnalités ajoutées. À un certain moment, les nouvelles fonctionnalités peuvent être suffisantes pour que l'ensemble du système devienne Turing-complete. Un exemple trivial serait d'incorporer un langage complet de Turing en utilisant une nouvelle syntaxe; mais cela peut aussi arriver moins évidemment. Peut-être que c'est déjà arrivé.