Pregunta

Me encantan los colores de sintaxis, donde se muestran diferentes elementos de código fuente en diferentes colores. Hoy en día, la buena coloración está a la altura de la sangría adecuada cuando se trata de mi capacidad para leer el código.

Mirando bajo Herramientas / Personalizar / Fuentes y colores , puedo ver que en algunos casos hay granularidad fina; puede dar diferentes colores a las cadenas, y las cadenas literales, por ejemplo.

Pero aquí hay una línea típica de código C #:

Controls.Add(combo);

Ahora Controls, Add, y combo son diferentes tipos de cosas, sin embargo, todos se representan en el mismo color, porque son solo 'identificadores'.

¿Seguro que hay una manera de obtener más granularidad que esa? ¿Al menos los métodos de color de manera diferente a los objetos?

¿Fue útil?

Solución

Algunos pensamientos.

Primero, las funciones " no están implementadas " por defecto. Para poder implementar una característica, alguien tiene que pensar en la característica. Luego tenemos que diseñarlo, especificarlo, implementarlo, probarlo, documentarlo, encontrar un vehículo de envío para él y sacarlo por la puerta. Si alguna de esas cosas no sucede, no obtienes la característica. Por lo que sé, NINGUNA de estas cosas ha sucedido para esta función.

En segundo lugar, las funciones se priorizan en función de sus beneficios netos, es decir, su beneficio total para nuestros clientes, menos nuestros costos totales al implementarlos. Hay "costos de oportunidad" muy reales en juego aqui Cada característica que implementamos es docenas de características para las cuales no tenemos presupuesto. Por lo tanto, las funciones no solo tienen que valer la pena el trabajo para hacerlas realidad, sino que tienen que ser MÁS beneficiosas que cualquiera de las miles de funciones que tenemos en nuestras listas de solicitudes de funciones. Esa es una barra alta para lograr; la mayoría de las características nunca lo consiguen.

Para explicar mi tercer punto, necesitas saber un poco sobre cómo se procesan los idiomas. Comenzamos tomando el código fuente y " lexing " en " tokens " -- palabras. En este punto, sabemos si cada carácter es parte de un número, una cadena, una palabra clave, un identificador, un comentario, una directiva del preprocesador, etc. Lexing es increíblemente rápido ; Podemos re-lex fácilmente un archivo entre pulsaciones de teclas.

Luego tomamos la serie de tokens y " parse " en un " árbol de sintaxis abstracta " ;. Esto determina qué partes del código son clases, expresiones, declaraciones de variables locales, nombres, asignaciones, lo que sea. El análisis también es rápido, pero no tan rápido como el de la lectura. Hacemos algunos trucos, como omitir el análisis de los cuerpos de los métodos hasta que alguien los esté mirando.

Finalmente, tomamos el árbol de sintaxis abstracta y hacemos un análisis semántico en él; esto determina si un nombre dado se refiere a un tipo, una variable local, un espacio de nombres, un grupo de métodos, un campo, etc. Hacemos ambos " nivel superior " análisis semántico, para determinar la jerarquía de tipos del programa, y ??" nivel de método " Análisis semántico, para determinar el tipo de cada expresión en cada método. " Nivel superior " El análisis semántico es bastante rápido, y cualquier análisis de método individual es bastante rápido, pero aún así, es difícil hacer un análisis semántico completo entre pulsaciones de teclas.

Obviamente, necesitamos hacer un análisis semántico completo para la inteligencia, pero podemos salir adelante para averiguar qué método está escribiendo actualmente, y solo hacer el análisis semántico del nivel superior y de ese método.

Pero la colorización tiene que funcionar en todo el archivo; no puedes simplemente colorear el método en el que se encuentra el cursor en este momento. Por lo tanto, la colorización debe ser increíblemente rápida, por lo que históricamente hemos coloreado principalmente en base a información léxica.

Ocasionalmente podemos descubrir cosas especiales como "¿esto es probablemente un tipo?" Para darle un color diferente. Pero descifrar cuándo una entidad dada es, digamos, un grupo de métodos vs, digamos, un campo de tipo delegado, requiere un nivel bastante rico de análisis semántico, un nivel que actualmente no realizamos con cada pulsación de tecla.

Ahora, hay cosas que podemos hacer aquí. Podríamos ser más inteligentes en la comprensión de las ediciones a la secuencia del token, y solo repetir el análisis gramatical y semántico en la parte editada del árbol. Estamos haciendo una investigación en esta área ahora, pero es solo investigación; puede que nunca lo haga realmente en el producto.

Otros consejos

Creo que el complemento ReSharper proporciona algunos resaltados de sintaxis mejorados de los que está hablando. También puede haber otros complementos que proporcionen la misma cosa (a un costo menor) que es simplemente el que yo uso. Estoy de acuerdo en que el resaltado de sintaxis es muy útil. ReSharper también hace algunas cosas agradables, como el código muerto gris para hacerlo más obvio, resaltar la línea actual, etc.

-Daniel

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top