Articulo de referencia

Lenguaje de diagramas de flujo

El lenguaje de diagramas de flujo (FCL) es un lenguaje de programación imperativo simple diseñado para explicar conceptos fundamentales de análisis y especialización de programa...

El lenguaje de diagramas de flujo (FCL) es un lenguaje de programación imperativo simple diseñado para explicar conceptos fundamentales de análisis y especialización de programas, en particular, la evaluación parcial . El lenguaje fue presentado por primera vez en 1989 por Carsten K. Gomard y Neil D. Jones. [ 1 ] Posteriormente reapareció en su libro con Peter Sestoft [ 2 ] en 1993, y en las notas de clase de John Hatcliff [ 3 ] en 1998. A continuación se describe FCL tal como apareció en las notas de clase de John Hatcliff.

FCL es un lenguaje de programación imperativo similar a la forma en que una computadora Von Neumann ejecuta un programa. Un programa se ejecuta secuencialmente siguiendo una secuencia de comandos, manteniendo un estado implícito, es decir, la memoria global. FCL no tiene el concepto de procedimientos, pero sí proporciona saltos condicionales e incondicionales. FCL hace honor a su nombre, ya que el grafo de llamadas abstracto de un programa FCL es un diagrama de flujo sencillo.

Un programa FCL toma como entrada una serie finita de valores con nombre como parámetros y produce un valor como resultado.

Sintaxis

Especificamos la sintaxis de FCL utilizando la forma Backus-Naur .

Un programa FCL es una lista de declaraciones de parámetros formales, una etiqueta de entrada y una secuencia de bloques básicos :

<p> :: = "(" <x> * " ) " " (" <l> " ) " <b> +

Inicialmente, el lenguaje solo permite variables enteras no negativas.

Un bloque básico consta de una etiqueta, una lista de asignaciones y un salto.

< b > ::= < l > ":" < a > * < j >

Una asignación asigna una variable a una expresión. Una expresión puede ser una constante, una variable o la aplicación de un operador n-ario integrado:

< a > := < x > ":=" < e > < e > := < c > | <x> |< o > "(" < e > * ")" 

Tenga en cuenta que los nombres de las variables que aparecen a lo largo del programa no necesitan declararse al principio del mismo. Las variables declaradas al principio del programa designan los argumentos del mismo.

Como los valores solo pueden ser enteros no negativos, también lo pueden ser las constantes. La lista de operaciones en general es irrelevante, siempre que no tengan efectos secundarios , lo que incluye excepciones, por ejemplo, la división por cero:

< c > ::= "0" | "1" | "2" | ... < o > ::= "+" | "-" | "*" | "=" | " < " | " > " | ... 

Donde = , < , ... tienen la misma semántica que en C. La semántica de - es tal que si xy<0, entonces xy=0.

Ejemplo

Escribimos un programa que calcula el n -ésimo número de Fibonacci , para n>2:

(norte) (inicialización) inicialización: x1 = 1 x2 = 1 Fibonacci: x1 = x1 + x2 t = x1 x1 = x2 x2 = t n = -(n 1) si >(n 2) entonces fib sino salir salir: devolver x2 

Donde el invariante de bucle de fib es que x1 es el (i+2-1) -ésimo y x2 es el (i+2) -ésimo número de Fibonacci, donde i es el número de veces que se ha saltado a fib .

Podemos comprobar la corrección del método para n=4 presentando el rastro de ejecución del programa:

(inorteit, [norte4, incógnita10, incógnita20, t0])(Fib, [norte4, incógnita11, incógnita21, t0])(Fib, [norte3, incógnita11, incógnita22, t0])(halt, 3, [norte2, incógnita12, incógnita23, t0]){\displaystyle {\begin{aligned}&\left({\mathtt {init}},\ \left[n\mapsto 4,\ x1\mapsto 0,\ x2\mapsto 0,\ t\mapsto 0\right]\right)\\\rightarrow &\left({\mathtt {fib}},\ \left[n\mapsto 4,\ x1\mapsto 1,\ x2\mapsto 1,\ t\mapsto 0\right]\right)\\\rightarrow &\left({\mathtt {fib}},\ \left[n\mapsto 3,\ x1\mapsto 1,\ x2\mapsto 2,\ t\mapsto 0\right]\right)\\\rightarrow &\left(\left\langle {\mathtt {detener}},\ 3\rango\derecho,\ \left[n\mapsto 2,\ x1\mapsto 2,\ x2\mapsto 3,\ t\mapsto 0\right]\right)\end{aligned}}}

Dóndehalt, v{\displaystyle \left\langle {\mathtt {detener}},\ v\right\rangle }marca un estado final del programa, con el valor de retornov{\displaystyle v}.

Variantes

Lenguaje de diagramas de flujo reversibles

El lenguaje de diagramas de flujo reversibles (RL) es un lenguaje de programación imperativo reversible simple diseñado para la computación reversible, donde cada proceso computacional es reversible. [ 4 ] RL combina pasos, pruebas y aserciones de manera que garantiza la reversibilidad de los programas.

RL enfatiza la construcción de programas reversibles que permiten la computación inversa determinista, asegurando que no se pierda información durante el procesamiento. Esta característica lo distingue de los lenguajes de diagramas de flujo tradicionales, que generalmente implican operaciones irreversibles. La sintaxis y los programas de ejemplo de RL se asemejan mucho a los lenguajes de diagramas de flujo tradicionales, pero con restricciones adicionales para garantizar la reversibilidad. Estas incluyen bucles reversibles, condicionales reversibles e invertibilidad de los pasos de computación atómica.

Debido a la restricción de reversibilidad, el RL tiene menor potencia computacional que las máquinas de Turing convencionales , pero es equivalente a las máquinas de Turing reversibles (RTM) , sentando las bases para la programación reversible. La variante reversible del teorema del programa estructurado , por ejemplo, puede analizarse eficazmente utilizando RL, lo que demuestra su importancia en los fundamentos teóricos de la computación reversible . También existe una variante estructurada de RL (SRL: lenguaje de diagramas de flujo reversibles estructurados) [ 4 ] que combina secuencia, selección e iteración de manera que garantiza la reversibilidad de los programas.

Referencias

  1. Carsten K. Gomard y Neil D. Jones. Generación de compiladores mediante evaluación parcial. En GX Ritter, editor, Information Processing '89. Actas del 11.º Congreso Mundial de Informática de la IFIP , páginas 1139-1144. IFIP, North-Holland, 1989.
  2. Neil D. Jones, Carsten K. Gomard y Peter Sestoft. Evaluación parcial y generación automática de programas. Con capítulos de L.O. Andersen y T. Mogensen. Prentice Hall International, junio de 1993. xii + 415 páginas. ISBN 0-13-020249-5Disponible gratuitamente en http://www.itu.dk/~sestoft/pebook/pebook.html
  3. John Hatcliff. Introducción a la evaluación parcial en línea y fuera de línea mediante un lenguaje de diagramas de flujo sencillo. En Evaluación parcial: práctica y teoría, Escuela Internacional de Verano DIKU 1998, John Hatcliff, Torben Æ. Mogensen y Peter Thiemann (eds.). 1998. Springer-Verlag, Londres, Reino Unido, 20-82.
  4. 1 2 Yokoyama, Tetsuo; Axelsen, Holger Bock; Glück, Robert (enero de 2016). "Fundamentos de los lenguajes de diagramas de flujo reversibles" . Theoretical Computer Science . 611 : 87–115 . doi : 10.1016/j.tcs.2015.07.046 .