64 votes

Une nouvelle implémentation complète de Generic Intellisense

Je suis intéressé par l'écriture d'un éditeur générique avec Intellisense pour SQL et C# (et al. si possible !). Je voudrais le faire en C# comme un contrôle WPF de type richTextBox surchargé ou étendu. Je sais qu'il existe de nombreux projets d'exemple disponibles et j'ai mis en œuvre un projet de type base de ma propre version ; mais la plupart des exemples que j'ai rencontrés (et même les miens) ne sont que cela, base .

Voici quelques exemples de code :

  1. DIY Intellisense Par yetanotherchris

  2. CodeTextBox - un autre contrôle RichTextBox avec coloration syntaxique et Intellisense Par Tamas Honfi

J'ai cependant trouvé un excellent exemple d'éditeur SQL avec Intellisense. QueryCommander Editeur SQL par Mikael Håkansson ce qui semble bien fonctionner. Microsoft doit utiliser une bibliothèque XML de mots-clés de commande, mais ma question est la suivante : comment (dans le détail) Microsoft implémente-t-il son Intellisense (Intellisense as-you-type) et à quel point serait-il difficile pour moi de créer le mien selon le même standard ?


Editer A : Un an plus tard, j'ai réussi à développer mon propre contrôle d'éditeur avec intellisense de base, principalement pour mon propre "plaisir". J'ai pensé que je reviendrais fournir une liste de projets .NET librement disponibles qui m'ont aidé dans mon propre développement et qui peuvent être utilisés prêts à l'emploi et gratuitement :

  1. ICSharpCode (WinForms)

  2. AvalonEdit (WPF)

  3. ScintillaNET (WinForms)

  4. Query Commander [pour un exemple d'implémentation d'intellisense] (WinForms)


Edit B : 15 mois après que la question ait été posée, je suis toujours à la recherche de nouveaux éditeurs améliorés. Celui-ci est sympa...

  1. RoslynPAD c'est cool !

Edit C : 2 ans et plus après la question, j'ai trouvé les projets suivants, tous deux utilisant WPF et soutenus par AvalonEdit.

  1. Complément de code pour AvalonEdit en utilisant NRefactory. Ce projet est vraiment bien et a une implémentation complète d'intellisense utilisant NRefactory.

  2. ScriptCS ScriptCS permet d'écrire et d'exécuter facilement du C# avec un simple éditeur de texte.

0 votes

Que voulez-vous exactement ? Le code source de Visual Studio Intellisense ? En quoi VS Intellisense est-il meilleur que le vôtre et quel problème rencontrez-vous pour l'implémenter ?

0 votes

Avez-vous jeté un coup d'œil à codeproject.com/Articles/42490/Utilisation d'AvalonEdit-WPF-Text-Editor encore ? AvalonEdit dispose non seulement de la coloration syntaxique, mais aussi d'une fonction de complétion automatique extensible.

0 votes

Je voudrais coder un contrôle de type éditeur qui puisse être utilisé dans les applications WPF et Win7 Phone. Je ne veux pas nécessairement les sources de MS, juste la méthodologie qu'ils utilisent pour implémenter cette fonctionnalité. Il semble que toutes les choses que j'ai rencontrées sont loin d'être aussi efficaces. Je vais maintenant jeter un coup d'œil à AvlonEdit. Merci à vous deux pour votre temps.

127voto

Eric Lippert Points 300275

Comment (en détail) Microsoft implémente-t-il son Intellisense as-you-type ?

I peut Vous pouvez le décrire avec tous les détails que vous voulez, mais je n'ai pas le temps de vous donner plus qu'une brève explication. Je vais vous expliquer comment nous faisons dans Roslyn.

Tout d'abord, nous construisons un modèle immuable du flux de jetons à l'aide d'une structure de données pouvant représenter efficacement éditions car il est évident qu'il y aura beaucoup d'éditions.

L'idée maîtresse pour rendre efficace la réutilisation persistante est de représenter l'image de l'utilisateur. longueurs de caractères des jetons mais pas de leur positions des caractères dans le tampon d'édition ; rappelez-vous qu'un jeton à la fin du fichier va changer de position à chaque édition mais que la longueur du jeton ne change pas. Vous devez à tout prix minimiser le nombre total de relectures si vous voulez être efficace sur des fichiers extrêmement volumineux.

Une fois que vous disposez d'un modèle immuable capable de gérer les insertions et les suppressions afin de constituer un flux de jetons immuable sans avoir à ré-exécuter l'ensemble du fichier à chaque fois, vous devez ensuite procéder à l'opération suivante même mais pour l'analyse grammaticale. En pratique, c'est un problème beaucoup plus difficile . Je vous recommande d'obtenir un diplôme de premier cycle ou de deuxième cycle en informatique avec un accent sur la théorie des analyseurs syntaxiques, si ce n'est pas déjà fait. Nous avons obtenu l'aide de personnes titulaires d'un doctorat qui ont fait leur thèse sur la théorie des analyseurs syntaxiques pour concevoir cette partie particulière de l'algorithme.

Ensuite, évidemment, construisez un analyseur grammatical capable d'analyser le C#. Rappelez-vous, il doit analyser brisé C#, pas correct C# ; IntelliSense doit fonctionner alors que le programme est dans un état de non-compilation. Commencez donc par trouver des modifications à la grammaire qui ont de bonnes caractéristiques de récupération des erreurs.

OK, donc maintenant vous avez un analyseur syntaxique qui peut efficacement faire une analyse grammaticale sans ré-lexion ou ré-analyse de quoi que ce soit d'autre que la région éditée, la plupart du temps, ce qui signifie que vous pouvez faire le travail entre les frappes de touches. J'ai oublié de mentionner que, bien sûr, vous devrez trouver un mécanisme pour ne pas bloquer le thread de l'interface utilisateur tout en effectuant toutes ces analyses, au cas où l'analyse prendrait plus de temps que le temps entre deux frappes. La nouvelle fonctionnalité "async/await" de C# 5 devrait y contribuer. (Je peux vous le dire d'après mon expérience personnelle : faites attention à la prolifération des tâches et des jetons d'annulation. Si vous êtes négligent, il est possible de se retrouver dans un état où il y a des dizaines de milliers de tâches annulées en attente, et c'est pas rapide .)

Maintenant que vous avez une analyse grammaticale, vous devez construire un analyseur sémantique . Puisque vous ne faites que de l'IntelliSense, il n'est pas nécessaire que ce soit un analyseur sémantique particulièrement sophistiqué. (Notre analyseur sémantique doit faire une analyse appropriée pour générer du code à partir de programmes corrects et une analyse correcte des erreurs à partir de programmes incorrects). Mais bien sûr, il doit à nouveau faire une bonne analyse sémantique sur les programmes cassés, ce qui augmente considérablement la complexité.

Mon conseil est de commencer par construire un analyseur sémantique de "haut niveau", en utilisant à nouveau un modèle immuable qui peut conserver l'état des types de code source déclarés d'une édition à l'autre. L'analyseur de haut niveau traite tout ce qui est no une déclaration ou une expression : déclarations de types, directives, espaces de noms, déclarations de méthodes, constructeurs, destructeurs, etc. Les éléments qui constituent la "forme" du programme lorsque le compilateur génère des métadonnées.

Métadonnées ! J'ai oublié les métadonnées. Tu vas avoir besoin d'un lecteur de métadonnées. Vous devez être capable de produire IntelliSense sur les expressions qui font référence à des types dans les bibliothèques, évidemment. Je vous recommande d'utiliser les bibliothèques CCI comme lecteur de métadonnées, et non Reflection. Puisque vous ne faites que de l'IntelliSense, vous n'avez évidemment pas besoin d'un rédacteur de métadonnées.

Quoi qu'il en soit, une fois que vous avez un analyseur sémantique de haut niveau, vous pouvez écrire un analyseur sémantique d'énoncés et d'expressions qui analyse les types d'expressions dans un énoncé donné. Faites particulièrement attention à recherche du nom y résolution des surcharges algorithmes. L'inférence de type de méthode sera particulièrement délicate, notamment dans les requêtes LINQ .

Une fois que vous avez tout cela, un moteur IntelliSense devrait être facile ; il suffit de déterminer le type de l'expression à la position actuelle du curseur et d'afficher une liste déroulante en conséquence.

à quel point serait-il difficile pour moi de créer le mien avec le même standard ?

Eh bien, nous avons une équipe de, disons, dix personnes, et il faudra probablement, disons, cinq ans pour tout faire du début à la fin. Mais nous avons beaucoup plus à faire que juste le moteur IntelliSense. C'est peut-être seulement 40% du travail. Oh, et la moitié de ces personnes travaillent sur VB, maintenant que j'y pense. Mais ces personnes ont en moyenne cinq ou dix ans d'expérience dans ce genre de travail, et sont donc plus rapides que vous ne le serez si vous n'avez jamais fait cela auparavant.

Disons qu'il vous faudra environ dix à vingt ans de travail à temps plein, en travaillant seul, pour construire un moteur IntelliSense de qualité Roslyn pour C#, capable d'effectuer une analyse acceptable, proche de la correction, de grands programmes entre deux frappes.

Plus long si vous devez d'abord faire ce doctorat, évidemment.

Ou, vous pouvez simplement utiliser Roslyn, puisque c'est à cela qu'il sert . Cela vous prendra probablement quelques heures, mais vous n'aurez pas le plaisir de le faire vous-même. Et c'est amusant !

Vous pouvez télécharger la version préliminaire ici :

http://www.microsoft.com/download/en/details.aspx?id=27746

13 votes

J'aime la solution "utiliser Roslyn" car elle n'implique pas de devoir s'inscrire à un programme de doctorat. Qui veut devenir assistant technique juste pour écrire Intellisense ?

0 votes

Wow. Votre estimation du travail effectué sur C# IntelliSense dans VS est-elle vraiment de 20 années-hommes ? Pourriez-vous préciser quels aspects sont inclus/exclus dans cette estimation ? En outre, je suppose qu'une grande partie de la sortie est également utilisée par le reste du pipeline du compilateur ?

0 votes

@Ani : Eh bien, un certain nombre de ces personnes travaillent également sur VB, alors peut-être que ce ne sont que dix années-hommes si tout ce qui vous intéresse est C#. Mais ces personnes ont une expérience collective d'environ cinquante ou cent années-hommes dans la construction de moteurs IntelliSense. Ils seront donc plus rapides que ceux qui doivent apprendre au fur et à mesure. En guise d'estimation, je dirais environ dix à vingt années-homme pour construire un moteur de qualité Microsoft à partir de zéro. Certainement pas une année homme, et certainement pas cent. Et oui, le générateur de code et le moteur IntelliSense utilisent le même analyseur sémantique dans Roslyn.

18voto

Ajs Points 101

Il s'agit d'un domaine où Microsoft produit généralement d'excellents résultats - les outils de développement de Microsoft sont vraiment géniaux. Et il y a un avantage commercial clair pour les ventes de leurs outils de développement et pour les ventes de Windows à avoir le meilleur intellisense, il est donc logique pour Microsoft de consacrer le type de ressources décrites par Eric dans sa réponse merveilleusement détaillée. Néanmoins, je pense qu'il est utile de souligner certaines choses :

  1. Il se peut que vos clients n'aient pas besoin de toutes les fonctionnalités offertes par la mise en œuvre de Microsoft. La solution de Microsoft peut être incroyablement sur-ingénierie en termes de fonctionnalités que vous doivent fournir à votre clients/utilisateurs. À moins que vous ne mettiez réellement en œuvre un environnement de codage générique destiné à concurrencer Visual Studio, il est probable que certains aspects de votre utilisation prévue simplifient le problème ou vous permettent de faire des compromis sur la solution que Microsoft estime ne pas pouvoir faire. Microsoft dépensera probablement des ressources pour réduire les temps de réponse qui se mesurent déjà en centaines de millisecondes. Ce n'est peut-être pas quelque chose que vous devez faire. Microsoft consacre du temps à fournir une API que d'autres pourront utiliser pour l'analyse du code. Cela ne fait probablement pas partie de votre plan. Classez vos fonctionnalités par ordre de priorité et décidez de ce qui est "suffisant" pour vous et vos clients, puis estimez le coût de la mise en œuvre.

  2. En plus de supporter les coûts évidents de la mise en œuvre d'exigences que vous n'avez peut-être pas réellement, Microsoft supporte également des coûts qui ne sont peut-être pas évidents si vous n'avez pas travaillé en équipe. Les coûts de communication associés aux équipes sont énormes. Il est en effet incroyablement facile de faire en sorte que cinq personnes intelligentes mettent plus de temps à produire une solution qu'il n'en faut à une seule personne intelligente pour produire une solution équivalente. Certains aspects des pratiques d'embauche et de la structure organisationnelle de Microsoft rendent ce scénario plus probable. Si vous embauchez un groupe de personnes intelligentes et égoïstes et que vous leur donnez à toutes le pouvoir de prendre des décisions, vous pouvez vous aussi obtenir une solution 5 % meilleure pour 500 % du coût. Cette solution améliorée de 5 % peut être rentable pour Microsoft, mais elle peut être mortelle pour une petite entreprise.

  3. Passer d'une solution à une personne à une solution à cinq personnes augmente les coûts, mais il ne s'agit que des coûts de développement intra-équipe. Microsoft a séparé des équipes qui se consacrent (en gros) à la conception, au développement et aux tests, même pour une seule fonctionnalité. La communication liée au projet entre pairs, au-delà de ces frontières, présente des frictions plus importantes qu'au sein de chacune des disciplines. Cela augmente non seulement les coûts de communication entre les individus, mais aussi la taille des équipes. Et plus encore, puisqu'il ne s'agit pas d'une seule équipe de 12 personnes, mais de 3 équipes de 5 personnes, le coût de la communication ascendante est multiplié par 3. Autant de coûts que Microsoft a choisi de supporter et qui ne se traduisent pas forcément par des coûts similaires pour d'autres entreprises.

Mon propos n'est pas de décrire Microsoft comme une entreprise inefficace. Ce que je veux dire, c'est que Microsoft prend une tonne de décisions sur tout, du recrutement à l'organisation des équipes, en passant par la conception et la mise en œuvre, qui partent d'hypothèses sur la rentabilité et le risque qui ne s'appliquent tout simplement pas aux entreprises qui ne sont pas Microsoft.

En ce qui concerne la question d'intellisense, il y a plusieurs façons d'envisager le problème. Microsoft produit une solution très générique et réutilisable qui ne résout pas seulement le problème d'intellisense, mais vise également la navigation dans le code, le remaniement et diverses autres utilisations de l'analyse du code. Vous n'avez pas besoin de faire les choses de la même manière si votre seul objectif est de permettre aux développeurs de saisir facilement du code sans avoir à taper beaucoup. Cibler cette fonctionnalité ne demande pas des années d'efforts et il y a toutes sortes de choses créatives que vous pouvez faire si vous ne fournissez pas seulement une API, mais que vous contrôlez aussi l'interface utilisateur.

7 votes

Re : "Microsoft dépensera probablement des ressources pour réduire les temps de réponse qui se mesurent déjà en centaines de millisecondes" -- absolument. Si une analyse prend plus de 30 millisecondes environ, nous commençons à nous inquiéter. Re : vous pouvez trouver des efficacités si vous résolvez un problème plus petit : absolument vrai ! Mais la question spécifique était de savoir comment faire aussi bien que l'implémentation de Microsoft pas comment faire un travail suffisamment bon pour une autre norme C'est donc à cette question que j'ai répondu.

0 votes

@StefanSteiger Vous devriez essayer d'utiliser netbeans et eclipse au lieu de visual studio parfois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X