2010-05-06 5 views
4

J'ai une compréhension approximative du fonctionnement des compilateurs (je parle des langages, des grammaires, de l'analyse lexicale, de l'analyse syntaxique, etc.). Les moteurs de règles ont diverses règles et actions associées, tout comme vous avez des règles dans les grammaires et vous pouvez y associer des actions dans des outils de génération d'analyseurs syntaxiques comme ANTLR. Donc, je suis un peu confus sur la façon de différencier ces deux. Quelqu'un pourrait-il donner une explication plus claire et plus formelle des différences?En quoi la phase d'analyse d'un compilateur est-elle différente d'un moteur de règles?

Merci, Abhinav.

+0

Je ne comprends pas très bien ce que vous entendez par "moteur de règles" dans votre question. Pourriez-vous élaborer? –

+0

Par les moteurs de règles, je veux dire ceci: http://en.wikipedia.org/wiki/Business_rules_engine ... un exemple http://java-source.net/open-source/rule-engines – abhinav

Répondre

3

Un moteur de règles possède une base de données de faits et un ensemble de règles qui peuvent inspecter des éléments de la base de données et modifier, insérer ou supprimer des faits. Habituellement, la base de données se compose de ce qui équivaut à un ensemble de structures étiquetées (T V1 V2 ... Vn), chacune avec différents types de valeurs V_i. Une règle est souvent un modèle spécifiant que si un ensemble d'instances de structure a des propriétés [une certaine condition sur les valeurs de ces structures, cela peut être conjonctif ou disjonctif], qu'une ou plusieurs valeurs de l'une des structures correspondantes sont modifiées, ou une structure appariée est supprimée ou une nouvelle structure est insérée avec un ensemble de valeurs calculé. Un moteur de règles très sophistiqué traite les règles en tant que telles structures, et peut donc aussi insérer et supprimer des règles, mais c'est assez inhabituel. Le moteur de règles (efficacement, et c'est la partie la plus difficile) détermine quel ensemble de règles pourrait correspondre à tout instant, en choisit un et l'exécute, de façon répétée. La valeur de cette idée est que l'on peut avoir un ensemble arbitraire de "faits" (chacun représenté par une structure étiquetée) qui sont à peu près indépendants, et un ensemble de règles qui sont également indépendantes, et les versent toutes ensemble d'une manière unifiée. L'espoir est qu'il est facile de définir des structures représentant des aspects du monde, et plus facile de définir des règles pour les manipuler. C'est une façon de coder beaucoup de connaissances disparates, et c'est pourquoi les «business» les aiment bien. (L'idée vient du monde de l'IA).

Les analyseurs de compilateur ont deux tâches enchevêtrées dans une activité: 1) décider si un flux de texte d'entrée (fragmenté en jetons langauge) est une instance légale d'une langue de programmation spécifique et 2) si oui, construire des structures de données de compilation arborescences de syntaxe abstraites et tables de symboles) qui représentent le programme pour que le reste du compilateur puisse générer du code. Les compilateurs ont passé près de 50 ans à trouver des solutions rapides et utilisent des algorithmes très spécialisés (tels que des générateurs d'analyseurs LALR avec des actions personnalisées selon les règles grammaticales) pour faire le travail.

On pourrait sans doute implémenter un analyseur-compilateur avec un moteur de règles; vous auriez besoin d'un type de données composé de flux de jetons, et d'autres types de données correspondant aux nœuds AST et aux entrées de la table de symboles. Il serait probablement plus difficile de coder l'analyseur, et il serait très peu probable d'approcher la vitesse d'un analyseur-compilateur, et c'est pourquoi personne ne le fait.

Vous ne pouvez pas utiliser un analyseur-compilateur pour implémenter un moteur de règles, période. Ainsi, un moteur de règles est strictement plus puissant.

+0

Merci, Ira. C'était une réponse très complète et claire, et cela a dissipé mes doutes :) – abhinav