Lenguaje (Ada)
marcos071996Ensayo29 de Abril de 2014
3.863 Palabras (16 Páginas)245 Visitas
Lenguaje (Ada)
Características
• La sintaxis, inspirada en Pascal, es bastante legible incluso para personas que no conozcan el lenguaje. Es un lenguaje que no escatima en la longitud de las palabras clave, en la filosofía de que un programa se escribe una vez, se modifica decenas de veces y se lee miles de veces (legibilidad es más importante que rapidez de escritura).
• Es indiferente el uso de mayúsculas y minúsculas en los identificadores y palabras claves, es decir es un lenguaje case-insensitive.
• En Ada, todo el programa es un único procedimiento, que puede contener subprogramas (procedimientos o funciones).
• Cada sentencia se cierra con end qué_cerramos. Es un modo de evitar errores y facilitar la lectura. No es necesario hacerlo en el caso de subprogramas, aunque todos los manuales lo aconsejan y casi todos los programadores de Ada lo hacen.
• El operador de asignación es :=, el de igualdad =. A los programadores de C y similares les puede confundir este rasgo inspirado en Pascal.
• La sintaxis de atributos predefinidos es Objeto'Atributo (o Tipo'Atributo) (nota: esto sólo aplica a atributos predefinidos por el lenguaje, ya que no es el concepto de atributo típico de OOP).
• Se distingue entre "procedimientos" (subrutinas que no devuelven ningún valor pero pueden modificar sus parámetros) y "funciones" (subrutinas que devuelven un valor y no modifican los parámetros). Muchos lenguajes de programación no hacen esta distinción. Las funciones de Ada favorecen la seguridad al reducir los posibles efectos colaterales, pues no pueden tener parámetros in out.
Sintaxis
La declaración básica de un array es la siguiente:
array (Tipo_Índice) of Tipo_Elemento
Este array consiste en un elemento de tipo Tipo_Elemento por cada posible valor de Tipo_Índice. Por ejemplo, si quisieramos contar las ocurrencias de cada letra en un texto nos definiríamos un array de este tipo:
type Contador_Caracteres is array (Character) of Natural;
Nota: usamos Natural como tipo de elemento puesto que los valores negativos de Integer no tienen sentido en una cuenta. Es conveniente usar el subtipo entero más adecuado en cada caso, puesto que así nos beneficiamos de la comprobación de rango y podemos descubrir errores fácilmente.
Con subrango conocido
A menudo no necesitamos un array con todos los valores posibles del tipo del índice. En este caso definimos un subtipo del tipo índice con el rango necesitado.
subtype Subtipo_Índice is Tipo_Índice range Primero ... Último;
array (Subtipo_Índice) of Tipo_Elemento;
Ten en cuenta que si First y Last son literales numéricos, esto implica que el tipo índice base es el Integer.
Si en el ejemplo anterior, sólo deseásemos contar letras mayúsculas desechando otros caracteres, podríamos definir el tipo array de este modo:
type Contador_Caracteres is array (Character range 'A' .. 'Z') of Natural;
Con elementos aliased
Los programadores de C/C++ dan por hecho que todo elemento de un array tiene una dirección propia en memoria (de hecho el nombre del array es un puntero sobre el que se puede operar).
En Ada, esto no es siempre así. Veamos este ejemplo:
type Día_De_Mes is range 1 .. 31;
type Día_Con_Cita is array (Día_De_Mes) of Boolean;
pragma Pack (Día_Con_Cita);
Uso de arrays
Para acceder a los elementos de un array se usan el nombre del objeto array seguido del índice entre paréntesis.
Se puede acceder a una rodaja (slice) de un array usando (x .. y).
Vector_A (1 .. 3) := Vector_B (4 .. 6);
El operador "&" permite concatenar arrays:
Nombre_Completo := Nombre & ' ' & Apellidos;
Tipos De Datos
Tipos de datos primitivos
Variables y Constantes
• Cualquier objeto de datos puede ser definido como variable o como constante.
• Cualquier declaración que empiece con la palabra constant es una constante y se deberá asignar un valor, el cual no se podrá cambiar en la ejecución.
• Si se omite la palabra constant, la misma declaración define un tipo de dato variable, a la cual se le debe asignar un valor inicial y el cual se podrá cambiar en la ejecución.
Ejemplo:
MaxSize constant integer := 500;
CurrentSize integer := 0;
Tipos de Datos Numericos
• Enteros, punto-flotante, punto-fijo y los tipos de datos basicos.
• Declaraciones son similares que en Pascal usando los atributos range (para enteros) y digits (para flotantes) los cuales especifican el rango de valores que podra tomar el tipo de dato.
Ejemplo:
type DayOfYear is range 1..366; -- un valor entero de 1 a 366
MyBirhtday: DayOfYear := 219; -- MyBirthday inicializada a 219
type Result is digits 7 -- flotante de 7 digitos
Anwer: Result :=3.17; -- varible de 7 digitos.
Los tipos Integer y float estan predefinidos en el paquete estandar como:
type integer is range implementation defined;
type float is digits implementation defined;
Enumeraciones
• Enumeraciones deben de definirse usando un estilo como Pascal de definición e implementación.
Ejemplo:
type class is (Fresh, Soph, Junior, Senior);
La representación en la ejecución usa el número de posición para cada valor de la literal, empezando con 0 para el primer valor listado, 1 para el segundo, etc.
Tipos Caracter y Boleano
• Estas son definidas en el paquete estandar para ser enumeraciones especificas.
Tipo de Dato Apuntador
• Un tipo apuntador llamado access, junto con una función primitiva new, crean un nuevo objeto y regresa un apuntador a este , el cual debe ser asignado a una varible del tipo access.
• Una variable no puede ser directamente declarada como access en vez de esto se hace lo siguiente:
type acces_typename is access typename;
y la variable deber ser declarada como un tipo de dato definido.
• Todas las variables del tipo acces tienen el valor NULL por default.
• Un bloque de almacenamiento puede ser solicitado para cualquier tipo de dato usando la sentencia:
for acces_typename use expresion;
Donde expresión es el tamaño del bloque a pedir.
TIPOS DE DATOS ESTRUCTURADOS
Vectores y Arreglos
• Un arreglo de objetos puede ser declarado con cualquier número de dimensiones, cualquier rango y cualquier tipo de componente.
Ejemplo:
Table: array (1..10, 1..20) of float;
crea una matriz de 10 X 20 de numeros reales;
• Definición de tipos puede ser utilizada para crear clases de cualquier tipo de arreglo de objetos.
Ejemplo:
type WhatIsTheMatrix is array (integer range <>,integer range <>) of float;
donde los < > indican un campo que se debe llenar.
Inicialización: cualquier arreglo debe de estar inicializado en su declaración.
Cadena de Caracteres
• Las cadenas de caracteres son tratadas como un tipo de vector predefinido usando otros dos tipos predefinidos positive (enteros) y character (enumerando los caracteres definidos en el paquete estandar).
type string array (positive range <>) of character;
Ejemplo:
MyString : string(1..30);
Tipo de Dato Archivo
• Archivos y operaciones de entrada-salida son definidos como tipos de datos abstractos, usando paquetes predefinidos.
• El programador de Ada mira los archivos como tipo de datos que en su estructura interna estan ocultos por ser encapsulados con los paquetes estandares.
• Existen diferentes tipos de archivos (texto, enteros, reales, etc.); cada paquete tiene su propio tipo de archivo ejemplo en TEXT_IO hay un tipo para archivos secuenciales o solo texto en FLOAT_IO hay un tipo de dato archivo para flotantes, y así sucesivamente.
Tipo de Dato Definido Por El Usuario
• Los tipos de datos record en Ada son similares que en Pascal.
• En Ada a diferencia de Pascal un objeto record debe de ser definido primero usando una definición de tipo, para definir la estructura de record y despues dando la declaración de la variable usando el tipo de nombre.
• Ejemplo:
type Birthday is
record
Month: string (1..3) := "jun";
Day: integer range 1..31 := 17;
Year: integer range 1950..2050 := 1970;
end record
Ejemplos:
Ejemplo 1
type Tipo_enumerado is (Enum1, Enum2, Enum3);
for Tipo_enumerado'Size use 2; -- Para representar 3 unidades necesitamos 2 bits
type Tipo_entero is range -1 .. 5;
...
pragma Assert (Tipo_enumerado'Last = Enum3); -- Correcto
pragma Assert (Tipo_entero'First = -1); -- Correcto
pragma Assert (Tipo_entero'Last = 4); -- ¡¡Incorrecto!!
...