1. Formulación de la Tarea 2. Descripción del lenguaje ADA 3. Los elementos teóricos de Sistemas de Computación 4. Modelo del Sistema de Programación 5. Forma general 6. Estructura Funcional (Algoritmos 7. Estructura Informática (Estructura de datos) 8. Hardware 9. Software 10. Personal (programadores) 11. Usuarios y mercado del Sistema de programación 12. Conclusión 13. Bibliografía 14. Apéndice A 15. Apéndice B
El estudio practico presente consta del análisis y síntesis del sistema de programa en lenguaje ADA. En el primer punto realizamos una descripción detallada del lenguaje elegido, en el segundo punto se trata de enfocar en forma general y abstracta las herramientas necesarias para un sistema de computación, tal es así que en el punto tres se explica la construcción, también en forma general, del sistema de programación y en los puntos subsiguientes se describe las estructuras funcionales e informáticas dinámicamente. Luego se obtiene una sistesis del personal de programación en los estados de análisis y diseño, ademas el hardware y software requerido. En el punto nueve se muestra el sistema de programación dentro del mercado actual y por ultimo una conclusión del sistema explicado anteriormente en lenguaje ADA, con el fin de servir de consulta y apoyo para la elección del lenguaje para un sistema en particular.
Descripción del lenguaje de programación ada
Es el ultimo intento de obtener un único lenguaje para todo tipo de aplicaciones e incluye los últimos avances en técnicas de programación.
Su diseño fue encargado por el Departamento de Defensa de Estados Unidos a la empresa Honeywell-Bull después de una selección rigurosa entre varias propuestas realizadas sobre una serie de requerimientos del lenguaje y de haber evaluado negativamente veintitrés lenguajes existentes. De estos, se seleccionaron como base para la creación del nuevo lenguaje el PASCAL, el ALGOL y el PL/I, aunque incluía importantes extensiones semánticas y sintácticas, incluyendo la ejecución simultánea de tareas.
La estandarización del lenguaje se publico en 1983 con el nombre de ADA, en honor a la primera programadora de la historia, Augusta Ada Byron.
Es un lenguaje estructurado parecido al PASCAL, destinado a controlar mecanismos en "tiempo real" (o sea una velocidad compatible con las necesidades reales), pero de gran complejidad. Admite una programación "orientada a objetos" y un sistema de alta modularidad de tipo hipertexto.
El ADA es un lenguaje grande que es relativamente difícil de compilar porque hace muchas comprobaciones en tiempo de compilación. Se ha estimado que un compilador de Ada completamente validado requiere cerca de 50 años de horas hombre para escribirlo y ponerlo a punto.
Características del Ada:
- Tipado fuerte: todo objeto tiene componentes de valor definido (es mucho mas fuerte que Pascal).
- Capaz de construir grandes programas: compilación separada de los distintos paquetes (módulos).
- programación estructurada
- programación concurrente
- Manejo de excepciones: ideal para la programación en tiempo real.
- Abstracción de datos.
- Unidades genéricas: que se pueden agrandar todo lo que queramos con nuevas funciones.
- Alta transportabilidad de los programas entre distintas plataformas: UNIX, OS/2, Win32.
El lenguaje ha ido evolucionando hasta que en el año 1995 surgió la revisión llamada Ada9X (o Ada95). En el Ada95 se añadieron nuevas sentencias y la programación Orientada a Objeto. (Ver Apéndice A Figura 1 Evolución de Ada 95)
Los elementos teóricos de sistemas de computación
SISTEMA: Conjunto de partes interrelacionadas para lograr un objetivo en común, llamado objeto real.
CONCEPTO DE PROGRAMA:
Un programa es un conjunto de instrucciones que al ser ejecutadas resuelven un problema.
La computadora se utiliza para procesar en forma automática y a gran velocidad estas instrucciones.
Para procesar la información está el hardware (microprocesador, RAM,…), y el software (que sirve para manejar el hardware).
Un programa tiene 3 partes:
- Entrada de datos X: Normalmente se va a ejecutar a través de instrucciones de lectura, y en lo que se le pide al usuario la información que el programa va a necesitar para ejecutarse y se hace a través de lecturas.
- Acciones de un algoritmo F(x): Parte en la que se resuelve el problema usando los datos de entrada.
- Salida Y: Mostrar en un dispositivo de salida los resultados de las acciones anteriormente realizadas. Son acciones de escritura.
En la parte de las acciones a ejecutar se distinguirán dos partes:
- Declaración de variables.
- Instrucciones del programa.
ESQUEMA GENERAL (ver Apéndice figura 3)
Objeto Real: | |
Sistema: Conjunto de propiedades de un objeto real realizando una sola función.
| Base: Información estática de datos y archivos.
|
Medio Exterior: Sitios o condiciones con los que se relacionan y conecta el sistema. |
ALGORITMOS
¿Qué es un algoritmo?:
Es una formula para resolver un problema. Es un conjunto de acciones o secuencia de operaciones que ejecutadas en un determinado orden resuelven el problema. Existen n algoritmos, hay que coger el más efectivo.
Es una secuencia ordenada de pasos – sin ambigüedades -, repetible, que es solución de un determinado problema.
Las características fundamentales que debe cumplir todo algoritmo son:
- Debe ser preciso e indicar el orden de realización de cada paso
- Debe estar definido (si se repite n veces los pasos se debe obtener siempre el mismo resultado)
- Debe ser finito (debe tener un número finito de pasos)
- Es independiente del lenguaje de programación que se utilice
- La definición de un algoritmo debe describir tres parte Entrada, Proceso, Salida.
- La programación es adaptar el algoritmo al ordenador.
- El algoritmo es independiente según donde lo implemente.
El algoritmo trata de resolver problemas mediante programas.
FASES:
- Análisis preliminar o evaluación del problema: Estudiar el problema en general y ver que parte nos interesa.
- Definición o análisis del problema: El objetivo de ésta fase es comprender el problema para lo cual como resultado tenemos que obtener la especificación de las entradas y salidas del problema. Tiene que quedar claro que entra y que sale, las posibles condiciones o restricciones, …
3. Diseño del algoritmo: Diseñar la solución. Una vez comprendido el problema se trata de determinar que pasos o acciones tenemos que realizar para resolverlo.
Como criterios a seguir a la hora de dar la solución algorítmica hay que tener en cuenta:
- Si el problema es bastante complicado lo mejor es dividirlo en partes más pequeñas e intentar dividirlo en partes más pequeñas e intentar resolverlas por separado. Esta metodología de "divide y vencerás" también se conoce con el nombre de diseño descendente.
- Las ventajas de aplicar esto son:
- Al dividir el problema en módulos o partes se comprende más fácilmente.
- Al hacer modificaciones es más fácil sobre un módulo en particular que en todo el algoritmo.
- En cuanto a los resultados, se probarán mucho mejor comprobando si cada módulo da el resultado correcto que si intentamos probar de un golpe todo el programa porque si se produce un error sabemos en que módulo ha sido.
Una segunda filosofía a la hora de diseñar algoritmos es el refinamiento por pasos, y es partir de una idea general e ir concretando cada vez más esa descripción hasta que tengamos algo tan concreto para resolver. Pasamos de lo más complejo a lo más simple.
La representación de los algoritmos:
Una vez que tenemos la solución hay que implementarla con alguna representación. Las representaciones más usadas son los flujogramas, los diagramas NS y el pseudocódigo.
4. Resolución en computadora: Implantación del algoritmo en un lenguaje de programación.
5. Ejecución del programa, pruebas y mantenimiento: Ver si el programa hace lo que queríamos (dentro de procedimientos)
PROCEDIMIENTOS
Son los pasos que definen el empleo especifico de cada elemento del sistema o el contexto procedimental en que reside el sistema. Los sistemas basados en computadoras Intentan poner orden a un desarrollo de sistemas e intentan poner al software en su contexto por lo tanto establece enlaces que unen al software con los elementos de un sistema basado en computadoras. El papel del ingeniero de sistemas es definir los elementos de un sistema especifico basado en computadora en el contexto de la jerarquía global de sistemas. Por lo tanto examinaremos las tareas que constituyen los sistemas de computación.
En el proceso cada elemento se implementa especificando los componentes técnicos que dan funcionalidad necesaria a un elemento en el contexto software, un componente podría ser un programa de computadora, un componente de programa reutilizable, un modulo, una clase u objeto o incluso una sentencia de lenguaje de programación.
Llflf
Sintaxis y Semántica
- La sintaxis de un lenguaje define como se pueden poner juntos símbolos, palabras reservadas, e identificadores para hacer un programa válido.
- La semántica de un constructor de un lenguaje es el significado del constructor; ella define su papel en un programa.
- Un programa sintácticamente correcto no implica que sea lógicamente (semánticamente) correcto.
- Los programas son más fáciles de construir y codificar cuando están constituidos por componentes separados.
- Un componente software puede considerarse como cualquier elemento de software que transforma una entrada en una salida.
En el Apéndice A (figura 7) se muestra la sintaxis completa de una compilación en notación BNF, extraída tal cual del manual de referencia del lenguaje Ada —recordemos que en la notación BNF [X] significa cero o una ocurrencia de X, {X} significa cero o más ocurrencias de X y * significa cualquier secuencia de caracteres—:
Gramática | |
< bit > ® < 0 >½ < 1 > < byte > ® < bit > < caracter > ® < byte > < palabra > ® < byte2 > < números > ® < entero > ½ < entero largo > ½ < decimal > < entero > ® < byte8 > < entero largo > ® < byte 16 > | < decimal > ® < byte 8 > < coma > < byte 8 > < coma > ® < separador decimal > < separador decimal > ® , < vector > ® entero½ palabra ½ < matrices > ® < vector > < estructura > ® < palabra* > < programa > ® < estructura > < sistema > ® < programa > |
BASE
SOFTWARE: Programas de computadoras, estructuras de datos y su documentación que sirven para ser efectivo el método lógico, procedimiento o control requerido.
- HARDWARE: Dispositivos electrónicos que proporcionan capacidad de cálculo y dispositivos electromagnéticos. Que proporcionan una función externa.
- PERSONAS: Usuarios y operadores del hardware y software.
- BASE DE DATOS: Una gran colección de información organizada a la que se accede por medio del software.
- DOCUMENTACIÓN: Manuales, formularios y otra información descriptiva que retrata el empleo y/o operación del sistema.
Modelo del sistema de programación
El modelo del sistema de programación en Ada se detalla en las siguientes partes en la estructura funcional (algoritmos en Ada, estructura informática (estructura de datos en lenguaje Ada) y los componentes orientados y explicados del hardware, software, usuarios, personal y el mercado del sistema de programación enunciado, con sus respectivas características.
Algoritmos: Estructura externa o funcional o algorítmica.
Ejemplo: Se ingresan dos números enteros, obtener su suma.
ANÁLISIS ¿Qué ingresa? Dos números enteros ¿Qué sale? Otro número entero ¿Qué vincula la entrada con la salida? La operación suma | PSEUDOCÓDIGO
Leo A (entero) Leo B (entero) Obtengo C como suma de A y B Imprimo C Fin |
DIAGRAMA N¾ S Inicio Leo A Leo B C ¬ A + B Imprimo C Fin | CÓDIGO EN ADA95 Package Body Sumas is A, B, C : Integer; begin {* Comienzo del programa *} put('Ingrese el primer valor '); get(A); put('Ingrese el segundo valor '); get(B); C := A + B; put ('El resultado es = ', C:6); end Sumas. {* Fin del programa *} |
Procedimiento: Estructura interna o en forma de procedimiento.
La estructura formal de un programa Ada viene dado por:
- Un programa es un conjunto de compilaciones. El concepto de compilación no está especificado por el lenguaje Ada, pero suele ser un fichero fuente.
- Una compilación es una secuencia de unidades de compilación. Por ejemplo, una compilación con seis unidades de compilación puede ser un fichero con cuatro procedimientos y dos paquetes. El número de unidades de compilación en una compilación puede estar limitado por la implementación. Por ejemplo, el compilador GNAT únicamente permite sólo una unidad de compilación por cada compilación.
- Una unidad de compilación puede ser bien una subunidad —luego hablaremos de ella— o bien una unidad de biblioteca. (Ver Apéndice A figura 5).
- Una unidad de biblioteca es la declaración o cuerpo de un procedimiento o de un paquete. (Ver Apéndice A figura 6)).
¿Cuál es la diferencia entre una biblioteca Ada y, por ejemplo, una biblioteca C? Los compiladores de otros lenguajes distintos a Ada simplemente toman código fuente y producen código objeto. En la compilación de un procedimiento en C se puede utilizar una biblioteca, por ejemplo la biblioteca de matemáticas: (Ver Apéndice A figura 4))
gcc Mi_Proc.c -o Mi_Proc.o -lm
En este caso, Mi_Proc.c usa dicha biblioteca, pero, tras la compilación, Mi_Proc.o no se incorpora a la misma. Tal y como indica la Fig. 2, los compiladores de Ada, en contraste, toman el fuente y la biblioteca y producen código objeto y una biblioteca actualizada con dicho código objeto. La biblioteca Ada "recuerda" las compilaciones que se realizan en el sistema y lo hace de la siguiente forma: Como ahora veremos, un programa Ada está compuesto por unidades de biblioteca. Cuando una unidad de biblioteca es compilada con éxito, pasa a incorporarse a la biblioteca Ada.
El concepto de incorporación no está definido por el lenguaje Ada, de modo que toma diferentes matices en una y otra implementación del lenguaje. Por ejemplo, en la implementación de Ada de GNU, denominada GNAT, la biblioteca se implementa sobre un sistema de ficheros.
La compilación de un fichero que contiene un procedimiento ADA produce un fichero objeto y una colección de ficheros de enlace al resto de la biblioteca, todos ellos en el mismo directorio. El compilador puede tener ahora dos vistas diferentes de la biblioteca Ada, una con el procedimiento incorporado y otra sin ella.
Dependencia
Lenguajes como Basic no permiten programar sistemas grandes porque no contemplan la compilación de módulos por separado. En contraste, lenguajes como Ada y C tienen compilación separada. Esto significa que el programa principal y una subrutina pueden escribirse por separado, en ficheros fuente diferentes. La ventaja de la compilación separada es el desarrollo modular. La compilación de C, además de separada, es independiente.
Ada, en contraste, proporciona a la vez una compilación separada y dependiente.
Cuando una unidad ha sido compilada con éxito, diremos que se ha incorporado a la biblioteca del lenguaje.
Unidades hijas
Un programa se contruye a partir de unidades de biblioteca.
Como puede apreciarse en ella, el padre de todos los nodos de esta jerarquía es el paquete Standard. A sus hijos se les denomina unidades de biblioteca raíz. Una unidad de biblioteca raíz, junto con sus descendientes forman un subsistema. Antes de realizar ninguna compilación, la biblioteca Ada consiste en la denominada biblioteca predefinida.
Subunidades
La mayoría de las unidades de la biblioteca Ada son especificaciones y cuerpos de paquetes. A estos últimos nos referimos ahora. En la implementación de un paquete pueden aparecer, de nuevo, elementos como procedimientos, objetos protegidos, tareas o paquetes, todos ellos con su respectiva especificación en su caso y, siempre, el cuerpo. Pues bien, el cuerpo de cualquiera de estos elementos puede ser extraído de la unidad de compilación y compilado como una unidad de compilación separada. A esta unidad segregada se le llama subunidad. Sólo un paquete puede tener subunidades.
MEDIO EXTERIOR:
Ejemplo
El Medio exterior que influyo en el proyecto para la creación de Ada 95 fue el Estado del Gobierno de EEUU, este insto a la creación de este lenguaje de programación porque tenia la necesidad de concretar un nuevo sistema de defensa moderno e inviolable.
Para esto en el mercado una empresa se encargo de desarrollar este nuevo sistema.
Competidores: La empresa encargada para desarrollar este nuevo sistema tuvo que decidirse entre el lenguaje Ada y el C++. Decidiéndose al final por Ada, la causa de esto se puede observar en la tabla 2 y 3 del Apéndice B.
Estructura funcional (algoritmos)
Estructuras de control | ||||
Repetitivas | selectivas | |||
loop <…> end loop ; | while <BOOLEAN expression>
loop <…> end loop ; | for <loop index> in <range> loop <…> end loop ; | if <condition>
then <…> end if ; | case <selector>
is <…> end case ; |
1 Declaración
Hay dos clases de declaraciones:
- Implícitas. Se supone que ocurren en un lugar del texto como consecuencia de las semánticas de otra construcción, como por ejemplo una cláusula de contexto.
- Explícitas. Apararecen en el texto del programa, como la variable i del ejemplo anterior. Sintácticamente son declarative_item’s. Toman dos formas:
- Las denominadas declaraciones básicas como las declaraciones de tipo, de variables (objetos), excepciones o las especificaciones de procedimientos y paquetes. Sintácticamente basic_declaration_item.
- Los cuerpos de los procedimientos y de los paquetes. Sintácticamente body.
Ámbito de una declaración
1.1 Vista de una entidad
Todas las declaraciones contienen una definición de vista de una entidad. Una vista consiste en:
- Un identificador de la entidad
- Características específicas de la vista que afectan al uso de la entidad a través de esa vista
1.2 Parte declarativa
Una secuencia de declaraciones forma una parte declarativa. Su sintaxis es la que sigue:
declarative_part ::= {declarative_item}
Cinco construcciones del lenguaje Ada tienen asociada una parte declarativa:
- Cuerpo de un subprograma (subprogram_body)
- Cuerpo de un paquete (package_body)
- Cuerpo de una tarea (task_body)
- Cuerpo de una entrada de un objeto protegido (entry_body)
- Bloque (block_statement)
Reglas de visibilidad : I : Integer := I; –Ilegal
Declare I, K : Integer; begin … declare I : Integer; begin … — Aquí no es visible — el objeto I externo end; … end; | procedure Q is I : Integer := 0; … procedure R is K : Integer := I; I : Integer := 0; J : Integer := Q.I; begin … end R; … begin … end Q; |
PROGRAMACIÓN DE SISTEMAS GRANDES
Los sistemas empotrados suelen ser grandes y complejos( bien un sistema de guía de misiles, un automóvil o una central nuclear ), formados por subsistemas relacionados, pero relativamente independientes.
Algunos lenguajes ignoran el hecho de que los programas se construyen por partes, cada una de ellas compilada por separado y todas ellas enlazadas en una aplicación final. El resultado se convierte en aplicaciones monolíticas difíciles de mantener. Otros lenguajes, en contraste, parten del concepto de módulo y proporcionan mecanismos de encapsulamiento y abstracción que ayudan a programar sistemas grandes, ya que el trabajo del equipo de programación y posterior mantenimiento del sistema se ve facilitado. Uno de estos lenguajes es Ada 95.
Está fuertemente fundamentado en la disciplina de la Ingeniería del Software por lo que es el lenguaje más apropiado en la programación de sistemas empotrados industriales grandes.
Aspectos de Ada dirigidos a la programación de estos sistemas:
2 Tipos abstractos de datos
Su implementación es de nuevo desconocida para el programador, esta vez no porque desconozca la arquitectura del computador subyacente, sino porque es encapsulado en un módulo que no permite el acceso directo a los detalles de su implementación. En su lugar, se proporciona al programador operaciones sobre el tipo que son invocaciones a entradas del módulo que lo encapsula. En esta sección estudiamos cómo Ada proporciona al programador tipos abstractos de datos.
2.1 Paquetes
Un paquete permite agrupar declaraciones y subprogramas relacionados. Por ejemplo, consideremos un procedimiento y una función sencillos:
procedure Double(Number : in Integer; Answer : out Integer);
function Twice(Number : in Integer) return Integer;
Podríamos bien compilarlos individualmente o bien insertarlos en un paquete y compilar este. En este último caso, esta sería la especificación del paquete, que contiene la interface al mismo y al que hemos llamado Simple_Math:
package Simple_Math is
procedure Double(Number : in Integer; Answer : out Integer);
function Twice(Number : in Integer) return Integer;
end Simple_Math;
El cuerpo del paquete debe contener la implementación de todos los procedimientos y funciones declarados en la especificación del paquete:
2.2 Tipos privados
El buffer puede ser una estructura de datos con tres campos. Un vector de caracteres Data suficientemente grande, el puntero Finish que marca la posición donde acaba la cadena y el puntero Start que marca la posición del ítem que puede ser retirado por el consumidor. En Ada, el buffer puede ser:
type Buffer is
record
Data : String(1..80);
Start : Integer;
Finish : Integer;
end record;
3.- Subprogramas y funciones
3.1.- Tipos de parámetros
Se distinguen tres tipos de parámetros:
Entrada: in será un parámetro por referencia Salida: out el procedimiento devolverá información Entrada/Salida: in out parámetro por variable, pasaremos y sacaremos información
3.1.2.- Procedimientos
En los procedimientos podemos utilizar los tres tipos de parámetros anteriores. Su definición será la siguiente:
procedure Nombre(X, Y, …: in|out| in out tipo; ….); — Definición
procedure Nombre(X, Y, …: in|out| in out tipo; ….) is — Declaración — declaración de variables locales
begin
Sentencias;
end Nombre;
3.1.3.- Funciones
Las funciones devuelven un único valor y sólo se les puede introducir parámetros por referencia (in). Su declaración es:
function Nombre(X, Y, ..: tipo; …) return tipo;
Y su cuerpo es igual que el del procedimiento, cambiando la palabra procedure por function y añadiendo un return.
El uso de las funciones es especial cuando queremos declarar operadores, podemos crear toda una serie de operadores para nuestros tipos de datos. Ejemplo:
type Humano is (Varon, Hembra);
subtype Adulto is Humano;
subtype Ninno is Humano; — Un poco absurdo pero más comprensible para el ejemplo Definimos el operador suma: function "+"(Uno, Otro: Adulto) return Ninno;
Definamos ahora lo siguiente:
declare — Sentencia para declarar un bloque más interno
Persona1: Humano:= Varon;
Persona2: Humano:= Hembra;
Resultado: Ninno;
begin
Resultado:= Persona1 + Persona2;
end;
con lo cual en resultado tendríamos la respuesta.
3.2.- Excepciones
Una excepción es un "aviso" que se produce en tiempo de ejecución. Existen dos tipos básicos de excepciones:
a) Las controladas por el usuario
b) Las predefinidas por la implementación, como son las de error numérico, falta de memoria y similares. El programador tiene que saber dónde se pueden producir los errores, por ejemplo en una entrada de datos el usuario podría entrar un dato incorrecto. Para esto tenemos dos posibles formas de actuación:
a) Realizar un bucle de validación de datos
b) Preguntar al programa si se ha producido un error.
subtype NUMERO:is Intger range 1..10;
procedure EntradaDatos(N: out NUMERO) is
begin
GET(N);
exception when CONSTRAINT_ERROR =>
EntradaDatos(N);
end EntradaDatos;
Si el usuario introduce un número fuera de rango se producirá una excepción y nosotros reaccionaremos pidiéndole de nuevo la entrada.
3.3-Definición de tareas
El mecanismo de Ada a la hora de definir las tareas es el siguiente:
task TAREA is — especificación, donde se define el interfaz a otras tareas
end TAREA; task body TAREA is — cuerpo de la tarea
end TAREA;
Si la tarea no requiere un interface a otras tareas, la especificación queda:
task Tarea;
Cada tarea se convertirá en una thread de la tarea principal , en sistemas que nos son multithread (como Linux) se hace una simulación de threads.
4.- Planificación de tareas
Podemos asignar prioridades a nuestras tareas si la implementación del compilador de Ada nos los permite. Estas prioridades se especifican en un pragma. Su declaración es la siguiente:
task TAREA is
pragma PRIORITY(7);
end;
El nivel de prioridad será una expresión estática del tipo PRIORITY (subtipo de INTEGER), el rango de este subtipo dependerá de la implementación del compilador, podemos preguntarlo con PRIORITY?FIRST y PRIORITY?LAST, que dan la prioridad más baja y la más alta..
5.- Parada de tareas
Hay varias razones por las que las tareas se quedan detenidas como paradas en las colas de los puntos de entrada o terminación de una tarea dependiente. Otra razón es que se pare con la sentencia delay. Delay parará a la tarea que la llame al menos la duración en segundos que se le indique. Esta duración es del tipo coma fija DURATION, el mínimo valor será de unos 20 milisegundos (mirar DURATION?SMALL) y la máxima será de un día (86400 segundos), para duraciones mayores de un día se tendrá que meter a la instrucción delay en un bucle. Ejemplo:
Definimos las siguientes constantes:
SEGUNDOS: constant := 1.0;
MINUTOS: constant := 60.0;
HORAS: constant := 3600.0;
Para luego poder utilizar …
delay 14*HORAS+20*MINUTOS;
Para construcciones más complicadas en la que intervienen una fecha en concreto habrá que utilizar el paquete estándar CALENDAR que nos dará todo lo necesario para el manejo de fechas.
6.- Selección de citas
La sentencia select se utiliza para seleccionar entre las posibles citas que posee una tarea , esta sentencia se utiliza de la siguiente manera:
select
accept A(…) do
or – – los or pueden ser múltiples
accept B(…) do
end select;
De esta forma aceptamos simultáneamente llamadas a dos puntos de entrada. Para controlar más la selección de las citas pondremos condiciones de entrada a cada una.
7.- El tipo de tarea
Ada permite definir una tarea como si fuera un tipo de datos abstracto o como una clase, esto nos da una mayor flexibilidad de uso de las tareas y si tenemos varias tareas similares nos ahorramos definirlas varias veces. La forma de declararlo es:
task type TAREA is
entry ENTRADA(…);
end TAREA; task body TAREA is
…
end TAREA;
8.- Terminación de las tareas
|Las tareas llegarán a su fin cuando alcancen su end final, aunque existen otras formas para precipitar su muerte. La sentencia terminate nos sirve para matar a la tarea que la llama cuando ya no es necesaria.
La otra sentencia usada para la terminación "incondicional" de tareas es abort.
La sintaxis de la llamada abort es:
abort X, VECTORT(4), R.all; — El all indica matar a todas las tareas que dependan de R
Podremos siempre consultar el estado de una tarea por medio de dos atributos que son TAREA?TERMINATED que será cierta si terminó la tarea y TAREA?CALLABLE que será cierto a menos que la tarea se haya terminado o completado.
9 Reusabilidad
En la búsqueda de la reusabilidad del software se han dado dos pasos importantes. Uno es la programación orientada a objetos y el otro es el uso de unidades genéricas. La respuesta de los diseñadores de Ada a las unidades genéricas son los paquetes con parámetros genéricos o simplemente "genéricos". Un genérico es una plantilla que manipula tipos parámetro que después instancia el programador.
Estructura informática (estructura de datos)
- Una estructura de datos es una colección de datos que pueden ser caracterizados por su organización y las operaciones que se definen en ella.
Dentro de ellas encontramos distintos tipos, los tipos de datos más frecuentes en los diferentes lenguajes son:
1 Tipos y subtipos de datos
Un rasgo muy característico de Ada es su gran soporte para la definición de los tipos de datos. Los tipos de datos en Ada son:
Escalares | Lógicos | No escalares | Decimales |
Elementales | Otros def. por el usuario | Reales | Acceso (es decir punteros) |
Discretos | Enteros | Punto flotante | Acceso a objetos |
Enumerados | Enteros con signo | Punto fijo | Acceso a subprogramas |
Carácter | Enteros sin signo | Ordinarios | Compuestos |
Clase | Tarea | Registro | Otros def. por el usuario |
| Cadenas de caracteres | Protegido | Matrices (array) |
Para declarar estos tipos de datos nos valemos de las sentencias type y subtype:
1.1.- Atributos de los tipos
Los atributos son las características de forma de cada tipo de datos, dependiendo de su naturaleza tendremos distintos atributos. Supongamos que E es un subtipo escalar definido:
type E is range 1900..1999;
E?First nos devolverá el extremo inferior: 1900 E?Last nos dará el extremo superior: 1999 E?Range será la distancia entre los extremos: 99
.. y así hasta un total de 12 atributos predefinidos, en estos atributos encontraremos las funciones típicas a la hora de manejar cadenas de caracteres, caracteres sueltos y mucho más.
Si el tipo fuera no escalar tendríamos otros atributos diferentes que nos mostrarían la precisión y los valores máximos y mínimos representables. Si fuera un tipo puntero los atributos tendrían que ver con el tipo de acceso ( acceso a dirección o a contenido). Los atributos se definen como funciones en los paquetes estándar de los compiladores de Ada.
- 2. Operadores
= igualdad /= Inigualdad > mayor que >= mayor que o igual que < menor que <= menor o igual que | Los operadores lógicos and operacion logica y or operacion logica o xor or exclusiva de 2 valores not inversion del valor and then circuito corto y oper. or else circuito corto u oper. |
La mayoría de los ordenadores disponibles para el uso común, utiliza hoy una palabra de 32 dígitos binarios (Ada utiliza 32 bits), así que se espera que la mayoría de los ordenadores utilice un sistema de 32 dígitos binarios. Por esa razón, importa la talla de la palabra, 32 dígitos binarios serán asumidos y los resultados de la ejecución reflejarán esa talla.
Manipulación de registros de entrada y salida:
ADA proporciona al programador facilidades para elegir la forma en que se implementan sobre el hardware los tipos de datos. Estas facilidades se conocen como cláusulas de representación
Una vez que se define el tipo de la forma usual, su implementación por defecto puede modificarse incluyendo en el código estas cláusulas de representación
Existen tres tipos de cláusulas:
- Cláusula de definición de atributo. Permite establecer varios atributos de un objeto, tarea o subprograma. Por ejemplo, el tamaño en bits de los objetos, el alineamiento en memoria, el máximo número de octetos disponibles para una tarea o la dirección de un objeto.
- Cláusula de representación de enumeración. Especifica los valores internos de los literales de un tipo enumeración
- Cláusula de representación de estructura. Permite asignar, en términos de bits, el orden, el desplazamiento y el tamaño a los componentes de un una estructura dentro de unidades de almacenamiento como palabras o bytes. Los bits en el registro se numeran desde cero.
Ver Apéndice B tabla 1 Relaciones de Tamaño y Complejidad para seleccionar el hardware y Software
ADA soluciono el desorden de software que existió en los años 70. Transformándolo en un lenguaje bien previsto para el uso en sistemas en tiempo real embutidos, dando una solución al problema de la programación. UNIX presenta una implementación del POSIX/UNIX95 de algoritmos en ADA, lo cual provee de técnicas muy útiles para mejorar la organización jerárquica.
Ver Apéndice B tabla 1 Relaciones de Tamaño y Complejidad para seleccionar el hardware y Software
Este lenguaje se enfoca especialmente para dos grupos de programadores, de ésos con maestría en el FORTRAN, y de ésos con maestría en un lenguaje estructurado moderno tal como PASCAL, C, o C++, El primer grupo consiste probablemente en los programadores maduros, los que han estado en la industria por muchos años y con experiencia usando el FORTRAN. El segundo grupo consistiría en esos programadores que tienen experiencia con un lenguaje estructurado moderno, tal como PASCAL, C, y C++ y entender ya el concepto del tipo de los datos, y además con muchos años de experiencia. El leng. Ada es un agregado a la lista hace aproximadamente once años, debido a la talla y la complejidad es requisito indispensable todos los conocimientos mencionados.
Usuarios y mercado del sistema de programación
El Ada 95 es una actualización de la ISO al lenguaje de programación de Ada para incorporar el último conocimiento del desarrollo del software lógica en el lenguaje.
El lenguaje tiene un número razonable de compiladores capaces existentes para el uso en los ordenadores centrales, así como las minicomputadoras, e incluso los microordenadores.
Un compilador de Ada tiene un trabajo grande que hacer y se justifica su validación al mercado. Por lo tanto tres compañías han desarrollado los compiladores de Ada completamente validados que se ejecutan bajo MS-DOS y/o Windows en una PC. Aunque algunos de éstos se ejecutarán en una PC mínima, una PC relativamente de gran alcance se recomienda para el uso con cualquier compilador de Ada.
Los sistemas empotrados (sistemas industriales, computadores de misiles …), utilizan este lenguaje.
Un uso común de este, se da entre parcioneros industriales en los grandes proyectos, por ejemplo en la industria Aereoespacial. Cabe destacar que este lenguaje esta totalmente estandarizado.
Es un lenguaje moderno de propósito general. Por su misma naturaleza, el ADA es un lenguaje grande que es relativamente difícil de compilar porque hace muchos chequeos en tiempo de compilación, incorpora muchos de los principios modernos de la tecnología de dotación lógica.
Por ejemplo, el concepto de la información que oculta se diseña en el lenguaje, más bien que se pone en ejecución como técnica de programación. Diseñaron para desarrollar sistemas de software lógica grandes, y es aplicable en programas que poseen millones de líneas de código de fuente.
El ADA está especialmente bien satisfecho para el uso en un ambiente del equipo. Como su principal inconveniente presenta su gran extensión. Tiene la ventaja que se adaptan a los sistemas incrustados y operar concurrentemente gracias a su alto poder. Observando el Apéndice en la figura 5 queda claro, que Ada presenta el mejor promedio, ante todas las características que se deben tomar en cuenta, para el desarrollo de un sistema de programacion.
Libros:
Ravi Sethi: "Lenguajes de Programación: Conceptos y Contructores." Addison- Wesley Iberoamericana, U.S.A, 1992.
- Lewis, T.G. y Smith, M.Z.: Estructura de Datos. Paraninfo, Madrid, 1985.
- Terrance, W Pratt, Marvin V. Zelbwitz: "Lenguajes de Programación: Diseño e implementación", Prentice Hall, Hispanamericana,U.S.A.
Manuales:
- Para Ada83 ver: "Programación en Ada" de JPG Barnes, Ediciones Díaz de Santos S.A. Primera edición inglesa en Octubre de 1983.
- Este libro ha sido escrito por uno del equipo de creación del Ada
- Para Ada95 ver: "Annotated Ada Reference Manual"
- Documento ISO/IEC 8652:1995(E)
- Es el documento oficial de la versión del Ada 95, publicado en el 25 de Noviembre de 1994, en es se incluye tanto la descripción del lenguaje como la de las librerías estándares con anotaciones para el programador de Ada como para el constructor de compilador de Ada.
- Guidelines for choosing a computer language: support for the visionary organization, 2nd edition by patricia k. Lawlis,c.j. kemp systems, inc.
FIGURA 1 Evolución de Ada 95
FIGURA 3 Esquema general
- FIGURA 4 Biblioteca Ada frente a biblioteca C
(Para ver el gráfico faltante haga click en el menú superior "Bajar Trabajo")
FIGURA 5 Estructura de un programa Ada.
FIGURA 6 Unidades de Biblioteca
DECLARACION DE ENTIDADES INDICADORES DE CONTROL DE FD INDICADORES DE FLUJO DE DATOS
(<name>) – type declaration ——>* – guarded entry o-*-*-*->
:<name>: – object declaration T—–> – timed call on entry <-*-*-*-o
<<name>> – exception declaration C—–> – conditional call on entry <-*-*-*->
|<name>| – subprogram T—–>* – timed call on guarded entry
/<name>/ – task entry C—–>* – conditional call on guarded entry
|<name]>| – subprogram with parameters ——> – caller-callee (subprograms, tasks)
/<name]>/ – task entry with parameters
IMPORT DECLARACIONES EXPORT DECLARACIONES
——> <name> – package/subprogram reference ( ) – type
—–>> <name> – virtual package reference : : – object
< > – exception
| | – subprogram
/ / – task entry
PAQUETE, SUBPROGRAMA O CUERPO DE LA TAREA
gi – generic instantiation (not supported) —
1 – single entry / O
2 – selective wait /
3 – serial entries —
4 – entry family Notacion Grafica de Ada
FIGURA 7 BNF
Tamaño y Complejidad | Consideraciones de Hardware y Software |
Pequeño y no Complejo | HARDWARE |
Mediano y moderadamente complejo | HARDWARE
SOFTWARE:
|
Grande y muy complejo | HARDWARE
SOFTWARE:
|
Muy grande e inmensamente complejo ejemplo Sistemas empotrados (un sistema de guía de misiles, o una central nuclear ), | HARDWARE
SOFTWARE:
|
Tabla 1: Relaciones de Tamaño y Complejidad para seleccionar el hardware y Software
Proyecto de Software Tamaño y Complejidad | Consideraciones del proceso de desarrollo |
Pequeño y no Complejo | • comprar un producto comercial existente. • Si no, se debe desarrollar uno para este. • Usar un lenguaje de 4ta o 5ta generación para este tipo de aplicaciónes. • Si no, utilizar un recurso existente o comprar un medio de desarrollo barato • Esperar que el software permanezca independiente y se convierta en obsoleto dentro de alguno año |
Mediano y moderadamente complejo | • Incluir proyectos pequeños que pueda crecer en grandes proyectos • Consultar planes de organizaciónes de negocio para asegurarse la compatibilidad de las decisiones de software. • Considerar COSTOS de los productos • Si no, usar practicas de ingenieria descriptas abajo para grandes sistemas. |
Grande y muy complejo | • Incluir proyectos medianos que pueda crecer en grandes proyectos • Considerar COSTOS de los productos satisfaciendo alguna de las partes que el sistema requiere • Usar buenas y solidas practicas de ingenieria • Consultar planes de organizaciónes de negocio • Elegir el lenguaje apropiado usando la Tabla 3 • Elegir el producto apropiado |
Muy grande e inmensamente complejo | • Incluir proyectos grandes que pueda crecer en muy grandes proyectos • Considerar COSTOS de los productos satisfaciendo alguna de las partes que el sistema requiere • Usar buenas y solidas practicas de ingenieria • Consultar planes de organizaciónes de negocio • Elegir el lenguaje apropiado usando la Tabla 3 • Elegir el producto apropiado • Control immense complexity from the outset • Considerar definir separaradamente subsistemas donde cada función es un sistema independiente |
TABLA 2: Relaciones de Tamaño y Complejidad para Desarrollar Procesos
| 4GL | 3 | G | L | 2GL | ||||
Características de los Lenguajes | o 5GL | A d a 9 5 | C | C + + | C O B O L | F O R T R A N | J a v a | S m a l l t a l k | A s s e m b l e r |
Claridad del código fuente | 5 | 9 | 5 | 6 | 7 | 5 | 8 | 9 | 1 |
Complejidad de manejo (arquitectura de soporte) | 2 | 9 | 5 | 6 | 2 | 4 | 7 | 6 | 2 |
Soporte de Concurrencia | 0 | 8 | 0 | 0 | 0 | 0 | 7 | 2 | 2 |
Soporte de sistemas Distribuidos | 0 | 5 | 0 | 0 | 0 | 0 | 7 | 0 | 0 |
Mantenimiento | 5 | 9 | 2 | 7 | 2 | 2 | 9 | 7 | 0 |
Soporte de lenguajes Mixtos | 0 | 8 | 5 | 7 | 0 | 5 | 5 | 3 | 0 |
Soporte de programación orientado a objetos | 0 | 10 | 0 | 10 | 0 | 0 | 10 | 10 | 0 |
Portabilidad | 1 | 8 | 5 | 7 | 3 | 3 | 9 | 3 | 1 |
Soporte de tiempo-Real | 0 | 7 | 7 | 7 | 0 | 5 | 0 | 0 | 5 |
Confianza | 3 | 9 | 1 | 5 | 3 | 1 | 8 | 3 | 0 |
Reusabilidad | 1 | 8 | 3 | 8 | 3 | 3 | 8 | 8 | 1 |
Seguridad | 0 | 6 | 0 | 3 | 0 | 0 | 4 | 0 | 0 |
Estandarización | 1 | 10 | 5 | 5 | 5 | 5 | 8 | 3 | 0 |
Soporte para métodos de ingeniería modernos | 3 | 9 | 1 | 7 | 1 | 1 | 9 | 7 | 0 |
Puntaje promedio de los lenguajes | 1,5 | 8,2 | 2,8 | 5,6 | 1,8 | 2,4 | 7,1 | 4,35 | 0,8 |
TABLA 3: Puntajes de SASEA Características de los Lenguajes
Trabajo enviado y realizado por: Esteban Tibaldi Elizabeth Ojeda Andrés D. Pasqua pandres[arroba]speedy.com.ar