sábado, 20 de noviembre de 2010

*Lenguaje GO

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: Martes m1 - m3

Hola a todos, aquí les dejó una pequeña entrada sobre el Lenguaje GO.

Go es un lenguaje de programación concurrente y compilado que está inspirado en la sintaxis utilizada en C, fué diseñado por Robert Griesemer, Rob Pike y Ken Thompson y ha sido desarrollado por Google.
GO es el lenguaje de programación de Google y entre sus más destacadas características se encuentra el hecho de ser de código abierto, a diferencia del lenguaje de Microsoft.

La compañía comenta que es un lenguaje experimental, que combina la potencia y los beneficios de seguridad asociados a lenguajes compilados del tipo de C++, con la velocidad de lenguajes dinámicos del estilo de Python. Resumiendo, Go es simple, rápido, seguro, concurrente, divertido y de código abierto.



El clásico ejemplo del programa Hola Mundo quedaría implementado en lenguaje GO de la siguiente manera:

package main


import "fmt"

func main() {
fmt.Printf(”Hello, world!”)
}





Bueno esto es todo de mi entrada, espero les sea útil.

Saludos :)

*Lenguaje OZ

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: martes m1 - m3

 Hola a todos, aquí les dejó una entrada sobre el Lenguaje OZ.


OZ fue originalmente desarrollado en el laboratorio de Programación de Sistemas en la Universidad de Saarland por Gert Smolka y sus estudiantes a comienzos de 1990.


Fue diseñado para hacer un avance moderno para las aplicaciones concurrentes , inteligentes , de redes , tiempo real , paralelismo , interactivas y reactivas .y para resolver aplicaciones complejas robusta y rápidamente.

Oz contiene una forma simple y bien hecha de la mayoría de los conceptos de los principales paradigmas de programación que son:



- Programación lógica
- Programación funcional
- Programación imperativa
- Programación orientada a objetos
- Programación concurrente
- Programación distribuida
- Programación con restricciones
 
Tipos de datos utilizados en el Lenuaje OZ :
 




 
Es un sistema de tipificación dinámico, el tipo de datos chunk es el que permite que los usuarios introduzcan nuevos tipos de datos abstractos y el FDint es un tipo de dominio finito que se utiliza en la programación con restricciones.
 
La concurrencia en OZ es muy eficiente y económico, la programación con hebras no es tan pesada.
 
Ventajas al utilizar el lenguaje OZ:
 
- Implementa un modelo de programación distribuido que hace a la red transparente.
- Hace fácil programar aplicaciones abiertas y tolerantes a fallos en el lenguaje.
- Introduce la idea de espacios de computación, los cuales permiten búsquedas definidas por el usuario y estrategias de distribución que son ortogonales al dominio de restricciones.
 
Oz tiene una semántica formal simple y una implementación eficiente, el Sistema de Programación Mozart.
 
 
 
Aquí les dejó un ejemplo que encontre de un programa en OZ que crea 100000 hebras en 7.5 segundos.
 

 
 
 
Bueno esto es todo sobre mi entrada, espero les sirva.
 
Saludos :)


*Programación Multiparadigma

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: martes m1 - m3


Hola a todos, en esta entrada les hablaré un poco acerca de la Programación Multiparadigma.


Se dice que un lenguaje de programación multiparadigma es el cual soporta más de un paradigma de programación con el objetivo de que un programador utilice el más conveniente a la hora de resolver un problema.


Ningún paradigma es capaz de resolver todos los problemas de forma sencilla y eficiente, por lo tanto es útil poder elegir entre distintos “estilos” de programación dependiendo del tipo de problema. También hay lenguajes que permiten mezclar los paradigmas que, en principio, parecerían irreconciliables. Se debe aclarar que hay subparadigmas que se incluyen en paradigmas más generales, pero hay otros que utilizan métodos de programación totalmente distintos entre sí e igualmente hay lenguajes que los combinan. Por ejemplo, el lenguaje Oz emplea programación lógica, funcional, orientada a objeto y otras.


El objetivo del diseño de estos lenguajes es permitir a los programadores utilizar el mejor paradigma para cada trabajo, sabiendo que ninguno resuelve todos los problemas de la forma más fácil y eficiente posible.
Los lenguajes como Delphi, C++ y Visual Basic combinan el paradigma imperativo, el procedural y el orientado a objetos.

El objetivo de un lenguaje multiparadigma es que los programadores puedan trabajar en una variedad de estilos, también que los programadores utilicen la mejor herramienta para un trabajo.



*Tipos de Paradigmas:

- Imperativo o por procedimientos: es considerado el más común y está representado, por ejemplo, por C o BASIC.



- Funcional: está representado por Scheme o Haskell. Este es un caso del paradigma declarativo.


- Lógico: está representado por Prolog. Este es otro caso del paradigma declarativo.


- Declarativo: por ejemplo la programación funcional, la programación lógica, o la combinación lógico-funcional.


- Orientado a objetos: está representado por Smalltalk, un lenguaje completamente orientado a objetos.




Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.



Probablemente el paradigma de programación que actualmente es el más usado a todos los niveles es la orientación a objeto. El nucleo central de este paradigma es la unión de datos y procesamiento en una entidad llamada "objeto", relacionable a su vez con otras entidades "objeto".



Tradicionalmente datos y procesamiento se han separado en areas diferente del diseño y la implementación de software. Esto provocó que grandes desarrollos tuvieran problemas de fiabilidad, mantenimiento, adaptación a los cambios y escalabilidad. Con la orientación a objetos y características como el encapsulado, polimorfismo o la herencia se permitió un avance significativo en el desarrollo de software a cualquier escala de producción.




Los diferentes tipos de paradigmas que hay son:


- En la nube

- Imperativo
- Lógico
- Funcional
- Declarativo
- Estructurado
- Dirigido por eventos
- Modular
- Orientado a aspectos
- Orientado a objetos
- Con restricciones
- A nivel funcional
 -A nivel de valores






Bueno esto es todo sobre mi entrada, espero les sea útil.

Saludos :)

viernes, 19 de noviembre de 2010

*Ejemplos en Java

Materia: Lenguajes de Programación
Hora: Martes m1 - m3

Hola a todos, aquí les dejó unos sencillos ejemplos implementados en Java :)

El primer programa te pide que insertes el número de alumnos que tienes, y a cada uno de ellos te pide que le des las 5 calificaciones de todo y ya con eso te da el promedio.





Y en el segundo programa te pide que insertes dos números para darte como resultado la suma, pero te lo pide en cuadros de dialogo.









Bueno esto es todo, espero les sea útil :)

Saludos :) 

jueves, 18 de noviembre de 2010

*Lenguaje Smalltalk

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: Jueves v1

Hola  a todos, en esta entrada les hablaré sobre el Lenguaje Smalltalk.

El lenguaje Smalltalk fué diseñado por Alan Kay y apareció en 1980, este lenguaje es un mundo virtual donde viven objetos que se comunican mediante el envío de mensajes.

Un sistema Smalltalk está compuesto por:
  • Máquina virtual
  • Imagen virtual que contiene todos los objetos del sistema
  • Lenguaje de programación
  • Biblioteca de Objetos reusables
  • Opcionalmente un entorno de desarrollo que funciona como un sistema en tiempo de ejecución
Los objetos Smalltalk presentan las siguientes características:

  • Tienen una memoria propia.
  • Poseen capacidad para comunicarse con otros objetos.
  • Poseen la capacidad de heredar características de objetos ancestros.
  • Tienen capacidad de procesamiento.

El lenguaje Smalltalk tiene las siguientes características:
  • Orientación a Objetos Pura
  • Tipado dinámico
  • Interacción entre objetos mediante envío de mensajes
  • Herencia simple y con raíz común
  • Reflexión computacional completa
  • Recolección de basura
  • Compilación en tiempo de ejecución o Interpretado (dependiendo de la distribución o del proveedor)
  • Múltiples Implementaciones

 
El lenguaje Smalltalk tiene 5 palabras reservadas:

- self
- super
- nil
- true
- false

* Ejemplos de Smalltalk :

En Smalltalk todo es un objeto, y a un objeto se le envían mensajes. Por ejemplo:


1 + 1


- Significa que al objeto "1" le enviamos el mensaje "+" con el colaborador externo, otro objeto, "1". Este ejemplo entonces resulta en el objeto "2".
Transcript show: '¡Hola, mundo!'


- En el típico Hola mundo, el objeto es Transcript, que recibe el mensaje show con el colaborador externo '¡Hola, Mundo!'.
- Para crear una instancia de un objeto, sólo hay que mandar un mensaje new a una clase:

Objeto new


- Para obtener las vocales de una cadena de texto:

'Esto es un texto' select: [:aCharacter aCharacter isVowel].


 
Bueno esto es todo sobre mi entrada Smalltalk, espero les sea útil.
 
 
Saludos :)

*Lenguaje Java

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: Jueves v1

Hola a todos, en esta entrada les hablaré un poco acerca del Lenguaje Java.

El lenguaje Java fue desarrollado por Sun Microsystems en los años 90, toma mucha sintaxis de C y C++, pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores como la manipulación directa de punteros o memoria.

- El lenguaje Java se creó con 5 objetivos principales:

1.Debería usar la metodología de la programación orientada a objetos.



2.Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.


3.Debería incluir por defecto soporte para trabajo en red.


4.Debería diseñarse para ejecutar código en sistemas remotos de forma segura.


5.Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.


La sintaxis de Java se deriva gran parte de C++, sólo que Java combina la sintaxis para programación genérica, estructurada y orientada a objetos. Ejemplo del programa "Hola Mundo" en Java:
 
// Hola.java

public class Hola {
          public static void main(String[] args) {
                    System.out.println("Hola, mundo!");
        }
}

La explicación de este ejemplo es la siguiente:

- Todo en Java está dentro de una clase, incluyendo programas autónomos. El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensión “.java”. Una clase (class) declarada pública (public) debe seguir este convenio. En el ejemplo anterior, la clase es Hola, por lo que el código fuente debe guardarse en el fichero “Hola.java”


- El compilador genera un archivo de clase (con extensión “.class”) por cada una de las clases definidas en el archivo fuente. Una clase anónima se trata como si su nombre fuera la concatenación del nombre de la clase que la encierra, el símbolo “$”, y un número entero.


- Los programas que se ejecutan de forma independiente y autónoma, deben contener el método ”main()”. La palabra reservada ”void” indica que el método main no devuelve nada. El método main debe aceptar un array de objetos tipo String. Por acuerdo se referencia como ”args”, aunque puede emplearse cualquier otro identificador.


- La palabra reservada ”static” indica que el método es un método de clase, asociado a la clase en vez de una instancias de la misma. El método main debe ser estático o ’’de clase’’.


- La palabra reservada public significa que un método puede ser llamado desde otras clases, o que la clase puede ser usada por clases fuera de la jerarquía de la propia clase. Otros tipos de acceso son ”private” o ”protected”.


- Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. 


* Applets

Los applet Java son programas incrustados en otras aplicaciones, normalmente una página Web que se muestra en un navegador.

gc.drawString("Hola, mundo!", 65, 95);





La sentencia import indica al compilador de Java que incluya las clases java.applet. Applet y java.awt. Graphics, para poder referenciarlas por sus nombres.

La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de ésta. La clase Applet permite a la aplicación mostrar y controlar el estado del applet. La clase Applet es un componente del AWT (Abstract Window Toolkit), que permite al applet mostrar una interfaz gráfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario.


La clase Hola sobrecarga el método paint (Graphics) heredado de la superclase contenedora (Applet), para acceder al código encargado de dibujar. El método paint( ) recibe un objeto Graphics que contiene el contexto gráfico para dibujar el applet. El método paint( ) llama al método drawString (String, int, int) del objeto.



* Servlets

Los servlets son componentes de la parte del servidor de Java, y son los encargados de generar respuestas a las peticiones recibidas por los clientes.
// Hola.java

import java.io.IOException;
import javax.servlet.*;
public class Hola extends GenericServlet
{
           public void service(ServletRequest request, ServletResponse response)
                   throws ServletException, IOException
           {
                     response.setContentType("text/html");
                     PrintWriter pw = response.getWriter();
                     pw.println("Hola, mundo!");
                     pw.close();
            }
}


Las sentencias import indican al compilador de Java la inclusión de todas las clases públicas e interfaces de los paquetes java.io y javax.servlet en la compilación.
 
La clase Hola extiende (extends), es heredera de la clase GenericServlet. Esta clase proporciona la interfaz para que el servidor le pase las peticiones al servlet y el mecanismo para controlar el ciclo de vida del servlet.


El método service() recibe un objeto de tipo ServletRequest que contiene la petición del cliente y un objeto de tipo ServletResponse, usado para generar la respuesta que se devuelve al cliente. El método service() puede lanzar (throws) excepciones de tipo ServletException e IOException si ocurre algún tipo de error.

El método getWriter() del objeto respuesta devuelve un objeto de tipo PrintWriter, usado como una tubería por la que viajarán los datos al cliente. El método println (String) escribe la cadena "Hola, mundo!" en la respuesta y finalmente se llama al método close() para cerrar la conexión, que hace que los datos escritos en la tubería o stream sean devueltos al cliente.

* Swing es la biblioteca para la interfaz gráfica de usuario avanzada de la plataforma Java SE. Y un ejemplo en donde quedaría implementada es el siguiente:
// Hola.java

import javax.swing.*;

public class Hola extends JFrame {
           Hola() {
                  setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                  add(new JLabel("Hola, mundo!"));
                  pack();
}

public static void main(String[] args) {
           new Hola().setVisible(true);
           }
}








Bueno esto es todo sobre mi entrada del Lenguaje Java, espero les sea útil.

Saludos :)

*Lenguaje C++

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: Jueves v1

Hola a todos, en está entrada les hablaré un poco sobre el Lenguaje C++.

El lenguaje C++, es un lenguaje diseñado por Bjarne Stroustrup en el año de 1983. El propósito de su creación fue extender el lenguaje C con mecanismos que permitan la manipulación de objetos.

Una particularidad del Lenguaje C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales.


 
Aquí les dejó un ejemplo del programa "Hola Mundo" :

# include // Este header permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(<<) y cin(>>)//


using namespace std;

int main()
{
            cout << "Hola mundo" << endl;
            return 0;
}
 
 
En éste ejemplo, al usar la directiva #include estamos diciéndole al compilador que busque determinadas cosas en un archivo que se llama iostream. Para evitar redefinir cosas ya hechas al ponerles igual nombre, se crearon los llamados espacios de nombres o namespace . En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la libreria estándar de C++, entre muchas otras cosas del objeto cout, que representa el flujo de salida estándar, y todo esto es exactamente lo que decimos al añadir la sentencia using namespace std.


En C++ la definición de funcines es similar a la de C, sólo que en C++ main no va a recoger argumentos, por lo que no tenemos que ponerselos, en C++ el símbolo << se le conoce como el operador de inserción y grosso modo que está enviando a cout lo que queremos mostrar en la pantalla para que lo imprima, éste operador se puede utilizar varias veces en la misma sentencia, de forma que gracias a esta característica podemos poner un carácter end1 al final que es equivalente al \n en C.

Para poder observar lo que imprime en la pantalla, especificamente en Windows, los  programadores tenemos que insertar la línea :

system("PAUSE"); // Este operador se incluye solamente en Windows// 

antes del 

return 0; 


Los tipos de datos que se utilizan en C++ son:

  • Caracteres: char (también es un entero), wchar_t
  • Enteros: short int, int, long int, long long int
  • Números en coma flotante: float, double, long double
  • Booleanos: bool
  • Vacío: void

El modificador unsigned se puede aplicar a enteros para obtener números sin signo, con lo que se consigue un rango mayor de números naturales.


 
Se decidió añadir el tipo de dato wchar_t, que permite el uso de caracteres UNICODE, a diferencia del tradicional char, que contempla simplemente al código de caracteres ASCII extendido. Por ejemplo:

- strcpy - wstrcpy

- std::string - std::wstring
- std::cout - std::wcout

 
La palabra clave void define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración, por lo tanto puede ser usada para destacar que una función no recibe parámetros, como en:


int funcion (void);

 
Aunque la tendencia actual es la de no colocar la palabra "void". Además se utiliza para determinar que una función no retorna un valor, como en:
 
void funcion (int parametro);

 
Cabe destacar que void no es un tipo. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo:

 
void t; //Está mal

 
Pero la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo:


void *memoria;

 
Los objetos en C++ son abstraídos mediante una clase, que consta de:


1.Métodos o funciones
2.Atributos o Variables Miembro

 
Un ejemplo de una clase sería:
class Punto

{
//por omisión los miembros son 'private' para que sólo se puedan modificar desde la propia clase.//
private:
            // Variable miembro privada
            int id;
protected:
           // Variables miembro protegidas
           int x;
           int y;
public:
           // Constructor
           Punto( );
          // Destructor
          ~Punto();
          // Funciones miembro o métodos
          int ObtenerX();
          int ObtenerY();
};


  
- Constructores: son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En su declaración no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Un ejemplo de constructor sería:
 
class Punto

{
public:

// Coordenadas del punto

                float x;
                float y;

// Constructor

                Punto() : x ( 0 ), y ( 0 ) // Inicializamos las variables "x" e "y"
                {}
};

// Main para demostrar el funcionamiento de la clase

# include // Esto nos permite utilizar "cout"

using namespace std;

int main()
{
          Punto MiPunto;                                         // creamos un elemento de la clase Punto llamado MiPunto
          cout << "Coordenada X: " << MiPunto.x << endl; // mostramos el valor acumulado en la variable x
          cout << "Coordenada Y: " << MiPunto.y << endl; // mostramos el valor acumulado en la variable y
          return 0;
}

Existen varios  tipos de constructores en C++ y son:

1.Constructor predeterminado. Es el constructor que no recibe ningún parámetro en la función. Si no se definiera ningún constructor, el sistema proporcionaría uno predeterminado. Es necesario para la construcción de estructuras y contenedores de la STL.


 
2.Constructor de copia. Es un constructor que recibe un objeto de la misma clase, y realiza una copia de los atributos del mismo. Al igual que el predeterminado, si no se define, el sistema proporciona uno.

 
3.Constructor de conversión. Este constructor, recibe como único parámetro, un objeto o variable de otro tipo distinto al suyo propio. Es decir, convierte un objeto de un tipo determinado a otro objeto del tipo que estamos generando.


- Destructores: son funciones miembro especiales llamadas automáticamente en la ejecución del programa, y por tanto no tienen por qué ser llamadas explícitamente por el programador. Sus principales objetivos son:


~ Liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecución al expirar éste.
~ Quitar los vínculos que pudiesen tener otros recursos u objetos con éste.

 

 
* Sobrecarga de Operadores
   Los Operadores que pueden ser sobrecargados son:

- Operadores Unarios
  • Operador * (de indirección)
  • Operador -> (de indirección)
  • Operador +
  • Operador -
  • Operador ++
  • Operador --
- Operadores Binarios
  • Operador ==
  • Operador +
  • Operador -
  • Operador *
  • Operador /
  • Operador %
  • Operador <<
  • Operador >>
  • Operador &
  • Operador ^
  • Operador
  • Operador []
  • Operador ()

- Operadores de Asignación
  • Operador =
  • Operador +=
  • Operador -=
  • Operador *=
  • Operador /=
  • Operador %=
  • Operador <<=
  • Operador >>=
  • Operador &=
  • Operador ^=
  • Operador |=

 Las clases basic_ostream y basic_stream, y los objetos cout y cin, proporcionan la entrada y salida estándar de datos (teclado/pantalla). Por ejemplo:
 
ostream& operator<<(ostream& fs,const Punto& punto)
{
return fs << punto.x << "," << punto.y;
}
//...

Punto p(4,5);
//...
cout << "Las coordenadas son: " << p << endl;
//...



fstreams: es el tipo de flujo para el manejo de ficheros, existen tres clases de ficheros:

~ ifstream - ficheros de lectura
~ ofstream - ficheros de escritura
~ fstream. - ficheros de lectura/escritura

La codificación de un fichero quedaría así:

* Si es un fichero de texto plano :

#include

#include
#include

using namespace std;

int main() {
        ifstream entrada;
       entrada.open("textoPlano.txt");
       string unString;
       while(entrada >> unString)
                cout << "Lei: " << unString << endl;
        return 0;
}






Bueno esto es todo sobre mi entrada de C++, espero les sea útil. Saludos :)

*Lenguaje Ada

Materia: Lenguajes de Programación - PUNTOS EXTRA
Hora: Martes m1 - m3

 
Hola a todos en está entrada les hablaré un poco acerca del Lenguaje Ada.

 
El lenguaje Ada es un Lenguaje que fué diseñado por el Departamento de Defensa de los Estados Unidos (DoD) en mayo de 1979, con un solo proposito: calidad del producto, es decir, la confianza que los usuarios van a poder depositar en el programa.

 
Es posible escribir cualquier programa en Ada, pero ha sido utilizado principalmente para desarrollar software de control, de tiempo real y de misión crítica. Ada es un lenguaje de programación imperativo (tradicional), orientado a objetos, concurrente y distribuido.

 
Su nombre se eligió en conmemoración a Lady Ada Augusta Byron, Condesa de Lovelace, hija de Lord Byron, considerado como el primer programador de la historia.

 
* Sus características principales son:

 
- Legibilidad

 
Su sintaxis fué inspirada en Pascal, es bastante legible, incluso para personas que no conozcan el lenguaje.
Debido a su uso para crear programas profesionales, los culales se leen muchas más veces de las que se escriben, la legibilidadd es mucho más importante que la rápidez de escritura. Además, Ada es un lenguage "case insensitive", es decir, sus identificadores y palabras claves son equivalentes sin importar el uso de mayúsculas y minúsculas.

 
- Tipado Fuerte

 
Asigna en cada objeto un conjunto de valores claramente definido, impidiendo la confusión entre conceptos lógicamente distintos. Esto hace que el compilador detecte más errores que en otros lenguajes.

 
- Construcción de grandes programas

 
Para crear programas mantenibles y transportables, de cualquier tamaño, se necesitan mecanismos de encapsulado para compilar por separado y para gestionar bibilotecas.

 
- Manejo de excepciones

 
Es necesario proporcionar medios para que, en un programa construido en capas y por partes, se limita las consecuencias de los errores presentados en cualquiera de sus partes ya que los programas no suelen ser totalmente correctos.

 
- Abstracción de datos

 
Se separan los detalles de la representación de los datos y las especificaciones de las operaciones lógicas sobre ellos para obtener mayor transportabilidad y mejor mantenimiento.

 
- Procesamiento paralelo

 
Se evita tener que añadir estos mecanismos por medio de llamadas al sistema operativo, consiguiendo mayor fiabilidad y transportabilidad.

 
- Unidades genéricas

 
Debido a que en muchos casos, parte de un programa es independiente del tipo de valores a manipular.
Para ello necesitamos un mecanismo que permita crear partes de un programa similares, a partir de una plantilla, es muy útil para crear bibliotecas.

 
La estructura básica de un programa en Ada es:

 

 
[Clausulas_de_Contexto]
procedure Identificador is
[Declaraciones]
begin
Sentencias_del_Programa
end Identificador;
Y un ejemplo común de la sintaxis de un lenguaje es el programa "Hola mundo":

 
with Ada.Text_IO;
procedure Hola_Mundo is
begin
Ada.Text_IO.Put_Line("¡Hola, mundo!");
end Hola_Mundo;

 
La cláusula with establece una dependencia con el paquete Ada.Text_IO y hace disponible toda la funcionalidad relacionada con la Entrada/Salida de textos. Después se define un procedimiento como programa principal. En Ada no tiene que tener un nombre especial, sino estar fuera de cualquier paquete. Al compilar se indica el programa principal.

 
* Sintaxis en Ada

 
- El alfabeto de Ada está compuesto por:
  • Letras mayúsculas: A, ..., Z y minúsculas: a, ..., z.
  • Dígitos: 0, ..., 9.

 
-Caracteres especiales.

 
En Ada 95 se admiten caracteres como 'Ñ', 'Ç' y vocales acentuadas, porque se permiten los 256 caracteres comprendidos en ISO Latin-1.

 
El alfabeto de minúsculas puede usarse en vez de o junto con el alfabeto de mayúsculas, pero se considera que los dos son idénticos (con la excepción de cadenas de caracteres y literales tipo carácter).

 

 

 
Las palabras reservadas de Ada son equivalentes tanto en mayúsculas como en minúsculas y son:

 
abort, abs, abstract, accept, access, aliased, all, and, array, at, begin, body, case, constant, declare, delay, delta, digits, do, else, elsif, end, entry, exception, exit, for, function, generic, goto, if, in, is, limited, loop, mod, new, not, null, of, or, others, out, package, pragma, private, procedure, protected, raise, range, record, rem, renames, requeue, return, reverse, select, separate, subtype, tagged, task, terminate, then, type, until, use, when, while, with y  xor.

 

 
Los Tipos de Datos en Ada se clasifican de la siguiente manera:

 

 
               Jerarquía de Tipos en Ada

 

 

 
- Los atributos son operaciones predefinidas que se pueden aplicar a tipos, objetos y otras entidades. Por ejemplo estos son algunos atributos aplicables a Tipos:

 

 
  • Last: Integer'Last es el máximo valor que puede tomar la variable de tipo Integer. También es el último valor de un tipo enumerado o del índice de un vector.

 
  • First: Integer'First es el mínimo valor que puede tomar la variable de tipo Integer. También es el primer valor de un tipo enumerado o del índice de un vector.

 
  • Range: Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de más de una dimensión, el valor Matriz'Range(1) indica el rango de la primera dimensión.
  • Succ: TColor'Succ(ROJO) indica el siguiente valor a ROJO que toma el tipo TColor, si no existe, se eleva la excepción Constraint_Error.

 
  • Pred: TDía'Pred(VIERNES) indica el anterior valor a VIERNES que toma el tipo TDía, si no existe, se eleva la excepción Constraint_Error.

 
  • Pos: El atributo Pos indica la posición ocupada por un determinado valor en un tipo enumeración. Por ejemplo: TColor'Pos(ROJO). La primera posición se considera 0.

 
  • Val: El atributo Val indica el valor que ocupa una determinada posición en un tipo enumeración. Por ejemplo: COLOR'Val(1).

 
  • Para identificar unívocamente un valor de un tipo enumeración se emplea TColor' (ROJO) y TIndicador'(ROJO) para distinguir el valor ROJO del tipo TColor o TIndicador.
- Algunos atributos aplicables a Objetos

 

 
  • Size: tamaño en bits de un objeto.

 
  • Valid: si tiene una representación válida para su tipo. Útil cuando se obtienen valores desde el «mundo exterior» mediante Unchecked_Conversion u otro mecanismo.

 
  • First, Last: aplicados a arrays dan el primer y el último índices del array.

 
  • Range: Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de más de una dimensión, el valor Matriz'Range(1) indica el rango de la primera dimensión
* Variables

 

 
- Una variable se introduce en el programa mediante una declaración, que se podría denotar así:

 
declaración_variable ::= identificador { , identificador } : tipo [ := expresión ] ;

 
Por ejemplo: V: Boolean := TRUE;

 
* Constantes

 
- Una constante es un objeto que se inicializa a un valor cuando se declara y posteriormente no puede cambiar, se declara igual que una variable, pero añadiendo la palabra reservada constant.

 
Ejemplo: PI: constant Float := 3.14159_26536;

 
Un tipo especial de constante es el número nombrado para el cual no es necesario especificar un tipo y que es equivalente a usar el literal correspondiente

 
* Sentencia IF

 
sentencia_selección ::=

 
if condición then secuencia_de_sentencias
[ { elsif condición then secuencia_de_sentencias } ]
[ else secuencia_de_sentencias ]
end if ;

 
                                                          flujo

 

 
* Sentencia Case

sentencia_selección_por_casos ::=

case expresión is
alternativa_caso { alternativa_caso }
end case ;
alternativa_caso ::=
when elección {
elección } => secuencia_de_sentencias
elección ::= expresión_simple
rango_discreto
others

                                                  flujo
 
* Sentencia Bucle

-LOOP 

sentencia_bucle_simple ::=

[ identificador_bucle : ] loop
secuencia_de_sentencias
end loop [ identificador_bucle ] ;

 

 
-FOR

sentencia_bucle_iterativo ::=

[ identificador_bucle : ] for parámetros_for loop
secuencia_de_sentencias
end loop [ identificador_bucle ] ;
parámetros_for ::= identificador in [ reverse ] rango_discreto

 
-WHILE

sentencia_bucle_iterativo ::=

[ identificador_bucle : ] while condición loop
secuencia_de_sentencias
end loop [ identificador_bucle ] ;

 
* Sentencia exit


 
Termina el bucle nombrado en la sentencia o, si no aparece, el bucle más próximo que la contiene. Su notación sintáctica es:

sentencia_exit ::= exit [ nombre_bucle ] [ when condición ] ;

 
* Sentencia return

 
Termina la ejecución del subprograma más próximo que la contiene, tanto en procedimientos como en funciones donde, además, se utiliza para devolver el resultado de dicha función. Su notación sintáctica es:

sentencia_return ::= return [ expresión ] ;

* Sentencia abort

 
Se utiliza sólo para tareas. Implica la terminación incondicional de las tareas que se especifiquen. Su notación sintáctica es: sentencia_abort ::= abort nombre_tarea { , nombre_tarea } ;

 
En el Lenguaje Ada los subprogramas se dividen en dos categorías:

- Procedimientos: son llamados como sentencias y no devuelven resultado.

- Funciones: son llamadas como componentes de expresiones y devuelven un resultado


 
Ahora hablaremos un poco más a fondo sobre ellos:

* Procedimientos

 
La llamada a un Procedimiento en Ada constituye por sí misma una sentencia. Su especificación se puede describir de la siguiente manera:

especificación_procedimiento ::=
procedure identificador
[ ( especificación_parámetro { ; especificación_parámetro } ) ]
especificación_parámetro ::= identificador { , identificador } : [ modo ] tipo
[ := expresión ]
modo ::= in
out
in out

 
Y el cuerpo del procedimiento sería:

cuerpo_procedimiento ::=
especificación_procedimiento is
[ parte_declarativa ]
begin
secuencia_de_sentencias
[ exception
manejador_de_excepción { manejador_de_excepción } ]
end [ identificador ]

 
- Los parámetros que se le pueden pasar a un procedimiento pueden ser de tres modos diferentes:

  • in: el parámetro formal es una constante y permite sólo la lectura del valor del parámetro real asociado.
  • in out: el parámetro formal es una variable y permite la lectura y modificación del valor del parámetro real asociado.
  • out: el parámetro formal es una variable y permite únicamente la modificación del valor del parámetro real asociado.
* Funciones

 
Una función es una forma de subprograma a la que se puede invocar como parte de una expresión. Su especificación se puede describir de la siguiente manera:

especificación_función ::=
function ( identificador
símbolo_operador )
[ ( especificación_parámetro { ; especificación parámetro } ) ]
return tipo
especificación_parámetro ::= identificador { , identificador } : [ in ] tipo
[ := expresión ]

 
La especificación de la función es necesaria para mostrar al exterior toda la información necesaria para poder invocarla. El cuerpo de la función sería:

cuerpo_función ::=
especificación_función is
[ parte_declarativa ]
begin
secuencia_de_sentencias
[ exception
manejador_de_excepción { manejador_de_excepción } ]
end [ identificador
símbolo_operador ] ;

 
Los parámetros formales de una función se comportan como constantes locales cuyos valores son proporcionados por los parámetros reales correspondientes.

 
La sentencia return se utiliza para indicar el valor devuelto por la llamada a la función y para devolver el control a la expresión que llamó a la función, el cuerpo de la función puede contener varias sentencias return y la ejecución de cualquiera de ellas terminará la función devolviendo el control a la sentencia que la había invocado.

Toda llamada a una función produce una nueva copia de cualquier objeto declarado dentro de ella, incluyendo los parámetros. Cuando la función finaliza, desaparecen sus objetos. Por lo tanto, es posible utilizar llamadas recursivas a una misma función.

 
Un parámetro formal de una función puede ser de cualquier tipo, incluyendo vectores o registros, pero debe declararse antes.

* Parámetros nombrados

 
Se puede alterar el orden de los parámetros en la llamada utilizando la notación nombrada, es decir, se especifica en la llamada el nombre del parámetro real seguido del símbolo => y después el parámetro formal.

 
* Parámetros por defecto

 
Se pueden establecer parámetros formales, tanto en procedimientos como en funciones, que tengan valores por defecto y, por tanto, se pueden observar en la llamada al subprograma.

Por ejemplo: procedure Prueba_Por_Defecto (A : in Integer := 0; B: in Integer := 0);

 
Se puede llamar de estas formas:

1- Prueba_Por_Defecto (5, 7); -- A = 5, B = 7
2- Prueba_Por_Defecto (5); -- A = 5, B = 0
3- Prueba_Por_Defecto; -- A = 0, B = 0
4- Prueba_Por_Defecto (B => 3); -- A = 0, B = 3
5- Prueba_Por_Defecto (1, B => 2); -- A = 1, B = 2

 
En la primera se utiliza una llamada "normal", la que es con notación posicional, en la segunda, se utiliza posicional y por defecto, la tercera utiliza todos los parámetros por defecto, en la cuarta nombrada y por defecto, y, por último, la quinta utiliza notación posicional y nombrada.

En el Lenguaje Ada se puede utilizar un identificador con más de un significado, y a esto es lo que se conoce como sobrecarga.


 
- Sobrecarga de literales de enumeración

  
Se pueden emplear identificadores iguales en distintos tipos enumeración.

 
- Sobrecarga de operadores


 
Se puede utilizar una función para definir una operación y sobrecargar cualquiera de los operadores ya establecidos excepto /= (que toma su valor a partir del operador =, pero que puede redefinirse si el valor de retorno no es de tipo Boolean).

 
Las reglas a cumplir a la hora de sobrecargar un operador son:

 
  • No cambiar la sintaxis.
  • No cambiar el número de parámetros de un operador (recuérdese que + y - pueden ser unarios o binarios).
  • La precedencia se mantiene.
 Una recomendación muy importante es no definir un operador para un nuevo tipo dándole un significado distinto al del operador predefinido, por ejemplo el símbolo de  + siempre va a representar conceptos relacionados con la adición; *, multiplicación; and, conjunción, etc.

 
- Sobrecarga de subprogramas

 
 Un subprograma sobrecargará un significado ya existente siempre que su especificación sea diferente, es decir, pueden existir dos subprogramas con el mismo identificador siempre que se distingan por el número o tipo de sus parámetros

Ada tiene cinco bibliotecas predefinidas independientes para operaciones de entrada/salida. Y son:

- Direct I/O: se usa para acceso directo a archivos que contienen unicamente elementos del mismo tipo.

- Sequential I/O: se usa para el acceso secuencial a archivos que unicamente contienen elementos de un tipo especificado.


- Storage I/O: nos permite almacenar un único elemento en un buffer de memoria.
- Stream I/O:  es el paquete de entrada/salida más flexible. Todos los atributos de E/S pueden sobreescribirse con subprogramas definidos por el usuario y es posible definir nuestros propios tipos de Stream I/O usando técnicas avanzadas de orientación a objetos.


- Text I/O:  es el tipo de entrada/salida más usada, en ella todos los datos del archivo se representan en formato de texto legible. 

* Biblioteca predefinida


Existen varios paquetes predefinidos para la entrada/salida en Ada:

- Paquete Ada.Direct_IO
- Paquete Ada.Sequential_IO
- Paquete Ada.Storage_IO
- Paquete Ada.Streams
                    - Paquete Ada.Streams.Stream_IO
- Paquete Ada.Text_IO, con sus paquetes genéricos anidados: Complex_IO, Decimal_IO, Enumeration_IO, Fixed_IO, Float_IO, Integer_IO y Modular_IO.
                     -Paquete Ada.Text_IO.Editing
- Paquete Ada.Float_Text_IO
- Paquete Ada.Integer_Text_IO













Bueno esto es todo sobre mi entrada acerda del Lenguaje Ada, espero les sea útil.

Saludos :)