name - comentarios c# documentacion
Una implementación nueva y completa de Intellisense genérico (2)
¿Cómo (en detalle) Microsoft implementa su Intellisense tipo-como-usted?
Puedo describirlo con cualquier nivel de detalle que quieras mencionar, pero no tengo tiempo para más que una breve explicación. Explicaré cómo lo hacemos en Roslyn.
Primero, creamos un modelo inmutable de la secuencia token utilizando una estructura de datos que puede representar ediciones de manera eficiente, ya que obviamente las ediciones son precisamente lo que van a ser muchas.
La idea clave para hacer que sea eficiente para la reutilización persistente es representar las longitudes de los caracteres de los tokens, pero no las posiciones de sus caracteres en el búfer de edición; recuerde, un token al final del archivo va a cambiar de posición en cada edición, pero la longitud del token no cambia. Debe minimizar a toda costa la cantidad total de releexings si quiere ser eficiente en archivos extremadamente grandes.
Una vez que tiene un modelo inmutable que puede manejar inserciones y eliminaciones para crear una secuencia de tokens inmutables sin volver a leer todo el archivo cada vez, debe hacer lo mismo , pero para el análisis gramatical. Esto es en la práctica un problema considerablemente más difícil . Te recomiendo que obtengas un título universitario o de posgrado en ciencias de la computación con énfasis en la teoría del analizador sintáctico si aún no lo has hecho. Obtuvimos la ayuda de personas con doctorados que hicieron sus tesis sobre la teoría del analizador sintáctico para diseñar este fragmento del algoritmo en particular.
Luego, obviamente, construye un analizador gramatical que pueda analizar C #. Recuerde, tiene que analizar C # roto , no corregir C #; IntelliSense tiene que funcionar mientras el programa no está compilando. Así que comience con modificaciones en la gramática que tengan buenas características de recuperación de errores.
OK, entonces ahora tienes un analizador sintáctico que puede hacer análisis gramaticales de manera eficiente sin volver a leer o volver a analizar nada, excepto la región editada, la mayoría de las veces, lo que significa que puedes hacer el trabajo entre pulsaciones de teclas. Me olvidé de mencionar, por supuesto, tendrás que encontrar algún mecanismo para no bloquear el hilo de la interfaz de usuario mientras realizas todos estos análisis si el análisis tarda más que el tiempo transcurrido entre dos pulsaciones de teclas. La nueva función "async / await" de C # 5 debería ayudar con eso. (Puedo decirte por experiencia personal: ten cuidado con la proliferación de tareas y tokens de cancelación. Si eres descuidado, es posible entrar en un estado donde hay decenas de miles de tareas canceladas pendientes, y eso no es rápido . )
Ahora que tienes un análisis gramatical, necesitas construir un analizador semántico . Como solo está haciendo IntelliSense, no necesita ser un analizador semántico particularmente sofisticado. (Nuestro analizador semántico debe hacer un análisis adecuado para generar código a partir de programas correctos y corregir el análisis de errores de programas incorrectos). Pero, por supuesto, nuevamente tiene que hacer un buen análisis semántico en programas rotos, lo que aumenta considerablemente la complejidad.
Mi consejo es comenzar construyendo un analizador semántico de "nivel superior", de nuevo usando un modelo inmutable que puede persistir en el estado de los tipos de código fuente declarado en editar para editar. El analizador de nivel superior trata con cualquier cosa que no sea una declaración o expresión: escriba declaraciones, directivas, espacios de nombres, declaraciones de métodos, constructores, destructores, etc. Lo que compone la "forma" del programa cuando el compilador genera metadatos.
Metadata! Me olvidé de los metadatos. Necesitarás un lector de metadatos. Necesita poder producir IntelliSense en expresiones que se refieren a tipos en bibliotecas, obviamente. Recomiendo usar las bibliotecas de CCI como su lector de metadatos, y no Reflexión. Como solo está haciendo IntelliSense, obviamente no necesita un escritor de metadatos.
De todos modos, una vez que tienes un analizador semántico de alto nivel, puedes escribir un analizador semántico de declaración y expresión que analiza los tipos de expresiones en una declaración dada. Preste especial atención a los algoritmos de búsqueda de nombres y resolución de sobrecarga . La inferencia del tipo de método será particularmente complicada, especialmente dentro de las consultas LINQ .
Una vez que tenga todo eso, un motor IntelliSense debería ser fácil; solo calcula el tipo de expresión en la posición actual del cursor y muestra un menú desplegable de forma apropiada.
¿Cuán difícil sería para mí crear mi propio estándar?
Bueno, tenemos un equipo de, llámenlo diez personas, y probablemente sea necesario, llámenlo cinco años para que todo termine de principio a fin. Pero tenemos mucho más que hacer que solo el motor IntelliSense. Eso es quizás solo el 40% del trabajo. Ah, y la mitad de esa gente trabaja en VB, ahora que lo pienso. Pero esas personas tienen en promedio probablemente cinco o diez años de experiencia en este tipo de trabajo, por lo que son más rápidos que nunca si nunca antes lo hubieras hecho.
Digamos que debería llevarle de diez a veinte años de trabajo a tiempo completo, trabajando solo, construir un motor IntelliSense con calidad Roslyn para C # que pueda realizar un análisis aceptablemente cercano a la corrección de programas grandes en el tiempo transcurrido entre pulsaciones de teclas.
Más tiempo si necesitas hacer ese doctorado primero, obviamente.
O bien, simplemente podría usar Roslyn, ya que eso es para lo que es . Eso te llevará probablemente unas pocas horas, pero no te diviertes haciéndolo tú mismo. ¡Y es divertido!
Puede descargar la versión preliminar aquí:
Estoy interesado en escribir un editor genérico habilitado para Intellisense para SQL y C # (y otros, si es posible). Me gustaría hacer esto en C # como un control WPF richTextBox tipo reemplazado o extendido. Sé que hay muchos proyectos de ejemplo disponibles y he implementado una versión básica propia; pero la mayoría de los ejemplos que he encontrado (y de hecho el mío) son solo eso, básicos .
Un par de ejemplos de código son:
Sin embargo, he encontrado un gran ejemplo de un editor SQL con Intellisense QueryCommander SQL Editor por Mikael Håkansson, que parece funcionar bien. Microsoft debe usar una biblioteca XML de palabras clave de comando, pero mi pregunta es: ¿cómo (en detalle) Microsoft implementa su Intellisense (como usted tipo Intellisense) y qué tan difícil sería para mí crear mi propio estándar?
Editar A: Un año después y he logrado desarrollar mi propio control de editor con intellisense básico principalmente para mi propio "disfrute". Pensé que volvería a proporcionar una lista de proyectos .NET de acceso libre que me ayudaron con mi propio desarrollo y que se pueden utilizar de inmediato y de forma gratuita:
Editar B: 15 meses después de que se hizo la pregunta, todavía estoy buscando nuevos editores mejorados. Este es bueno ...
- RoslynPAD es genial!
Editar C: dos años después de la pregunta, encontré los siguientes proyectos, ambos usando WPF y respaldados por AvalonEdit.
CodeCompletion para AvalonEdit usando NRefactory. Este proyecto es realmente bueno y tiene una implementación completa de intellisense usando NRefactory.
ScriptCS ScriptCS hace que sea fácil escribir y ejecutar C # con un editor de texto simple.
Esta es un área donde Microsoft generalmente produce excelentes resultados: las herramientas de desarrollo de Microsoft son realmente increíbles. Y existe una clara ventaja comercial para las ventas de sus herramientas de desarrollo y para las ventas de Windows para tener el mejor intellisense, por lo que tiene sentido para Microsoft dedicar el tipo de recursos que Eric describe en su respuesta maravillosamente detallada. Aún así, creo que vale la pena señalar algunas cosas:
Es posible que sus clientes no necesiten todas las funciones que ofrece la implementación de Microsoft. La solución de Microsoft podría estar increíblemente sobrediseñada en términos de las características que necesita proporcionar a sus clientes / usuarios. A menos que realmente esté implementando un entorno de codificación genérico que pretende ser competitivo con Visual Studio, es probable que haya aspectos del uso previsto que simplifiquen el problema o que le permitan hacer concesiones en la solución que Microsoft siente ellos no pueden hacer Microsoft probablemente gastará recursos disminuyendo los tiempos de respuesta que ya se miden en cientos de milisegundos. Eso puede no ser algo que necesites hacer. Microsoft está dedicando tiempo a proporcionar una API para que otros la utilicen para el análisis de código. Es probable que no sea parte de su plan. Dé prioridad a sus características y decida qué aspecto "lo suficientemente bueno" tienen para usted y sus clientes, luego calcule el costo de implementarlo.
Además de asumir los costos obvios de implementar requisitos que en realidad no podría tener, Microsoft también conlleva algunos costos que pueden no ser obvios si no ha trabajado en un equipo. Hay grandes costos de comunicación asociados con los equipos. De hecho, es increíblemente fácil lograr que cinco personas inteligentes tarden más en producir una solución de lo que se necesita para que una sola persona inteligente produzca la solución equivalente. Hay aspectos de las prácticas de contratación de Microsoft y la estructura organizacional que hacen que este escenario sea más probable. Si contrata a un grupo de personas inteligentes con egos y luego los faculta a todos para tomar decisiones, usted también puede obtener una solución mejor al 5% por el 500% del costo. Esa solución 5% mejor podría ser rentable para Microsoft, pero podría ser mortal para una empresa pequeña.
Pasar de una solución de 1 persona a una solución de 5 personas aumenta los costos, pero eso son solo los costos de desarrollo dentro del equipo. Microsoft tiene equipos separados que se dedican (más o menos) al diseño, desarrollo y pruebas, incluso para una sola característica. La comunicación relacionada con el proyecto entre pares a través de estos límites tiene una mayor fricción que dentro de cada una de las disciplinas. Esto no solo aumenta los costos de comunicación entre las personas, sino que también da como resultado un tamaño de equipo más grande. Y más que eso, dado que no se trata de un solo equipo de 12 personas, sino de 3 equipos de 5 personas, el costo de comunicación al alza es 3 veces mayor. Más costos que Microsoft ha decidido llevar, que pueden no traducirse en costos similares para otras compañías.
Mi punto aquí no es describir a Microsoft como una compañía ineficiente. Mi punto es que Microsoft toma una tonelada de decisiones sobre todo, desde la contratación, la organización del equipo, hasta el diseño y la implementación, que parten de suposiciones sobre rentabilidad y riesgo que simplemente no se aplican a compañías que no son Microsoft.
En términos de lo inteligible, hay varias formas de pensar sobre el problema. Microsoft está produciendo una solución muy genérica y reutilizable que no solo resuelve el problema de intellisense, sino que también apunta a la navegación de código, refactorización y varios otros usos para el análisis de código. No necesita hacer las cosas de la misma manera si su único objetivo es facilitar que los desarrolladores ingresen el código sin tener que escribir mucho. Apuntar a esa característica no lleva años de esfuerzo y hay todo tipo de cosas creativas que puede hacer si no solo proporciona una API, sino que también controla la IU.