Comenzaré con cómo los analizadores usualmente funcionan. En general, un analizador toma tokens de entrada en orden secuencial. En algún momento (generalmente después de que todos los tokens están agotados), el analizador devuelve el resultado. Una desventaja de este modelo es que es inherentemente secuencial: como el analizador opera en una secuencia de tokens en orden, no es obvio cómo paralelizar el proceso.
Sin embargo, el análisis se puede paralelizar si tenemos acceso a una operación capaz de combinar resultados parciales parciales en un solo resultado. Por ejemplo, si nuestro lenguaje es representable con una gramática libre de contexto, entonces podríamos analizar cada definición de nivel superior por separado y en paralelo, luego ensamblar las piezas más tarde utilizando la operación de combinación.
El análisis monoidal simplemente significa que el analizador tiene acceso a una función de combinación adecuada. Un monoide es una estructura con un elemento cero y un operador asociativo binario. Por ejemplo, las listas forman un monoide donde el cero es la lista vacía y el operador asociativo es la concatenación. Recuerde que asociatividad significa (a++b)++c == a++(b++c)
. Sucede que esta es la propiedad necesaria para garantizar que podamos recombinar resultados de análisis de forma sensata. No importa el orden exacto en que los submodos se recombinan, siempre que cada sub-parse se mantenga en la ubicación de secuencia correcta.
Por supuesto, para escribir realmente un analizador paralelo, es necesario dividir los trozos de manera apropiada también. Si desea analizar definiciones de nivel superior en paralelo, es necesario poder reconocer dónde comienza esa definición. Esta tarea generalmente la realiza el analizador en sí. Según recuerdo, una gran parte de sus diapositivas cubren este tema. Dividir en las definiciones de nivel superior es bastante grueso; lo ideal sería que nuestro analizador sintáctico pudiese partir de cualquier token arbitrario, luego tener sentido de las piezas más tarde cuando se aplica el operador monoide.
Desafortunadamente no puedo decir si el "análisis monoidal" es nuevo, ya que no estoy particularmente familiarizado con la literatura. Sin embargo, sospecho que cualquier modelo o algoritmo para el análisis paralelo implica una estructura monoide, incluso si no se nombra explícitamente. Hace tiempo que se sabe que los monoides son adecuados para paralelizar problemas, por lo que no me sorprendería que la técnica sea común entre los investigadores analizadores.
Edward menciona algunas de las publicaciones de sigfpe como de interés: http://blog.sigfpe.com/2009/01/fast-incremental-regular-expression.html http: //blog.sigfpe.com/2009/01/beyond-regular-expressions-more.html – applicative
Otra cosa que estaba influyendo en las personas en ese momento fueron algunas conferencias de Guy Steele sobre estructuras de datos aptas para el paralelismo. Este es quizás un poco más tarde, pero característico: http://stevereads.com/papers_to_read/ICFPAugust2009Steele.pdf – applicative
Creo que los combinadores de analizadores monoidales fueron descritos por primera vez por Fokker en 1995. – rotskoff