TABLA DE CONTENIDO
Gráfica 1: Algunos lenguajes de programación creados a lo largo de la historia, con su fecha de aparición.
Scheme, Perl, Python y Ruby son multiparadigma, siguiendo tanto el paradigma imperativo como el declarativo.
La sintaxis de GCL enumera las reglas que definen como escribir programas en el lenguaje,
brindando los siguientes tipos de instrucción: 1. skip (instrucción vacía), 2. abort
(terminación anormal), 3. Asignación, 4. Concatenación (secuencias de programas), 5.
Selección (instrucciones condicionales) y 6. Repetición (ciclos).
La sintaxis por sí sola no es suficiente para definir un lenguaje. Por ejemplo, una persona
podría hablar perfectamente en chino sin entender que está diciendo, o cantar una canción
en inglés sin comprender la letra. Por lo tanto, además de la sintaxis, es necesario definir la
semántica del lenguaje, que nos provee el significado.
Así pues, los programas en GCL pueden interpretarse bajo una semántica o significado que
nos indique cómo entenderlos. Existen dos maneras importantes para dotar de significado a
los programas en GCL:
Semántica Operacional: el significado de los programas se establece describiendo su
operación en términos de cómo se ejecutan en una máquina instrucción tras instrucción,
transformando el estado de las variables.
Semántica Axiomática: el significado de los programas se establece mediante axiomas
formales que describen bajo qué condiciones éstos son correctos con respecto a su
especificación.
Se estudiará con detalle cada tipo de instrucción del lenguaje de programación GCL
definiendo su sintaxis y su semántica operacional, con la ayuda de diagramas de flujo. Más
adelante definiremos la semántica axiomática.
El comando más sencillo en GCL es la instrucción vacía skip, que no realiza ningún cambio
sobre el estado de las variables (coloquialmente, la instrucción skip no hace nada). Su
significado operacional se establece afirmando que, después de ejecutarse un skip, el estado
de las variables permanece igual a como estaba antes de ejecutarse la instrucción.
Formalmente, para todo estado que satisface la precondición , después de ejecutarse el
comando skip, se termina en el mismo estado .
En los diagramas de flujo, representaremos al comando skip con una flecha que dé
continuación al flujo de ejecución sin tener ningún efecto sobre el estado de las variables:
En Java y C++ hay muchas posibilidades para simular una instrucción vacía, que van más allá
de simplemente no escribir código.
Para terminar abruptamente una ejecución, se cuenta en GCL con la instrucción abort, que
termina anormalmente el flujo de operaciones de un programa. Formalmente, para todo
estado que satisface la precondición , después de ejecutarse el comando abort, la
ejecución termina anormalmente.
En los diagramas de flujo, representaremos al comando abort con un nodo que termine
abruptamente el flujo de ejecución del programa:
2.3. ASIGNACIÓN
Código 7: Asignación.
x1,x2,...,xn:=E1,E2,...,En
Es posible traducir asignaciones en GCL a lenguajes como Java y C++, teniendo especial
cuidado con las asignaciones simultáneas, que pueden requerir de la creación de variables
auxiliares o temporales durante la traducción.
La disyunción de las guardas es verdadera en un estado si existe alguna guarda que sea
verdadera en tal estado, y es falsa en un estado si todas las guardas son falsas en el estado.
Además, note que gracias al teorema de De Morgan
Generalizado.
Se dice que un algoritmo es determinístico si y sólo si para todo estado que cumpla la
precondición, cada vez que se ejecute el programa comenzando en tal estado, se sigue el
mismo flujo de operaciones y se llega al mismo resultado. Por otro lado, un algoritmo es no
determinístico si y sólo si existe un estado que cumpla la precondición, tal que sea posible
que hayan dos ejecuciones que sigan distintos flujos de operaciones y/o lleguen a resultados
distintos.
Código 15: Programa no determinístico en GCL que calcula el máximo entre dos números.
con x: ,y: ;
var r: ;
{Pre Q: true}
if xy r:=x
[] yx r:=y
fi
{Pos R: r=xy}
Código 16: Programa determinístico en GCL que calcula el máximo entre dos números.
con x: ,y: ;
var r: ;
{Pre Q: true}
if x>y r:=x
[] yx r:=y
fi
{Pos R: r=xy}
Para soportar comandos iterativos (también llamados ciclos, bucles o loops), se tiene la
instrucción de repetición DO, donde:
son expresiones booleanas llamadas guardas del ciclo.
son programas llamados comandos del ciclo.
Cada expresión de la forma es un comando guardado del ciclo.
es el número de comandos guardados del ciclo ( ).
Dado que todo ciclo con más de un comando guardado puede ser traducido en un ciclo con
exactamente un comando guardado, no perdemos expresividad si todas nuestras
instrucciones repetitivas las escribimos en la forma
do B S
od
Una de las ventajas de diseñar ciclos con un sólo comando guardado es que la traducción a
lenguajes como Java, C y C++ se facilita.
EN RESUMEN
GCL es un lenguaje especialmente diseñado para facilitar el estudio de los algoritmos, que consta de
un conjunto reducido de instrucciones lo suficientemente expresivas como para permitir describir
comandos como condicionales y ciclos, y lo suficientemente simples como para poder estudiar los
algoritmos sin tener que preocuparnos por instrucciones complejas difíciles de comprender y de
analizar.
La sintaxis de GCL enumera las reglas que definen como escribir programas en el lenguaje, brindando
los siguientes tipos de instrucción: 1. skip (instrucción vacía), 2. abort (terminación anormal), 3.
Asignación, 4. Concatenación (secuencias de programas), 5. Selección (instrucciones condicionales) y
6. Repetición (ciclos).
Existen dos maneras importantes para dotar de significado a los programas en GCL:
Semántica Operacional: el significado de los programas se establece describiendo su operación en
términos de cómo se ejecutan en una máquina instrucción tras instrucción, transformando el estado
de las variables.
Semántica Axiomática: el significado de los programas se establece mediante axiomas formales que
describen bajo qué condiciones éstos son correctos con respecto a su especificación.
skip (instrucción vacía)
Sintaxis Diagrama de flujo Semántica operacional
No realiza ningún cambio sobre el estado de las
skip
variables.
Asignación
Sintaxis Diagrama de flujo Semántica operacional
Se asigna simultáneamente a las variables
el valor de las expresiones
, respectivamente. En otras
palabras, a la variable se le asigna el valor de
x1,x2,...,xn:=E1,E2,...,En la expresión , a la variable se le asigna el
valor de la expresión , …, y a la variable se
le asigna el valor de la expresión , donde
todas las asignaciones se ejecutan
simultáneamente.
Repetición (ciclos)
Sintaxis Diagrama de flujo Semántica operacional