UNIDAD 4.
1.- EXPLIQUE AMPLIAMENTE LOS SIGUIENTES CONCEPTOS:
SOFTWARE:
El software es un ingrediente indispensable para el funcionamiento del computador. Está formado
por una serie de instrucciones y datos, que permiten aprovechar todos los recursos que el
computador tiene, de manera que pueda resolver gran cantidad de problemas. Un computador en
si, es sólo un conglomerado de componentes electrónicos; el software le da vida al computador,
haciendo que sus componentes funcionen de forma ordenada.
El software es un conjunto de instrucciones detalladas que controlan la operación de un sistema
computacional.
Funciones del software:
* Administrar los recursos de cómputo
* Proporcionar las herramientas para optimizar estos recursos.
* Actuar como intermediario entre el usuario y la información almacenada.
PROGRAMA:
Programa: conjunto de argumentos o instrucciones para la computadora, almacenado en la
memoria primaria de la computadora junto con los datos requeridos para ser ejecutado, en otras
palabras hacer que las instrucciones sean realizadas por la computadora.
PROGRAMACION:
Programación es aquella actividad por la cual se crean programas para computadoras, tales
programas pueden ser códigos fuentes interpretados (como por ejemplo scripts en BASH) o
códigos fuentes que serán compilados (como por ejemplo programas en C++) hacia lenguajes
binarios y ejecutados desde el kernel del sistema operativo.
No es normal escribir un programa en lenguaje de máquina dado que es muy difícil, en cambio, se
utilizan lenguajes de programación inteligibles por un ser humano. No es necesario que un
programa sea escrito en un sólo lenguaje, puede poseer diversas partes escritas en distintos
lenguajes de programación, como por ejemplo C, C++ y ASM.
LENGUAJE DE PROGRAMACION:
Lenguaje artificial que puede ser usado para controlar el comportamiento de una máquina,
especialmente una computadora. Estos se componen de un conjunto de reglas sintácticas y
semánticas que permiten expresar instrucciones que luego serán interpretadas.
Debe distinguirse de “lenguaje informático”, que es una definición más amplia, puesto estos
incluyen otros lenguajes como son el HTML o PDF que dan formato a un texto y no es
programación en sí misma.
Los lenguajes de programación pueden clasificarse según el paradigma que usan en:
procedimentales, orientados a objetos, funcionales, lógicos, híbridos, etc.
El programador es el encargado de utilizar un lenguaje de programación para crear un conjunto de
instrucciones que, al final, constituirá un programa o subprograma informático.
DATO:
Es la unidad mínima de información también llamada materia prima, no elaborada sin sentido en si
misma, pero que se puede utilizar en la realización de cálculos y representar hechos.
También definido como la expresión general que describe los objetos con los cuales opera una
computadora. Los datos de entrada se transforman por el programa, después de las etapas
intermedias, en datos de salida.
IDENTIFICADOR:
Un identificador es un "nombre" que nos permite dirigirnos específicamente a una de las entidades
propias del lenguaje, es decir, son los nombres que podemos ponerles a nuestros/as variables,
métodos, clases, interfaces y objetos.
La única restricción en la formación de identificadores es que tienen que comenzar por letra,
subrayado o por el signo '$', pudiéndoles seguir después letras o números. Hay que tener en
cuenta que en Java como en otros muchos lenguajes de programación se distinguen las
mayúsculas y las minúsculas.
MEMORIA:
Los datos que manejas los programas varían continuamente, y esto exige que la memoria que los
contiene debe ser de lectura y escritura, por lo que la memoria RAM estática (SRAM) es la más
adecuada, aunque sea volátil.
Hay microcontroladores que disponen como memoria de datos una de lectura y escritura no volátil,
del tipo EEPROM. De esta forma, un corte en el suministro de la alimentación no ocasiona la
pérdida de la información, que está disponible al reiniciarse el programa. El PIC16F84 dispone de
64 bytes de memoria EEPROM para contener datos.
SISTEMA DE NUMERACION:
Un sistema de numeración es un conjunto de símbolos y reglas de generación que permiten
construir todos los números válidos en el sistema.
Un sistema de numeración puede representarse como
donde:
- N es el sistema de numeración considerado (p.ej. decimal, binario, etc.)
- S son los símbolos permitidos en el sistema. En el caso del sistema decimal son {0,1...9}; en
- el binario son {0,1}; en el octal son {0,1...7}; en el hexadecimal son {0,1...9,A,B,C,D,E,F}
- R son las reglas que nos indican qué números son válidos en el sistema, y cuáles no.
OPERADOR:
Son elementos que relacionan de forma diferente, los valores de una o mas variables y/o
constantes. Es decir, los operadores nos permiten manipular valores.
OPERANDO:
Referente a la parte de la instrucción de lenguaje máquina de la computadora que designa la
dirección de los datos con los que se debe operar.
EXPRESION:
Una expresión es una combinación de operandos y operadores.
La evaluación de una expresión consiste en reducirla, esto es, realizar todas las operaciones
contenidas en ella para obtener un valor final.
Para evaluar una expresión es necesario conocer la prioridad de los operadores, con lo cual se
puede determinar cuál operación se va a realizar antes que las demás.
Una expresión entre paréntesis se evalúa primero que las demás. Si hay paréntesis anidados, se
evalúa primero la expresión contenida en los paréntesis más internos.
EJECUTABLE:
En Informática, un ejecutable o archivo ejecutable, es un archivo binario cuyo contenido se
interpreta por el ordenador como un programa.
Generalmente, contiene instrucciones en código máquina de un procesador en concreto, pero
también puede contener bytecode que requiera un intérprete para ejecutarlo. Además suele
contener llamadas a funciones específicas de un sistema operativo (llamadas al sistema).
2.-DESCRIBA AMPLIAMENTE EL DESARROLLO HISTORICO DE LA PROGRAMACION:
Los primeros lenguajes de programación surgieron de la idea de Charles Babagge, la cual se le ocurrió a este hombre a mediados del siglo XIX. Era un profesor matemático de la universidad de Cambridge e inventor ingles, que la principio del siglo XIX predijo muchas de las teorías en que se basan los actuales ordenadores.
Consistía en lo que él denominaba la maquina analítica, pero que por motivos técnicos no pudo construirse hasta mediados del siglo XX. Con él colaboro Ada Lovedby, la cual es considerada como la primera programadora de la historia, pues realizo programas para aquélla supuesta maquina de Babagge, en tarjetas perforadas. Como la maquina no llego nunca a construirse, los programas de Ada, lógicamente, tampoco llegaron a ejecutarse, pero si suponen un punto de partida de la programación, sobre todo si observamos que en cuanto se empezó a programar, los programadores utilizaron las técnicas diseñadas por Charles Babagge, y Ada, que consistían entre otras, en la programación mediante tarjetas perforadas. A pesar de ello, Ada ha permanecido como la primera programadora de la historia. Se dice por tanto que estos dos genios de antaño, se adelantaron un siglo a su época, lo cual describe la inteligencia de la que se hallaban dotados.
En 1823 el gobierno Británico lo apoyo para crear el proyecto de una máquina de diferencias, un dispositivo
mecánico para efectuar sumas repetidas. Pero Babagge se dedico al proyecto de la máquina analítica,
abandonando la maquina de diferencias, que se pudiera programar con tarjetas perforadas, gracias a la
creación de Charles Jacquard (francés). Este hombre era un fabricante de tejidos y había creado un telar que podía reproducir automáticamente patrones de tejidos, leyendo la información codificada en patrones de agujeros perforados en tarjetas de papel rígido. Entonces Babagge intento crear la máquina que se pudiera programar con tarjetas perforadas para efectuar cualquier cálculo con una precisión de 20 dígitos. Pero la tecnología de la época no bastaba para hacer realidad sus ideas. Si bien las ideas de Babagge no llegaron a materializarse de forma definitiva, su contribución es decisiva, ya que los ordenadores actuales responden a un esquema análogo al de la máquina analítica. En su diseño, la máquina constaba de cinco unidades básicas:
1) Unidad de entrada, para introducir datos e instrucciones; 2) Memoria, donde se almacenaban datos y
resultados intermedios; 3) Unidad de control, para regular la secuencia de ejecución de las operaciones; 4)Unidad Aritmético-Lógica, que efectúa las operaciones; 5) Unidad de salida, encargada de comunicar al
exterior los resultados. Charles Babbage, conocido como el "padre de la informática" no pudo completar en
aquella época la construcción del computador que había soñado, dado que faltaba algo fundamental: la
electrónica. El camino señalado de Babbage, no fue nunca abandonado y siguiéndolo, se construyeron los
primeros computadores.
Cuando surgió el primer ordenador, el famoso ENIAC (Electronic Numerical Integrator And Calculator), su
programación se basaba en componentes físicos, o sea, que se programaba, cambiando directamente el
Hardware de la maquina, exactamente lo que sé hacia era cambiar cables de sitio para conseguir así la
programación de la maquina. La entrada y salida de datos se realizaba mediante tarjetas perforadas.
LAS TENDENCIAS DE LOS LENGUAJES DE PROGRAMACIÓN
El estudio de los lenguajes de programación agrupa tres intereses diferentes; el del programador profesional, el del diseñador del lenguaje y del Implementador del lenguaje.
Además, estos tres trabajos han de realizarse dentro de las ligaduras y capacidades de la organización de una computadora y de las limitaciones fundamentales de la propia "calculabilidad". El termino "el programador" es un tanto amorfo, en el sentido de que camufla importantes diferencias entre distintos niveles y aplicaciones de la programación. Claramente el programador que ha realizado un curso de doce semanas en COBOL y luego entra en el campo del procesamiento de datos es diferente del programador que escribe un compilador en Pascal, o del programador que diseña un experimento de inteligencia artificial en LISP, o del programador que combina sus rutinas de FORTRAN para resolver un problema de ingeniería complejo, o del programador que desarrolla un sistema operativo multiprocesador en ADA.
En este trabajo, intentare clarificar estas distinciones tratando diferentes lenguajes de programación en el
contexto de cada área de aplicación diferente. El "diseñador del lenguaje" es también un termino algo
nebuloso. Algunos lenguajes (como APL y LISP) fueron diseñados por una sola persona con un concepto
único, mientras que otros (FORTRAN y COBOL) son el producto de desarrollo de varios años realizados por comités de diseño de lenguajes.
El "Implementador del lenguaje" es la persona o grupo que desarrolla un compilador o interprete para un
lenguaje sobre una maquina particular o tipos de maquinas. Mas frecuentemente, el primer compilador para el lenguaje Y sobre la maquina X es desarrollada por la corporación que manufactura la maquina X . Por ejemplo, hay varios compiladores de Fortran en uso; uno desarrollado por IBM para una maquina IBM, otro desarrollado por DEC para una maquina DEC, otro por CDC, y así sucesivamente. Las compañías de software también desarrollan compiladores y también lo hacen los grupos de investigación de las universidades. Por ejemplo, la universidad de Waterloo desarrolla compiladores para FORTRAN Y PASCAL, los cuales son útiles en un entorno de programación de estudiantes debido a su superior capacidad de diagnostico y velocidad de compilación.
Hay también muchos aspectos compartidos entre los programadores, diseñadores de un lenguaje
implementadores del mismo. Cada uno debe comprender las necesidades y ligaduras que gobiernan las
actividades de los otros dos.
Hay, al menos, dos formas fundamentales desde las que pueden verse o clasificarse los lenguajes de
programación: por su nivel y por principales aplicaciones. Además, estas visiones están condicionadas por la visión histórica por la que ha transcurrido el lenguaje. Además, hay cuatro niveles distintos de lenguaje de programación.
Los "Lenguajes Declarativos" son los mas parecidos al castellano o ingles en su potencia expresiva y
funcionalidad están en el nivel mas alto respecto a los otros. Son fundamentalmente lenguajes de ordenes, dominados por sentencias que expresan "Lo que hay que hacer" en ves de "Como hacerlo". Ejemplos de estos lenguajes son los lenguajes estadísticos como SAS y SPSS y los lenguajes de búsqueda en base de datos, como NATURAL e IMS. Estos lenguajes se desarrollaron con la idea de que los profesionales pudieran asimilar mas rápidamente el lenguaje y usarlo en su trabajo, sin necesidad de programadores o practicas de programación.
Los lenguajes de " Alto Nivel" son los más utilizados como lenguaje de programación. Aunque no son
fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y comprensible por otros programadores. Además, los lenguajes de alto nivel tienen normalmente las características de " Transportabilidad". Es decir, están implementadas sobre varias maquinas de forma que un programa puede ser fácilmente " Transportado " (Transferido) de una maquina a otra sin una revisión sustancial. En ese sentido se llama "Independientes de la maquina". Ejemplos de estos lenguajes de alto nivel son PASCAL, APL y FORTRAN (para aplicaciones científicas), COBOL (para aplicaciones de procesamiento de datos), SNOBOL( para aplicaciones de procesamiento de textos), LISP y PROLOG (para aplicaciones de inteligencia artificial), C y ADA (para aplicaciones de programación de sistemas) y PL/I (para aplicaciones de propósitos generales).
Los "Lenguajes Ensambladores" y los "Lenguajes Maquina" son dependientes de la maquina. Cada tipo de maquina, tal como VAX de digital, tiene su propio lenguaje maquina distinto y su lenguaje ensamblador
asociado. El lenguaje Ensamblador es simplemente una representación simbólica del lenguaje maquina
asociado, lo cual permite una programación menos tediosa que con el anterior. Sin embargo, es necesario un conocimiento de la arquitectura mecánica subyacente para realizar una programación efectiva en cualquiera de estos niveles lenguajes.
Los siguientes tres segmentos del programa equivalentes exponen las distinciones básicas entre lenguajes maquina, ensambladores de alto nivel:
Como muestra este ejemplo, a mas bajo nivel de lenguaje mas cerca esta de las características de un tipo e maquina particular y más alejado de ser comprendido por un humano ordinario. Hay también una estrecha relación ( correspondencia 1:1) entre las sentencias en lenguaje ensamblador y sus formas en lenguaje maquina codificada. La principal diferencia aquí es que los lenguajes ensambladores se utilizan símbolos (X, Y, Z, A para " sumar", M para "multiplicar"), mientras que se requieren códigos numéricos (OC1A4, etc.) para que lo comprenda la maquina.
La programación de un lenguaje de alto nivel o en un lenguaje ensamblador requiere, por tanto, algún tipo de interfaz con el lenguaje maquina para que el programa pueda ejecutarse. Las tres interfaces más comunes: un "ensamblador”, un "compilador" y un "interprete". El ensamblador y el compilador traducen el programa a otro equivalente en el lenguaje X de la maquina "residente" como un paso separado antes de la ejecución. Por otra parte, el interprete ejecuta directamente las instrucciones en un lenguaje Y de alto nivel, sin un paso de procesamiento previo.
La compilación es, en general, un proceso más eficiente que la interpretación para la mayoría de los tipos de maquina. Esto se debe principalmente a que las sentencias dentro de un "bucle" deben ser reinterpretadas cada vez que se ejecutan por un interprete. Con un compilador. Cada sentencia es interpretada y luego traducida a lenguaje maquina solo una vez.
Algunos lenguajes son lenguajes principalmente interpretados, como APL, PROLOG y LISP. El resto de los
lenguajes -- Pascal, FORTRAN, COBOL, PL/I, SNOBOL, C, Ada y Modula-2 - son normalmente lenguajes
compilados. En algunos casos, un compilador estará utilizable alternativamente para un lenguaje interpretado (tal como LISP) e inversamente (tal como el interprete SNOBOL4 de los laboratorios Bell). 1
Frecuentemente la interpretación es preferible a la compilación en un entorno de programación experimental o de educación, donde cada nueva ejecución de un programa implicado un cambio en el propio texto del programa. La calidad de diagnosis y depuración que soportan los lenguajes interpretados es generalmente mejor que la de los lenguajes compilados, puesto que los mensajes de error se refieren directamente a sentencias del texto del programa original. Además, la ventaja de la eficiencia que se adjudica tradicionalmente a los lenguajes compilados frente a los interpretados puede pronto ser eliminado, debido a la evolución de las maquinas cuyos lenguajes son ellos mismos1lenguajes de alto nivel. Como ejemplo de estos están las nuevas maquinas LISP, las cuales han sido diseñadas recientemente por Symbolics y Xerox Corporations.
Los lenguajes de Programación son tomados de diferentes perspectivas. Es importante para un programador decidir cuales conceptos emitir o cuales incluir en la programación. Con frecuencia el programador es osado a usar combinaciones de conceptos que hacen al lenguaje "DURO" de usar, de entender e implementar. Cada programador tiene en mente un estilo particular de programación, la decisión de incluir u omitir ciertos tipos de datos que pueden tener una significativa influencia en la forma en que el Lenguaje es usado, la decisión de usar u omitir conceptos de programación o modelos.
Existen cinco estilos de programación y son los siguientes: Orientados a Objetos.
Imperativa : Entrada, procesamiento y salidas de Datos.
Funcional : "Funciones", los datos son funciones, los resultados pueden ser un valor o una función.
Lógico : {T, F} + operaciones lógicas (Inteligencia Artificial).
Concurrente : Aún esta en proceso de investigación.
El programador, diseñador e implementador de un lenguaje de programación deben comprender la evolución histórica de los lenguajes para poder apreciar por que presentan características diferentes. Por ejemplo, los lenguajes "mas jóvenes" desaconsejan (o prohíben) el uso de las sentencias GOTO como mecanismo de control inferior, y esto es correcto en el contexto de las filosofías actuales de ingeniería del software y programación estructurada. Pero hubo un tiempo en que la GOTO, combinada con la IF, era la única estructura de control disponible; el programador no dispone de algo como la construcción WHILE o un IFTHEN-ELSE para elegir. Por tanto, cuando se ve un lenguaje como FORTRAN, el cual tiene sus raíces en los comienzos de la historia de los lenguajes de programación, uno no debe sorprenderse de ver la antigua sentencia GOTO dentro de su repertorio.
Lo más importante es que la historia nos permite ver la evolución de familias de lenguajes de programación, ver la influencia que ejercer las arquitecturas y aplicaciones de las computadoras sobre el diseño de lenguaje y evitar futuros defectos de diseño aprendido las lecciones del pasado. Los que estudian se han elegido debido a su mayor influencia y amplio uso entre los programadores, así como por sus distintas características de diseño e implementación. Colectivamente cubren los aspectos más importantes con los que ha de enfrentarse el diseñado de lenguajes y la mayoría de las aplicaciones con las que se enfrenta el programador. Para los lectores que estén interesados en conocer con mas detalle la historia de los lenguajes de programación recomendamos las actas de una recién conferencia (1981) sobre este tema, editadas por Richard Wexelblat.
Vemos que FORTRAN I es un ascendente directo de FORTRAN II, mientras que FORTRAN, COBOL,
ALGO 60, LISP, SNOBOL y los lenguajes ensambladores, influyeron en el diseño de PL/I.
También varios lenguajes están prefijados por las letras ANS. Esto significa que el American National
Standards Institute ha adoptado esa versión del lenguaje como el estándar nacional. Una vez que un lenguaje esta estandarizado, las maquinas que implementan este lenguaje deben cumplir todas las especificaciones estándares, reforzando así el máximo de transportabilidad de programas de una maquina a otra. La policía federal de no comprar maquinas que no cumplan la versión estándar de cualquier lenguaje que soporte tiende a "fortalecer" el proceso de estandarización, puesto que el gobierno es, con mucho, el mayor comprador de computadoras de la nación.
Finalmente, la notación algebraica ordinaria, por ejemplo, influyo fuertemente en el diseño de FORTRAN y
ALGOL. Por otra parte, el ingles influyo en el desarrollo del COBOL. El lambda calculo de Church dio los
fundamentos de la notación funcional de LISP, mientras que el algoritmo de Markov motivo el estilo de
reconocimiento de formas de SNOBOL. La arquitectura de computadoras de Von Neumann, la cual fue una
evolución de la maquina más antigua de Turing, es el modelo básico de la mayoría de los diseños de
computadoras de las ultimas tres décadas. Esta maquina no solo influyeron en los primeros lenguajes sino que también suministraron el esqueleto operacional sobre el que evoluciono la mayoría de la programación de sistemas.
Una discusión más directa de todos estos primeros modelos no están entre los objetivos de este texto. Sin
embargo, es importante apuntar aquí debido a su fundamental influencia en la evolución de los primeros
lenguajes de programación, por una parte, y por su estado en el núcleo de la teoría de la computadora, por
otra. Mas sobre este punto, cualquier algoritmo que pueda describirse en ingles o castellano puede escribirse igualmente como una maquina de Turing (maquina de Von Neumann), un algoritmo de Markov o una función recursiva. Esta sección, conocida ampliamente como "tesis de Church", nos permite escribir algoritmos en distintos estilos de programación (lenguajes) sin sacrificar ninguna medida de generalidad, o potencia de programación, en la transición.
CLASIFICACION DE LOS LENGUAJES DE PROGRAMACIÓN
LENGUAJE MÁQUINA:
El lenguaje máquina es el único que entiende directamente la computadora, ya que esta escrito en lenguajes directamente inteligibles por la máquina (computadora), utiliza el alfabeto binario, que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios). Sus instrucciones soncadenas binarias (cadenas o series de caracteres de dígitos 0 y 1) que especifican una operación y, las posiciones (dirección) de memoria implicadas en la operación se denominan instrucciones de máquina o código maquina. Fue el primer lenguaje utilizado en la programación de computadoras, pero dejo de utilizarse por su dificultad y complicación, siendo sustituido por otros lenguajes más fáciles de aprender y utilizar, que además reducen la posibilidad de cometer errores. El lenguaje máquina es el conocido código binario.
Generalmente, en la codificación de los programas se empleaba el sistema hexadecimal para simplificar el trabajo de escritura. Todas las instrucciones preparadas en cualquier lenguaje máquina tienen por lo menos dos partes. La primera es el comando u operación, que dice a las computadoras cual es la función que va a realizar. Todas las computadoras tienen un código de operación para cada una de las funciones. La segunda parte de la instrucción es el operando, que indica a la computadora donde hallar o almacenar los datos y otras instrucciones que se van a manipular, el número de operándoos de una instrucción varia en distintas computadoras.
Ventajas del lenguaje máquina: posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de
programación.
Desventajas del lenguaje máquina: dificultad y lentitud en la codificación. Poca fiabilidad. Gran dificultad
para verificar y poner a punto los programas. Los programas solo son ejecutables en el mismo procesador
(CPU). En la actualidad, las desventajas superan a las ventajas, lo que hace prácticamente no recomendables a los lenguajes máquina.
LENGUAJES DE BAJO NIVEL (ensamblador):
Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en
particular. El lenguaje de bajo nivel por excelencia es el ensamblador. El lenguaje ensamblador es el primer intento de sustituir el lenguaje maquina por otro más similar a los utilizados por las personas. Este intenta desflexibilizar la representación de los diferentes campos. Esa flexibilidad se consigue no escribiendo los campos en binario y aproximando la escritura al lenguaje. A principios de la década de los 50 y con el fin de facilitar la labor de los programadores, se desarrollaron códigos mnemotécnicos para las operaciones y direcciones simbólicas. Los códigos mnemotécnicas son los símbolos alfabéticos del lenguaje maquina. La computadora sigue utilizando el lenguaje maquina para procesar los datos, pero los programas ensambladores traducen antes los símbolos de código de operación especificados a sus equivalentes en el lenguaje maquina.
En la actualidad los programadores no asignan números de dirección reales a los datos simbólicos,
simplemente especifican donde quieren que se coloque la primera localidad del programa y el programa
ensamblador se encarga de lo demás, asigna localidades tanto para las instrucciones como los datos. Estos programas de ensamble o ensambladores también permiten a la computadora convertir las instrucciones en lenguaje ensamblador del programador en su propio código maquina. Un programa de instrucciones escrito en lenguaje ensamblador por un programador se llama programa fuente. Después de que el ensamblador convierte el programa fuente en código maquina a este se le denomina programa objeto. Para los programadores es más fácil escribir instrucciones en un lenguaje ensamblador que en código de lenguaje maquina pero es posible que se requieran dos corridas de computadora antes de que se puedan utilizar las instrucciones del programa fuente para producir las salidas deseadas.
El lenguaje de bajo nivel es el lenguaje de programación que el ordenador puede entender a la hora de ejecutar programas, lo que aumenta su velocidad de ejecución, pues no necesita un intérprete que traduzca cada línea de instrucciones.
Visto a muy bajo nivel, los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador.
Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son, a menudo, difíciles de
aprender. Más importante es el hecho de que los programas escritos en un bajo nivel sean altamente
específicos de cada procesador. Si se lleva el programa a otra maquina se debe reescribir el programa desde el principio.
Ventajas del lenguaje ensamblador frente al lenguaje máquina: mayor facilidad de codificación y, en general, su velocidad de calculo, ahorran tiempo y requieren menos atención a detalles. Se incurren en menos errores y los que se cometen son más fáciles de localizar. Tanto el lenguaje maquina como el ensamblador gozan de la ventaja de mínima ocupación de memoria y mínimo tiempo de ejecución en comparación con el resultado de la compilación del programa equivalente escrito en otros lenguajes. Los programas en lenguaje ensamblado son más fáciles de modificar que los programas en lenguaje máquina.
Desventajas del lenguaje ensamblador: dependencia total de la maquina lo que impide la transportabilidad de los programas (posibilidad de ejecutar un programa en diferentes máquinas). El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Machintosh. La formación de los programadores es más compleja que la correspondiente a los programadores de alto nivel, ya que exige no solo las técnicas de programación, sino también el conocimiento del interior de la maquina El programador ha de conocer perfectamente el hardware del equipo, ya que maneja directamente las posiciones de memoria, registros del procesador y demás elementos físicos. Todas las instrucciones son elementales, es decir, en el programa se deben describir con el máximo detalle todas las operaciones que se han de efectuar en la maquina para la realización de cualquier proceso.
Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se centran básicamente en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos.
LENGUAJES DE ALTO NIVEL:
Estos lenguajes son los mas utilizado por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho mas fácil que los lenguajes máquina y ensamblador. Un programa escrito en lenguaje de alto nivel es independiente de la máquina (las instrucciones no dependen del diseño del hardware o de una computadora en particular), por lo que estos programas son portables o transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificación en diferentes tipos de computadoras. Son lenguajes de programación en los que las instrucciones enviadas para que el ordenador ejecute ciertas órdenes son similares al lenguaje humano. Dado que el ordenador no es capaz de reconocer estas ordenes, es necesario el uso de un intérprete que traduzca el lenguaje de alto nivel a un lenguaje de bajo nivel que el sistema pueda entender.
Por lo general se piensa que los ordenadores son máquinas que realizan tareas de cálculos o procesamiento de texto. La descripción anterior es sólo una forma muy esquemática de ver una computadora. Hay un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. Existe también una relación compleja entre los lenguajes de alto nivel y el código máquina.
Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como “IF CONTADOR=10 THEN STOP” pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a diez. Por desgracia para muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una forma rígida y sistemática.
Los lenguajes de alto nivel, también denominados lenguajes evolucionados, surgen con posterioridad a los anteriores (lenguaje máquina, lenguajes de bajo nivel o ensamblador) con los siguientes objetivos, entre otros: Lograr independencia de la maquina, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador, que es suministrado por el fabricante, para obtener el programa ejecutable en lenguaje binario de la maquina que se trate. Además, no se necesita conocer el hardware especifico de dicha maquina. Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje maquina, ya que se utilizan palabras (en ingles) en lugar de cadenas de símbolos sin ningún significado aparente.
Incluir rutinas de uso frecuente, como las de entrada / salida, funciones matemáticas, manejo de tablas, etc., que figuran en una especie de librería del lenguaje, de manera que se puedan utilizar siempre que se quiera sin necesidad de programarlas cada vez.
Ventajas de los lenguajes de alto nivel: el tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes. La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos, nombres de las instrucciones tales como READ, WRITE, PRINT, OPEN, etc. Las
modificaciones y puestas a punto de los programas son más fáciles. Reducción del costo de los programas.
Transportabilidad. Permiten tener una mejor documentación. Son más fáciles de mantener.
Desventajas de los lenguajes de alto nivel: incremento del tiempo de puesta a punto al necesitarse diferentes traducciones del programa fuente para conseguir el programa definitivo. No se aprovechan los recursos internos de la maquina que se explotan mucho mejor en lenguajes máquina y ensambladores. Aumento de la ocupación de memoria. El tiempo de ejecución de los programas es mucho mayor.
Se puede decir que el principal problema que presentan los lenguajes de alto nivel es la gran cantidad de ellos que existen actualmente en uso, además de las diferentes versiones o dialectos que se han desarrollado de algunos de ellos. Es difícil establecer una clasificación general de los mismos, ya que en cualquiera que se realice habrá lenguajes que pertenezcan a mas de uno de los grupos establecidos. Una clasificación muy extendida, atendiendo a la forma de trabajar de los programas y a la filosofía con que fueron concebidos, es la siguiente:
Lenguajes imperativos. Utilizan instrucciones como unidad de trabajo de los programas (Cobol,
Pascal, C, Ada).
Lenguajes declarativos. Los programas se construyen mediante descripciones de funciones o
expresiones lógicas (Lisp, Prolog).
Lenguajes orientados a objetos. El diseño de los programas se basa mas en los datos y su estructura.
La unidad de proceso es el objeto y en el se incluyen los datos (variables) y las operaciones que actúan
sobre ellos (Smalltalk, C++).
Lenguajes orientados al problema. Diseñados para problemas específicos, principalmente de
gestión, suelen ser generadores de aplicaciones.
Lenguajes naturales. Están desarrollándose nuevos lenguajes con el principal objetivo de aproximar
el diseño y construcción de programas al lenguaje de las personas.
Otra clasificación que se puede hacer es la de atendiendo al desarrollo de los lenguajes desde la aparición de las computadoras, que sigue un cierto paralelismo con las generaciones establecidas en la evolución de las mismas:
Primera generación. Lenguajes maquina y ensambladores.
Segunda generación. Primeros lenguajes de alto nivel imperativo (FROTRAN, COBOL).
Tercera generación. Lenguajes de alto nivel imperativo. Son los mas utilizados y siguen vigentes en
la actualidad (ALGOL 8, PL/I, PASCAL, MODULA).
Cuarta generación. Orientados básicamente a las aplicaciones de gestión y al manejo de bases de
datos (NATURAL, SQL).
Quinta generación. Orientados a la inteligencia artificial y al procesamiento de los lenguajes
naturales (LISP, PROLOG).
Para la mejor compresión se harán unas definiciones:
Programa: es un conjunto de instrucciones escritas en un lenguaje de programación que indican a la
computadora la secuencia de pasos, para resolver un problema.
Código fuente: esta creado en algún lenguaje de alto nivel, por lo que es entendido 100% por el ser humano.
Este debe estar complementado por su documentación o manuales donde se indica el desarrollo lógico del mismo.
Código objeto: es creado por los compiladores y nos sirve como enlace entre el programa fuente y el
ejecutable.
ALGUNOS LEGUAJES DE PROGRAMACIÓN DE ALTO NIVEL
A continuación se presentan varios de los mas conocidos y utilizados, lenguajes de alto nivel.
FORTRAN
Abreviatura de FORmula TRANslator (traductor de formulas), fue definido alrededor del año 1955 en Estados Unidos por la compañía IBM. Es él más antiguo de los lenguajes de alto nivel. Antes de él, todos los programas se escribían en lenguaje ensamblador o en lenguaje máquina. Es un lenguaje especializado en aplicaciones técnicas y científicas. Se caracteriza por su potencia en los cálculos matemáticos, pero esta limitado en las aplicaciones de gestión, manejo de archivos, tratamiento de cadenas de caracteres y edición de informes. Es un lenguaje notorio, por la facilidad con que permite expresar una ecuación. Muchas de sus características fueron incorporadas mas tarde en el primer lenguaje BASIC. Una de sus ventajas es que es un lenguaje compacto y es también ampliamente utilizado para aplicaciones en los negocios que no requieren manejo de grandes archivos de datos. Hasta 1961 se mantuvo como monopolio de IBM, pero posteriormente se fue implementando en ordenadores de otros fabricantes. A lo largo de su existencia han aparecido diferentes versiones, entre las que destaca la adoptada en 1966 por el ANSI (American National Standards Institute), en la que se definieron nuevas reglas del lenguaje y se logro la independencia del mismo con respecto a la máquina; es decir, comenzo la portabilidad del lenguaje. Esta versión se denominó FORTRAN V o FORTRAN 66, y el idioma se hizo tan popular en los años 60, que FORTRAN 66 se volvió el primer idioma en ser regularizado oficialmente en 1972. En 1977 apareció una nueva versión mas evolucionada que se llamo FORTRAN V o FORTRAN 77. Está reflejada en el documento ANS X3.9-1978: Programming Language FORTRAN y define dos niveles del lenguaje denominados FORTRAN 77 completo y FORTRAN 77 básico, siendo el segundo un subconjunto del primero. Incluye, además, instrucciones para el manejo de cadenas de caracteres y de archivos, así como otras para la utilización de técnicas de programación estructurada. Estas características hacer que el lenguaje también sea valido para determinadas aplicaciones de gestión. A mediados de los años setenta se proporcionaron virtualmente cada computadora, mini o mainframe, con un sistema FORTRAN 66 normal. Era por consiguiente posible escribir programas en FORTRAN en cualquier sistema y estar bastante seguro que estos pudieran moverse para trabajar en cualquier otro sistema bastante fácil. Esto, y el hecho que pudieran procesarse programas de FORTRAN muy eficazmente. La ultima normalización del lenguaje, FRONTRAN 90, se encuentra en el documento ANS X3.198-1991 en la que se
incluyen características como la recursividad, tratamiento paralelo de tablas y uso de memoria dinámica.
Permite expresar los programas de maneras que se satisfacen mas a un ambiente de la informática moderna y han quedado obsoletos muchos de los mecanismos que eran apropiados en FROTRAN 77. En FROTRAN 90 algunos rasgos de FROTRAN 77 han sido reemplazados por rasgos mejores, mas seguros y más eficaces, muchos de estos fueron quitados del idioma FORTRAN 95. El FRONTRAN tiene la ventaja de ser un lenguaje compacto que sirve muy bien para satisfacer las necesidades de los científicos y los estadísticos de los negocios.
COBOL
Es el lenguaje mas utilizado en las aplicaciones de gestión, creado en 1960 por un comité denominado
CODASYL (COnference on DAta SYstems Languages), patrocinado por el Departamento de Defensa de
Estados Unidos, a fin de disponer de un lenguaje universal para aplicaciones comerciales, como expresa su
nombre (COmmnon Business Oriented Language).
A lo largo de su existencia ha sufrido diversas actualizaciones. Su primer estándar fue aprobado por el ANSI
en 1968. Posteriormente, en 1974, se adopta la norma ANS X3.23-1974, que ha perdurado hasta su ultima
versión, COBOL ANS-85, que facilita el diseño estructurado de los programas.
Sus características más destacables son las siguientes: se asemeja al lenguaje natural (inglés), es
autodocumentado y ofrece grandes facilidades en el manejo de archivos, así como en la edición de informes
escritos. Puede emplear términos comúnmente utilizados en los negocios.
Entre sus inconvenientes están sus rígidas reglas de formatos de escritura, la necesidad de escribir todos los
elementos al máximo detalle, la extensión excesiva en sus sentencias, e incluso duplicación en algunos casos,
y la inexistencia de funciones matemáticas.
No obstante, se puede afirmar que en la actualidad continua siendo el lenguaje mas utilizado en las
aplicaciones de gestión.
PL/I
Fue creado a comienzos de los años sesenta por IBM para ser usado en sus equipos del sistema 360.
Inspirándose en los lenguajes ALGOL, COBOL y FORTRAN se desarrollo el PL/I (Programming
Language/I) tomando las mejores características de los anteriores y añadiendo algunas nuevas, con el objetivo
de obtener un lenguaje lo mas general posible en cuanto a su implementación, útil para aplicaciones técnicocientíficas,
comerciales, de proceso de textos, de bases de datos y de programación de sistemas. Se trata de un
lenguaje de programación complejo. Compilado y estructurado, es capaz de gestionar errores y de procesar
multitareas, y se emplea en entornos académicos y de investigación.
Entre sus novedades esta su gran libertad en el formato de escritura de los programas: soporta la programación
estructurada y diseño modular. Es un lenguaje flexible y sofisticado. No obstante, no ha superado a sus
progenitores en sus aplicaciones especificas, debido en parte a su amplitud y, por ello, al tamaño de su
compilador que hasta ahora solo se podía instalar en grandes equipos. El elemento básico de este programa es
el enunciado que termina en punto y coma. Los enunciados se combinan en procedimientos. Un
procedimiento puede representar por completo a un programa pequeño o un “bloque de construcción” o
modulo de un programa más complejo.
BASIC
El lenguaje BASIC fue diseñado por los profesores John G. Kemeny y Thomas E. Kurtz del Dartmouth
College (Estados Unidos) en 1965, con el objetivo principal de proporcionar a los principiantes un lenguaje
fácil de aprender, como se indica en su nombre Beginner's All-purpose Symbolic Instruction Code (Código de
instrucciones simbólico de propósito general para principiantes). Es un lenguaje interactivo muy popular que
tiene una aceptación debido a la facilidad de su uso, es un idioma simple para aprender y fácil de traducir.
Que sé interactivo, permite la comunicación directa entre el usuario y el sistema de computo durante la
preparación y uso de los programas.
Entre sus principales novedades están las de ser un lenguaje interpretado y de uso conversacional, útil para
aplicaciones técnicas y de gestión. Esto, unido a la popularización de las microcomputadoras y computadoras
personales, ha hecho que su utilización sea haya extendido enormemente, a la vez que ha propiciado el
surgimiento de una gran diversidad de diversiones que extienden y se adaptan a necesidades particulares el
lenguaje original. Existen multitud de interpretes y compiladores del lenguaje.
PASCAL
Fue creado por el matemático suizo Nicklaus Wirth en 1970, basándose en el lenguaje ALGOL, en cuyo
diseño había participado en los años sesenta. Su nombre proviene del filosofo y matemático francés del siglo
XVII, Blaise Pascal, que invento la primera maquina tipo mecánico para sumar. Fue el primer gran lenguaje
creado después de haber sido ampliamente diseminados los conceptos asociados con la programación
estructurada.
Aunque en principio la idea del diseñador era proporcionar un lenguaje adecuado para la enseñanza de los
conceptos y técnicas de programación, con el tiempo ha llegado a ser un lenguaje ampliamente utilizado en
todo tipo de aplicaciones, que posee grandes facilidades para la programación de sistemas y diseño grafico.
Aporta los conceptos de tipo de datos, programación estructurada y diseño descendente, entre otros, además
de haberse convertido en predecesor de otros lenguajes más modernos, como MODULA-2 y ADA.
C
Este lenguaje fue creado en 1972 por Dennis Ritchie a partir del trabajo elaborado por su colega de los
laboratorios Bell Telephone, Ken Thompson. Estos habían diseñado con anterioridad el sistema operativo
UNIX, y su intención al desarrollar el lenguaje C fue la de conseguir un lenguaje idóneo para la programación
de sistemas que fuese independiente de la maquina, con el cual escribir su sistema UNIX.
Aunque, como acabo de decir, fue diseñado inicialmente para la programación de sistemas, posteriormente su
uso se ha extendido a ablaciones técnico-científicas, de bases de datos, de proceso de textos, etc.
En 1980 Bjarne Stroustrup, inspirado en el lenguaje Simula67 adicionó las características de la programación
orientada a objetos incluyendo la ventaja de una biblioteca de funciones orientadas a objetos) y lo denomino C
con clases. Para 1983 dicha denominación cambio a la de C++. Con este nuevo enfoque surge la nueva
metodología que aumenta las posibilidades de la programación bajo nuevos conceptos.
La utilización optima de este lenguaje se consigue dentro de su entorno natural, que ese el sistema operativo
UNIX, y entre sus características destaca el uso de programación estructurada para resolver tareas de bajo
nivel, así como la amplia librería de rutinas de que dispone. El lenguaje C reúne características de
programación intermedia entre los lenguajes ensambladores y los lenguajes de alto nivel; con gran poderío
basado en sus operaciones a nivel de bits (propias de ensambladores) y la mayoría de los elementos de la
programación estructurada de los lenguajes de alto nivel, por lo que resulta ser el lenguaje preferido para el
desarrollo de software de sistemas y aplicaciones profesionales de la programación de computadoras.
MODULA-2
El lenguaje MODULA fue diseñado en 1977 bajo la dirección de Nicklaus Wirth, creador también el lenguaje
PASCAL, con la intención de incluir las necesidades de la programación de sistemas y dar respuestas a las
criticas recibidas respecto de las carencias del lenguaje PASCAL. En 1979 se realiza una versión que pasa a
denominarse MODULA-2 y que perdura en la actualidad.
Además de incluir las características de su predecesor, este nuevo lenguaje incorpora las principales carencias
de aquel, como la posibilidad de compilación separada, creación de librerías, programación concurrente,
mejora el manejo de cadenas de caracteres, los procedimientos de entrada/salida y la gestión de la memoria,
etc. además, posee grandes facilidades para la programación de sistemas.
También, debido a sus cualidades didácticas, ha sido ampliamente aceptado por la comunidad universitaria
como herramienta idónea para la enseñanza de la programación.
ADA
Es él ultimo intento de obtener un único lenguaje para todo tipo de aplicaciones, e incluso los últimos avances
de técnicas de programación. Su diseño fue encargado por el Departamento de Defensa de Estados Unidos,
para su uso en servicios militares, 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.
La estandarización del lenguaje se publico en 1983 con el nombre de ADA, en honor de la considerada
primera programadora de la historia, Augusta Ada Byron, condesa de Lovelace.
Entre las características del lenguaje se encuentran la compilación separada, los tipos abstractos de datos,
programación concurrente, programación estructurada, libertad de formatos de escritura, etc. Como principal
inconveniente presenta su gran extensión. Los escritores lo llamaron inflexible e ineficiente, en tanto que sus
favorecedores lo consideraban un gran avance en la tecnología del software.
LISP
En informática, acrónimo de List Processing. Un lenguaje de programación para ordenadores o computadoras
orientado a la generación de listas, desarrollado en 1959-1960 por John McCarthy y usado principalmente
para manipular listas de datos o de símbolos. El lenguaje LISP constituyó un cambio radical con respecto a los
lenguajes procedurales (FORTRAN, ALGOL) que se desarrollaban por entonces. El LISP es un lenguaje
interpretado, en el que cada expresión es una lista de llamadas a funciones. Este lenguaje se sigue utilizando
con frecuencia en investigación y en círculos académicos, y fue considerado durante mucho tiempo el
lenguaje modelo para la investigación de la inteligencia artificial (IA), aunque el Prolog ha ganado terreno
durante los últimos años.
LOGO
En informática, lenguaje de programación de ordenadores o computadoras, desarrollado en 1968 por Seymour
Papert en el MIT, que se usa frecuentemente en la enseñanza de lenguaje de programación a niños. Una
característica importante de Logo son los gráficos de tortuga, que permiten al programador hacer dibujos
simples dirigiendo los movimientos de la tortuga en la pantalla hacia adelante, hacia la derecha o la izquierda.
Una vez que dominan el entorno sencillo del dibujo, el programador (normalmente un niño o una niña)
empieza a descubrir las características más sofisticadas del lenguaje, que están basadas fundamentalmente en
el lenguaje de programación LISP. Logo está considerado como un lenguaje para la formación, a pesar de que
algunas empresas intentaron que tuviera una mayor aceptación en los círculos profesionales de programación.
RPG
Report Program Operator fue introducido en 1960 como un lenguaje para duplicar rápidamente el enfoque de
proceso utilizado con un equipo de tarjeta perforada. Este lenguaje fue desarrollado por IBM en 1964. Su uso
esta aun limitado sobre todo para las aplicaciones de negocios que son procesadas en pequeñas computadoras,
generar informes comerciales o de negocios. Como su nombre lo sugiere, el RPG esta diseñado para generar
los reportes de salida que resultan del proceso de aplicaciones de negocios.
A pesar de las aplicaciones de actualización de archivos, el RPG es un lenguaje de propósito limitado porque
los programas objeto generados por el compilador de RPG siguen sin desviación, un ciclo de procesamiento
básico.
Una ventaja del RPG es la relativa facilidad para aprenderlo y usarlo. Dado que la lógica de la programación
es fija, existen menos reglas formales que en otros lenguajes.
ALGOL
El ALGOL (ALGOritmic Language) fue presentado en 1958. Fue el primer lenguaje de programación de
proceso estructurado de alto nivel. Fue orientado al uso de quienes participan en proyectos científicos y
matemáticos. Un grupo internacional de matemáticos europeos y americanos, pretendían crear un lenguaje
común normalizado que les permitiera el intercambio de algoritmos, aunque esta en desuso, fue el primero
que incorporo conceptos claves para la programación actual.
APL
Sus siglas significan (A Programming Language). Un Lenguaje de Programación. Este programa fue
desarrollado por Kenneth Inverson en el año 1961 para resolver problemas matemáticos. Este lenguaje se
caracteriza por su brevedad y por su capacidad de generación de matrices y se utiliza en el desarrollo de
modelos matemáticos.
PILOT
Programmend Inquiry Language Or Teaching (Consulta, lenguaje o aprendizaje de investigación programada)
creado en 1969.
Este lenguaje de programación es utilizado fundamentalmente para crear aplicaciones destinadas a
instrucciones asistidas por computadoras. Se caracteriza por utilizar un mínimo de sintaxis.
SMALLTALK
SMALLTALK, Lenguaje de Programación orientado a objetos integrados con un entorno de desarrollo
multiventana. SMALLTALK no es solo un hermoso lenguaje de computación orientado a objetos. El entorno
de desarrollo merece similar valoración y ha sido copiado muchas veces, desde el Sistema Operativo de Apple
MS Windows y Borland Pascal (en una memoria extensión). Muchos conceptos de SMALLTALK como los
browsers y las técnicas de browsing han encontrado hoy su rumbo en muchas herramientas de desarrollo de la
generación X, desarrollado por SMALLTALK poseen un factor “divertido-de-usar”. Los cambios se graban
instantáneamente y los mismos pueden probarse rápidamente.
SMALLTALK fue desarrollado dentro del Grupo de Investigación del Aprendizaje en el Centro de
Investigación de Xerox en palo Alto a comienzos de los 70. Las principales ideas de SMALLTALK se le
atribuyen generalmente a Alan kay con raíces en Simula, LISP y SketchPad. Dan Ingalls escribió el código de
las primeras ventanas solapables, los pop-up menús y la clase BitBlt. Adele Goldberg y Dave Robson
escribieron los manuales de referencia para SMALLTALK y fueron miembros clave del equipo de desarrollo.
Un programa de licenciamiento de Xerox y Xerox Special Information Systems. Sin embargo la distribución
generalizada a la comunidad de desarrollo no sucedió hasta la fundación de una nueva compañía llamada
ParcPlace Systems Inc. , Dirigida por Adele Goldberg.
Un segundo SMALLTALK (SMALLTALK 4) fue desarrollado por Digitalk en los Angeles California. Este
SMALLTALK estaba dirigido a cubrir la necesidad de un producto pequeño, de alta velocidad, basado en PC.
Object Technology International Inc. (OTI) desarrolló un conjunto de herramientas para proveer el control de
inversiones y el manejo de configuraciones en grandes proyectos. IBM desarrolló la familia de productos
VisualAge para SMALLTALK en colaboración con Object Technology (antiguamente ParcPlase-Digitalk) e
IBM permanecen como los distribuidores dominantes de entornos de desarrollos en SMALLTALK. Algunos
nuevos SMALLTALK se hallan en etapa de desarrollo.
FORTH
Lenguaje de cuarta generación, creado en 1970, es un lenguaje estructurado e interpretado de fácil ampliación
y ofrece una alta funcionalidad en un espacio reducido. Es un lenguaje de alto nivel del cual derivan en la
actualidad casi todos los lenguajes empleados en los robots.
LENGUAJE C++
Se pronuncia “ce plus plus”. Fue desarrollada por Bjarme Stroustrup en los Bell Laboratories a principios de
la década de los 80. C++ introduce la programación orientada al objeto en C. Es un lenguaje extremadamente
poderoso y eficiente. C++ es un super conjunto de C, para aprender C++ significa aprender todo de C, luego
aprender programación orientada al objeto y el uso de éstas con C++.
DELPHI
Es un entorno de programación visual orientado a objetos para desarrollo rápido de aplicaciones (RAD) de
propósito general, incluyendo aplicaciones cliente/servidor.
Delphi es la versión de Delphi para 32 bits (delphi 3), es decir son casi los mismos, con la única diferencia
que Delphi 3 es mucho más mejorado, por ejemplo contiene un TeeChart, que sirve para los gráficos de
negocio.
Delphi tiene las siguiente características:
Rendimiento - con el mejor y más rápido compilador del mundo.
Empresa e Internet - soluciones cliente y servicio
Desarrollo de aplicaciones rápidas (RAD).
Reusabilidad de componentes, un verdadero entorno orientado a objetos.
Manejo de Base de Datos escalables.
Arquitectura multinivel abierta y dimensionable.
Diseminación de información de base de datos en la Web a una gran velocidad.
JAVA
Es un lenguaje de programación para crear programas seguros, portátiles, orientados a objetos interactivos,
para mejorar la entrega de información a través de Internet, etc.
JAVASCRIPT
Este lenguaje de programación originalmente fue llamado LIVESCRIPT, pero luego fue renombrado con el
nombre de JAVASCRIPT, con la idea de capitalizar la fama de Java, lenguaje desarrollado por Sun
Microsystems. Éste es un complemento ideal del lenguaje HTML, al permitir a la página realizar algunas
tareas por si misma, sin necesidad de estar sobrecargando el servidor del cual depende; JAVASCRIPT es un
lenguaje diseñado especialmente para ejecutarlo en internet.
Entre estas tareas, puede estar, por ejemplo, realizar algunos cálculos simples, formatear un texto para que sea
leído por distintas personas de manera distinta, proveer de un medio de configurar la visualización de una
página, realizar un prechequeo de validación en formulario antes de enviarlo, etc.
HTML
El lenguaje HTML, sirve para realizar esas atractivas páginas Web. Se trata de un sistema de marcas que
permite enlazar al mismo tiempo texto, sonidos y gráficos dentro del mismo documento, con otros dentro del
servidor o incluso con otros servidores WWW. Es decir, es un editor para combinar textos, imágenes e incluso
sonido y ahora también imágenes en movimiento. Es, en definitiva, la forma de manejar y presentar la
información en la red.
Para escribir documentos de hipertexto se ha desarrollado un nuevo formato de datos o lenguaje llamado
Hyper Text Markup Language (HTML). Este lenguaje permite dar indicaciones precisas al programa cliente
de cómo debe presentarse el documento en pantalla o al ser impreso.
El lenguaje HTML es el usado actualmente para escribir textos Hypermediales en el web.
Tres normas fundamentales:
1.- HTML simplemente texto
Lo primero es saber que un documento HTML es un archivo de texto simple, luego, se puede editar con
cualquier editor de textos.
2.- No importan los Tabs ni los saltos de línea
Los interpretes HTML no toman en cuenta las tabulaciones, los saltos de líneas ni los espacios en blanco
extra. Esto tiene ventajas o desventajas. La principal ventaja es que permite obtener resultados uniformes y de
buena presentación de manera bastante fácil. La principal desventaja es que un documento HTML, por lo
menos se debe usar los comandos <P>... </P> o <BR> para evitar que quede todo el texto en una sola línea.
3.- Existen 3 caracteres especiales:
< menor que, se usa para indicar el comienzo de un comando HTML
>mayor que, se usa para indicar el término de un comando HTML.
& Ampersand, se usa para escribir caracteres especiales (símbolos matemáticos, comerciales, así como
el signo menor que y el mayor que entre otros) en un documento.
Lo primero es conocer los comandos que debe contener todo documento HTML de más de una línea de largo:
EL COMANDO PÁRRAFO:
El comando <P>... </P> se utiliza como un delimitador de párrafo en HTML. Inserta automáticamente un
quiebre de línea al final del párrafo, y produce un espaciamiento conveniente entre los diferentes párrafos de
un documento. También en forma adicional permite alinear el texto al centro, a la izquierda o a la derecha.
EL COMANDO QUIEBRE DE LÍNEAS:
El comando < BR> permite hacer un quiebre (salto)de línea.
LOS COMANDOS DE ENCABEZADO:
Los textos en HTML poseen seis niveles de encabezado. Por ejemplo el nivel 1 se usa para las divisiones
mayores de texto, el nivel de encabezado 6 se usa para las divisiones más chicas de texto.
ESTRUCTURA DE HYPERTEXTO:
Existen dos partes fundamentales de un documento HTML.
ENCABEZADO:
Se inicia mediante el comando<HEAD> y se termina con </HEAD>. Por lo general se incluyen aquí el título
del documento, mediante el comando <TITLE>... </TITLE>.
CUERPO:
Se inicia mediante el comando <BODY> y se termina con el comando. Dentro del cuerpo del documento se
incluyen cualquier carácter imprimible. Además es importante incluir el comando<ADDRESS>...
</ADDRESS> al final del cuerpo pero dentro de él. Dentro del ADDRESS se escribe el nombre del autor del
documento, la organización a la que pertenece, su dirección del correo electrónico y otra información que se
considere relevante.
HYPERTALK
"HyperTalk" es el lenguaje desarrollado por Dan Winkler para Bill Atkinson, el creador del "HyperCard" para
Apple-Macintosh. Está orientado a la creación de aplicaciones conforme al sistema de "hiperarchivos"
(sistemas de fichas interrelacionadas donde se facilita el "navegar" de un archivo a otro).
HyperTalk es un buen ejemplo de lenguaje orientado a objetos. Este tipo de lenguaje combina la lógica
declarativa con los algoritmos (Vea "PROLOG"). Un programa ya no es una secuencia de instrucciones sino
un conjunto de objetos agrupados en conjuntos, definidos mediante atributos y a los cuales pueden asociarse
instrucciones. Así, en HyperCard, existen archivos ("stacks" o "pilas") que agrupan fichas ("cards"), y cada
una de éstas contiene campos de datos y botones. Todos son "objetos" que -si bien mantienen entre sí una
relación jerárquica- tienen asociados paquetes de instrucciones ("scripts") independientes unos de otros. Cada
objeto pertenece a un conjunto (como fichas o botones) que tiene "atributos" propios comunes a todos sus
miembros, y cada atributo tendrá un valor común o específico para cada caso. Para dar o buscar dicho valor
intervienen "facetas" que son instrucciones (procedimientos) asociadas.
Perl
Es un lenguaje especializado en el procesamiento de textos, particularmente extraer y validar las respuestas a
cuestionarios incluidos en páginas web.
PHP
Lenguaje que se acopla al HTML (páginas web) para definir procedimientos que ha de realizar el servidor de
web, por ejemplo procesar un formulario, enviar o extraer datos de una base de datos (acoplándose también
con un lenguaje de tipo SQL), enviar una u otra página web según determinadas condiciones prefijadas por el
programador, etc.
PROLOG
Los primeros años de la década del 70 son conocidos como un período de "crisis del software", en que se
descubrió que la creación de buenos programas involucraba costos mayores que los del hardware que los
ejecuta. También se hacía patente una creciente necesidad de procesar "conocimientos" (algo mucho más
amplio y complejo que los datos cuantitativos o meras "secuencias de caracteres" a los cuales se reducen
muchos lenguajes de programación). Esta crisis llevó a investigar numerosas alternativas, entre las cuales
nuevos lenguajes no basados en instrucciones algorítmicas o procedimientos. Si el hombre "procesa" más
información por inferencia lógica que por cálculo, ¿no podría la máquina hacer lo mismo?
PROLOG ("PROgramación en LOGica") es una respuesta a esta crisis, producto del avance de la lógica
moderna (de tipo funcional). Lo crearon A. Colmenauer y Ph. Roussel, con la colaboración de R. Kowalski,
simultáneamente en la Universidad de Aix-Marseille (Francia) y Edimburgo (Gran Bretaña). Se basa en el
cálculo de predicados de primer orden y en el principio de resolución de Robinson. En vez de ser algorítmico
("procedural" en inglés, término sin traducción), es decir concebido como un conjunto de instrucciones que la
máquina debe ejecutar en forma secuencial, es "declarativo", es decir basado en definiciones (de "hechos" o
"reglas", como se explica más abajo).
SQL
Lenguaje desarrollado especialmente para facilitar la consulta de bases de datos (BD), acotando
progresivamente la búsqueda (de ahí el nombre de "Sequential Query Language").
Existen hoy numerosas aplicaciones de administración de bases de datos que recurren al SQL (Las más
conocidas, potentes - y caras - son Oracle e Informix).
Hoy se pueden acoplar las bases de datos a hipertextos (páginas web), para lo cual las buenas aplicaciones ya
traen módulos que hacen la conexión. El lenguaje PHP del cual hablamos más arriba también sirve para
definir procedimientos de inserción y de consulta de datos en BD que funcionan con SQL.
ASP
Su nombre es Active Server Pages. Es un lenguaje independiente, diseñado por Microsoft para la codificación
eficiente de los scripts de los servidores, que fueron diseñados para ser ejecutados por un servidor Web en
respuesta a la petición de un URL de un usuario. Los scripts de ASP son similares a otros scripts de servidores
con los que puedes estar familiarizado, que son utilizados en otras plataformas, como Perl, Python, etc.
EVOLUCION DE LOS LENGUAJES DE PROGRAMACIÓN
periodo Influencias Lenguajes
1950 - 55 Ordenadores primitivos Lenguajes ensamblador
Lenguajes experimentales
de alto nivel
1956 - 60 Ordenadores pequeños, FORTRAN
caros y lentos ALGOL 58 y 60
Cintas magnéticas COBOL
Compiladores e interpretes LISP
Optimización del código
1961 - 65 Ord. grandes y caros FORTRAN IV
Discos Magnéticos COBOL 61 Extendido
Sistemas operativos ALGOL 60 Revisado
Leng. de propósito general SNOBOL
APL ( como notación sólo)
1966 - 70 Ordenadores de diferentes PL/I
tamaños, velocidades, costes FORTRAN 66 (estandard)
Sistemas de almacenamiento COBOL 65 (estandard)
masivo de datos (caros) ALGOL 68
S.O. multitarea e SNOBOL4
interactivos SIMULA 67
Compil. con optimización BASIC
Leng. estandard , APL/360
flexibles y generales
1971 - 75 Micro ordenadores
Sistemas de almacenamiento PASCAL
masivo de datos pequeños COBOL 74
y baratos PL /I
Progr. estructurada
Ingeniería del software
Leng. sencillos
1976 - 80 Ord. baratos y potentes ADA
Sistemas distribuidos FORTRAN 77
Prog. tiempo-real PROLOG
Prog. interactiva C
Abstracción de datos
Prog. con fiabilidad
y fácil mantenimiento
Todo este desarrollo de las computadoras y de los lenguajes de programación, suele divisarse por
generaciones y el criterio que se determinó para determinar el cambio de generación no está muy bien
definido, pero resulta aparente que deben cumplirse al menos los siguientes requisitos:
La forma en que están construidas.
Forma en que el ser humano se comunica con ellas.
Primera Generación
En esta generación había un gran desconocimiento de las capacidades de las computadoras, puesto que se
realizó un estudio en esta época que determinó que con veinte computadoras se saturaría el mercado de los
Estados Unidos en el campo de procesamiento de datos.
Esta generación abarco la década de los cincuenta. Y se conoce como la primera generación. Estas máquinas
tenían las siguientes características:
Estas máquinas estaban construidas por medio de tubos de vacío.
Eran programadas en lenguaje de máquina. 1
En esta generación las máquinas son grandes y costosas (de un costo aproximado de ciento de miles de
dólares). En 1951 aparece la UNIVAC (NIVersAl Computer), fue la primera computadora comercial, que
disponía de mil palabras de memoria central y podían leer cintas magnéticas, se utilizó para procesar el censo
de 1950 en los Estados Unidos.
En las dos primeras generaciones, las unidades de entrada utilizaban tarjetas perforadas, retomadas por
Herman Hollerith (1860 - 1929), quien además fundó una compañía que con el paso del tiempo se conocería
como IBM (International Bussines Machines).
Después se desarrolló por IBM la IBM 701 de la cual se entregaron 18 unidades entre 1953 y 1957.
Posteriormente, la compañía Remington Rand fabricó el modelo 1103, que competía con la 701 en el campo
científico, por lo que la IBM desarrollo la 702, la cual presentó problemas en memoria, debido a esto no duró
en el mercado.
La computadora más exitosa de la primera generación fue la IBM 650, de la cual se produjeron varios cientos.
Esta computadora que usaba un esquema de memoria secundaria llamado tambor magnético, que es el
antecesor de los discos actuales.
Otros modelos de computadora que se pueden situar en los inicios de la segunda generación son: la UNIVAC
80 y 90, las IBM 704 y 709, Burroughs 220 y UNIVAC 1105.
Segunda Generación
Cerca de la década de 1960, las computadoras seguían evolucionando, se reducía su tamaño y crecía su
capacidad de procesamiento. También en esta época se empezó a definir la forma de comunicarse con las
computadoras, que recibía el nombre de programación de sistemas.
Las características de la segunda generación son las siguientes:
Están construidas con circuitos de transistores.
Se programan en nuevos lenguajes llamados lenguajes de alto nivel.
En esta generación las computadoras se reducen de tamaño y son de menor costo. Aparecen muchas
compañías y las computadoras eran bastante avanzadas para su época como la serie 5000 de Burroughs y la
ATLAS de la Universidad de Manchester.
Algunas de estas computadoras se programaban con cintas perforadas y otras más por medio de cableado en
un tablero. Los programas eran hechos a la medida por un equipo de expertos: analistas, diseñadores,
programadores y operadores que se manejaban como una orquesta para resolver los problemas y cálculos
solicitados por la administración. El usuario final de la información no tenía contacto directo con las
computadoras. Esta situación en un principio se produjo en las primeras computadoras personales, pues se
requería saberlas "programar" (alimentarle instrucciones) para obtener resultados; por lo tanto su uso estaba
limitado a aquellos audaces pioneros que gustaran de pasar un buen número de horas escribiendo
instrucciones, "corriendo" el programa resultante y verificando y corrigiendo los errores o bugs que
aparecieran. Además, para no perder el "programa" resultante había que "guardarlo" (almacenarlo) en una
grabadora de astte, pues en esa época no había discos flexibles y mucho menos discos duros para las PC; este
procedimiento podía tomar de 10 a 45 minutos, según el programa. El panorama se modificó totalmente con la
aparición de las computadoras personales con mejore circuitos, más memoria, unidades de disco flexible y
sobre todo con la aparición de programas de aplicación general en donde el usuario compra el programa y se
pone a trabajar. Aparecen los programas procesadores de palabras como el célebre Word Star, la
impresionante hoja de cálculo (spreadsheet) Visicalc y otros más que de la noche a la mañana cambian la
imagen de la PC. El sortware empieza a tratar de alcanzar el paso del hardware. Pero aquí aparece un nuevo
elemento: el usuario.
El usuario de las computadoras va cambiando y evolucionando con el tiempo. De estar totalmente
desconectado a ellas en las máquinas grandes pasa la PC a ser pieza clave en el diseño tanto del hardware
como del software. Aparece el concepto de human interface que es la relación entre el usuario y su
computadora. Se habla entonces de hardware ergonómico (adaptado a las dimensiones humanas para reducir
el cansancio), diseños de pantallas antirreflejos y teclados que descansen la muñeca. Con respecto al software
se inicia una verdadera carrera para encontrar la manera en que el usuario pase menos tiempo capacitándose y
entrenándose y más tiempo produciendo. Se ponen al alcance programas con menús (listas de opciones) que
orientan en todo momento al usuario (con el consiguiente aburrimiento de los usuarios expertos); otros
programas ofrecen toda una artillería de teclas de control y teclas de funciones (atajos) para efectuar toda
suerte de efectos en el trabajo (con la consiguiente desorientación de los usuarios novatos). Se ofrecen un
sinnúmero de cursos prometiendo que en pocas semanas hacen de cualquier persona un experto en los
programas comerciales. Pero el problema "constante" es que ninguna solución para el uso de los programas es
"constante". Cada nuevo programa requiere aprender nuevos controles, nuevos trucos, nuevos menús. Se
empieza a sentir que la relación usuario-PC no está acorde con los desarrollos del equipo y de la potencia de
los programas. Hace falta una relación amistosa entre el usuario y la PC.
Las computadoras de esta generación fueron: la Philco 212 (esta compañía se retiró del mercado en 1964) y la
UNIVAC M460, la Control Data Corporation modelo 1604, seguida por la serie 3000, la IBM mejoró la 709 y
sacó al mercado la 7090, la National Cash Register empezó a producir máquinas para proceso de datos de tipo
comercial, introdujo el modelo NCR 315.
La Radio Corporation of America introdujo el modelo 501, que manejaba el lenguaje COBOL, para procesos
administrativos y comerciales. Después salió al mercado la RCA 601.
Tercera generación
Con los progresos de la electrónica y los avances de comunicación con las computadoras en la década de los
1960, surge la tercera generación de las computadoras. Se inaugura con la IBM 360 en abril de 1964.3
Las características de esta generación fueron las siguientes:
Su fabricación electrónica esta basada en circuitos integrados.
Su manejo es por medio de los lenguajes de control de los sistemas operativos.
La IBM produce la serie 360 con los modelos 20, 22, 30, 40, 50, 65, 67, 75, 85, 90, 195 que utilizaban
técnicas especiales del procesador, unidades de cinta de nueve canales, paquetes de discos magnéticos y otras
características que ahora son estándares (no todos los modelos usaban estas técnicas, sino que estaba dividido
por aplicaciones).
El sistema operativo de la serie 360, se llamó OS que contaba con varias configuraciones, incluía un conjunto
de técnicas de manejo de memoria y del procesador que pronto se convirtieron en estándares. 2
En 1964 CDC introdujo la serie 6000 con la computadora 6600 que se consideró durante algunos años como
la más rápida.
En la década de 1970, la IBM produce la serie 370 (modelos 115, 125, 135, 145, 158, 168). UNIVAC compite
son los modelos 1108 y 1110, máquinas en gran escala; mientras que CDC produce su serie 7000 con el
modelo 7600. Estas computadoras se caracterizan por ser muy potentes y veloces.
A finales de esta década la IBM de su serie 370 produce los modelos 3031, 3033, 4341. Burroughs con su
serie 6000 produce los modelos 6500 y 6700 de avanzado diseño, que se reemplazaron por su serie 7000.
Honey - Well participa con su computadora DPS con varios modelos.
A mediados de la década de 1970, aparecen en el mercado las computadoras de tamaño mediano, o
minicomputadoras que no son tan costosas como las grandes (llamadas también como mainframes que
significa también, gran sistema), pero disponen de gran capacidad de procesamiento. Algunas
minicomputadoras fueron las siguientes: la PDP - 8 y la PDP - 11 de Digital Equipment Corporation, la VAX
(Virtual Address eXtended) de la misma compañía, los modelos NOVA y ECLIPSE de Data General, la serie
3000 y 9000 de Hewlett - Packard con varios modelos el 36 y el 34,
la Wang y Honey - Well -Bull, Siemens de origen alemán, la ICL fabricada en Inglaterra. En la Unión
Soviética se utilizó la US (Sistema Unificado, Ryad) que ha pasado por varias generaciones.
Cuarta Generación
Aquí aparecen los microprocesadores que es un gran adelanto de la microelectrónica, son circuitos integrados
de alta densidad y con una velocidad impresionante. Las microcomputadoras con base en estos circuitos son
extremadamente pequeñas y baratas, por lo que su uso se extiende al mercado industrial. Aquí nacen las
computadoras personales que han adquirido proporciones enormes y que han influido en la sociedad en
general sobre la llamada "revolución informática".
En 1976 Steve Wozniak y Steve Jobs inventan la primera microcomputadora de uso masivo y más tarde
forman la compañía conocida como la Apple que fue la segunda compañía más grande del mundo, antecedida
tan solo por IBM; y esta por su parte es aún de las cinco compañías más grandes del mundo.
En 1981 se vendieron 800 00 computadoras personales, al siguiente subió a 1 400 000. Entre 1984 y 1987 se
vendieron alrededor de 60 millones de computadoras personales, por lo que no queda duda que su impacto y
penetración han sido enormes.
Con el surgimiento de las computadoras personales, el software y los sistemas que con ellas de manejan han
tenido un considerable avance, porque han hecho más interactiva la comunicación con el usuario. Surgen otras
aplicaciones como los procesadores de palabra, las hojas electrónicas de cálculo, paquetes gráficos, etc.
También las industrias del Software de las computadoras personales crecen con gran rapidez, Gary Kildall y
William Gates se dedicaron durante años a la creación de sistemas operativos y métodos para lograr una
utilización sencilla de las microcomputadoras (son los creadores de CP/M y de los productos de Microsoft).
No todo son microcomputadoras, por su puesto, las minicomputadoras y los grandes sistemas continúan en
desarrollo. De hecho las máquinas pequeñas rebasaban por mucho la capacidad de los grandes sistemas de 10
o 15 años antes, que requerían de instalaciones costosas y especiales, pero sería equivocado suponer que las
grandes computadoras han desaparecido; por el contrario, su presencia era ya ineludible en prácticamente
todas las esferas de control gubernamental, militar y de la gran industria. Las enormes computadoras de las
series CDC, CRAY, Hitachi o IBM por ejemplo, eran capaces de atender a varios cientos de millones de
operaciones por segundo.
Quinta Generación
En vista de la acelerada marcha de la microelectrónica, la sociedad industrial se ha dado a la tarea de poner
también a esa altura el desarrollo del software y los sistemas con que se manejan las computadoras. Surge la
competencia internacional por el dominio del mercado de la computación, en la que se perfilan dos líderes
que, sin embargo, no han podido alcanzar el nivel que se desea: la capacidad de comunicarse con la
computadora en un lenguaje más cotidiano y no a través de códigos o lenguajes de control especializados.
Japón lanzó en 1983 el llamado "programa de la quinta generación de computadoras", con los objetivos
explícitos de producir máquinas con innovaciones reales en los criterios mencionados. Y en los Estados
Unidos ya está en actividad un programa en desarrollo que persigue objetivos semejantes, que pueden
resumirse de la siguiente manera:
Procesamiento en paralelo mediante arquitecturas y diseños especiales y circuitos de gran velocidad.
Manejo de lenguaje natural y sistemas de inteligencia artificial.
3.-DESCRIBA AMPLIAMENTE EL DESARROLLO HISTORICO DEL SOFTWARE.
El software como se ha visto, no surge con los equipos electrónicos, -aunque es con ellos que adopta el
nombre- está presente desde el empleo de ábacos o sumadoras mecánicas. Sin embargo, en estos casos, el
software no se encuentra incorporado en el equipo. Es aportado por el operario. La máquina analítica de
Charles Babbage, incidentalmente, tuvo su software, y fue una amiga de éste, la legendaria lady Lovelace,
quien aportó el software que no se llegó a usar, dado que la máquina nunca se completó.
En el ENIAC el control de las operaciones estaba parcialmente integrado en el equipo. Dicho control era
realizado por un circuito que requería un alambrado específico para cada aplicación. Imaginemos lo engorroso
que resultaba realambrar el circuito cada vez que cambiaba el uso del ENIAC.
Hasta este momento, no se percibía una diferencia sustancial entre el equipo y el control de las operaciones.
El concepto de programa de control almacenado en memoria, aportación popularmente atribuida a John von
Neumann, precipitó el desarrollo de software. En éste se perfilaron dos tendencias de desarrollo: los
programas de aplicación y los de servicio. Estos últimos tenían como propósito facilitar el desarrollo de
programas a partir de programas.
Algunos programas de servicio fueron simples cargadores que permitieron emplear notaciones como el octal o
hexadecimal más compactas que el binario. Otros como los ensambladores simplificaron más el proceso al
reemplazar las notaciones numéricas con los símbolos mnemónicos que aportaron para describir a cada
instrucción de la máquina. El siguiente paso significativo fue la traducción de fórmulas, que permitió la
descripción de los algoritmos con el empleo de expresiones algebraicas. Dicha traducción se realiza con
programas que se denominan compiladores, generan programas que al ejecutarse producen los resultados.
Es importante destacar que en tanto los programas de aplicación saturaron los recursos de los equipos,
imponiendo sus requerimientos en cuanto a velocidad, precisión en la aritmética y capacidad en los
almacenamientos; los programas de servicio repercutieron en la evolución de la arquitectura de los equipos
(hardware). Entre las aportaciones más notables, podemos citar el empleo de pilas y el reemplazo de
referencias físicas por lógicas.
Con la pila (Push Down List), se da lugar al manejo recursivo de los procesos. Por ejemplo, esto ocurre en una
oficina administrativa, cuando se pospone la solución de un problema para resolver otro de mayor exigencia.
El problema original se suspende y se aborda nuevamente cuando el de mayor exigencia ya ha sido resuelto.
Con el reemplazo de referencias físicas por lógicas, se obtuvo un incremento más real que virtual de los
recursos disponibles. Almacenamientos secundarios, registros operacionales, memoria virtual, memoria cache
e hizo translapes (overlay), son algunas de las técnicas que emplean este concepto. El efecto es similar al de
las operaciones bancarias nominales con que las instituciones de crédito prestan varias veces su capital.
Los elementos aportados por los programas de servicio, al interrelacionarse configuran el sistema operativo
con el cual se administran los recursos disponibles en las computadoras y se establecen líneas de producción
para el proceso de programas con una mínima participación del operario: la automatización de la
automatización. Al principio, los sistemas operativos brotan como extensiones de los lenguajes.
Posteriormente, el fenómeno se invierte de modo que los sistemas operativos configuren el ambiente en el que
se desempeñan las aplicaciones y los programas de servicio.
4.-MEDIANTEUNA TABLA DESCRIPTIVA ILUSTRE LA COMPARACION DE 20 LENGUAJES DE PROGRAMACION DIFERENTES CON RESPECTOS A 10 CARACTERISTICAS PRINCIPALES QUE DEBEN CUBRIR LOS LENGUAJES DE PROGRAMACION.
5.-MEDIANTE UNA TABLA DESCRIPTIVA ILUSTRE LA COMPARACION DE 20 SOFTWARES DIFERENTES CON RESPECTO A 10 CARACTERISTICAS PRINCIPALES QUE DEBEN CUBRIR LOS SOFTWARES.
6.-ILUSTRE UN EJEMPLO QUE EXPLIQUE AMPLIAMENTE LA ESTRUCTURA DE UN PROGRAMA DESARROLLADO CON LA FILOSOFIA ORIEMTADO A OBJETOS.
Un programa Java se compone de un conjunto de clases que contienen variables de diversos tipos utilizadas
para almacenar datos, y métodos que implementan código capaz de manipular dichas variables y crear
objetos o instancias de clase, que permitan la interacción con otros métodos y variables de esas clases.
El punto de inicio de todo programa Java es el código asociado al método main (principal en inglés), es
como la puerta de entrada del programa, lo primero que se ejecuta.
A la clase que contiene al método main se la llama clase principal.
Las clases y métodos van entre llaves {} y al final de una instrucción o declaración de variable debe escribirse
un punto y coma (;). Se utilizan tabuladores para sangrar las líneas de código con el fin de facilitar su
legibilidad, aunque si se omiten no pasa nada.
Este programa consta de una clase de nombre PrimerSaludo, no declara ninguna variable y cuenta con dos
métodos de nombres main y mostrarMensaje. En programas más complejos, se tendrán varias clases, en cada
clase habrá muchos métodos y declaraciones de variables, dentro de los métodos se declararán también
variables, etc. Por el momento, con esta sencilla clase nos conformaremos. Se va a explicar ahora cada una de
sus líneas.
La primera línea es la definición de una clase, la segunda es el método main o punto de entrada del programa
(siempre se define de esta forma), la tercera es una instrucción o sentencia que muestra por la consola del
DOS el mensaje entrecomillado, la cuarta sirve para crear un objeto de la clase llamado ps mediante el que se
llama o invoca a otros métodos de la clase, la quinta es la llamada mediante el objeto ps al método
mostrarMensaje(), la sexta muestra por consola el mensaje entrecomillado. Luego aparece la definición del
método mostrarMensaje() cuyo código hace que se muestre por consola el mensaje entrecomillado. Después
de compilar y ejecutar este programa va a mostrarse por consola lo siguiente:
A continuación se van a explicar qué son los métodos:
Es una de las herramientas fundamentales de cualquier lenguaje orientado a objetos. Contienen código que
persigue una serie de objetivos. En el ejemplo anterior, la clase contenía dos métodos y sus objetivos eran:
Objetivos del método main: mostrar un mensaje por consola, crear un objeto de la clase
PrimerSaludo, invocar al método mostrarMensaje mediante el objeto anterior y mostrar otro mensaje
por consola. Aparte de estos objetivos, el fundamental y más importante es servir como punto de inicio
de la ejecución del programa.
Objetivos del método mostrarMensaje: mostrar un mensaje por consola.
El programador, aparte de crear sus propios métodos como en el código anterior, puede utilizar los que
forman parte de la API (Application Programming Interface) estándar de Java. La API se estudiará en
siguiente sección.
DECLARACIÓN GENÉRICA DE UN MÉTODO: tiene la siguiente estructura
<modificadores de acceso> <tipo de dato de retorno> <nombre del método>(tipo1 arg1,tipo2 arg2,...){
Cuerpo del método;
}
Explicación de cada uno de los componentes de un método:
Nombre del método: el que desee el programador.
Número y tipo de argumentos asociados al método (tipo1 arg1,tipo2 arg2,...): constituye su firma.
Los argumentos pueden ser tanto variables primitivas como variables referenciadas. Más adelante se
estudiarán estos dos tipos de variables. Por el momento, basta saber que las variables primitivas se
emplean para almacenar números, caracteres o valores lógicos, mientras que las referenciadas están
asociadas a objetos de clases.
Tipo de dato de retorno o tipo de dato que devuelve el método:
Dato asociado a una variable primitiva.
Dato asociado a una variable referenciada.
void. Es lo que debe ponerse cuando el método no devuelve nada y, por ejemplo, simplemente muestra
por consola un mensaje. Es el caso del método "void mostrarMensaje()" del código anterior.
Modificadores de acceso: public, private, protected y sin modificador. Sirven para fijar el grado de
accesibilidad de un método. Además de los de acceso, se tienen otros como static, synchronized, final,
abstract, etc. que afectan de un determinado modo al método. Todos se irán estudiando a lo largo del
curso.
Cuerpo del método: código asociado al método.
7.-ILUSTRE CON UN ESQUEMA LA CLASIFICACION EXTENSA DE TODOS LOS TIPOS DE DATOS QUE EXISTE EN LA PROGRAMACION ORIENTADO A OBJETOS Y EJEMPLIFIQUE CADA UNOCON 5 EJEMPLOS.
A. Tipos de datos simples
Es uno de los conceptos fundamentales de cualquier lenguaje de programación. Estos definen los
métodos de almacenamiento disponibles para representar información, junto con la manera en que
dicha información ha de ser interpretada.
Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de
variable y su identificador que la identificará de forma única. La sintaxis de declaración de variables
es la siguiente:
TipoSimple Identificador1, Identificador2;
Esta sentencia indica al compilador que reserve memoria para dos variables del tipo simple
TipoSimple con nombres Identificador1 e Identificador2.
Los tipos de datos en Java pueden dividirse en dos categorías: simples y compuestos. Los simples
son tipos nucleares que no se derivan de otros tipos, como los enteros, de coma flotante,
booleanos y de carácter. Los tipos compuestos se basan en los tipos simples, e incluyen las
cadenas, las matrices y tanto las clases como las interfaces, en general.
Cada tipo de datos simple soporta un conjunto de literales que le pueden ser asignados, para
darles valor. En este apartado se explican los tipos de datos simples (o primitivos) que presenta
Java, así como los literales que soporta (sintaxis de los valores que se les puede asignar).
a.) Tipos de datos enteros
Se usan para representar números enteros con signo. Hay cuatro tipos: byte, short, int y long.
Tipo Tamaño
byte 1Byte (8 bits)
short 2 Bytes (16 bits)
int 4 Bytes (32 bits)
long 8 Bytes (64 bits)
Tabla 5: Tipos de datos enteros
Literales enteros
Son básicos en la programación en Java y presentan tres formatos:
Decimal: Los literales decimales aparecen como números ordinarios sin ninguna notación
especial.
Hexadecimal: Los hexadecimales (base 16) aparecen con un 0x ó 0X inicial, notación similar
a la utilizada en C y C++.
Octal: Los octales aparecen con un 0 inicial delante de los dígitos.
Por ejemplo, un literal entero para el número decimal 12 se representa en Java como 12 en
decimal, como 0xC en hexadecimal, y como 014 en octal.
Los literales enteros se almacenan por defecto en el tipo int, (4 bytes con signo), o si se trabaja con
números muy grandes, con el tipo long, (8 bytes con signo), añadiendo una L ó l al final del
número.
La declaración de variables enteras es muy sencilla. Un ejemplo de ello sería:
long numeroLargo = 0xC; // Por defecto vale 12
b.) Tipos de datos en coma flotante
Se usan para representar números con partes fraccionarias. Hay dos tipos de coma flotante: float y
double. El primero reserva almacenamiento para un número de precisión simple de 4 bytes y el
segundo lo hace para un numero de precisión doble de 8 bytes.
Tipo Tamaño
float 4 Byte (32 bits)
double 8 Bytes (64 bits)
Tabla 6: Tipos de datos numéricos en coma flotante
Literales en coma flotante
Representan números decimales con partes fraccionarias. Pueden representarse con notación
estándar (563,84) o científica (5.6384e2).
De forma predeterminada son del tipo double (8 bytes). Existe la opción de usar un tipo más corto
(el tipo float de 4 bytes), especificándolo con una F ó f al final del número.
La declaración de variables de coma flotante es muy similar a la de las variables enteras. Por
ejemplo:
double miPi = 314.16e-2 ; // Aproximadamente
float temperatura = (float)36.6; // Paciente sin fiebre
Se realiza un moldeado a temperatura, porque todos los literales con decimales por defecto se
consideran double.
c.) Tipo de datos boolean
Se usa para almacenar variables que presenten dos estados, que serán representados por los
valores true y false. Representan valores bi-estado, provenientes del denominado álgebra de
Boole.
Literales Booleanos
Java utiliza dos palabras clave para los estados: true (para verdadero) y false (para falso). Este tipo
de literales es nuevo respecto a C/C++, lenguajes en los que el valor de falso se representaba por
un 0 numérico, y verdadero cualquier número que no fuese el 0.
Para declarar un dato del tipo booleano se utiliza la palabra reservada boolean:
boolean reciboPagado = false; // ¡¿Aun no nos han pagado?!
d.) Tipo de datos carácter
Se usa para almacenar caracteres Unicode simples. Debido a que el conjunto de caracteres
Unicode se compone de valores de 16 bits, el tipo de datos char se almacena en un entero sin
signo de 16 bits.
Java a diferencia de C/C++ distingue entre matrices de caracteres y cadenas.
Literales carácter
Representan un único carácter (de la tabla de caracteres Unicode 1.1) y aparecen dentro de un par
de comillas simples. De forma similar que en C/C++. Los caracteres especiales (de control y no
imprimibles) se representan con una barra invertida ('') seguida del código carácter.
Descripción Representación Valor Unicode
Caracter Unicode udddd
Numero octal ddd
Barra invertida \ u005C
Continuación
Retroceso b u0008
Retorno de carro r u000D
Alimentación de
formularios
f u000C
Tabulación horizontal t u0009
Línea nueva n u000A
Comillas simples ’ u0027
Comillas dobles " u0022
Números arábigos ASCII 0-9 u0030 a u0039
Alfabeto ASCII en
mayúsculas
A.-Z u0041 a u005A
Alfabeto ASCII en a.-z u0061 a u007A
minúsculas
Tabla 7: Caracteres especiales Java
Las variables de tipo char se declaran de la siguiente forma:
char letraMayuscula = 'A'; // Observe la necesidad de las ' '
char letraV = 'u0056'; // Letra 'V'
e.) Conversión de tipos de datos
En Java es posible transformar el tipo de una variable u objeto en otro diferente al original con el
que fue declarado. Este proceso se denomina "conversión", "moldeado" o "tipado". La conversión
se lleva a cabo colocando el tipo destino entre paréntesis, a la izquierda del valor que queremos
convertir de la forma siguiente:
char c = (char)System.in.read();
La función read devuelve un valor int, que se convierte en un char debido a la conversión (char), y
el valor resultante se almacena en la variable de tipo carácter c.
El tamaño de los tipos que queremos convertir es muy importante. No todos los tipos se convertirán
de forma segura. Por ejemplo, al convertir un long en un int, el compilador corta los 32 bits
superiores del long (de 64 bits), de forma que encajen en los 32 bits del int, con lo que si contienen
información útil, esta se perderá.
Por ello se establece la norma de que "en las conversiones el tipo destino siempre debe ser igual o
mayor que el tipo fuente":
Tipo Origen Tipo Destino
byte double, float, long, int, char,
short
short double, float, long, int
char double, float, long, int
int double, float, long
long double, float
float double
Tabla 8: Conversiones sin pérdidas de información
B. Vectores y Matrices
Una matriz es una construcción que proporciona almacenaje a una lista de elementos del mismo
tipo, ya sea simple o compuesto. Si la matriz tiene solo una dimensión, se la denomina vector.
En Java los vectores se declaran utilizando corchetes ( [ y ] ), tras la declaración del tipo de datos
que contendrá el vector. Por ejemplo, esta sería la declaración de un vector de números enteros
(int):
int vectorNumeros[ ]; // Vector de números
Se observa la ausencia de un número que indique cuántos elementos componen el vector, debido
a que Java no deja indicar el tamaño de un vector vacío cuando le declara. La asignación de
memoria al vector se realiza de forma explícita en algún momento del programa.
Para ello o se utiliza el operador new:
int vectorNumeros = new int[ 5 ]; // Vector de 5 números
O se asigna una lista de elementos al vector:
int vectorIni = { 2, 5, 8}; // == int vectorIni[3]=new int[3];
Se puede observar que los corchetes son opcionales en este tipo de declaración de vector, tanto
después del tipo de variable como después del identificador.
Si se utiliza la forma de new se establecerá el valor 0 a cada uno de los elementos del vector.
C. Cadenas
En Java se tratan como una clase especial llamada String. Las cadenas se gestionan internamente
por medio de una instancia de la clase String. Una instancia de la clase String es un objeto que ha
sido creado siguiendo la descripción de la clase.
Cadenas constantes
Representan múltiples caracteres y aparecen dentro de un par de comillas dobles. Se implementan
en Java con la clase String. Esta representación es muy diferente de la de C/C++ de cadenas como
una matriz de caracteres.
Cuando Java encuentra una constante de cadena, crea un caso de la clase String y define su
estado, con los caracteres que aparecen dentro de las comillas dobles.
Vemos un ejemplo de cadena declarada con la clase String de Java:
String capitalUSA = "Washington D.C.";
String nombreBonito = "Amelia";
Más tarde profundizaremos con detenimiento en las cadenas Java.
8.-EXPLIQUE AMPLIAMENTE LAS REGLAS FUNDAMENTALES PARA CREAR IDENTIFICADORES VALIDOS EN P.O.O. E ILUSTRE 5 EJEMPLOS DE IDENTIFICADORES POR CADA TIPO DE DATOEXISTENTE.
Hay una serie de normas muy recomendables para crear identificadores en Java: En Java es
habitual escribir todos los identificadores en minúscula teniendo en cuenta las siguientes
excepciones:
1. Si en un identificador queremos incluir un nombre compuesto se pone el primer nombre entero
en minúscula y el resto con la primera letra en mayúscula y el resto en minúscula. Por ejemplo:
miNuevaVariable = 3;
2. Los identificadores de clases e interfaces siempre empiezan en mayúscula siguiendo la anterior
norma en caso de tratarse de un nombre compuesto. Por ejemplo:
MiNuevaClase();
3. Los nombres de variables finales ( las mas habitualmente llamadas "constantes") se escriben
íntegramente en mayúscula. Por ejemplo: "PI"
Otra restricción muy importante y evidente a la hora de elegir identificador por ejemplo para una
variable es no coincidir con ciertas palabras restringidas que tiene el lenguaje, estas son:
abstract continue for new switch boolean default goto null synchronized
break do if package this byte double implements private threadsafe
byvalue else import protected throw case extends instanceof public transient
catch false int return true char final interface short try
class finally long static void const float native super while
9.-EXPLIQUE AMPLIAMENTE COMO SE ENCUENTRA ESTRUCTURADA LA MEMORIA VIRTUAL Y REALDE UNA COMPUTADORA ASIMISMO EXPLIQUE COMO SE ALMACENA ,DIRECCIONA Y SE RECUPERAN LOS DATOS DE LA MEMORIA DE LA COMPUTADORA AL UTILIZAR UN PROGRAMA.
Almacenamiento de direcciones de memoria
Supongamos que la memoria utilizada tiene un tamaño de 4 Gigabytes y por tanto sus direcciones se representan con 32 bits. Las direcciones de memoria son números naturales en el rango [0, 232 - 1]. Pero este número natural es susceptible de ser almacenado él mismo en memoria. Es decir, se puede almacenar la representación binaria de una dirección de memoria en la propia memoria. Al tener un tamaño de 32 bits o 4 bytes, se utilizan para ello cuatro posiciones de memoria consecutivas.
Una dirección de memoria, por tanto, se puede considerar de dos formas posibles: o como una dirección de una celda de memoria, o como un número natural susceptible de ser manipulado como tal. Supóngase que en la posición de memoria 0x00000100 se encuentra almacenado el número entero de 32 bits 0x0153F2AB y que en la posición 0x00000200 se debe almacenar la dirección de dicho número. Para ello se almacena, a partir de la posición 0x00000200 el número 0x00000100 utilizando los cuatro bytes a partir de esa posición y se hace en orden creciente de significación al utilizar el esquema little endian. El resultado se ilustra en la figura 3.15.
Figura 3.15. Dirección de memoria almacenada como número natural
Tras almacenar la dirección de memoria de un dato en la posición 0x00000200, ¿es posible obtener de nuevo el número 0x0153F2AB? La respuesta es afirmativa, pero no de forma inmediata, se debe obtener de memoria primero los cuatro bytes almacenados en la posición 0x00000200 y utilizarlos como una dirección de memoria de donde obtener los cuatro bytes contenidos en la posición 0x00000100. El acceso a este último dato se ha realizado de forma indirecta, es decir, mediante un acceso previo a memoria para obtener la dirección del dato final. Utilizando la notación funcional de operaciones sobre memoria, el acceso al dato se logra ejecutando Lectura(Lectura(0x00000200)).
A este mecanismo de acceso a un dato en memoria a través de su dirección a su vez almacenada en otra posición se le conoce con el nombre de “indirección”. En el ejemplo anterior se dice que el dato almacenado en la posición 0x00000200 apunta al dato 0x0153F2AB. La figura 3.16 ilustra esta situación.
Figura 3.16. Una posición de memoria “apunta a” otra
El mecanismo de indirección se puede encadenar de manera arbitrariamente larga. La dirección que contiene la dirección de un dato, a su vez se puede almacenar de nuevo en memoria. En tal caso, para acceder al dato final se requieren dos accesos a memoria en lugar de uno. Por tanto, es posible almacenar las direcciones tal que haya que seguir una cadena de indirecciones para en última instancia acceder al dato. La figura 3.17 muestra una distribución de datos tal que la posición 0x00000100 contiene “la dirección de memoria de la dirección de memoria de la dirección de memoria del dato”.
Figura 3.17. Indirección múltiple para acceder a un dato
De la técnica de indirección se deriva que en memoria no sólo se almacenan datos (naturales, enteros, coma flotante, letras, etc.) sino también direcciones de memoria. Todos estos datos, a efectos de almacenamiento y su manipulación por el procesador, no son más que una secuencia de bytes en diferentes celdas. El que una secuencia de bits determinada se interprete como un número o como una dirección queda totalmente bajo el control del programador. En los programas escritos en ensamblador es preciso saber qué dato está almacenado en qué posición de memoria pero el propio lenguaje no aporta mecanismo alguno que compruebe que se el acceso se hace de forma correcta. Si por error en un programa se obtiene un dato de 32 bits de memoria y se interpreta como una dirección cuando en realidad es un dato numérico o viceversa, lo más probable es que el programa termine de forma brusca o con resultados incorrectos.
3.6.1. Ejemplos de indirección
El almacenar una dirección en memoria no parece a primera vista un mecanismo útil, pues esta cumple un único papel que es el de apuntar al dato en cuestión. Sin embargo, esta técnica se utiliza con frecuencia en la ejecución de programas.
Ejemplo 3.1. Almacenamiento de una tabla de strings
Supóngase que se dispone de un conjunto de n strings almacenados en otras tantas posiciones de memoria. Aunque las letras de cada string están almacenadas en posiciones consecutivas, los strings no están uno a continuación de otro sino en zonas de memoria dispersas. Se quiere imprimir estos strings en orden alfabético. El primer paso es ordenar los strings para a continuación imprimir cada uno de ellos por orden.
Para ordenar los strings hay dos opciones, o se manipulan todos los caracteres de cada uno de ellos, o se manipulan sus direcciones de comienzo. Es decir, en lugar de tener los strings ordenados alfabéticamente y almacenados en posiciones consecutivas de memoria, se almacenan por orden las direcciones de memoria de comienzo de cada string y se ordenan en base a las letras que contienen. Esta estructura se ilustra en la figura 3.18.
Figura 3.18. Tabla con direcciones de comienzo de strings
La ordenación los strings se puede realizar sin mover ninguna de las letras en memoria. La tabla resultante contiene en cada uno de sus elementos una indirección a un string, es decir, la dirección en la que se encuentra el string pertinente. Para imprimir los strings en orden alfabético se itera sobre los elementos de la tabla y mediante doble indirección se accede a las letras de cada string.
Ejemplo 3.2. Referencias en el lenguaje Java
El lenguaje de programación Java utiliza el mecanismo de indirección para acceder a los datos almacenados en un objeto. Supóngase que se ha definido una clase con nombre Dato que a su vez contiene un campo de acceso público, entero y con nombre valor. Se ejecuta la siguiente porción de código.
Línea
|
Código
|
1
2
3
4
5
6
|
Dato obj1, obj2;
obj1 = new Dato();
obj1.valor = 3;
obj2 = obj1;
obj2.valor = 4;
System.out.println(obj1.valor)
|
¿Qué valor imprime por pantalla la última línea? El código asigna al campo valor de obj1 el valor 3, a continuación se produce la asignación obj2 = obj1, luego se asigna el valor 4 al campo valor de obj2 y se imprime el mismo campo pero de obj1. Al ejecutar este fragmento de código se imprime el valor 4 por pantalla. La línea que explica este comportamiento es la asignación obj2 = obj1. En Java, todo objeto se manipula a través de una “referencia”. Las variables obj1 y obj2 son referencias y la asignación obj1 = obj2 no transfiere el contenido entero de un objeto a otro, sino que se transfiere el valor de la referencia. Por tanto, al ejecutar esta asignación, obj2 se refiere al mismo objeto que obj1 y por eso la última línea imprime el valor 4.
El mecanismo interno que se utiliza a nivel de lenguaje máquina para representar las referencias está basado en el concepto de indirección. Cuando se crea un objeto se almacenan sus datos en memoria. Cuando un objeto se asigna a una referencia esta pasa a contener la dirección de memoria a partir de la cual está almacenado. La asignación obj2 = obj1 transfiere la dirección de memoria contenida en obj1 al contenido de obj2. Cualquier modificación que se haga a través de la referencia obj1 afecta por tanto al objeto al que apunta obj2 pues ambas referencias apuntan al mismo objeto. La figura 3.19 ilustra cómo se asignan los valores en memoria para este ejemplo.
Figura 3.19. Dos referencias en Java que apuntan al mismo objeto
El objeto está ubicado en una posición arbitraria de memoria (en la figura 3.19 es la posición 0x00000100). En dos posiciones de memoria adicionales se almacenan las referencias obj1 y obj2. La primera de ellas recibe su valor al ejecutarse el constructor de la clase. La segunda recibe el mismo valor cuando se ejecuta la asignación. A partir de este momento, cualquier modificación realizada en el objeto a través de obj1 será visible si se consulta a través de obj2.
Ejemplo 3.3. Doble indirección con referencias en el lenguaje Java
Las referencias en Java se utilizan, por tanto, como indirecciones a memoria. Pero las clases definidas en Java pueden contener en su interior campos que sean referencias a otros objetos. Por ejemplo, si se define una segunda clase Dato2 en cuyo interior existe un campo con nombre c1 de la clase Dato, este campo es una referencia a un objeto. Supóngase que se ejecuta la siguiente porción de código.
Línea |
Código
|
1
2
3
4
|
Dato2 obj2;
obj2 = new Dato2();
obj2.c1 = new Dato();
obj2.c1.valor = 4;
|
En este caso la referencia obj2 apunta a un objeto de la clase Dato2 que a su vez contiene en su interior una referencia a un objeto de la clase Dato. Para ejecutar la última línea en la que se asigna el valor 4 al campo valor es preciso realizar una doble indirección. La referencia obj2 contiene la dirección del objeto de la clase Dato2, y este a su vez contiene en su interior una referencia que contiene la dirección del objeto de la clase Dato. Tras esta doble indirección se asigna el valor 4 a dicho dato. La figura 3.20 muestra el acceso a este dato a través de la doble indirección.
Figura 3.20. Acceso a un dato mediante doble indirección
10.-EXPLIQUE EN QUE CONSISTE EL SISTEMA BINARIO,OCTAL, HEXADECIMAL Y DECIMAL EJEMPLIFICANDO CON 5 EJEMPLOS CADA UNO DE ELLOS.
1.1. SISTEMA DECIMAL
Su origen lo encontramos en la India y fue introducido en España por los árabes. Su base es 10.
Emplea 10 caracteres o dígitos diferentes para indicar una determinada cantidad: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. El valor de cada símbolo depende de su posición dentro de la cantidad a la que pertenece. Veámoslo con un ejemplo:
Si el número contiene decimales:
1.2. SISTEMA BINARIO
Es el sistema digital por excelencia, aunque no el único, debido a su sencillez. Su base es 2
Emplea 2 caracteres: 0 y 1. Estos valores reciben el nombre de bits (dígitos binarios). Así, podemos decir que la cantidad 10011 está formada por 5 bits. Veamos con un ejemplo como se representa este número teniendo en cuenta que el resultado de la expresión polinómica dará su equivalente en el sistema decimal:
1.3. SISTEMA OCTAL
Posee ocho símbolos: 0, 1, 2, 3, 4, 5, 6, 7. Su base es 8.
Este sistema tiene una peculiaridad que lo hace muy interesante y es que la conversión al sistema binario resulta muy sencilla ya que, 8 = 23 . Así, para convertir un número de base 8 a binario se sustituye cada cifra por su equivalente binario en el apartado 1.5. Conversiones se estudiará esta conversión.
1.4. SISTEMA HEXADECIMAL
Está compuesto por 16 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Su base es 16. Es uno de los sistemas más utilizados en electrónica, ya que además de simplificar la escritura de los números binarios, todos los números del sistema se pueden expresar en cuatro bits binarios al ser 16 = 24. La conversión de un número hexadecimal a uno binario es muy sencilla al igual que en el sistema octal, profundizaremos en ello en el apartado 1.5.
11.-REALICE LAS CONVERSIONES SIGUIENTES (5 EJEMPLOS DE CADA CONVERSION) EXPLICANDO PRIMERAMENTE Y TEORICAMENTE OMO SE DEBE DE HACER ESA CONVERSION.
DELDECIMAL A BINARIO.
Si la conversión es de binario a decimal, aplicaremos la siguiente regla: se toma la cantidad binaria y se suman las potencias de 2 correspondientes a las posiciones de todos sus dígitos cuyo valor sea 1. Veamos dos ejemplos:
1011112 = 1.25+0.24+1.23+1.22+1.21+1.20 = 4510
101012= 1.24+0.23+1.22+0.21+1.20 = 2110
Si la conversión es de decimal a binario, aplicaremos la siguiente regla: se toma la cantidad decimal dada y se divide sucesivamente entre 2. Los restos obtenidos en cada división (0, 1), forman la cantidad binaria pedida, leída desde el último cociente al primer resto. Se presentaran los ejemplos en forma de tabla debido a la dificultad que supone utilizar el sistema tradicional de división con el editor:
Nº Decimal |
Base
|
Cociente
|
Resto
|
107
|
2
|
53
|
1
|
53
|
2
|
26
|
1
|
26
|
2
|
13
|
0
|
13
|
2
|
6
|
1
|
6
|
2
|
3
|
0
|
3
|
2
|
1
|
1
|
|
10710= 11010112
|
|
Cuando tengamos un número con decimales seguiremos el siguiente procedimiento: multiplicaremos por 2 la parte decimal y se toma como dígito binario su parte entera. El proceso se repite con la fracción decimal resultante del paso anterior, hasta obtener una fracción decimal nula, o bien hasta obtener el número de cifras binarias que se desee. Ejemplo: 107,645. Como anteriormente convertimos 107 a binario, el resultado de la conversión quedaría así:
1101011, 101001012
|
Fracción decimal
|
Multiplicado por:
|
Resultado
|
Dígito binario
|
0,645
|
2
|
1,290
|
1
|
0,290
|
2
|
0,580
|
0
|
0,580
|
2
|
1,160
|
1
|
0.160
|
2
|
0,320
|
0
|
0,320
|
2
|
0.64
|
0
|
0.64
|
2
|
1.28
|
1
|
0.28
|
2
|
0.56
|
0
|
0.56
|
2
|
1.12
|
1
|
|
BINARIO A DECIMAL.
DECIMAL AL OCTAL.
OCTAL A DECIMAL.
Si la conversión es de octal a decimal se procederá como observas en el ejemplo:
7408= 7.82+4.81+4.80 = 48410
Si la conversión es de decimal a octal se procederá de modo similar a la conversión de decimal a binario, pero dividiendo entre 8. Comprueba los resultados en el siguiente ejemplo:
42610 = 6528
DECIMAL A HEXADECIMAL.
HEXADECIMAL A DECIMAL.
BINARIO A HEXADECIMAL.
La conversión entre binario y hexadecimal es igual al de la conversión octal y binario, pero teniendo en cuenta los caracteres hexadecimales, ya que se tienen que agrupar de 4 en 4. La conversión de binario a hexadecimal se realiza según el ejemplo siguiente:
Sistema binario |
Sistema Hexadecimal
|
0000
|
0
|
0001
|
1
|
0010
|
2
|
0011
|
3
|
0100
|
4
|
0101
|
5
|
0110
|
6
|
0111
|
7
|
1000
|
8
|
1001
|
9
|
1010
|
A
|
1011
|
B
|
1100
|
C
|
1101
|
D
|
1110
|
E
|
1111
|
F
|
|
Ejemplo: 1011111,1100012
Agrupando obtenemos el siguiente resultado:
0101 1111, 1100 01002
Sustituyendo según la tabla logramos la conversión esperada:
5F, C416
|
La conversión de hexadecimal a binario simplemente sustituiremos cada carácter por su equivalente en binario, por ejemplo:
69DE16= 0110 1001 1101 11102
HEXADECIMAL A BINARIO.
12.-MEDIANTE UNA TABLA DESCRIPTIVA ILUSTRE LA CLASIFICACION DE TODOS LOS TIPOS DE OPERADORES QUE EXISTEN Y QUE SE PUEDEN APLICAR A TODOS LOS TIPOS DE DATOS QUE EXISTEN Y REPRESENTELO JERARQUICAMENTE , PONER 5 EJEMPLOS DE EXPRESIONES VALIDAS POR CADA GRUPO DE OPERACIONES.
Operadores
Son elementos que relacionan de forma diferente, los valores de una o mas variables y/o constantes. Es decir,
los operadores nos permiten manipular valores.
Operadores Aritméticos
Los operadores aritméticos permiten la realización de operaciones matemáticas con los valores (variables y
constantes).
Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el
resultado es entero; si alguno de ellos es real, el resultado es real.
Operadores Aritméticos
+ Suma
- Resta
* Multiplicación
/ División
mod Modulo (residuo de la división entera)
Ejemplos:
Expresión Resultado
7 / 2 3.5
12 mod 7 5
4 + 2 * 5 14
Prioridad de los Operadores Aritméticos
Todas las expresiones entre paréntesis se evalúan primero. Las expresiones con paréntesis anidados se evalúan
de dentro a fuera, el paréntesis más interno se evalúa primero.
Dentro de una misma expresión los operadores se evalúan en el siguiente orden:
1. ^ Exponenciación
2. *, /, mod Multiplicación, división, modulo.
3. +, - Suma y resta.
Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izquierda a derecha.
Ejemplos:
4 + 2 * 5 = 14 23 * 2 / 5 = 9.2
3 + 5 * (10 - (2 + 4)) = 23 2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98
Operadores Relacionales
Se utilizan para establecer una relación entre dos valores. Luego compara estos valores entre si y esta
comparación produce un resultado de certeza o falsedad (verdadero o falso).
Los operadores relacionales comparan valores del mismo tipo (numéricos o cadenas). Estos tienen el mismo
nivel de prioridad en su evaluación.
Los operadores relaciónales tiene menor prioridad que los aritméticos.
Tipos de operadores Relacionales
> Mayor que
< Menor que
> = Mayor o igual que
< = Menor o igual que
< > Diferente
= Igual
Ejemplos:
Si a = 10, b = 20, c = 30
a + b > c Falso
a - b < c Verdadero
a - b = c Falso
a * b < > c Verdadero
Ejemplos no lógicos:
a < b < c
10 < 20 < 30
T > 5 < 30
(no es lógico porque tiene diferentes operandos)
Operadores Lógicos
Estos operadores se utilizan para establecer relaciones entre valores lógicos. Estos valores pueden ser
resultado de una expresión relacional.
Tipos de operadores Lógicos
And Y
Or O
Not Negación
Ejemplo:
Para los siguientes ejemplos T significa verdadero y F falso.
Operador Not Operador Not
Operando Resultado
T F
F T
Operador And Operador And
Operando1 Operador Operando2 Resultado
T AND T T
T F F
F T F
F F F
Operador Or Operador Or
Operando1 Operador Operando2 Resultado
T Or T T
T F T
F T T
F F F
Prioridad de los Operadores Lógicos
1. Not
2. And
3. Or
Prioridad de los Operadores en General
1. ( )
2. ^
3. *, /, Mod, Not
4. +, -, And
5. >, <, > =, < =, < >, =, Or
Ejemplos:
Sea: a = 10 b = 12 c = 13 d =10
4.5 Prioridad de operadores, evaluación de expresiones.
Una expresión es una combinación de operandos y operadores.
La evaluación de una expresión consiste en reducirla, esto es, realizar todas las operaciones
contenidas en ella para obtener un valor final.
Para evaluar una expresión es necesario conocer la prioridad de los operadores, con lo cual se
puede determinar cuál operación se va a realizar antes que las demás.
Una expresión entre paréntesis se evalúa primero que las demás. Si hay paréntesis anidados, se
evalúa primero la expresión contenida en los paréntesis más internos.
La siguiente tabla muestra los operadores y su asociatividad (empezando con los de mayor
prioridad).
Operadores Asociatividad
( ) [ ] . new typeof izquierda a derecha
- ~ ! ++ -- (tipo)expresión derecha a izquierda
* / % izquierda a derecha
+ - izquierda a derecha
<< >> izquierda a derecha
< <= > >= is as izquierda a derecha
== != izquierda a derecha
& ^ | izquierda a derecha
&& || izquierda a derecha
?: derecha a izquierda
= *= /= %= += -= <<= >>= >>>= &= |= ^= derecha a izquierda
13.-REALICE UNA INVESTIGACION DOCUMENTAL SOBRE LOS PRO Y LOS CONTRA DE CONVERTIR EN EJECUTABLE UN PROGRAMA EN JAVA ASI MISMO EXPLIQUE AMPLIAMENTE LOS PROCEDIMIENTOS QUE EXISTEN PARA CONVERTIR UN PROGRAMA EJECUTABLE.
Creación de Ejecutables
Cada día me escribe más gente pidiéndome consejo porque, a la hora de seguir los tutoriales que tenemos
publicados en www.adictosaltrabajo.com relativos al mundo Java, se producen errores incomprensibles. El 90
de las veces, la respuesta es ¿has comprobado el classpath?.
El despliegue y la ejecución de aplicaciones Java es una asignatura pendiente. El Java Web Start, del que
publicamos un tutorial hace unos meses, pretende ayudar a solucionar el problema pero creo que introduce un
nuevo factor de incertidumbre, en lo que respecta a la seguridad, a la hora de ejecutar los programas, sobre
todo si tienes un FireWall personal instalado (podéis consultar como montar uno en otro tutorial).
He visto un producto gratuito llamado JSmooth que puede venir a minimizar el impacto del despliegue de
aplicaciones Java, permitiéndonos distribuirlo como un fichero ejecutable (.exe) tradicional (con sus
problemas, aunque estos ya son los tradicionales, para los que quizá ya tengamos solución)
Podemos descargarnos el binario auto-instalable
El proceso de instalación esta muy cuidado
Seleccionamos el directorio de trabajo ...
Y todo ha salido bien
Se nos han creado los iconos que nos permitirán manejar la aplicación
Uno de los iconos más interesantes es el propio tutorial. Está en ingles y el L&F no coincide demasiado con el
que os vamos a mostrar según lo hemos probado (aunque eso es lo de menos) pero es un muy buen trabajo.
Si arrancamos la aplicación, con unas configuraciones simples, podemos generar nuestro ejecutable.
En la parte del esqueleto, seleccionamos el mensaje que queremos que aparezca si la máquina donde corremos
el ejecutable no tiene una máquina virtual instalada.
Elegimos el nombre del fichero ejecutable
Elegimos el nombre de la clase y classpath
Y también elegimos el orden de precedencia a la hora de seleccionar la máquina virtual más adecuada.
Ejecutamos el proceso de compilación y todo va estupendo.
Y sin darnos cuenta, nuestro ejecutable está listo. Si pinchamos el botón de ejecutar, podemos ver que nuestra
aplicación funciona bien.
Ésta es la estructura de ficheros donde podemos visualizar el exe generado
El fichero ejecutable.jsmooth en el fichero XML donde guardamos nuestro proyecto. Esto es es posible que
nos de mucho juego en el futuro ...
Conclusiones
Una de las cosas más importantes, a la hora de desarrollar en Java, es la capacidad de disponer buenas
herramientas para solucionar las distintas situaciones que encontremos en nuestro clientes.
Necesitamos visión. La visión solo se consigue con la práctica y experiencia. En www.adictosaltrabajo.com
tratamos de compartir la nuestra.
No olvidéis una cosa:
Compartiendo conocimiento es como más aprenderéis. Si cuentas lo que sabes, muchas de las
preguntas que te hagan serán relativas a cosas que no sabes ..... o a posibles usos distintos de tus
conocimientos que no se te hubieran ocurrido .... Todo ello te ayuda a aumentar tu propia visión |