web-dev-qa-db-fra.com

Arbres d'expression pour les nuls?

Je suis le mannequin dans ce scénario.

J'ai essayé de lire sur Google ce que ce sont, mais je ne l'obtiens pas. Quelqu'un peut-il me donner une simple explication de ce qu'ils sont et pourquoi ils sont utiles?

edit: Je parle de la fonctionnalité LINQ dans .NET.

66
Dave

Les arbres d'expression sont une représentation en mémoire d'une expression, par ex. une expression arithmétique ou booléenne. Par exemple, considérons l'expression arithmétique

a + b*2

Comme * a une priorité de l'opérateur supérieur à +, l'arborescence d'expression est construite comme celle-ci:

    [+]
  /    \
 a     [*]
      /   \
     b     2

Avoir cet arbre, il peut être évalué pour toutes les valeurs de A et B. De plus, vous pouvez le transformer en d'autres arbres d'expression, par exemple pour dériver l'expression.

Lorsque vous implémentez un arbre d'expression, je suggérerais de créer une classe de base expression. Dérivé de cela, la classe Binarinexpression serait utilisé pour toutes les expressions binaires, telles que + et *. Ensuite, vous pouvez introduire un variabléréexpression Pour les variables de référence (telles que A et B), et une autre classe ConstantXpression (pour le 2 de l'exemple).

L'arborescence d'expression est dans de nombreux cas construite à la suite de l'analyse d'une entrée (de l'utilisateur directement ou d'un fichier). Pour évaluer l'arborescence d'expression, je suggérerais d'utiliser le motif visiteur .

14
EFrank

Réponse courte: Il est agréable de pouvoir écrire le même type de requête LINQ et le signaler à n'importe quelle source de données. Vous ne pouviez pas avoir une question de "langue intégrée" sans elle.

Réponse longue: Comme vous le savez probablement, lorsque vous compilez le code source, vous le transformez d'une langue à une autre. Généralement d'une langue de haut niveau (C #) à un levier inférieur sur (IL).

Il y a essentiellement deux façons de faire cela:

  1. Vous pouvez traduire le code à l'aide de rechercher et de remplacer
  2. Vous analyez le code et obtenez un arbre d'analyse.

Ce dernier est ce que tous les programmes que nous connaissons comme "compilateurs".

Une fois que vous avez un arbre d'analyse, vous pouvez facilement le traduire en une autre langue et c'est ce que les arbres d'expression nous permettent de faire. Étant donné que le code est stocké sous forme de données que vous pouvez faire tout ce que vous voulez, mais vous voudrez probablement simplement le traduire en une autre langue.

Maintenant, à Linq à SQL, les arbres d'expression sont transformés en une commande SQL, puis sont envoyés sur le fil sur le serveur de base de données. Autant que je sache, ils ne font rien vraiment envie de traduire le code mais ils pourrait. Par exemple, le fournisseur de requêtes pourrait créer un code SQL différent en fonction des conditions du réseau.

14
Rodrick Chapman

IIUC, un arbre d'expression est similaire à un arbre de syntaxe abstraite, mais une expression est généralement une valeur unique, alors qu'un AST peut représenter tout un programme (avec des classes, des packages, des relevés, des relevés, des déclarations, etc.).

Quoi qu'il en soit, pour une expression (2 + 3) * 5, l'arbre est:

    *
   / \ 
  +   5
 / \
2   3

Évaluez chaque nœud récursivement (ascendant) pour obtenir la valeur au nœud racine, c'est-à-dire la valeur de l'expression.

Vous pouvez bien sûr disposer d'opérateurs unis unary (négation) ou de Trürin (SI-THEN-ARRIER) et des fonctions (N-ARY, I.E. N'importe quel nombre de OPS) si votre langue d'expression le permet.

L'évaluation des types et le contrôle de type est effectué sur des arbres similaires.

5
Macke

Le DLR
Les arbres d'expression sont un ajout à C # pour prendre en charge l'exécution de la langue dynamique (DLR). Le DLR est également ce qui est responsable de nous donner la méthode "Var" de déclarer des variables. (var objA = new Tree();)

Plus sur le DLR .

Essentiellement, Microsoft a voulu ouvrir le CLR pour les langages dynamiques, tels que Lisp, SmallTalk, JavaScript, etc., ils devaient pouvoir analyser et évaluer les expressions à la volée. Ce n'était pas possible avant que le DLR ne soit arrivé.

Retour à ma première phrase, les arbres d'expression sont un ajout à C # qui ouvre la capacité d'utiliser le DLR. Avant de cela, c # était une langue beaucoup plus statique - tous les types de variable devaient être déclarés comme un type spécifique et que tout code devait être écrit à la compilation.

Utiliser avec des données
Les arbres d'expression ouvrent les portes d'inondation au code dynamique.

Disons, par exemple, que vous créez un site immobilier. Pendant la phase de conception, vous connaissez tous les filtres que vous pouvez appliquer. Pour mettre en œuvre ce code, vous avez deux choix: vous pouvez écrire une boucle qui compare chaque point de données à une série de chèques if-alors. Ou vous pouvez essayer de créer une requête dans une langue dynamique (SQL) et transmettez cela à un programme pouvant effectuer la recherche de vous (la base de données).

Avec des arbres d'expression, vous pouvez maintenant modifier le code de votre programme - à la volée - et effectuez la recherche. Plus précisément, vous pouvez le faire à travers LINQ.

(Voir plus: MSDN: Comment: Utilisez des arbres d'expression pour créer des requêtes dynamiques ).

Au-delà des données
[.____] Les utilisations principales des arbres d'expression sont destinées à la gestion des données. Cependant, ils peuvent également être utilisés pour le code généré dynamiquement. Donc, si vous souhaitez une fonction définie dynamiquement (ALA JavaScript), vous pouvez créer un arborescence d'expression, la compiler et évaluer les résultats.

J'irais un peu plus en profondeur, mais ce site fait un bien meilleur:

Arbres d'expression en tant que compilateur

Les exemples énumérés incluent la création de opérateurs génériques pour des types de variable, des expressions Lambda à la main, un clonage peu profond de performances et une copie de manière dynamique des propriétés de lecture/écriture d'un objet à un autre.

Résumé
Les arbres d'expression sont des représentations de code compilées et évaluées au moment de l'exécution. Ils permettent des types dynamiques, utiles pour la manipulation de données et la programmation dynamique.

3
Richard