Lenguaje De Programación
miércoles, 9 de julio de 2014
Introducción
Universidad Nacional Experimental Romulo Gallegos
NOVEDAD TECNOLOGIA Proyect Loon
Proyect
Loon recorrió el cielo de Agua Fría y llevó Internet a una escuela. Google se
prepara para lanzar sus globos a todo el mundo.
Google continúa avanzando con su
proyecto de globos con WiFi, Proyect Loon. El sistema de dirigibles capaces de
trazar una red inalámbrica llegó ayer a Brasil, donde conectó a Internet a una
escuela por primera vez.
Se trató de un vuelo de prueba
que, según la compañía, fue uno de los primeros realmente significativos.
Google está aprendiendo a superar distintos perfiles de temperatura y probando
la tecnología LTE por primera vez.
Long Term Evolution
LTE (Long Term Evolution) es un
estándar de la norma 3GPP. Definida
para unos como una evolución de la norma 3GPP UMTS (3G), para otros es un nuevo
concepto de arquitectura evolutiva (4G).
Módem de tecnología LTE (4G)
Lo novedoso de LTE es la interfaz radioeléctrica
basada en OFDMA para el
enlace descendente (DL) y SC-FDMA para el
enlace ascendente (UL). La modulación elegida por el estándar 3GPP hace que las
diferentes tecnologías de antenas (MIMO) tengan una mayor facilidad de
implementación.
Características
- Alta eficiencia espectral
- OFDM de enlace descendente robusto frente a las múltiples interferencias y de alta afinidad a las técnicas avanzadas como la programación de dominio frecuencial del canal dependiente y MIMO.
- DFTS-OFDM (single-Carrier FDMA) al enlace ascendente, bajo PAPR, ortogonalidad de usuario en el dominio de la frecuencia.
- Multi-antena de aplicación.
- Muy baja latencia con valores de 100 ms para el Control-Plane y 10 ms para el User-Plane.
- Separación del plano de usuario y el plano de control mediante interfaces abiertas.
- Ancho de banda adaptativo: 1.4, 3, 5, 10, 15 y 20 MHz
- Puede trabajar en muchas bandas frecuenciales diferentes.
- Arquitectura simple de protocolo.
- Compatibilidad con otras tecnologías de 3GPP.
- Interfuncionamiento con otros sistemas como CDMA2000.
- Red de frecuencia única OFDM.
- Velocidades de pico:
- Bajada: 326,5 Mbps para 4x4 antenas, 172,8 Mbps para 2x2 antenas.
- Subida: 86,5 Mbps
- Óptimo para desplazamientos hasta 15 km/h. Compatible hasta 500 km/h
- Más de 200 usuarios por celda. Celda de 5 MHz
- Celdas de 100 a 500 km con pequeñas degradaciones cada 30 km. Tamaño óptimo de las celdas 5 km. El Handover entre tecnologías 2G (GSM - GPRS - EDGE), 3G (UMTS - W-CDMA - HSPA) y LTE son transparentes. LTE nada más soporta hard-handover.
- La 2G y 3G están basadas en técnicas de Conmutación de Circuito (CS) para la voz mientras que LTE propone la técnica de Conmutación por paquetes IP (PS) al igual que 3G (excluyendo las comunicaciones de voz).
- Las operadoras UMTS pueden usar más espectro, hasta 20 MHz
- Mejora y flexibilidad del uso del espectro (FDD y TDD) haciendo una gestión más eficiente del mismo, lo que incluiría servicios unicast y broadcast. Reducción en TCO (coste de análisis e implementación) y alta fidelidad para redes de Banda Ancha
Actualidad
Se han previsto las bandas de
700 MHz para América del Norte, 900, 1800 y 2600 MHz para Europa, 1800 y 2600
MHz para Asia y 1800 MHz para Australia. En septiembre del 2010, los operadores
CenterNet y Mobyland, de Polonia, anunciaron la puesta en marcha de la primera
red LTE comercial con 20 MHz de espectro en la banda de 1800 MHz.
Según el Sector de Normalización
de las Telecomunicaciones (UIT), LTE es una 3.9G en el estándar 3GGP porque no llega a los
objetivos de la cuarta generación (4G). Por eso, el sucesor previsto para implantar la cuarta
generación es LTE Advanced
Venezuela -
La Operadora Digitel Cuenta con Zonas 4G/LTE en la Región Gran Caracas,
Maracay, Región Centro, Región Centro Occidente, Región Occidente.
A partir del 5 de septiembre de 2013 la red 4G/LTE de Digitel se encuentra
disponible comercialmente.
“Obrigado a nuestros amigos en
Agua Fría, Brasil, por ayudarnos con la última prueba de Project Loon! Nuestro
objetivo era tratar de conectar probadores usando LTE, por primera vez, y nos
entregó con éxito en Internet a la escuela a tiempo para su lección de
geografía”, anunció Proyect Loon en Google +.
Los globos de Google se están
preparando. Comenzaron a funcionar en mayo del año pasado, cuando Google llevó
conexión Wifi a distintas zonas “emergentes” a través de 20 globos. El
proyecto, según explicó la compañía, es sin fines de lucro (ver también: Google
lleva WiFi hasta los últimos rincones de Asia y África).
Sin embargo, este año los globos
comenzaron a recorrer el mundo. El mes pasado, uno de ellos dio una vuelta
alrededor del mundo en 22 días, y recorrió 500.000 kilómetros. Proyect Loon
buscaría llenar la estratósfera de globos para el año que viene. Mientras
tanto, Brasil fue el primer país de la región en lograr conectarse a Internet
de forma gratuita gracias al proyecto.
“Como el invierno comienza en el
hemisferio sur, muchos brasileños están enviando globos de papel hacia el cielo
en la celebración de la Festa Junina, un festival que celebra el solsticio de
invierno. Proyecto Loon tuvo el honor de participar en las festividades de este
año con nuestro propio lanzamiento de globos en las afueras rurales de Campo
Maior, donde conectamos Linoca Gayoso, una escuela local, a la Internet por
primera vez”, agregó Google.
“Con el equipo del Proyecto Loon
en la ciudad y uno de nuestros globos de arriba, los estudiantes en clase de
geografía de Tiao fueron capaces de acceder a Internet desde su salón de
clases, por primera vez, y pudieron aprender acerca de las distintas culturas
del mundo”
Universidad Nacional Experimental Romulo Gallegos
ELEMENTOS SINTÁCTICOS DE UN LENGUAJE DE PROGRAMACIÓN
ELEMENTOS SINTÁCTICOS DE
UN LENGUAJE DE PROGRAMACIÓN
Conjunto de Caracteres
Conjunto de Caracteres
Es la primera etapa en el diseño de la sintaxis de un lenguaje
Casi todos tienen el mismo conjunto de letras y dígitos
La diferencia está en los caracteres especiales
Incide en la determinación del tipo de equipo para la E/S
Identificadores
Sintaxis básica: string de letra y/o dígito comenzando con letra
Se introducen caracteres especiales que facilitan la lectura
Operadores
La mayoría de los lenguajes tiene un conjunto estándar de operadores:
aritméticos
relacionales
lógicos
Palabras Claves y Reservadas
Palabra clave: identificador usado como parte fija de la sintaxis de una sentencia
Palabra reservada: palabra clave que no puede ser usada como identificador
El análisis sintáctico se facilita usando palabras reservadas
Generalmente una sentencia comienza con palabras claves designando el tipo de sentencia.
Comentarios y Palabras Opcionales
La mayoría de los lenguajes permite incluir comentarios en los programas
Los comentarios no son considerados durante la compilación.
Espacios en Blanco
Varía su inclusión entre un lenguaje y otro
Delimitadores
Es un elemento sintáctico para marcar el comienzo y/o el fin de una unidad sintáctica
Ejemplo BEGIN
....
END
Las características son:
realza la lectura
simplifica el análisis sintáctico
elimina ambigüedades
delimita explícitamente frontera o cota de una construcción sintáctica.
Formato Libre y Fijo
Una sintaxis es libre si las sentencias del programa se pueden escribir en cualquier parte de una línea sin observar la posición o salto de línea. Ejemplo Pascal
Una sintaxis es fija si utiliza la posición en la línea para proporcionar información. Ejemplo estrictamente fija, máquina; parcialmente fija, Fortran
Expresiones
Son unidades sintácticas básicas con las cuales se construyen sentencias.
Hay distintas formas para escribir una expresión: infija, prefija, postfija (inorden, preorden, postorden).
Sentencias
Son las componentes sintácticas más importantes de los lenguajes de programación. Algunos tienen formato básico de sentencia. Existen diferentes sintaxis para cada tipo diferente de sentencia.
En general existen sentencias simples
y estructuradas.
Estructura de Programa y Subprograma
La organización sintáctica de un programa y la definición de subprograma es variada.
Definición variada de subprograma
- cada definición de subprograma es tratada como una unidad sintáctica separada
- Las principales estructuras de los programas son: bloques, subprogramas
- El bloque se ejecuta cuando la secuencia de ejecución llega. El procedimiento es llamado explícitamente.
En Fortran cada subprograma es compilado separadamente y los programas son "linkeados" en tiempo de carga.
En APL los subprogramas son compilados separadamente y son "linkeados" sólo cuando uno llama a otro durante la ejecución.
Definición de subprogramas anidados
Un ejemplo se da en ALGOL que muestra
la estructura de programas anidados en que la definición del subprograma
aparece como declaración en el programa principal. A su vez, el mismo
subprograma puede contener otra definición anidada.
Descripción separada de datos y sentencias ejecutables
Un representante es el COBOL. Las declaraciones de datos y sentencias ejecutables para los subprogramas (párrafos), se encuentran en la DATA DIVISION y en la PROCEDURE DIVISION, respectivamente. La ENVIRONMENT DIVISION consiste de las declaraciones de operación y ambiente externo, equipo, archivos, memoria, etc... Todos los datos son globales a los subprogramas. Una ventaja es que cambios en la estructura de datos se hacen sin tocar los subprogramas.
Descripción separada de datos y sentencias ejecutables
Un representante es el COBOL. Las declaraciones de datos y sentencias ejecutables para los subprogramas (párrafos), se encuentran en la DATA DIVISION y en la PROCEDURE DIVISION, respectivamente. La ENVIRONMENT DIVISION consiste de las declaraciones de operación y ambiente externo, equipo, archivos, memoria, etc... Todos los datos son globales a los subprogramas. Una ventaja es que cambios en la estructura de datos se hacen sin tocar los subprogramas.
Definición de subprogramas no
separados
No hay diferencia sintáctica entre las sentencias del programa y las del subprograma. Un ejemplo SNOBOL: independiente del número de subprogramas que contenga el programa, es una lista de sentencias. El punto donde un subprograma comienza y termina no se distingue. Los programadores introducen una separación artificial insertando comentarios. Otro ejemplo BASIC.
Universidad Nacional Experimental Romulo Gallegos
martes, 8 de julio de 2014
Programación Funcional
La programación funcional
es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos
mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el
estilo de programación imperativa, que enfatiza los
cambios de estado. La programación funcional tiene sus raíces en el cálculo
lambda, un sistema formal desarrollado en los años 1930 para
investigar la definición de función, la aplicación de las funciones y la
recursión. Muchos lenguajes de programación funcionales pueden ser vistos como
elaboraciones del cálculo lambda.
En la práctica, la diferencia
entre una función matemática y la noción de una "función" utilizada
en la programación imperativa es que las funciones imperativas pueden tener
efectos secundarios, al cambiar el valor de cálculos realizados previamente.
Por esta razón carecen de transparencia referencial, es decir, la misma
expresión sintáctica puede resultar en valores diferentes en diferentes
momentos dependiendo del estado del programa siendo ejecutado. Con código
funcional, en contraste, el valor generado por una función depende
exclusivamente de los argumentos alimentados a la función. Al eliminar los
efectos secundarios se puede entender y predecir el comportamiento de un
programa mucho más fácilmente, y esta es una de las principales motivaciones
para utilizar la programación funcional.
Los lenguajes de programación
funcional, especialmente los que son puramente funcionales, han sido
enfatizados en el ambiente académico principalmente y no tanto en el desarrollo
de software comercial. Sin embargo, lenguajes de programación importantes tales
como Scheme,
Erlang,
Rust, Objective
Caml y Haskell,
han sido utilizados en aplicaciones comerciales e industriales por muchas
organizaciones. La programación funcional también es utilizada en la industria
a través de lenguajes de dominio específico como R (estadística), Mathematica
(matemáticas simbólicas), J y K (análisis financiero), F# en Microsoft.NET y
XSLT (XML). Lenguajes de uso específico usados comúnmente como SQL y Lex/Yacc,
utilizan algunos elementos de programación funcional, especialmente al procesar
valores mutables. Las hojas de cálculo también pueden ser consideradas
lenguajes de programación funcional.
La programación funcional
también puede ser desarrollada en lenguajes que no están diseñados
específicamente para la programación funcional. En el caso de Perl, por ejemplo, que es
un lenguaje de programación imperativo, existe un libro que describe como
aplicar conceptos de programación funcional. JavaScript,
uno de los lenguajes más ampliamente utilizados en la actualidad, también
incorpora capacidades de programación funcional. Python también
incorpora particularidades de los lenguajes funcionales como listas de
comprensión y funciones de tratamiento de listas como matemática de conjuntos.
Funciones de orden superior
Funciones de orden superior son funciones que pueden
tomar otras funciones como argumentos o devolverlos como resultados. En cálculo,
un ejemplo de una función de orden superior es el operador diferencial d / dx ,
que devuelve la derivada de una función f .
Las funciones de orden superior están estrechamente
relacionadas con las funciones de primera clase en las cuales las funciones de
orden superior y las funciones de primera clase
pueden recibir como argumentos y resultados otras funciones. La distinción
entre los dos es sutil: "de orden superior", describe un concepto
matemático de funciones que operan sobre otras funciones, mientras que la
"primera clase" es un término informático que describe las entidades
del lenguaje de programación que no tienen ninguna restricción de su
utilización (por lo tanto funciones de primera clase pueden aparecer en cualquier
parte del programa que otras entidades de primer nivel como los números pueden,
incluidos como argumentos a otras funciones y como sus valores de retorno).
Las funciones de orden superior permiten la aplicación
parcial, una técnica en la que se aplica una función a sus argumentos uno a la
vez, con cada aplicación devolver una nueva función que acepta el siguiente
argumento. Esto le permite a uno expresar, por ejemplo, la función sucesor como
el operador de suma aplicada parcialmente al número natural uno.
Recursividad
Iterar en los lenguajes funcionales es normalmente
llevado a cabo mediante recursividad. Las funciones recursivas se invocan a sí
mismas, permitiendo que una operación se realice una y otra vez hasta alcanzar
el caso base. Aunque algunas recursividades requieren el mantenimiento de una
pila, la recursividad mediante una cola puede ser reconocida y optimizada
mediante un compilador dentro del mismo código utilizado, para implementar las
iteraciones en un lenguaje imperativo. El estándar del esquema del lenguaje
requiere implementaciones para conocer y optimizar la recursividad mediante una
cola. La optimización de la recursividad mediante una cola puede ser
implementada transformando el programa a un estilo de pase de continuidad
durante la compilación, entre otros enfoques.
Los patrones comunes de recursividad puede ser
factorizados usando funciones comunes más grandes, con “catamorfismos” y
“anamorfismos” (pliegues y despliegues), siendo estos los ejemplos más
evidentes. Tal y como las mayores funciones más comunes tienen un rol análogo
para construir estructuras de control se tienen los iteradores en los lenguajes
imperativos.
La mayoría de los lenguajes de programación funcional
de propósito general permiten la recursividad sin restricciones y superan el
test de Turing, lo que hace que el programa que se interrumpe no pueda tomar un
decisión, lo que puede causar una falta de solidez en el razonamiento
ecuacional y generalmente requiere introducir inconsistencia dentro de la
lógica expresada por los tipos del sistema del lenguaje. Algunos lenguajes de
propósito especial como Coq permiten tan sólo recursividad bien fundamentada y
tienen una normalización fuerte(cálculos no finalizados pueden ser expresados
tan sólo con flujos de valores infinitos llamados codata) En consecuencia,
estos lenguajes fallan el test de Turing y declarar funciones ciertas en ellos
es imposible, pero pueden declarar una amplia clase de cálculos interesantes
mientras evitan los problemas producidos por la recursividad sin restricciones.
La programación funcional limitada a la recursividad bien construida con unas
cuantas restricciones más se llama programación funcional total.
Evaluación estricta frente a la no estricta
Los lenguajes funcionales pueden ser clasificados por
el hecho de usar evaluación estricta(eager) o no estricta(lazy), conceptos que
hacen referencia a cómo los argumentos de las funciones son procesados cuando
una expresión está siendo evaluada. La diferencia técnica está en la notación
semántica de las expresiones que contienen cálculos fallidos o divergentes.
Bajo la evaluación estricta, la evaluación de cualquier término que contenga un
sub-término fallido hará que este sea de por sí fallido.
Por ejemplo, la expresión:
print length([2+1, 3*2, 1/0, 5-4])
fallará bajo evaluación estricta por la división por
cero en el tercer elemento de la lista. Utilizando evaluación no estricta, el
tamaño de la función devolverá un valor de 4( por ejemplo el número de
elementos de la lista) ya que evaluar esto no afectará al estar evaluando los
que componen la lista. En resumen, la evaluación estricta evalúa por completo
los argumentos a menos que sus valores requieran evaluar la propia función que
se llama a sí misma.
La implementación de la estrategia común para
evaluación no estricta en los lenguajes funcionales es la de reducción mediante
un grafo. La evaluación no estricta es utilizada por defecto en multitud de
lenguajes funcionales puros, incluidos Miranda, Clean y Haskell.
Hughes (1984) defendía la evaluación no estricta como
un mecanismo para mejorar la modularidad de los programas a través de la
separación de tareas, a partir de la implementación de productores y
consumidores de flujos de datos de forma fácil e independiente. Launchbury
(1993) describe algunas dificultades que tenía la evaluación no estricta,
particularmente al analizar los requisitos de almacenamiento de los programas,
y propone una semántica operacional para ayudar durante el análisis. Harper
(2009) propone incluir ambas técnicas (evaluación estricta y no estricta) en el
mismo lenguaje, utilizando los tipos del sistema del lenguaje para
distinguirlas.
Tipo de sistemas
Especialmente desde el desarrollo de tipos de
inferencia de Hindley - Milner en la década de 1970, los
lenguajes de programación funcionales han tendido a utilizar el cálculo con
tipo lambda, en comparación con el cálculo lambda sin tipo utilizado en Lisp y sus variantes (tales
como el lenguaje scheme).
El uso de tipos de datos algebraicos y la coincidencia de patrones hace que la
manipulación de estructuras de datos complejas convenientes y expresivos, la
presencia de comprobaciones estrictas de tipos en tiempo de compilación hace
que los programas sean más fiable, mientras que la inferencia de tipos libera
al programador de la necesidad de declarar manualmente los tipos para el
compilador.
Algunos lenguajes funcionales orientados a la
investigación, tales como Coq,
Agda, Cayenne
y Epigram se basan en la teoría de tipo
intuicionista, que permite a los tipos a depender de los términos. Estos tipos
se denominan tipos dependientes. Estos sistemas de tipo no tienen un tipo
decidible inferencia y son difíciles de entender y programar con plantillas de
citación. Pero tipos dependientes pueden expresar proposiciones arbitrarias en
la lógica de predicados.
A través del isomorfismo de Curry-Howard, entonces,
mecanografiados a programas en estas lenguas se convierten en una forma de
escribir las pruebas matemáticas formales de las que un compilador puede
generar código de certificado. Si bien estas lenguas son principalmente de
interés en la investigación académica (incluyendo las matemáticas
formalizadas), han comenzado a ser utilizado en la ingeniería también. Compcert
es un compilador para un subconjunto del lenguaje de programación C que se escribe en Coq y
verificó formalmente. Una forma limitada de tipos dependientes llamados tipos
de datos algebraicos generalizados (GADTs) puede ser implementado de una manera
que ofrece algunos de los beneficios de la programación dependiente escrito,
evitando la mayor parte de su inconveniencia. GADTs están disponibles en el Glasgow Haskell Compiler, en OCaml (desde
la versión 4.00) y en Scala y se han propuesto como adiciones a otros idiomas,
incluyendo Java y C#.
La programación funcional en lenguajes no funcionales
Es posible utilizar un estilo de programación
funcional en lenguajes que tradicionalmente no se consideran lenguajes
funcionales. Por ejemplo, tanto D
y Fortran95
se apoyan explícitamente en funciones puras. Funciones de primera clase,
se han añadido lentamente a los lenguajes principales. Por ejemplo, a
principios de 1994, el apoyo a lambda, filtro, mapa, y reducir esta en Python. Luego,
durante el desarrollo de Python 3000, Guido van
Rossum pidió la eliminación de estas características. Sin embargo,
más tarde cambió de opinión, y sólo la reducción fue eliminado, a pesar de que
sigue siendo accesible a través de los módulos de biblioteca functools estándar. Funciones de primera
clase también fueron introducidas en PHP 5.3, Visual Basic9, C#3.0 y C++11.
En Java, las clases anónimas a veces pueden ser
utilizados para simular [[Clausura_(informática)|clausuras]. Sin embargo, las
clases anónimas no son siempre los reemplazos completos de las clausuras, ya
que tienen capacidades más limitadas. Por ejemplo, Java 8, cuya publicación se
ha anunciado para 2014, incluirá expresiones lambda para reemplazar determinadas
clases anónimas. Sin embargo, la presencia de excepciones con comprobaciones en
este lenguaje puede desaconsejar el uso de programación funcional, ya que puede
ser necesario para capturar las excepciones que se deben controlar para después
volverlas a lanzar ellos (problema este que sin embargo no se produce en otros
lenguajes sobre JVM
que no tienen excepciones comprobadas, como es Scala).
Ventajas de usar un paradigma funcional
Entre las ventajas que suelen citarse
de usar un paradigma funcional en la programación de computadoras, están las
siguientes:1
- Ausencia de efectos colaterales
- Proceso de depuración menos problemático
- Pruebas de unidades más confiables
- Mayor facilidad para la ejecución concurrente
Simulación de estados
Hay tareas (como por ejemplo, el
mantenimiento del saldo de una cuenta bancaria) que a menudo parecen
implementadas con estados. La programación funcional pura actúa sobre esas
tareas, tareas de entrada/salida de datos tales como entrada de datos por parte
del usuario y mostrar resultados por pantalla, de una forma diferente.
El lenguaje de programación
funcional Haskell
lo implementa usando mónadas, estructura que representa cálculos que se
describen como una secuencia de pasos, derivada de la teoría de categorías.
Cuestiones de eficiencia
Los lenguajes de programación
son típicamente menos eficientes en el uso de CPU y memoria que los lenguajes
imperativos como pueden ser C
y Pascal.
Esto está relacionado con el hecho de que algunas estructuras de datos de
tamaño indefinido como los vectores tienen una programación muy sencilla usando
el hardware existente, el cual es una máquina de Turing bastante evolucionada. Se
puede acceder muy eficientemente a las posiciones del array con CPUs con un
alto grado de perfeccionamiento, haciendo pre búsquedas eficientemente a través
de las memorias caché
o manejado con instrucciones SIMD.
Y no es fácil crear componentes homólogos inmutables de
propósito general con la misma eficiencia. Para lenguajes puramente
funcionales, el peor caso descendente es el logarítmico en el número de celdas
de memoria usadas, porque las estructuras de memoria que cambian de tamaño
pueden ser representadas por estructuras de datos puramente funcionales con
tiempo de acceso logarítmico, como por ejemplo un árbol equilibrado. Sin
embargo, tales retrasos no son universales. Para programas que realizan
cálculos numéricos intensivos, los lenguajes funcionales tales como OCaml y Clean son algo más lentos
que C. Para programas que
manejan grandes matrices y bases de datos multidimensionales, los vectores de
los lenguajes funcionales, como J
y K, fueron diseñados
optimizando su velocidad.
El polimorfismo se refiere a la propiedad por la que es posible
enviar mensajes sintácticamente iguales a objetos de tipos
distintos. El único requisito que deben cumplir los objetos que se utilizan de
manera polimórfica es saber responder al mensaje que se les envía.
La apariencia del código puede
ser muy diferente dependiendo del lenguaje que se utilice, más allá de las
obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de
programación que cuenta con un sistema de
tipos dinámico (en los que las variables pueden contener datos de
cualquier tipo u objetos de cualquier clase) como Smalltalk
no se requiere que los objetos que se utilizan de modo polimórfico sean parte
de una jerarquía de clases.
Clasificación
Se puede clasificar el polimorfismo en dos
grandes clases:
- Polimorfismo dinámico (o polimorfismo paramétrico) es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.
- Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explícitos y declarados uno por uno antes de poder ser utilizados.
El polimorfismo dinámico unido a la herencia es
lo que en ocasiones se conoce como programación genérica.
También se clasifica en herencia por redefinición
de métodos abstractos y por método sobrecargado. El segundo hace referencia al
mismo método con diferentes parámetros.
Otra clasificación agrupa los polimorfismo en dos
tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores y coerción, Universal
(inclusión o controlado por la herencia, paramétrico o genericidad).
Ejemplo de polimorfismo
En el siguiente ejemplo hacemos uso del lenguaje
C++ para ilustrar el polimorfismo. Se observa a la vez el uso de las funciones
virtuales puras, como se les conoce en C++, estas funciones constituyen una
interfaz más consistente cuando se trabaja con una jerarquía de clases, puesto
que hacen posible el enlace durante la ejecución. Sin embargo como se verá,
para que el polimorfismo funcione no es una condición obligatoria que todas las
funciones en la clase base sean declaradas como virtuales.
Diagrama de clases UML, que describe
gráficamente la relación entre la clase base Figura y sus posibles clases
derivadas, y la entidad que utiliza esta estructura: la Aplicación, también
identificado como objeto Cliente.
#include<iostream>
using namespace std;
class Figura {
private:
float base;
float altura;
public:
void captura();
virtual unsigned float perimetro()=0;
virtual unsigned float area()=0;
};
class Rectangulo: public Figura {
public:
void imprime();
unsigned float perimetro(){return 2*(base+altura);}
unsigned float area(){return base*altura;}
};
class Triangulo: public Figura {
public:
void muestra();
unsigned float perimetro(){return 2*altura+base}
unsigned float area(){return (base*altura)/2;}
};
void Figura::captura()
{
cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISÓSCELES Y UN RECTANGULO:" << endl;
cout << "escribe la altura: ";
cin >> altura;
cout << "escribe la base: ";
cin >> base;
cout << "EL PERIMETRO ES: " << perimetro();
cout << "EL AREA ES: " << area();
getchar();
return 0;
}
Universidad Nacional Experimental Romulo Gallegos
Suscribirse a:
Entradas (Atom)