Sobre los últimos 50 años, los idiomas que programan han evolucionado del código binario de máquina a herramientas poderosas que crean las abstracciones complejas. Es importante entender por qué los idiomas han evolucionado, y qué capacidades que los idiomas más nuevos nos dan.
"Tan largo como no había máquinas, programar era ningún problema; cuando tuvimos unos pocas computadoras débiles, programar llegó a ser un problema templado y ahora que tenemos las computadoras gigantescas, programar ha llegado a ser un problema igualmente gigantesco. En este sentido que la industria electrónica no ha resuelto un solo problema, tiene sólo los creó - ha creado el problema de usar su producto". [Edsger. W. Dijkstra. "El Programista Humilde" (la Conferencia del Premio de Turing), Comunicaciones del ACM, Vol 15, No. 10 (el octubre 1972).]
E. W. Dijkstra habló estas palabras proféticas casi hace 28 años en su es la conferencia del Premio de Turing. En aquel momento, el 'las computadoras gigantescas él radio de probablemente tenido entre 64 y 128 kilobytes de la memoria verdadera, y a lo más unos pocos megaoctetos de artefactos de almacenamiento de acceso directo. Si él pensó que el problema era gigantesco entonces...
Uno de las llaves a programar exitoso son el concepto de la abstracción. La abstracción es la llave a la construcción sistemas complejos de software. Como el tamaño de nuestros problemas crece, la necesidad para la abstracción dramáticamente aumentos. En sistemas sencillos, característica de idiomas usados en el 1950s y '60s, un solo programista podría entender el problema entero, y por lo tanto manipula todas estructuras del programa y datos. Los programistas son hoy incapaces de entender todos los programas y los datos - es apenas demasiado grande. La abstracción se requiere a permitir que el programista para agarrar los conceptos necesarios.
La mayoría de los libros y el reglamento en la historia de programar los idiomas tienden a discutir los idiomas en términos de generaciones. Esto es un arreglo útil para clasificar los idiomas por la edad.
Primera Generación
Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno.
John Von Neumann desarrolló el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstracción de la memoria como un conjunto de celdas, que almacenan simplemente números. Estos números pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en sí.
¿Cómo es que describimos un programa como números? Se tenía el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permitía almacenar números binarios.
La solución que se tomó fue la siguiente: a cada acción que sea capaz de realizar nuestra computadora, asociarle un número, que será su código de operación (opcode) . Por ejemplo, una calculadora programable simple podría asignar los opcodes :
1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE.
La descripción y uso de los opcodes es lo que llamamos lenguaje de máquina. Es decir, la lista de códigos que la máquina va a interpretar como instrucciones, describe las capacidades de programación que tenemos de ella; es el lenguaje más primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la máquina al más bajo nivel.
Los lenguajes más primitivos fueron los lenguajes de máquina. Esto, ya que el hardware se desarrolló antes del software, y además cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware.
La programación en esos momentos era sumamente tediosa, pues el programador tenía que "bajarse" al nivel de la máquina y decirle, paso a pasito, cada punto de la tarea que tenía que realizar. Además, debía expresarlo en forma numérica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente aún no existía alternativa.
Segunada Generación
El primer gran avance que se dio, como ya se comentó, fue la abstracción dada por el Lenguaje Ensamblador, y con él, el nacimiento de las primeras herramientas automáticas para generar el código máquina. Esto redujo los errores triviales, como podía ser el número que correspondía a una operación, que son sumamente engorrosos y difíciles de detectar, pero fáciles de cometer. Sin embargo, aún aquí es fácil para el programador perderse y cometer errores de lógica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de él.
Tercera Generación
Con el desarrollo en los 50s y 60s de algoritmos de más elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras científicos de otras ramas; ellos conocían mucho de Física, Química y otras ramas similares, pero no de Computación, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de fórmulas. Así, nació el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inició como un "simple" esfuerzo de traducir un lenguaje de fórmulas, al lenguaje ensamblador y por consiguiente al lenguaje de máquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstracción posible, y facilitar la vida al programador, aumentando la productividad, encargándose los compiladores o intérpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora.
Hay que notar la existencia de lenguajes que combinan características de los de alto nivel y los de bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de programación de alto nivel, y la facilidad de usar librerías que también son características de alto nivel; sin embargo, fue diseñado con muy pocas instrucciones, las cuales son sumamente sencillas, fáciles de traducir al lenguaje de la máquina; y requiere de un entendimiento apropiado de cómo funciona la máquina, el uso de la memoria, etcétera. Por ello, muchas personas consideramos a lenguajes como C (que fue diseñado para hacer sistemas operativos), lenguajes de nivel medio.
Cuarta Generación
Los idiomas de la cuarta generación parecen según las instrucciones a las de la tercera generación. Lo nuevo de estas lenguajes son conceptos como clases, objetos y eventos que permiten soluciones más fáciles y lógicos. Lenguajes como C++, java y C# se llaman lenguajes orientadas al objeto.
Los idiomas modernos, tal como C++ y Java, no sólo permite las abstracciones, pero permite la implementación impuesta de restricciones en abstracciones. La mayoría de los idiomas modernos son objetivas orientado, que permite que mí modele el mundo verdadero que usa mi idioma. Además, puedo limitar el acceso para modelar las restricciones de mundo verdadero en datos. La llave es que usé el término "mundo verdadero." Por la primera vez, yo modelo mi solución en términos del problema. Quiero que mi solución sea orientado de problema, para que la solución refleje el mundo verdadero en términos de estructuras de datos y acceso a los datos. Yo también puedo aplicar directamente y para poder modelar objetos de mundo verdadero usando las clases (en C + + o Java).
Quinta Generación
Como la quinta generación están conocidos los Lenguajes de inteligencia artificial. Han sido muy valorados al principio de las noventa - mientras ahora el desarrollo de software toma otras caminos.
Lo que veremos en el futuro es menos dependencia en el idioma, y más en el modelando herramientas, tal como el Unificado Modelando el Idioma (UML). La salida del modelando herramienta producirá mucho de nuestro código para nosotros; en el muy menos, producirá arquitectónico y los modelos del diseño y la estructura de nuestro código. Esto producirá un diseño (y posiblemente código) eso puede ser validado por el cliente antes de completar la implementación y probar. Cuando los problemas diarios que resolvemos llegan a ser más grande, nosotros tenemos cada vez menos tiempo "volver a hacer" el código. Los días de decir, "acabamos de escribir una versión de Beta y el cliente entonces pueden decir nosotros lo que ellos quieren realmente," son pasados. Las organizaciones que fallan de obtener completa y corrige los requisitos de cliente antes de escribir el código saldrá del negocio. ¿Por qué? Porque toma demasiado largo, y cuesta también mucho, para escribir código dos o más vez. Las organizaciones que tienen un compromiso a la comprobación y la validación antes de producir código prosperarán - los otros fallarán.
miércoles, 23 de febrero de 2011
Pseudocódigo
Es un lenguaje que se asemeja a los lenguajes de progamación en los que se crea software de programación para la PC pero sin el rigor y exactitud que estos tienen a nivel sintáctico; es una forma clara de escribir programas en un lenguaje común y cotidiano.
Tipos de Datos
En Pascal existen gran variedad y cantidad de tipos de datos. Pero en este tutorial sólo se trataran los básicos para que puedas ir construyendo tus primeros programas.
Existen muchas clasificaciones para los tipos de datos, y dependiendo de la fuente que mires, te mostrarán una u otra. A continuacón tienes una de las posibles clasificaciones:
Tipos estáticos
Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se tratarán debido a su complejidad.
Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria no puede variar durante la ejecución del programa. Es decir, una vez declarada una variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este trozo no se podrá aumentar ni disminuír.
Tipos dinámicos
Dentro de esta categoría entra sólamente el tipo puntero. Este tipo te permite tener un mayor control sobre la gestión de memoria en tus programas. Con ellos puedes manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa se está ejecutando.
Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo trataremos. Además, lenguajes que están muy de moda (por ejemplo Java) no permiten al programador trabajar con punteros.
Tipos simples
Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más fáciles de aprender. Por todo esto, serán en los que nos centremos.
Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los lenguajes de programación los soportan, no como ocurre con los estructurados que pueden variar de un lenguaje a otro.
Tipos estructurados
Mientras que una variable de un tipo simple sólo referencia a un elemento, los estructurados se refieren a colecciones de elementos.
Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy variadas: tenemos colecciones ordenadas que se representan mediante el tipo array, colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen otros tipos, son los llamados registros.
Tipos ordinales
Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice que es ordinal porque el conjunto de valores que representa se puede contar, es decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto de los números naturales.
Dentro de los tipos simples ordinales, los más importantes son:
El tipo entero (integer)
El tipo lógico (boolean)
El tipo carácter (char)
Tipos no-ordinales
Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los números reales.
A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que poder calcular la posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto.¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121, ...
Existen muchas clasificaciones para los tipos de datos, y dependiendo de la fuente que mires, te mostrarán una u otra. A continuacón tienes una de las posibles clasificaciones:
Tipos estáticos
Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se tratarán debido a su complejidad.
Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria no puede variar durante la ejecución del programa. Es decir, una vez declarada una variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este trozo no se podrá aumentar ni disminuír.
Tipos dinámicos
Dentro de esta categoría entra sólamente el tipo puntero. Este tipo te permite tener un mayor control sobre la gestión de memoria en tus programas. Con ellos puedes manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa se está ejecutando.
Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo trataremos. Además, lenguajes que están muy de moda (por ejemplo Java) no permiten al programador trabajar con punteros.
Tipos simples
Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más fáciles de aprender. Por todo esto, serán en los que nos centremos.
Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los lenguajes de programación los soportan, no como ocurre con los estructurados que pueden variar de un lenguaje a otro.
Tipos estructurados
Mientras que una variable de un tipo simple sólo referencia a un elemento, los estructurados se refieren a colecciones de elementos.
Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy variadas: tenemos colecciones ordenadas que se representan mediante el tipo array, colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen otros tipos, son los llamados registros.
Tipos ordinales
Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice que es ordinal porque el conjunto de valores que representa se puede contar, es decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto de los números naturales.
Dentro de los tipos simples ordinales, los más importantes son:
El tipo entero (integer)
El tipo lógico (boolean)
El tipo carácter (char)
Tipos no-ordinales
Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los números reales.
A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que poder calcular la posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto.¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121, ...
Técnicas de Diseño en la Progamación
Existen dos principales tecnicas de diseño de algoritmos de programación, el Top Down y el Bottom Up.
Top Down
También conocida como de arriba-abajo y consiste en establecer una serie de niveles de mayor a menor complejidad (arriba-abajo) que den solución al problema.
La utilización de la técnica de diseño Top-Down tiene los siguientes objetivos básicos:
•Simplificación del problema y de los subprogramas de cada descomposición.
•Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas.
•El programa final queda estructurado en forma de bloque o módulos lo que hace mas sencilla su lectura y mantenimiento.
Bottom Up
El diseño ascendente se refiere a la identificación de aquellos procesos que necesitan computarizarse con forme vayan apareciendo, su análisis como sistema y su codificación, o bien, la adquisición de paquetes de software para satisfacer el problema inmediato.
Entonces…
La diferencia entre estas dos técnicas de programación se fundamenta en el resultado que presentan frente a un problema dado.
Top Down
También conocida como de arriba-abajo y consiste en establecer una serie de niveles de mayor a menor complejidad (arriba-abajo) que den solución al problema.
La utilización de la técnica de diseño Top-Down tiene los siguientes objetivos básicos:
•Simplificación del problema y de los subprogramas de cada descomposición.
•Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas.
•El programa final queda estructurado en forma de bloque o módulos lo que hace mas sencilla su lectura y mantenimiento.
Bottom Up
El diseño ascendente se refiere a la identificación de aquellos procesos que necesitan computarizarse con forme vayan apareciendo, su análisis como sistema y su codificación, o bien, la adquisición de paquetes de software para satisfacer el problema inmediato.
Entonces…
La diferencia entre estas dos técnicas de programación se fundamenta en el resultado que presentan frente a un problema dado.
Variables y Constantes
Variables
Son aquellas que pueden cambiar durante la ejecución del programa.
Constantes
Son aquellos que su valor NO CAMBIA durante la ejecución del programa.
Son aquellas que pueden cambiar durante la ejecución del programa.
Constantes
Son aquellos que su valor NO CAMBIA durante la ejecución del programa.
Diagrama de Flujo
Un Diagrama de Flujo representa la esquematización gráfica de un algoritmo, el cual muestra gráficamente los pasos o procesos a seguir para alcanzar la solución de un problema.
Ejemplo:
Ejemplo:
Algoritmo
El algoritmo es un método paso a paso o bien una serie de instrucciones a seguir para llegar a una solución dichos pasos deberan ser finitos o finito.
Sus caracteristicas principales son:
Finito:Las instrucciones o pasos deberan tener fin.
Presizo:Los pasos deberan ser de forma concreta y lo mas claras posibles; de tal forma que al realizar el algoritmo mas de una vez el resultado debera ser el mismo.
Concizo:El algoritmo debera tener o ser lo mas simplificado posible pero que de el resultado adecuado y correcto.
Ejemplo:
Leer el sueldo de tres empleados y aplicarles un aumento del 10, 12 y 15%
respectivamente. Desplegar el resultado.
Salidas: Sueldos finales
Entradas: Salarios de los empleados
Datos adicionales: aumentos del 10, 12 y 15%
Cálculos:
Sueldo final = sueldo inicial + aumento
Aumento = sueldo inicial * porcentaje/100 Definición de variables:
Sf1, Sf2, Sf3 = los sueldos finales
S1, S2, S3 = salarios de los empleados
Aum1, aum2, aum3 = aumentos
Sus caracteristicas principales son:
Finito:Las instrucciones o pasos deberan tener fin.
Presizo:Los pasos deberan ser de forma concreta y lo mas claras posibles; de tal forma que al realizar el algoritmo mas de una vez el resultado debera ser el mismo.
Concizo:El algoritmo debera tener o ser lo mas simplificado posible pero que de el resultado adecuado y correcto.
Ejemplo:
Leer el sueldo de tres empleados y aplicarles un aumento del 10, 12 y 15%
respectivamente. Desplegar el resultado.
Salidas: Sueldos finales
Entradas: Salarios de los empleados
Datos adicionales: aumentos del 10, 12 y 15%
Cálculos:
Sueldo final = sueldo inicial + aumento
Aumento = sueldo inicial * porcentaje/100 Definición de variables:
Sf1, Sf2, Sf3 = los sueldos finales
S1, S2, S3 = salarios de los empleados
Aum1, aum2, aum3 = aumentos
Metodología para solucionar un roblema
1.-Definición del problema
Es el enunciado del problema, el cual debe ser claro y completo. Es fundamental conocer y delimitar por completo el problema, saber que es lo que se desea realice la computadora, mientras esto no se conozca del todo, no tiene caso continuar con el siguiente paso.
2.-Análisis de la solución
Consiste en establecer una serie de preguntas acerca de lo que establece el problema para poder determinar si se cuenta con los elementos suficientes para llevar a cabo la solución del mismo.
3.- Diseño de la solución
Una vez definido y analizado el problema, se procede a la creación del algoritmo (Diagrama de flujo ó pseudocódigo), en el cual se da la serie de pasos ordenados que nos proporcione un método explícito para la solución del problema.
4.-Codificación
Consiste en escribir la solución del problema (de acuerdo al pseudocódigo); en una serie de instrucciones detalladas en un código reconocible por la computadora; es decir en un lenguaje de programación (ya sea de bajo o alto nivel), a esta serie de instrucciones se le conoce como PROGRAMA.
5.-Prueba y Depuración
Prueba es el proceso de identificar los errores que se presenten durante la ejecución del programa; es conveniente que cuando se pruebe un programa se tomen en cuenta los siguientes puntos:
a)Tratar de iniciar la prueba con una mentalidad saboteadora, casi disfrutando la tarea de encontrar un error.
b)Sospechar de todos los resultados que arroje la solución, con lo cual se deberán verificar todos.
c)Considerar todas las situaciones posibles, normales y aún las anormales.
La Depuración consiste en eliminar los errores que se hayan detectado durante la prueba, para dar paso a una solución adecuada y sin errores.
6.-Documentación
Es la guía o comunicación escrita que sirve como ayuda para usar un programa, o facilitar futuras modificaciones.
7.-Mantenimiento
Se lleva a cabo después de determinado el programa, cuando se ha estado trabajando un tiempo, y se detecta que es necesario hacer un cambio, ajuste y/o complementación al programa para que siga trabajando de manera correcta. Para realizar esta función, el programa debe estar debida mente documentado, lo cual facilitará la tarea.
Es el enunciado del problema, el cual debe ser claro y completo. Es fundamental conocer y delimitar por completo el problema, saber que es lo que se desea realice la computadora, mientras esto no se conozca del todo, no tiene caso continuar con el siguiente paso.
2.-Análisis de la solución
Consiste en establecer una serie de preguntas acerca de lo que establece el problema para poder determinar si se cuenta con los elementos suficientes para llevar a cabo la solución del mismo.
3.- Diseño de la solución
Una vez definido y analizado el problema, se procede a la creación del algoritmo (Diagrama de flujo ó pseudocódigo), en el cual se da la serie de pasos ordenados que nos proporcione un método explícito para la solución del problema.
4.-Codificación
Consiste en escribir la solución del problema (de acuerdo al pseudocódigo); en una serie de instrucciones detalladas en un código reconocible por la computadora; es decir en un lenguaje de programación (ya sea de bajo o alto nivel), a esta serie de instrucciones se le conoce como PROGRAMA.
5.-Prueba y Depuración
Prueba es el proceso de identificar los errores que se presenten durante la ejecución del programa; es conveniente que cuando se pruebe un programa se tomen en cuenta los siguientes puntos:
a)Tratar de iniciar la prueba con una mentalidad saboteadora, casi disfrutando la tarea de encontrar un error.
b)Sospechar de todos los resultados que arroje la solución, con lo cual se deberán verificar todos.
c)Considerar todas las situaciones posibles, normales y aún las anormales.
La Depuración consiste en eliminar los errores que se hayan detectado durante la prueba, para dar paso a una solución adecuada y sin errores.
6.-Documentación
Es la guía o comunicación escrita que sirve como ayuda para usar un programa, o facilitar futuras modificaciones.
7.-Mantenimiento
Se lleva a cabo después de determinado el programa, cuando se ha estado trabajando un tiempo, y se detecta que es necesario hacer un cambio, ajuste y/o complementación al programa para que siga trabajando de manera correcta. Para realizar esta función, el programa debe estar debida mente documentado, lo cual facilitará la tarea.
Bienvenida
Bienvenido a mi Blog, estas en el modulo 3, aqui se desarrollaran sistemas de información, estás en el bolg de Brenda Mireya.
Suscribirse a:
Entradas (Atom)