Herramientas de programación visual, ¿por qué no funcionan directamente con el AST?


25

He encontrado varias herramientas de programación visual de código abierto como Blockly y sus amigos, y otros proyectos alojados en Github, pero no pude encontrar ninguno que funcione directamente con el árbol de sintaxis abstracta.

¿Porqué es eso?

Lo pregunto porque una vez que descubrí que cada compilador tiene una fase en el proceso de compilación donde analiza el código fuente a un AST, era obvio para mí que algunas herramientas de programación visual podrían aprovechar esto para darle al programador formas para editar el AST directamente de forma visual, y también para realizar el viaje de ida y vuelta desde la fuente al gráfico de nodos y luego volver a la fuente cuando sea necesario.

Por ejemplo, uno podría pensar que desde el JavaScript AST Visualizer hasta una herramienta de programación visual JavaSript real no hay mucha diferencia.

Entonces, ¿qué me estoy perdiendo?


10
Los AST son muy detallados y no muy convenientes para la programación. Fueron diseñados para compiladores, no para programadores.
Yuval Filmus


1
¿Qué quiere decir con "trabajar directamente con el árbol de sintaxis abstracta"? Podría decirse que todas las herramientas basadas en bloques como Blockly están editando el AST: representan bordes al anidar (o apilar, si prefiere verlo de esa manera), y el usuario puede editar el árbol (digamos) arrastrar y soltar.
Michael Homer

Es una gran pregunta que muchos de nosotros que nos gustan los compiladores hemos tenido. Creo que la respuesta corta es que si pudieras hacer esto y hacerlo fácil de usar, la gente lo usaría. El único problema es que es un gran "si".
Mehrdad

2
¿Has mirado a Lisp ? "[No] es tanto que Lisp tenga una sintaxis extraña sino que Lisp no tiene sintaxis. Usted escribe programas en los árboles de análisis que se generan dentro del compilador cuando se analizan otros idiomas. Pero estos árboles de análisis son completamente accesibles para sus programas". Puedes escribir programas que los manipulen ".
Comodín el

Respuestas:


28

Muchas de estas herramientas hacen el trabajo directamente con el árbol de sintaxis abstracta (o más bien, una visualización directa de uno a uno de la misma). Eso incluye Blockly, lo que has visto, y las otras lenguas y editores basados en bloques como él ( arañazos , lápiz Código / la gotita , Snap! , GP , baldosa Gracia , y así sucesivamente).

Esos sistemas no muestran una representación gráfica tradicional de vértices y bordes, por razones explicadas en otra parte (espacio, y también dificultad de interacción), pero están representando directamente un árbol. Un nodo o bloque es hijo de otro si está directamente, físicamente dentro del padre.


Construí uno de estos sistemas ( Tiled Grace , papel , papel ). Les puedo asegurar que está trabajando directamente con el AST: lo que ven en la pantalla es una representación exacta del árbol de sintaxis, como elementos DOM anidados (¡un árbol!).

Captura de pantalla del código de Tiled Grace anidado

Este es el AST de algún código. La raíz es un método llamado nodo "for ... do". Ese nodo tiene algunos hijos, comenzando con "_ .. _", que tiene dos hijos, un nodo "1" y un nodo "10". Lo que aparece en la pantalla es exactamente lo que el backend del compilador escupe en el medio del proceso: así es fundamentalmente cómo funciona el sistema.

Si lo desea, puede considerarlo como un diseño de árbol estándar con los bordes apuntando fuera de la pantalla hacia usted (y ocluido por el bloque frente a ellos), pero anidar es una forma tan válida de mostrar un árbol como un vértice diagrama.

También "realizará el viaje de ida y vuelta desde la fuente al gráfico de nodos y luego volverá a la fuente cuando sea necesario". De hecho, puede ver que eso sucede cuando hace clic en "Vista de código" en la parte inferior. Si modifica el texto, se volverá a analizar y se generará el árbol resultante para que pueda volver a editar, y si modifica los bloques, sucede lo mismo con la fuente.


Pencil Code hace esencialmente lo mismo con, en este punto, una mejor interfaz . Los bloques que utiliza son una vista gráfica de CoffeeScript AST. También lo hacen los otros sistemas basados ​​en bloques o mosaicos, en general, aunque algunos de ellos no hacen que el aspecto de anidación sea tan claro en la representación visual, y muchos no tienen un lenguaje textual real detrás de ellos, por lo que el " árbol de sintaxis "puede ser un poco ilusorio, pero el principio está ahí.


Lo que te falta, entonces, es que estos sistemas realmente están trabajando directamente con el árbol de sintaxis abstracta. Lo que ves y manipulas es una representación de un árbol que ahorra espacio, en muchos casos literalmente el AST que produce un compilador o analizador.


6

Al menos dos razones:

  1. Porque el código fuente es una representación mucho más concisa. Diseñar un AST como un gráfico ocuparía mucho más espacio visual.

    Los programadores valoran tener el mayor contexto posible, es decir, tener tanto código presente de una vez en la pantalla al mismo tiempo. El contexto les ayuda a gestionar mejor la complejidad. (Esa es una razón por la cual muchos programadores usan estas fuentes pequeñas y locas y enormes pantallas de 30 ").

    Si tratamos de mostrar el AST como un gráfico o árbol, entonces la cantidad de código que podría caber en una sola pantalla sería mucho menor que cuando se representa como código fuente. Esa es una gran pérdida para la productividad del desarrollador.

  2. Los AST están destinados a la programación del compilador, no para una fácil comprensión por parte de los programadores. Si tomó una representación AST existente y la visualizó visualmente, probablemente sería más difícil de entender para los desarrolladores, porque los AST no fueron diseñados para que los desarrolladores puedan aprenderlos fácilmente.

    Por el contrario, el código fuente generalmente está diseñado para que los desarrolladores puedan leerlo / entenderlo; normalmente es un criterio de diseño crítico para el código fuente, pero no para los AST. Los AST solo deben ser entendidos por los escritores del compilador, no por los desarrolladores cotidianos.

    Y, en cualquier caso, el lenguaje AST sería un segundo idioma que los desarrolladores tienen que aprender, además del idioma fuente. No es una victoria

Consulte también /software//q/119463/34181 para conocer otros posibles motivos.


2
"Por el contrario, el código fuente está diseñado para que los desarrolladores puedan leerlo / entenderlo" - contraejemplo: la mayoría de esolangs, Perl, Lisp
John Dvorak

1
"Porque el código fuente es una representación mucho más concisa"; "el lenguaje AST sería un segundo idioma que los desarrolladores tienen que aprender, además del idioma fuente", estos son argumentos en contra de todos los PL visuales, pero no ayudan a explicar la distinción que preocupa al OP.
Raphael

"(Esa es una razón por la que muchos programadores utilizan estas fuentes pequeñas locos y enormes pantallas de 30".)" - si usted necesita una gran pantalla-culo para ver el contexto suficiente, tal vez usted está spaghetti-codificación;)?
Raphael

1
@Raphael Quizás, ¡pero es menos esfuerzo arrojarle dinero que refactorizar!
Kroltan

3
@ JanDvorak, ... LISP es un contraejemplo porque el AST es el lenguaje, que es lo que le da su poder expresivo; escribir código LISP que recompila su otro código LISP es tan fácil como escribir código que modifique las estructuras de datos LISP estándar ... que es exactamente en lo que está escrito el código LISP . Hay una razón por la que ha durado más de medio siglo: el diseño de la familia es extraordinariamente expresivo. Go tenía que tener sus extensiones asíncronas insertadas profundamente en el lenguaje y el tiempo de ejecución; para Clojure, es solo una biblioteca. Ver también: Batir los promedios .
Charles Duffy

3

El AST típico de los compiladores es bastante complejo y detallado. La representación gráfica dirigida rápidamente se volvería bastante difícil de seguir. Pero hay dos grandes áreas de CS donde se usan AST.

  1. Los lenguajes Lisp en realidad se escriben como AST. El código fuente del programa se escribe como listas y el compilador y / o intérprete lo usa directamente (dependiendo de la variante que se esté usando).
  2. Los lenguajes de modelado, por ejemplo, UML, y muchos lenguajes específicos de dominio visual usan notaciones gráficas que son gráficos de sintaxis abstracta (ASG) efectivos en un nivel de abstracción más alto que el AST de lenguaje de propósito general típico.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.