Recientemente encontré un marco llamado ecto .
En este marco, un componente básico llamado "plasma" , que es el gráfico acíclico dirigido ecto. En ecto, el plasma puede ser operado por el programador ecto.
Me pregunto cuál es la ventaja de este mecanismo y en qué otras situaciones podemos explotar el concepto de DAG.
algorithms
data-structures
frameworks
graph
Po-Jen Lai
fuente
fuente
Respuestas:
Buena pregunta.
EDITAR:
Buenos recursos:
fuente
La respuesta es que no tiene mucho que ver con la programación. Tiene que ver con la resolución de problemas.
Al igual que las listas enlazadas son estructuras de datos utilizadas para ciertas clases de problemas, los gráficos son útiles para representar ciertas relaciones. Las listas enlazadas, los árboles, los gráficos y otras estructuras abstractas solo tienen una conexión con la programación, ya que puede implementarlas en código. Existen en un nivel superior de abstracción. No se trata de programar, se trata de aplicar estructuras de datos en la solución de problemas.
Si aún desea alguna relación con la programación, considere los siguientes puntos:
fuente
Otras personas han aplicado DAG a los datos, pero creo que es al menos tan aplicable (si no más) al código. Mahbubur R. Aaman menciona esto, así que realmente es más una adición a su respuesta que una respuesta completa por sí sola.
Se me ocurre que cualquier programa informático imperativo que esté libre de bucles infinitos (gracias @AndresF.) Es un Gráfico Acíclico Dirigido (DAG). Lo que significa que las posibles rutas de ejecución del código son dirigidas (primero esto, luego aquello) y acíclicas (sin formar bucles infinitos). Son un gráfico porque la ruta a través de cualquier código significativo rara vez es tan simple como una lista o un árbol.
Trabajé en XSLT por unos 4 años. Tuve un momento terrible tratando de explicar por qué no era un buen lenguaje de programación de propósito general, pero DAG es la razón. Específicamente, XSLT es un lenguaje basado en datos. Define funciones (sí, en el sentido de la programación funcional) pero no necesariamente llama a estas funciones desde su código. Por el contrario, XSLT establece una combinación de selección e iteración a través de los nodos de un documento XML de entrada. Esto permite que la estructura de los datos de entrada determine qué funciones se llaman y en qué orden.
Esto fue muy interesante y genial hasta que su programa encontró una condición de datos que no probó a las 2:30 a.m. y tuvo que despertarse y arreglarlo. Cuando deja que los datos definan el DAG, la definición del DAG se convierte en todas las condiciones de entrada posibles, que para cualquier aplicación comercial no trivial son más que incalculables; Son inimaginables.
Al principio, pensé que la programación funcional puede no ser un DAG porque el orden de ejecución a veces no es claro, ni siquiera pensado por el programador. Pero un programa funcional sí define dependencias. De hecho, la naturaleza declarativa de la programación funcional podría considerarse como la definición de solo dependencias (a ^ 2 = b ^ 2 + c ^ 2) sin especificar el orden de ejecución (no importa si 'b' o 'c' se cuadran primero , siempre que ambos estén al cuadrado antes de sumarlos).
Pero aunque la programación funcional puede ser deliberadamente vaga sobre el orden de las operaciones a un nivel detallado, es exquisitamente clara sobre las dependencias. Estas son las características que lo hacen tan susceptible a la concurrencia. En cualquier caso, todavía hay un gráfico de rutas a través del código, y ese gráfico todavía está dirigido (las dependencias deben evaluarse antes de las tareas dependientes), por lo que creo que DAG también se aplica allí.
Buena pregunta: ¡gracias por publicar!
fuente
while (true) { print("hi"); }
? ¿Quizás quiera excluir los programas que no terminan?Actualmente DAG está subestimado en la programación. Históricamente, muchas cosas relacionadas con el desarrollo se hicieron con árboles y jerarquías porque mover algo en una caja es conveniente para que nuestro cerebro haga que las cosas complejas sean más fáciles de manejar. Pero si observa los eventos y cómo dependen de otros eventos y estados, obtendrá DAG porque cualquier cosa en nuestra vida y en el programa puede depender de cualquier cosa en el pasado pero no en el futuro, por lo que sería perfectamente "acíclico". Las relaciones deben ser aplicables al concepto DAG. Aunque esto rara vez se usa explícitamente en el desarrollo, tener esto en mente ayudaría a comprender mejor las cosas
fuente
DAG se puede usar para modelar una colección de tareas en una secuencia con la restricción de que ciertas tareas deben realizarse antes que las demás. Ecto es un marco de procesamiento y utiliza DAG para modelar gráficos de procesamiento para que los gráficos realicen una ejecución síncrona ordenada. El plasma en Ecto es el DAG y el Programador opera en él.
fuente
Como ejemplo del mundo real, nuestro software es similar a un IDE donde el usuario final puede definir una serie de operaciones que se realizarán en una imagen (inspección por visión artificial). Estas inspecciones pueden tener dependencias de otras inspecciones o pueden tener inspecciones que dependen de ellas. Como todo esto es configurable por el usuario final, no podemos hacer optimizaciones para el procesamiento paralelo en tiempo de diseño. Al representar estas inspecciones y dependencias como un DAG, podemos optimizar el paralelismo de la inspección general para obtener el máximo rendimiento en tiempo de ejecución.
fuente
Solo por otro ejemplo, las reglas de administración de memoria en las aplicaciones de Cocoa están hechas para que todas las referencias fuertes formen un gráfico acíclico dirigido, que se hace para garantizar la ausencia de fugas.
fuente
Agregando otra respuesta, ya que no he visto una referencia a los sistemas de compilación, como el
make
que usa DAG para descubrir las dependencias para la construcción.Más detalles aquí
fuente
make