Sei sulla pagina 1di 9

Lenguajes de Programacin Tipos de Datos Un tipo de datos define una coleccin de objetos de datos y un conjunto predefinido de operaciones en esos

objetos. El sistema de tipos de datos de un lenguaje de programacin define como un tipo es asociado con cada expresin en el lenguaje e incluye la reglas de equivalencia y la compatibilidad de datos. Un descriptor es la coleccin de atributos de una variable, un descriptor es un rea de memoria que almacena los atributos de una variable. Si los atributos son estticos, los descriptores son requeridos solo en tiempo de compilacin. Estos descriptores son construidos por el compilador, usualmente como parte de la tabla de smbolos y son usados durante la compilacin. Para atributos dinmicos, sin embargo, parte o todo el descriptor debe mantenerse durante toda la ejecucin. En este caso el descriptor es usado en tiempo de ejecucin. Un objeto representa una instancia de un tipo de datos definido por el usuario (dato abstracto). Los tipos de datos que no se definen en base a otros tipos se llaman primitivos. Casi todos los lenguajes de programacin tienen definidos un conjunto de datos primitivos. Algunos tipos de datos son reflexiones del hardware como los tipos de datos enteros. Tipo de Dato Entero Caractersticas El tipo de dato ms comn. Algunos lenguajes como C++ y C# incluyen tipos de entero unsigned, los cuales son tipos de enteros ms simples sin signos, estos son usados para tipos de datos binarios. Los tipos de enteros manejados en: byte, short, int, long. Modelan a los nmeros reales, pero la representacin son slo aproximaciones. Por ejemplo los valores de pi o e no pueden representarse correctamente con la notacin de punto flotante. Pierde exactitud a travs de las operaciones aritmticas. La mayora de los lenguajes incluye dos tipos de datos flotantes llamados float y double. Flot es el tamao standard, usualmente se almacena en 4 bytes de memoria. Los valores representados se definen en trminos de precisin y rango. Presicin: Exactitud de la parte fraccional de un valor. Rango: combinacin del rango de fracciones y de exponentes.

Punto Flotante

Decimal

Este tipo de dato guarda un nmero fijo de dgitos decimales.

Booleano String

Character

Implementacion de cadenas de caracteres

El rango de valores se encuentra limitado ya que no hay exponentes. Desperdicio de memoria. Tipo de Datos para aplicaciones de negocios (cobol), C# tiene tipo de dato decimal. Tipo de dato ms simple. Solo tiene 2 rangos de valores : true o false. El uso de tipo booleano ofrece mayor legibilidad. Puede representarse por un solo bit. Se almacena como cdigo numrico. Comnmente se usa el cdigo ASCCI. Un cdigo alternativo ms amplio es UNICODE que permite representar un carcter con 16 bits. Se comenz a usar originalmente en java, c# y javascript soportan Unicode. Su valor consiste en una secuencia de caracteres. Las principales operaciones con cadenas son: asignacin, concatenacin, substring referencia, comparacin y bsqueda de patrones. Una referencia a una subcadena, es la referencia a una parte de una cadena dada. En los lengujaes que las cadenas no son un tipo de dato primitivo, se toman como un arreglo de caracteres (c y c++). Las cadenas en python son inmutables de manera similar que java. La longitud de las cadenas puede ser fija, esto se define en el momento de su creacin, (static lenght). Se puede fijar un valor mximo a la cadena, lo que se conoce como limited dynamic length (cadena de longitud dinmica limitada). La tercera opcin, es permitir a las cadenas una longitud dinmica, sin establecer un mximo como en java, perl y c++. Ada 95 soporta las tres opciones. Las cadenas son parte importante en la escritura de lenguaje. Aunque las cadenas dinmicas son ms flexibles, son ms costosas. Un descriptor para un tipo de cadenas estticas, el cual es requerido slo en la compilacin tiene tres caracteres: el primero el nombre del tipo, el segundo la longitud de caracteres y el tercero es la direccin del primer carcter. Para las cadenas dinmicas se requiere un descriptor ms simple en el que slo la longitud es guardada. En las cadenas dinmicas limitadas de c y c++ no se requieren descriptores ya que la cadena es marcada con nulo al final. Para las cadenas de longitud dinmica la asignacin de memoria allocation y deallocation es el mayor problema. Las cadenas pueden guardarse en un lista, asi cuando la cadena crezca la nueva celda requerida, puede venir de donde quiera desde el heap. Las cadenas pueden almacenarse como arreglos de punteros a caracteres individuales guardados en el heap, este mtodo usa memoria extra

pero es ms rpido que el uso de listas. La tercera forma es almacenar la cadenas en celdas continuas. Tipos de Datos Ordinales Un tipo de dato ordinal es aquel en el rango de los posibles valores se pueden asociar fcilmente con el conjunto de enteros positivos. En java por ejemplo los tipos de datos primitivos ordinales son integer, char y booleano. Existen dos tipos de datos ordinales definidos por el usuario, estos son enumeraciones y subrangos. Enumeracin: Todos los posibles valores, los cuales son llamados constantes, se proporcionan, o enumeran en la definicin. enum days {mon, tue, wed, thu, fri, sat, sun}; Problemas de Diseo de las Enumeraciones: En una enumeracin una contante puede aparecer ms de una vez en su definicin, si es as cmo es el tipo de ocurrencia de la constante revisada? Los valores de una enumeracin se forzan a tipo entero? Cualquier otro tipo se forza a tipo enumeracin? - Evaluacin: - Ofrece legibilidad y confiabilidad en el cdigo. - El compilador puede checar que: - no se permiten agregar ms enumeraciones - Ninguna variable de enumeracin puede asignar un valor fuera de su rango definido. - Ada, C# y java tienen un mejor manejo de enumeracin por lo que no se obliga la conversin a entero. Subragos: Es una subsecuencia ordenada contigua de un tipo ordinal. Ejemplo 12..14 es un subrango de un tipo entero. En Ada, subrangos se incluyen como categora de tipo y se llama subtipo. type Days is (mon, tue, wed, thu, fri, sat, sun); subtype Weekdays is Days range mon..fri; subtype Index is Integer range 1..100; En este ejemplo la restriccn en el tipo existente es el rango de valores posibles. Todas las operaciones definidas en el tipo padre tambin son definidas para el subtipo, excepto la asignacin de valores fuera del rango especificado. - Day1: Days; - Day2: Weekday; - Day2 := Day1; Esta asignacin es ilegal a menos que el da sea Sat o Sun. Evaluacin: Aumenta la legibilidad, haciendo ms claro los valores que pueden que pueden almacenar las variables de subtipo. Aumento en la confiabilidad, la asignacin de un valor a una variable de subrango que este fuera del rango especificado se detecta como error.

Los tipos de enumeracin se implementan como enteros, sin restricciones de en los rangos de valores y operaciones. Los subrangos son implementados en la misma forma que sus tipos padre, excepto que la verificacin del rango debe estar implcitamente incluida por el compilador en cada asignacin de una variable o una expresin de una variable de subrango. Arreglos Un arreglo es un conjunto de elementos homogneos en el que cada elemento es identificado por su posicin relativa al primer elemento. Especificar un elemento de un arreglo puede ser referenciado por dos niveles de mecanismos sintcticos, primero se hace referencia al nombre y despus se selecciona el subscriptor o el ndice. ndices de Arreglos: Indexar o subscriptor es un mapeo de los ndices a los elementos. array_name (index_value_list) an element Sintaxis de los ndices: - FORTRAN, PL/I, Ada usa parentesis - Ada usa explcitamente parntesis para mostrar la uniformidad entre las referencias de un arreglos y sus llamados a funciones ya que ambos son mapeos. - La mayora de otros lenguajes usan corchetes. Tipos de ndices FORTRAN, C: Slo enteros Pascal: Cualquier tipo ordinal (Entero, Booleano, char, enumeracin) Ada: Entero o Enumeracin (incluye Booleano and char). Java: Slo tipos entero. C, C++, Perl, and Fortran no especifican verificacin de rango. Java, ML, C# especifican verificacin de rango. Estticos: Los ndices de los rangos son ligados estticamente y la asignacin del almacenamiento es esttica (antes del tiempo de ejecucin). Ventajas: Eficiencia (no hay asignacin dinmica de memoria). Desventaja: Que el almacenamiento del arreglo es definido para toda la ejecucin del programa. * Pila dinmica Fija: El ndice del rango es fijo, es vinculado estticamente, pero la asignacin se realiza dinmicamente en el momento de la declaracin. * Ventaja: Eficiencia en el espacio. Pila Dinmica: Los valores de los subndices del rango son ligados dinmicamente y la asignacin de memoria es dinmica, (en tiempo de ejecucin). *Ventaja: Flexibilidad en el tamao, el tamao de un arreglo no necesita conocerse hasta que sea utilizado. Heap Dinmico Fijo: Parecido a la pila dinmica fija: El ligado del

almacenamiento es dinmico pero fijo, despus de la asignacin. El ligado es hecho cuando es requerido y el almacenamiento es asignado desde el heap no de la pila. Heap Dinmico: El ligado de los ndices del rango y la asignacin de memoria es dinmica, puede cambiar cualquier nmero de veces. * Ventaja: Flexibilidad( el arreglo puede crecer o encogerse durante la ejecucin del programa). En C and C++ los arreglos que incluyen el modificador static son estticos. Los arreglos en C and C++ sin el modificador static son fixed stack-dynamic (pila dinmica fija). Los arreglos en Ada puede ser dinmicos de pila. C and C++ puede manejar arreglos de pila dinmica fija. C# incluye una segunda clase de arreglo que es la clase ArrayList que provee un heap dinmico fijo. Perl, Python and JavaScript soportan arreglos de heap dinmico. Algunos lenguajes permiten la inicializacin al mismo tiempo que la asignacin de memoria. Ejemplo en C, C++, Java, C# int list [] = {4, 5, 7, 83} Cadenas de caracteres en C and C++ char name [] = freddie; Las operaciones mas comunes con arreglos son asignacin, concatenacin, comparacin de igualdad y desigualdad, y slices. Los lenguajes basados en c no proveen ninguna operacin con arreglos, excepto a travs de mtodos de java,c++,y c#. Perl soporta asignacin de arreglos pero no soporta comparaciones. APL provee el procesamiento de arreglos ms poderoso, operaciones para procesamiento de matrices y vectores, como operadores unarios ( revierte elementos en columnas). Fortran provee operaciones elementales por que estos sn entre pares de elementos del arreglo. - Por ejemplo el operador + entre dos arreglos trae como resultado un arreglo de sumas de elementos pares de los dos arreglos. * Un arreglo rectangular es un arreglo multidimensional en el cual las filas tienen el mismo numero de elementos y las columnas tienen el mismo nmero de elementos. * Una matriz irregular tiene filas con un nmero de elementos variado. Posible cuando arreglos multidimensionales aparecen como arrglos de arreglos. Slices Un slice es una subestructura de un arreglo, nada ms que un mecanismo de referencia. Los sclices son tiles en los lenguajes que manejan operaciones con arreglos. Ejemplos de Slices:

Operaciones con Arreglos

Vector (3:6) Es un arreglo de cuatro elementos

Implementacin Las funciones de acceso mapean expresiones por ndices a una direccin de de Arreglos memoria en el arreglo. Funciones de acceso para un arreglo unidimensional: address(list[k]) = address (list[lower_bound]) + ((k-lower_bound) * element_size). Dos formas comunes de acceder al elemento de un arreglo: - Por la fila de mayor importancia, usado en la mayora de los lenguajes. - Por la columna de mayor orden, usado en Fortran. Localizacin de un elemento en un arreglo multidimensional: Location (a[I,j]) = address of a [row_lb,col_lb] + (((I - row_lb) * n) + (j - col_lb)) * element_size Un descriptor para un arreglo unidimensional. El descriptor incluye la informacin requerida para construir el acceso a la funcin. Arreglos Asociativos Un arreglo asociativo es una coleccin desordenada de elementos que son ordenadas por un igual nmero de valores llamados claves. Las claves definidas por el usuario deben guardarse en la estructura. As que cada elemento de un arreglo asociativo es de hecho un par de entidades, una clave y un valor. En el caso de los arreglos no asociativos los ndices no necesitan ser almacenados. Arreglos Asociativos en Pearl * Nombres comienzan con %; las literales son delimitadas con parntesis. %hi_temps = ("Mon" => 77, "Tue" => 79, Wed => 65, ); Subndices hacen uso de llaves y claves $hi_temps{"Wed"} = 83; Los elementos pueden borrarse con delete. delete $hi_temps{"Tue"}; Record Type Registros Es un agregado de conjunto de datos en el cual los elementos individuales son identificados por nombres y se accede a ellos a travs de offsets al principio de la estructura. Es una necesidad frecuente en los programas

modelar colecciones de datos que no son del mismo tamao o tipo. Los elementos de un registro pueden ser de diferente tamao y se alojan en localidades de memoria adyacentes. Los registros fueron introducidos por COBOL., en algunos lenguajes que soportan programacin orientada a objetos los registros son simulados con los objetos. En C y C++, los registros son soportados con el tipo de dato struct. Cobol utiliza nmeros para controlar el nivel de anidamiento de los registros, mientras que otros lenguajes ocupan la recursividad. Referencias a los campos de estructuras (registros) 1. COBOL field_name OF record_name_1 OF ... OF record_name_n 2. Otros record_name_1.record_name_2. ... record_name_n.field_name COBOL usa nmero de nivel para mostrar los registros anidados otros, usan recursividad. 01 EMP-REC. 02 EMP-NAME. 05 FIRST PIC X(20). 05 MID PIC X(10). 05 LAST PIC X(20). 02 HOURLY-RATE PIC 99V99. * Definicin de Registros en Ada Los registros de las estructuras son indicadas de forma ortogonal. Referencia hacia los registros La mayora de los lenguajes utiliza la notacin (.). Emp_Rec.Name Referencias completas calificadas incluyen todos los nombres de los registros. Operaciones con Registros Asignacin es comn si los registros son idnticos. Ada permite la comparacin de registros COBOL provee MOVE CORRESONDING - Copia un campo del origen a otro campo del registro destino. Desplazamiento de la direccin en relacin con el comienzo de los registros, se asocia cada campo. Una unin es un tipo donde las variables pueden almacenar diferentes valores en tiempos diferentes de ejecucin. Fortran,C, C++ proporcionan la unin, en construcciones donde no hay un lenguaje que permita la comprobacin de tipos, la unin en

Unin de Tipos

estos lenguajes se llama unin libre. La verificacin de tipos de las uniones requiere que cada unin incluya el tipo de indicador, lo que se llama discriminante. (Soportada por Ada). type Shape is (Circle, Triangle, Rectangle); type Colors is (Red, Green, Blue); type Figure (Form: Shape) is record Filled: Boolean; Color: Colors; case Form is when Circle => Diameter: Float; when Triangle => Leftside, Rightside: Integer; Angle: Float; when Rectangle => Side1, Side2: Integer; end case; end record;

Punteros y Referencias de Tipos

una unin discriminada de las tres variables forma. Evaluacin de las uniones: - Potencialmente inseguras. (no permiten verificacin de tipos). - Java y C# no soportan uniones. Una variable de tipo puntero tiene un rango valores que se compone de direcciones de memoria y un valor nulo. Tienen la capacidad de direccionamiento indirecto. Proporciona una forma de gestionar la memoria dinmica. Un puntero se puede utilizar para acceder a una ubicacin en el rea de almacenamiento donde se crea de forma dinmica (heap). Tienen dos operaciones fundamentales asignacin y des referencia. - La asignacin establece una direccin de memoria a un puntero. - La des referencia toma el valor almacenado en la ubicacin de memoria almacenada por el puntero. - J=*ptr Los punteros son extremadamente flexibles por lo que deben usarse con cuidado. Void * puede apuntarse a cualquier tipo y puede tener verificacin de tipos. Los punteros son necesarios para las estructuras de datos dinmicas por lo que no se puede disear un lenguaje sin ellos. Los contadores de referencia mantienen un contador de cada celda que

guarda el nmero de punteros que apuntan hacia esa celda. Garbage Collector En tiempo de ejecucin las celdas de memoria son requeridas y se desconectan los punteros de estas celdas como sea necesario, el recolector de basura inicia el proceso. Todas las celdas se inician con basura. Todos los punteros hacia el heap son marcados para diferenciarlos de basura.