En un mot
Les langages de programmation sont composés d'une syntaxe qui représente le programme sous forme de chaînes de caractères et d'une sémantique qui est la signification voulue du programme.
Les langages formels sont une syntaxe sans signification. Il est destiné à étudier la structure d'ensembles de chaînes définies formellement, sans généralement attacher de sens à ces chaînes.
L'expression régulière et d'autres formalismes (tels que les grammaires sans contexte) sont utilisés pour définir des langages formels, utilisés comme composante syntaxique de la programmation et des langages naturels, c'est-à-dire pour représenter des phrases de manière structurée. D'autres mécanismes sont utilisés pour relier cette structure à la sémantique des langages de programmation.
Beaucoup ici est considérablement simplifié, en particulier en ce qui concerne le langage naturel.
Avec beaucoup plus de détails
Pour répondre à votre question, nous devons commencer par le début. Une langue au sens habituel est, de manière informelle, un moyen de transmettre des informations ou des idées. Dans une langue, on distingue généralement la syntaxe et la sémantique. La sémantique est ce dont vous voulez parler / écrire. les informations que vous souhaitez transmettre. La syntaxe est le moyen que vous utilisez pour la transmettre, c'est-à-dire une représentation conventionnelle qui peut être échangée entre personnes, et maintenant aussi entre personnes et appareils, ou entre appareils (ordinateurs).
En règle générale, vous utiliserez le mot dog
pour transmettre l'idée d'un chien. Le mot dog
est composé de trois lettres, ou d'un son équivalent, et est destiné à être la représentation d'une sorte d'animal. L'idée clé est que la communication se fait par la représentation de ce qui doit être communiqué. Les structures de représentation sont généralement appelées syntaxe, tandis que ce qui est représenté est appelé sémantique. Cela vaut plus ou moins pour le langage naturel ainsi que pour les langages de programmation.
Les mots sont des entités syntaxiques pour représenter des concepts sémantiques plus ou moins élémentaires. Mais ces concepts élémentaires doivent être rassemblés de diverses manières pour donner un sens plus complexe. Nous écrivons
the dog
pour transmettre que nous voulons dire un chien spécifique et the dog bites the cat
pour transmettre une idée plus complexe. Mais la façon dont les mots sont organisés doit être fixée par des règles, afin que nous puissions dire lequel du chien et du chat mord réellement l'autre.
Nous avons donc des règles telles que celles sentence -> subject verb complement
qui sont censées correspondre aux phrases et nous dire comment les idées associées à chaque partie sont articulées. Ces règles sont des règles syntaxiques, car elles nous indiquent comment organiser la représentation de notre message. Le subject
peut lui-même être défini par une règle subject -> article noun
, etc.
2 x + 1 = 23X123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
La structure des langages de programmation est la même. Les langages de programmation sont sémantiquement spécialisés dans l'expression de calculs à effectuer, plutôt que d'exprimer des problèmes à résoudre, des preuves de théorèmes ou des relations amicales entre animaux. Mais c'est la principale différence.
Les représentations utilisées dans la syntaxe sont généralement des chaînes de caractères ou de sons pour les langues parlées. La sémantique appartient généralement au domaine abstrait, ou peut-être à la réalité, mais toujours abstraite dans nos processus de pensée, ou au domaine comportemental des dispositifs. La communication implique de coder l'information / l'idée dans la syntaxe, qui est transmise et décodée par le récepteur. Le résultat est alors interprété de quelque manière que ce soit par le récepteur.
Donc, ce que nous voyons du langage est principalement la syntaxe et sa structure. L'exemple ci-dessus n'est que l'un des moyens les plus courants de définir des chaînes syntaxiques et leur organisation structurelle. Il y en a d'autres. Pour une langue donnée, certaines chaînes peuvent se voir attribuer une structure et sont réputées appartenir à la langue, d'autres non.
Il en va de même pour les mots. Certaines séquences de lettres (ou sons) sont des mots légitimes, tandis que d'autres ne le sont pas.
Les langages formels ne sont que de la syntaxe sans sémantique. Ils définissent avec un ensemble de règles quelles séquences peuvent être construites, en utilisant les éléments de base d'un alphabet. Les règles peuvent être très variables, parfois complexes. Mais les langages formels sont utilisés à de nombreuses fins mathématiques au-delà de la communication linguistique, que ce soit pour des langages naturels ou pour des langages de programmation. L'ensemble de règles qui définissent les chaînes dans une langue est appelé une grammaire. Mais il existe de nombreuses autres façons de définir les langues.
En pratique, une langue est structurée en deux niveaux. Le niveau lexical définit des mots construits à partir d'un alphabet de caractères. Le niveau syntaxique définit des phrases, ou des programmes construits à partir d'un alphabet de mots (ou plus précisément de familles de mots, pour qu'il reste un alphabet fini). Ceci est nécessairement quelque peu simplifié.
La structure des mots est assez simple dans la plupart des langages (de programmation ou naturels) de sorte qu'ils sont généralement définis avec ce qui est généralement considéré comme le type de langage formel le plus simple: les langages réguliers. Ils peuvent être définis avec des expressions régulières (regexp) et sont assez facilement identifiables avec des dispositifs programmés appelés automates à états finis. Dans le cas des langages de programmation, les exemples d'un mot sont un identifiant, un entier, une chaîne, un nombre réel, un mot réservé tel que if
ou repeat
, un symbole de ponctuation ou une parenthèse ouverte. Des exemples de familles de mots sont identifiant, chaîne, entier.
Le niveau syntaxique est généralement défini par un type de langage formel légèrement plus complexe: les langues sans contexte, utilisant les mots comme alphabet. Les règles que nous avons vues ci-dessus sont des règles sans contexte pour le langage naturel. Dans le cas des langages de programmation, les règles peuvent être:
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
Avec de telles règles, vous pouvez écrire:
while aaa /= bbb do aaa = aaa + bbb / 6
qui est une déclaration.
Et la façon dont il a été produit peut être représentée par une structure arborescente appelée arbre d'analyse ou arbre de syntaxe (non complet ici):
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
Les noms apparaissant à gauche d'une règle sont appelés non-terminaux, tandis que les mots sont également appelés terminaux, car ils sont dans l'alphabet de la langue (au-dessus du niveau lexical). Les non-terminaux représentent les différentes structures syntaxiques, qui peuvent être utilisées pour composer un programme.
Ces règles sont appelées sans contexte, car un non-terminal peut être remplacé arbitrairement en utilisant l'une des règles correspondantes, indépendamment du contexte dans lequel il apparaît. L'ensemble de règles définissant la langue est appelé une grammaire sans contexte.
En fait, il existe des restrictions à ce sujet, lorsque les identificateurs doivent être déclarés pour la première fois, ou lorsqu'une expression doit satisfaire aux restrictions de type. Mais une telle restriction peut être considérée comme sémantique plutôt que syntaxique. En fait, certains professionnels les placent dans ce qu'ils appellent
la sémantique statique .
Étant donné n'importe quelle phrase, n'importe quel programme, la signification de cette phrase est extraite en analysant la structure donnée par l'arbre d'analyse pour cette phrase. Par conséquent, il est très important de développer des algorithmes, appelés analyseurs, qui peuvent récupérer la structure arborescente correspondant à un programme, une fois le programme donné.
L'analyseur est précédé de l'analyseur lexical qui reconnaît les mots et détermine la famille à laquelle ils appartiennent. Ensuite, la séquence de mots, ou éléments lexicaux, est donnée à l'analyseur qui récupère la structure arborescente sous-jacente. À partir de cette structure, le compilateur peut alors déterminer comment générer du code, qui est la partie sémantique du programme, du côté du compilateur.
L'analyseur d'un compilateur peut réellement construire une structure de données correspondant à l'arbre d'analyse et la transmettre aux étapes ultérieures du processus de compilation, mais ce n'est pas obligatoire. L'exécution de l'algorithme d'analyse revient à développer une stratégie de calcul pour explorer l'arbre de syntaxe implicite dans le texte du programme. Cet arbre de syntaxe / analyse peut être explicité ou non dans le processus, selon la stratégie de compilation (nombre d'étapes). Ce qui est nécessaire cependant, c'est qu'il y a finalement au moins une exploration ascendante de l'arbre d'analyse, qu'elle soit expliquée ou laissée implicite dans la structure de calcul.
La raison en est intuitivement qu'une méthode formelle standard pour définir la sémantique associée à une structure arborescente syntaxique consiste à utiliser ce qu'on appelle un homomorphisme. N'ayez pas peur du grand mot. L'idée est juste de considérer que le sens de l'ensemble est construit à partir du sens des parties, sur la base de l'opérateur qui les relie
Par exemple, la phrase the dog bites the cat
peut être analysée avec la règle sentence -> subject verb complement
. Connaître la signification des 3 sous subject
- arbres,, verb
et complement
, la règle qui les compose nous dit que le sujet fait l'action et que le chat est celui qui est mordu.
Ce n'est qu'une explication intuitive, mais elle peut être formalisée. La sémantique est construite vers le haut à partir des constituants. Mais cela cache beaucoup de complexité.
Le fonctionnement interne d'un compilateur peut être décomposé en plusieurs étapes. Le compilateur réel peut fonctionner étape par étape, en utilisant des représentations intermédiaires. Il peut également fusionner certaines étapes. Cela dépend de la technologie utilisée et de la complexité de la compilation du langage en question.