Home About us Products Services Contact us Bookmark
:: wikimiki.org ::
Programación

Programación

Se llama programación a la creación de un programa de computadora, un conjunto concreto de instrucciones que una computadora puede ejecutar. El programa se escribe en un lenguaje de programación, aunque también se pueda escribir directamente en lenguaje de máquina, con cierta dificultad. Un programa se puede dividir en diversas partes, que pueden estar escritas en lenguajes distintos. Software es el sustantivo que denomina a los programas y datos de computadora.

Programas y algoritmos

Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) un algoritmo. Puede haber programas que no se ajusten a un algoritmo (pueden no terminar nunca), en cuyo caso se denomina procedimiento a tal programa. Los programas suelen subdividirse en partes menores (módulos), de modo que la complejidad algorítmica de cada una de las partes es menor que la del programa completo, lo cual ayuda al desarrollo del programa. Según Niklaus Wirth un programa está formado por algoritmos y estructura de datos. Se han propuesto diversas técnicas de programación, cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas se pueden mencionar las programaciones lineal, estructurada, modular y orientada a objetos.

Compilación

El programa escrito en un lenguaje de programación (comprensible por el ser humano, aunque se suelen corresponder con lenguajes formales descritos por gramáticas independientes del contexto) no es inmediatamente ejecutable en un ordenador. La opción más común es compilar el programa, aunque también puede ser ejecutado mediante un intérprete informático El código fuente del programa ha de someterse a un proceso de transformación para convertirse en lenguaje máquina, interpretable por el procesador. A este proceso se le llama compilación. Normalmente la creación de un programa ejecutable (un típico .exe para los usuarios de Windows) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de alto nivel a código objeto (más cercano al lenguaje máquina). El segundo paso se llama enlazado (o a veces mal llamado linkado del inglés link) y traduce el código objeto a código máquina. Un programa podría tener partes escritas en varios lenguajes, que se podrían compilar de forma independiente y enlazar juntas para formar un único ejecutable, aunque no es una práctica habitual.

Programación e ingeniería del software

Existe una tendencia a identificar el proceso de creación de un programa informático con la programación, que es cierta cuando se trata de programas pequeños para uso personal, y que dista de la realidad cuando se trata de grandes proyectos. El proceso de creación de software desde el punto de vista de la Ingeniería tiene los siguientes pasos: #Reconocer la necesidad de un programa para solucionar un problema ó identificar la posibilidad de automatización de una tarea. #Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se necesita. #Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase. #Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable. #Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el funcionamiento del programa, tras lo cual la codificación debería resultar inmediata. #Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentes que pueda necesitar (bases de datos, redes de comunicaciones, etc.) La Ingeniería del Software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente (programación artesanal) la realización de un programa consistía únicamente en escribir el código.

Referencias históricas

La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella y Lord Byron. Anabella introdujo en las matemáticas a Ada, quien después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.

Objetivos de la programación

La programación de ordenadores debe perseguir tres objetivos fundamentales:
- Corrección: Un programa es correcto si hace lo que debe hacer. Para determinar si un programa hace lo que debe es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y una vez acabado compararlo con lo que realmente hace.
- Claridad: Es muy importante que el programa sea lo más claro posible y legible posible para mejorar el mantenimiento del software. Cuando se acaba de escribir el código del programa, se deben buscar errores y corregirlos. Más concretamente, cuando el programa está concluido, es necesario hacerle ampliaciones y/o modificaciones, según la demanda de los usuarios, esta labor puede ser llevada acabo por el mismo programador que implementó el programa o por otros.
- Eficiencia: Debe consumir la menor cantidad de recursos posible. Normalmente al hablar de eficiencia se suele hacer referencia al consumo de tiempo y/o memoria. La eficiencia y la claridad de un programa pueden ser objetivos contrapuestos: se puede conseguir mayor claridad sacrificando parte de la eficiencia o viceversa. Pero hay que tener en cuenta que el tiempo del programador es caro, y que hoy en día el precio de los ordenadores es razonable y cada vez son más baratos.

Véase también


- Lenguaje de programación
- Programación dirigida por eventos
- Programación estructurada
- Programación extrema
- Programación orientada a objetos
- Testeo de software

Enlaces externos


- [http://www.computerbooks01.com/store/books/3839/1/1/ Libros de referencia sobre programación]
- [http://www.hewop.com Grupo de programación HeWoP, un lugar para aprender a programar]
- [http://www.mentores.net Mentores.NET: Programación, Internet y Tecnología]
- [http://www.elguruprogramador.com.ar El Guru Programador: Articulos y Tutoriales]
-
ja:プログラミング ko:프로그래밍

Programa informático

Software -también conocido como programática o equipamiento lógico- es el conjunto de programas que puede ejecutar el hardware para la realización de las tareas de computación a las que se destina. Se trata del conjunto de instrucciones que permite la utilización del ordenador.

Breve reseña histórica

El término software fue usado por primera vez en 1957 por John W. Turkey, ingeniero en ciencias de la computación. Surge por analogía con la palabra hardware, el sustrato físico donde se ejecuta el software. Hoy día, el software está presente en casi todo lo que nos rodea, aunque no siempre de manera perceptible.

Definición

Probablemente la definición más formal de software es la atribuida a la IEEE en su estándar 729: la suma total de los programas de cómputo, procedimientos, reglas [,] documentación y datos asociados que forman parte de las operaciones de un sistema de cómputo (Ver: IEEE Std 729-1993, IEEE Software Engineering Standard 729-1993: Glossary of Software Engineering Terminology. IEEE Computer Society Press, 1993). Bajo esta definición el concepto de software va más allá de los programas de cómputo en sus distintas formas: código fuente, binario o código ejecutable, además de su documentación.

Tipología

El software se clasifica en dos categorías:
- Software de base o de sistema. Consistente en todo aquel software cuyo propósito es facilitar la ejecución de otro software. Entran en esta categoría:
  - Sistemas operativos.
  - Compiladores.
  - Sistemas gestores de bases de datos.
  - Etc.
- Software de aplicación. Consistente en aquel software que automatiza un sistema de información, es decir, con relevancia para un fin concreto. Entran en esta categoría:
  - Procesadores de texto.
  - Hojas de cálculo.
  - Etc.

Formas

El software adopta varias formas en distintos momentos de su ciclo de vida:
- Código fuente: escrito por programadores. Contiene el conjunto de instrucciones, inteligibles por el ser humano, destinadas a la computadora.
- Código objeto: resultado del uso de un compilador sobre el código fuente. Consiste en una traducción de éste último. El código objeto no es directamente inteligible por el ser humano, pero tampoco es directamente entendible por la computadora. Se trata de una representación intermedia del código fuente.
- Código ejecutable: resultado de enlazar uno o varios fragmentos de código objeto. Constituye un archivo binario con un formato tal que el sistema operativo es capaz de cargarlo en la memoria de un ordenador, y proceder a su ejecución. El código ejecutable es directamente inteligible por la computadora.

El proceso Software

El proceso de creación de software es materia de la Ingeniería del software. Es un proceso complejo que involucra diversas tareas de gestión y desarrollo.

Véase también


- Programación
- Aplicaciones
- Software colaborativo
- Software Libre

Enlaces externos


- [http://www.care-t.com/index.html OlivaNova Model Execution System, un programa que programa]. Categoría:Software ja:ソフトウェア ko:컴퓨터 소프트웨어 simple:Software th:ซอฟต์แวร์

Lenguaje de máquina

Lenguaje de máquina es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de un ordenador o el microcontrolador de un autómata . Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina. Un programa de computadora consiste en una cadena de estas instrucciones de lenguaje de máquina (más los datos). Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas. Los circuitos microprogramables son sistemas digitales, lo que significa que trabajan con dos únicos niveles de tensión. Dichos niveles, por abstracción, se simbolizan con el cero, 0, y el uno, 1, por eso el lenguaje de máquina sólo utiliza dichos signos. Esto permite el empleo de las teorías del álgebra booleana y del sistema binario en el diseño de este tipo de circuitos y en su programación. Claude Elwood Shannon, en su Analysis of Relay and Switching Circuits, y con sus experiencias en redes de conmutación, sentó las bases para la aplicación del álgebra de Boole a las redes de conmutación. Una red de conmutación es un circuito de interruptores eléctricos que al cumplir ciertas combinaciones booleanas con las variables de entrada, define el estado de la salida. Este concepto es el núcleo de las puertas lógicas, las cuales son, por su parte, los ladrillos con que se construyen sistemas lógicos cada vez más complejos. Shannon utilizaba el relé como dispositivo físico de conmutación en sus redes. El relé, a igual que una lámpara eléctrica, posee dos estados: 1 ó 0, esto es, está activado, encendida, o está desactivado, apagada. El desarrollo tecnológico ha permitido evolucionar desde las redes de relés electromagnéticos de Shannon a circuitos con tubos de vacío, luego a redes transistorizadas, hasta llegar a los modernos circuitos integrados cuyas cúspide lo forman los circuitos microprogramados. Tanto el microprocesador como el microcontrolador operan en lenguaje máquina, ya que su repertorio de instrucciones consiste en la ejecución de conjuntos binarios. Por cierto que Shannon fue quien aportó el término bit para los guarismos 1 y 0, abreviatura inglesa de binary digits o "dígitos binarios").

Véase también


- Lógica binaria
- Lenguaje ensamblador Maquina ja:機械語 ko:기계어 simple:Machine code

Software

Software -también conocido como programática o equipamiento lógico- es el conjunto de programas que puede ejecutar el hardware para la realización de las tareas de computación a las que se destina. Se trata del conjunto de instrucciones que permite la utilización del ordenador.

Breve reseña histórica

El término software fue usado por primera vez en 1957 por John W. Turkey, ingeniero en ciencias de la computación. Surge por analogía con la palabra hardware, el sustrato físico donde se ejecuta el software. Hoy día, el software está presente en casi todo lo que nos rodea, aunque no siempre de manera perceptible.

Definición

Probablemente la definición más formal de software es la atribuida a la IEEE en su estándar 729: la suma total de los programas de cómputo, procedimientos, reglas [,] documentación y datos asociados que forman parte de las operaciones de un sistema de cómputo (Ver: IEEE Std 729-1993, IEEE Software Engineering Standard 729-1993: Glossary of Software Engineering Terminology. IEEE Computer Society Press, 1993). Bajo esta definición el concepto de software va más allá de los programas de cómputo en sus distintas formas: código fuente, binario o código ejecutable, además de su documentación.

Tipología

El software se clasifica en dos categorías:
- Software de base o de sistema. Consistente en todo aquel software cuyo propósito es facilitar la ejecución de otro software. Entran en esta categoría:
  - Sistemas operativos.
  - Compiladores.
  - Sistemas gestores de bases de datos.
  - Etc.
- Software de aplicación. Consistente en aquel software que automatiza un sistema de información, es decir, con relevancia para un fin concreto. Entran en esta categoría:
  - Procesadores de texto.
  - Hojas de cálculo.
  - Etc.

Formas

El software adopta varias formas en distintos momentos de su ciclo de vida:
- Código fuente: escrito por programadores. Contiene el conjunto de instrucciones, inteligibles por el ser humano, destinadas a la computadora.
- Código objeto: resultado del uso de un compilador sobre el código fuente. Consiste en una traducción de éste último. El código objeto no es directamente inteligible por el ser humano, pero tampoco es directamente entendible por la computadora. Se trata de una representación intermedia del código fuente.
- Código ejecutable: resultado de enlazar uno o varios fragmentos de código objeto. Constituye un archivo binario con un formato tal que el sistema operativo es capaz de cargarlo en la memoria de un ordenador, y proceder a su ejecución. El código ejecutable es directamente inteligible por la computadora.

El proceso Software

El proceso de creación de software es materia de la Ingeniería del software. Es un proceso complejo que involucra diversas tareas de gestión y desarrollo.

Véase también


- Programación
- Aplicaciones
- Software colaborativo
- Software Libre

Enlaces externos


- [http://www.care-t.com/index.html OlivaNova Model Execution System, un programa que programa]. Categoría:Software ja:ソフトウェア ko:컴퓨터 소프트웨어 simple:Software th:ซอฟต์แวร์

Algoritmo

Un algoritmo es un conjunto finito de instrucciones o pasos que sirven para ejecutar una tarea o resolver un problema. De un modo más formal, un algoritmo es una secuencia finita de operaciones realizables, no ambiguas, cuya ejecución da una solución de un problema.

Introducción

El término algoritmo no está exclusivamente relacionado con las matemáticas, ciencias de la computación o informática. En realidad, en la vida cotidiana empleamos algoritmos en multitud de ocasiones para resolver diversos problemas. Ejemplos son el uso de una lavadora (se siguen las instrucciones), para cocinar (se siguen los pasos de la receta). También, existen ejemplos de índole matemática, como el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para calcular el máximo común divisor de dos enteros positivos, o incluso el método de Gauss para resolver sistemas de ecuaciones.

Implementación

Los algoritmos no se implementan sólo como programas, algunas veces en una red neuronal biológica (por ejemplo, el cerebro humano implementa la aritmética básica o, incluso, una rata sigue un algoritmo para conseguir comida), también en circuitos eléctricos, en instalaciones industriales o maquinaria pesada. El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación, y en la mayoría de los casos su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces codificar) un algoritmo es escribirlo en pseudocódigo o utilizar un lenguaje muy simple tal como Lexico cuyos códigos pueden estar en el idioma del programador. Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de éste con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerese dos tipos de señales: una señal positiva (en el caso de que el número de ceros es mayor que el de unos), y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia, y en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.

Ejemplo

Se presenta el algoritmo para encontrar el máximo de un conjunto de enteros positivos. Se basa en recorrer una vez cada uno de los elementos, comparándolo con un valor concreto (el máximo entero encontrado hasta ahora). En el caso de que el elemento actual sea mayor que el máximo, se le asigna su valor al máximo. El algoritmo escrito de una manera más formal, esto es, en pseudocódigo tendría el siguiente aspecto: ALGORITMO Maximo ENTRADAS: Un conjunto no vacío de enteros C. SALIDAS: El mayor número en el conjunto C. maximo ← -∞ PARA CADA elemento EN el conjunto C, HAZ SI item > maximo, HAZ maximoelem DEVUELVE maximo Sobre la notación:
- "←" representa la asignación entre dos elementos. Por ejemplo, con maximoelem significa que el número maximo cambia su valor por el de elem.
- "DEVUELVE" termina el algoritmo y devuelve el valor a su derecha (en este caso maximo). Como medida de la bondad de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. Por eso, se ha desarrollado el análisis de algoritmos para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada. Por ejemplo, el algoritmo anterior tiene un orden de eficiencia en tiempo de O(n), en la notación O mayúscula n es el tamaño de la entradas; en este caso n es la el número de elementos de C. Además, como el algoritmo necesita recordar un único valor (el máximo) requiere un espacio de O(1) (hay que tener en cuenta que el tamaño de las entradas no se considera como memoria usada por el algoritmo).

Historia

La palabra algoritmo proviene del nombre del matemático persa llamado Abu Abdullah Muhammad bin Musa al-Khwarizmi que vivió entre los siglos VIII y IX. Su trabajo consistió en preservar y difundir el conocimiento de la antigua Grecia y de la India. Sus libros eran de fácil comprensión, he aquí que su principal valor no fuera el de crear nuevos teoremas o nuevas corrientes de pensamiento, sino el simplificar las matemáticas a un nivel lo suficientemente bajo para que pudiera ser comprendido por un amplio público. Cabe destacar, como él señaló las virtudes del sistema decimal indio, (en contra de los sistemas tradicionales árabes) y como explicó que mediante una especificación clara y concisa de cómo calcular sistemáticamente, se podrían definir algoritmos que fueran usados en dispositivos mecánicos en vez de las manos (por ejemplo, ábacos). También estudió la manera de reducir las operaciones que formaban el cálculo. Es por esto que aun no siendo él el creador del primer algoritmo, el concepto lleva aunque no su nombre, sí su pseudónimo. Así, de la palabra algorismo que originalmente hacía referencia a las reglas de uso de la aritmética utilizando dígitos arábigos, se evolucionó a la palabra latina, derivación de al-Khwarizmi, algobarismus, y luego más tarde mutó en algoritmo en el siglo XVIII. La palabra ha cambiado de forma que en su definición se incluyen a todos los procedimientos finitos para resolver problemas. Ya en el siglo XIX, se produjo el primer algoritmo escrito para un computador. La autora fue Ada Byron en cuyos escritos se detallaban la máquina analítica en 1842. Es por ello que es considerada por muchos como la primera programadora aunque, desde Charles Babbage nadie completó su máquina, por lo que el algoritmo nunca se implementó.

Técnicas de diseño de algoritmos


- Algoritmos greedy: Informalmente, podemos decir que este tipo de algoritmos selecciona los elementos del conjunto de candidatos en un determinado orden hasta encontrar una solución; es decir, calcula la solución al problema tomando en cada paso la opción más prometedora. En la mayoría de los casos la solución no es óptima.
- Algoritmos paralelos
- Algoritmos probabilísticos
- Divide y vencerás(divide & conquer, en inglés): este tipo de algoritmos particionan el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos, para después unirlas logrando así, la solución al problema completo.
- Heurísticas: algoritmos que encuentran soluciones a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos.
- Programación dinámica
- Ramificación y acotación: también conocidos como ramificación y poda, branch and bound. Este método se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones.
- Vuelta Atrás: al igual que el método ramificación y acotación, vuelta atrás (backtracking, en inglés) se construye el espacio de soluciones del problema en un árbol que se examina completamente, almacenando las soluciones menos costosas.

Temas relacionados


- Cota superior asintótica
- Cota inferior asintótica
- Cota ajustada asintótica
- Complejidad computacional

Disciplinas relacionadas


- Ciencias de la Computación
- Informática
- Inteligencia artificial
- Investigación operativa
- Matemáticas
- Programación

Libros sobre Algoritmia


- The Art of Computer Programming, Knuth, D. E. [quien fue también, el creador del TeX]
- Introduction to Algorithms (2nd ed), Cormen, T. H., Leiserson, C. E., Rivest, R. L. y Stein, C.
- Introduction to Algorithms. A Creative Approach, Mamber, U.
- Algorithms in C (3r ed), Sedgewick, R. [también existen versiones en C++ y Java]

Enlaces externos


- http://www.algoritmia.net Portal de algoritmia
- http://www.lcc.uma.es/~av/Libro/ Técnicas de Diseño de Algoritmos manual que explica y ejemplifica los distintos paradigmas de diseño de algoritmos. Rosa Guerequeta y Antonio Vallecillo (profesores de la Universidad de Málaga).
- http://webdiis.unizar.es/asignaturas/EDA/ Transparencias de la asignatura "Esquemas Algorítmicos", Campos, J.
- http://dis.um.es/~domingo/alg.html Apuntes y problemas de Algorítmica por Domingo Giménez Cánovas
- [http://www.myalgorithm.com Algoritmos basicos] Categoría: Algoritmos ja:アルゴリズム ko:알고리즘 th:อัลกอริทึม

Niklaus Wirth

Niklaus Wirth Winterthur Suiza, 15 de febrero, 1934). Científico de la computación. En 1949 obtiene la carrera de Ingeniero en Electrónica en el Instituto Federal Suizo de Tecnología (ETH) en Suiza. En 1960 ganó un M.Sc. de la Universidad de Laval, Canadá. En 1963 obtiene un Doctorado en Filosofía (Ph.D.) en la Universidad de California, Berkeley. De 1963 a 1967 el sirvió como profesor auxiliar de Informática en la Universidad de Stanford y de nuevo en la Universidad de Suiza. A partir de 1968 se convirtió en profesor de Informática en la ETH en Suiza, tomándose dos años sabáticos en la Xerox PARC de California. Wirth fue el jefe de diseño de los lenguajes de programación Algol W, Pascal, Modula, Modula-2 y Oberon. También ocupó gran parte de su tiempo en el equipo de diseño e implementación de sistemas operativos Lilith y Oberon para el Lola en el diseño del hardware digital y el sistema de simulación. Su artículo de desarrollo de un programa por refinamiento sucesivo ("program development by stepwise refinement") es considerado un texto clásico en la ingeniería del software, así como su libro Algoritmos + Estructuras de datos = Programas, que recibió un amplio reconocimiento, y que aun hoy en día es útil en la enseñanza de la programación. Recibió el Premio Turing por el desarrollo de estos lenguajes de programación en 1983. Se jubiló en 1999. Wirth, Niklaus

Estructura de datos

En programación, una estructura de datos es una forma de organizar un conjunto de datos elementales (un dato elemental es la mínima información que se tiene en el sistema) con el objetivo de facilitar la manipulación de estos datos como un todo y/o individualmente. Una estructura de datos define la organización e interrelacionamiento de estos, y un conjunto de operaciones que se pueden realizar sobre él. Las operaciones básicas son:
- Alta, adicionar un nuevo valor a la estructura.
- Baja, borrar un valor de la estructura.
- Búsqueda, encontrar un determinado valor en la estructura para se realizar una operación con este valor, en forma SECUENCIAL o BINARIO(siempre y cuando los datos estén ordenados). Otras operaciones que se pueden realizar son:
- Ordenamiento, de los elementos pertenecientes a la estructura.
- Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas. Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como las frecuencias y el orden en que se realiza cada operación sobre los datos.

Algunas estructuras de datos utilizadas en programación


- Arrays (Arreglos)
  - Vectores
  - Matrices
- Tipo de datos algebraico
- Listas Enlazadas
  - Listas Simples
  - Listas Dobles
  - Listas Circulares
  - Listas por saltos (Skip lists)
- Pilas (stack)
- Colas (queue)
  - Colas de Prioridad
- Árboles
  - Árboles Binarios
    - Árbol binario de búsqueda
      - Árbol binario de búsqueda autoajustable
      -
- Árboles Rojo-Negro
      -
- Árboles AVL
      - Árboles Biselados (Árboles Splay)
  - Árboles Multicamino (Multirrama)
    - Árboles B
    - Árboles B+
    - Árboles B
-

- Conjuntos (set)
- Grafos
- Tablas Hash
- Montículos (o heaps)
  - Montículo binario
  - Montículo binómico
  - Montículo de Fibonacci
  - Montículo suave
  - Mantículo 2-3
-
ja:データ構造 ko:자료구조 th:โครงสร้างข้อมูล

Programación estructurada

Una de las cuestiones más importantes que hay que tener en cuenta al construir un programa en un lenguaje de alto nivel, es el control de su ejecución. Son raros los programas que constan de un conjunto de instrucciones que se ejecutan sucesivamente una tras otra. En la mayor parte de los casos, diversas partes del programa se ejecutan o no, dependiendo de que se cumpla alguna condición. Además, hay instrucciones (los bucles) que deben efectuarse varias veces, ya sea en número fijo o hasta que se cumpla una condición determinada. Los lenguajes más antiguos (como Fortran) se apoyaban en una sola instrucción para definir el control de los programas: la instrucción GOTO (del inglés go to, que significa ir a), que corresponde a la transferencia incondicional de los lenguajes simbólicos, a la que se añade alguna forma condicional, combinada con ella, que permite bifurcar el orden de ejecución de las instrucciones. Tanto en Fortran como en Basic, la instrucción GOTO y sus variantes van acompañadas de una o más etiquetas, que indican el número de la instrucción a la que debe dirigirse la transferencia de control. Pero las etiquetas numéricas y las transferencias arbitrarias hacen los programas muy poco legibles y difíciles de comprender. Como primer intento de resolver el problema, en lenguajes más modernos se recurrió a utilizar etiquetas no numéricas, igual que se hace en los lenguajes simbólicos de segunda generación. Sin embargo, a finales de los años sesenta surgió una nueva forma de programar que reduce a la mínima expresión el uso de la instrucción GOTO y la sustituye por otras más comprensibles. Un famoso teorema, demostrado por Edsger Dijkstra ([http://www.cs.utexas.edu/users/UTCS/notices/dijkstra/ewdobit.html 1930-2002]) en los años sesenta, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes:
- El bloque secuencial de instrucciones, instrucciones ejecutadas sucesivamente.
- La instrucción condicional alternativa, de la forma "IF condición THEN instrucción-1 ELSE instrucción-2".
  - Si la condición se cumple, se ejecutará "instrucción-1".
  - En caso contrario, se ejecuta "instrucción-2".
  - Abreviadamente, esta instrucción se suele llamar IF-THEN-ELSE.
- El bucle condicional "WHILE condición DO instrucción", que ejecuta la instrucción repetidamente mientras la condición se cumpla. En su lugar, se puede utilizar también la forma "UNTIL condición DO instrucción", que ejecuta la instrucción hasta que la condición se cumpla. Los dos bucles se diferencian entre sí porque en la forma WHILE la condición se comprueba al principio, por lo que es posible que la instrucción no se ejecute ni una sola vez. En cambio, en la forma UNTIL la condición se comprueba al final del bucle, por lo que la instrucción se ejecuta siempre al menos una vez. Los programas que utilizan sólo estas tres instrucciones de control básicas o sus variantes (como los bucles bm,bmcondicional CASE), pero no la instrucción GOTO, se llaman estructurados. Ver estructuras de control. La programación estructurada (llamada también "programación sin GOTO") se convirtió durante los años setenta en la forma de programar más extendida. A pesar de todo, la mayoría de los lenguajes conservan la instrucción GOTO y las etiquetas de las instrucciones, para utilizarla en casos muy especiales, aunque normalmente se desaconseja su uso. Entre los lenguajes de alto nivel, Pascal, C y Ada pueden considerarse especializados en programación estructurada, y aunque todos ellos permiten utilizar la instrucción GOTO, se desaconseja su uso (aunque en C es una práctica común utilizarlo para manejo de errores). Diferente que la programación estructurada la programación orientada a objetos se enfoca en reducir la cantidad de estructuras de control y reemplazarlo con el concepto de polimorfismo. Aún así los programadores todavía utilizan las estructuras de control (if, while, for, etc...) para implementar sus algoritmos porque en muchos casos es la forma más natural de hacerlo.

Véase también


- Estructuras de control
- Bucle
- Bucle for
- Bucle while
- Bucle repetir
- Ciclo infinito
- Teorema de Dijkstra
- Lenguaje de programación Categoría:Paradigmas de programación ja:構造化プログラミング ms:Pengaturcaraan Berstruktur

Programación orientada a objetos

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es una metodología de diseño de software y un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos) y comportamiento (esto es, procedimientos o métodos). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que se comunican entre ellos para realizar tareas. Esto difiere de los lenguajes procedurales tradicionales, en los que los datos y los procedimientos están separados y sin relación. Estos métodos están pensados para hacer los programas y módulos más fáciles de escribir, mantener y reutilizar. Otra manera en que esto es expresado a menudo, es que la programación orientada a objetos anima al programador a pensar en los programas principalmente en términos de tipos de datos, y en segundo lugar en las operaciones ("métodos") específicas a esos tipos de datos. Los lenguajes procedurales animan al programador a pensar sobre todo en términos de procedimientos, y en segundo lugar en los datos que esos procedimientos manejan. Los programadores que emplean lenguajes procedurales, escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos. Algunas personas también diferencian la POO sin clases, la cual es llamada a veces programación basada en objetos.

Caracteristicas de la POO

Hay un cierto desacuerdo sobre exactamente que características de un método de programación o lenguaje le califican como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (cada una de las cuales se explica más detalladamente en su respectiva página enlazada):
- Abstracción: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando los están, una variedad de técnicas son requeridas para ampliar una abstracción.
- Encapsulamiento: También llamada "ocultación de la información", esto asegura que los objetos no pueden cambiar el estado interno de otros objetos de maneras inesperadas; solamente los propios métodos internos del objeto pueden acceder a su estado. Cada tipo de objeto expone una interfaz a otros objetos que especifica cómo otros objetos pueden interactuar con él. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción.
- Polimorfismo: Las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del referente. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
- Herencia: Organiza y facilita el polimorfismo y la encapsulación permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y las clases en árboles o enrejados que reflejan un comportamiento común.

Origen

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos. La programación orientada a objetos tomó posición como la metodología de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, y otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características procedurales de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, para la cual Java tiene características especiales.

Diferencias con la programación procedural

Apenas como programación procedural conducida a los refinamientos de la técnica, tales como la programación estructurada, los métodos modernos de diseño de software orientado a objetos incluyen refinamientos tales como el uso de los patrones de diseño, diseño por contrato, y lenguajes de modelado (tales como UML). La programación procedimental clásica presenta ciertos problemas, que han ido haciéndose cada vez más graves, a medida que se construían aplicaciones y sistemas informáticos más complejos, entre los que destacan los siguientes:
- Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos, mientras la programación clásica se basa en el comportamiento, representado usualmente por verbos.
- Es difícil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos.
- Es difícil mantener los programas. Casi todos los sistemas informáticos grandes tienen errores ocultos, que no surgen a la luz hasta después de muchas horas de funcionamiento.
- Es difícil reutilizar los programas. Es prácticamente imposible aprovechar en una aplicación nueva las subrutinas que se diseñaron para otra. En la programación orientada a objetos pura no deben utilizarse llamadas de subrutinas, únicamente mensajes. Por ello, a veces recibe el nombre de programación sin CALL, igual que la programación estructurada se llama también programación sin GOTO. Sin embargo, no todos los lenguajes orientados a objetos prohíben la instrucción CALL (o su equivalente), permitiendo realizar programación híbrida, procedimental y orientada a objetos a la vez.

La Programación orientada a objetos como solución

La programación orientada a objetos es una nueva forma de programar que proliferó a partir de los años ochenta y trata de encontrar solución a estos problemas utilizando los siguientes conceptos:
- Objetos: entidades complejas provistas de datos (propiedades, atributos) y comportamiento (funcionalidad, programas, métodos).Corresponden a los objetos reales del mundo que nos rodea.
- Clases: conjuntos de objetos que comparten propiedades y comportamiento.
- Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen.
- Encapsulamiento: cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados a un objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones.
- Polimorfismo: programas diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, aunque el significado del programa varíe según el objeto al que se aplica.

Nuevos conceptos

La programación orientada a objetos introduce nuevos conceptos, que a veces no son más que nombres nuevos aplicados a conceptos antiguos, ya conocidos. Entre ellos destacan los siguientes:
- Método: es un programa asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena mediante un "mensaje". En analogía con un lenguaje procedural se le llamaría "función".
- Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros.
- Propiedad, atributo o variable: datos asociados a un objeto o a una clase de objetos.

Lenguajes orientados a objetos

Entre los lenguajes orientados a objetos destacan los siguientes:
- Smalltalk
- Objective-C
- C++
- Ada 95
- Java
- Ocaml
- Python
- Delphi
- Lexico (en castellano)
- C Sharp
- Eiffel
- Ruby
- ActionScript
- Visual Basic.NET
- PHP
- PowerBuilder Estos lenguajes de programación son muy avanzados en orientación a objetos. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico. Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo. Categoría:Programación orientada a objetos Categoría:Acrónimos de informática ja:オブジェクト指向 ms:Pengaturcaraan Berorientasikan Objek th:การเขียนโปรแกรมเชิงวัตถุ

Lenguaje de programación

Un lenguaje de programación es una técnica estándar de comunicación que permite expresar las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto de reglas sintácticas y semánticas que definen un programa informático. Aunque, muchas veces se usa lenguaje de programación y lenguaje informático como fuesen sinónimos, no tiene porque ser así, ya los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML. Un lenguaje de programación permite a un programador especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y, qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, es decir, ser traducido al lenguaje de máquina, o ser interpretado para que pueda ser ejecutado por el ordenador.

Véase también


- Programación
- Paradigmas de programación

Enlaces externos


- [http://www.levenez.com/lang/ Árbol cronológico de los lenguajes de programación] (en inglés)
- [http://delta.cs.cinvestav.mx/~gmorales/ta/ta.html Principios de Autómatas Finitos]
- [http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm Lista de lenguajes de programación] (hay unos 2500 pero están en inglés) Categoría:Lenguajes de programación ja:プログラミング言語

Compilación

Compilación es el proceso por el cual se traducen programas en código fuente a programas en código objeto. El programa que realiza esta traducción se llama compilador. El archivo de código objeto que se obtiene con la compilación está representado normalmente en código de máquina, aunque también puede ser un código intermedio binario multiplataforma (bytecode). Para conseguir el programa ejecutable final a partir de todos los archivos de código objeto se debe utilizar un programa llamado montador y un enlazador (linker). Este proceso de montaje tiene como resultado un archivo ejecutable que contiene el programa en código máquina listo para ser ejecutado con la ayuda del sistema operativo. El proceso de enlazamiento arregla las referencias a subrutinas externas. Fases de la realización de un programa Categoría:Programación

Compilación

Compilación es el proceso por el cual se traducen programas en código fuente a programas en código objeto. El programa que realiza esta traducción se llama compilador. El archivo de código objeto que se obtiene con la compilación está representado normalmente en código de máquina, aunque también puede ser un código intermedio binario multiplataforma (bytecode). Para conseguir el programa ejecutable final a partir de todos los archivos de código objeto se debe utilizar un programa llamado montador y un enlazador (linker). Este proceso de montaje tiene como resultado un archivo ejecutable que contiene el programa en código máquina listo para ser ejecutado con la ayuda del sistema operativo. El proceso de enlazamiento arregla las referencias a subrutinas externas. Fases de la realización de un programa Categoría:Programación

Ejecutable

Un ejecutable o archivo ejecutable, en informática, es un archivo 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 código intermedio que requiera un intérprete para ejecutarlo. Además suele contener llamadas a funciones específicas de un sistema operativo. Dependiendo de lo específicas que sean las instrucciones, hablaremos de ejecutables portables (se pueden ejecutar en varias plataformas) y no portables (destinado a una plataforma concreta). Por ejemplo, un ejecutable Java es portable; uno de Windows o Unix no lo es. Existen otro tipo de programas llamados scripts. No contienen código máquina sino el código fuente, que se interpreta mientras se ejecuta. Determinar si un archivo es ejecutable es sobre todo una cuestión de convención. Unos sistemas operativos se basan en la extensión de archivo (como la terminación .exe) y otros lo hacen leyendo los metadatos (como los bits de permiso de ejecución en Unix). En la mayoría de los sistemas modernos, un archivo ejecutable contiene mucha información que no es parte del programa en sí: recursos como textos e imágenes, requisitos del entorno de ejecución, información simbólica y de depuración, u otra información que ayude al sistema operativo a ejecutar el programa. Categoría:Partes de programas

Enlazador

Un enlazador (en inglés, linker) es un programa que toma los ficheros de código objeto generado en los primeros pasos del proceso de compilación, la información de todos los recursos necesarios (biblioteca), quita aquellos recursos que no necesita, y enlaza el código objeto con su(s)biblioteca con lo que finalmente produce un fichero ejecutable o una biblioteca. En el caso de los programas enlazados dinámicamente, el enlace entre el programa ejecutable y las bibliotecas se realiza en tiempo de carga o ejecución del programa. Categoría:Herramientas de programación ja:リンケージエディタ

Código objeto

Se llama código objeto en programación al código resultante de la compilación del código fuente, por lo general está codificado en código de máquina y distribuido en varios archivos resultantes de la compilación de cada archivo de código fuente. Para obtener un archivo ejecutable se han de enlazar todos los archivos de código fuente con un programa llamado enlazador (linker).
Fases en la realización de software
Categoría:Partes de programas



Ada Lovelace

Ada Augusta Byron King (10 de diciembre de 1815 - 27 de noviembre de 1852) fue la primera programadora en la historia de las computadoras. Ada Augusta nació en Inglaterra, única hija legítima del poeta inglés Lord Byron y de Annabella Milbanke Byron. Sus padres se separaron legalmente cuando ella tenía dos meses de edad. Su padre abandonó definitivamente Gran Bretaña y su hija nunca llegó a conocerlo en persona. El 8 de julio de 1835 se casó con William King, octavo barón de King, nombrado más tarde conde de Lovelace. Su nombre de casada pasó a ser desde entonces lady Ada Augusta Byron King, condesa de Lovelace, nombre del cual nace su denominación moderna de (lady) Ada Lovelace. Siguió estudios particulares de matemáticas y ciencias, siendo uno de sus tutores Augustus De Morgan, primer profesor de matemáticas de la Universidad de Londres. Autodidacta, desde joven trabajó con Charles Babbage a quien se le considera como el padre de las computadoras, gracias a que su «máquina analítica» funciona con el mismo principio que las computadoras actuales. Charles Babbage Desarrolló instrucciones para hacer cálculos en una versión temprana del computador. Su relación con Charles Babbage, el hombre que inventó la primera computadora, comenzó cuando ella visitaba su taller a temprana edad. Babbage estaba muy impresionado con la manera en que ella entendía su computador para el que escribió un "plan" describiendo los pasos que permitirían calcular los valores de los números de Bernoulli. Suyos son, además, conceptos tan familiares en un lenguaje de programación como un conjunto de instrucciones que permiten que otras se repitan en un bucle o subrutina. Posteriormente, él pasó a ser su tutor y más tarde trabajaron juntos. Publicó en 1843 una serie de influyentes notas sobre la computadora de Babbage, su «máquina analítica», que nunca llegó a construirse (aunque firmó con sus iniciales A.A.L. por miedo a ser censurada por ser mujer). Ada Byron se llamó a sí misma una analista, un concepto realmente moderno para la época. En su notas, Ada Augusta dice que la «máquina analítica» sólo podía dar información disponible que ya era conocida: vio claramente que no podía originar conocimiento. Su trabajo fue olvidado por muchos años, atribuyéndole exclusivamente un papel de transcriptora de las notas de Babbage. Este mismo caracterizó su aportacion al llamarla su intérprete y recientes investigaciones muestran la originalidad de su punto de vista sobre las instrucciones necesarias para el funcionamiento de la «máquina analítica». En este momento se reconoce a Ada Byron como la primera persona en describir un lenguaje de programación de carácter general interpretando las ideas de Babbage, pero reconociéndosele la plena autoría y originalidad de sus aportaciones. Siendo muchas las mujeres que han realizado grandes aportaciones a la informática, sólo Ada Lovelace cuenta con un lenguaje de programación que lleve su nombre: en 1979 el Departamento de Defensa de los Estados Unidos creó un lenguaje de programación basado en Pascal en honor de Ada Byron llamado lenguaje de programación Ada. Ada Byron fue una mujer muy adelantada a su época que lamentablemente murió de cancer a la temprana edad de 37 años.

Enlaces externos


- [http://www.iua.upf.es/~berenguer/textos/ada/principal.html Ada, por Xavier Berenguer]. Publicado en El País.
- [http://www.laflecha.net/perfiles/tecnologia/ada_lovelace/ Ada Lovelace, biografía en laflecha.net] Lovelace, Ada Categoría:programación Lovelace, Ada ja:エイダ・ラブレス th:เอดา ไบรอน

Lord Byron

Lord George Gordon Byron (1788-1824) Poeta inglés, uno de los escritores más versátiles e importantes del Romanticismo. Nacido en Londres el 22 de enero de 1788, estudió en el colegio de Harrow y la Universidad de Cambridge. En 1798, al morir su tío abuelo William, quinto barón Byron, heredó el título y las propiedades. En 1807 se publicó su libro de poemas Horas de ocio. En 1809 ocupó un escaño en la Cámara de los Lores y emprendió un viaje de dos años por España, Portugal y Grecia. La publicación en 1812 de los dos primeros Cantos de Childe Harold, poemas que narran sus viajes por Europa, le llevaron a la fama. En 1815, año en que publicó Melodías hebreas, se casó con Anna Isabella Milbanke, quien le abandonó en 1816 tras dar a luz a la única hija legítima del poeta, Augusta Ada. Los rumores sobre sus relaciones incestuosas con su hermanastra Augusta y las dudas sobre su cordura provocaron su ostracismo social. Amargado profundamente, Byron abandonó Inglaterra en 1816 y nunca volvió. En la España absolutista de Fernando VII y en una América hispana que luchaba por su emancipación, la vida y obra de Byron tuvieron una gran influencia y sirvieron de inspiración a los poetas del Romanticismo. Byron, Lord Byron

Lenguaje de programación Ada

Ada es un lenguaje de programación estructurado y fuertemente tipado de forma estática que fue diseñado por Jean Ichbiah de CII Honeywell Bull por encargo del Departamento de Defensa de los EE.UU. Es un lenguaje multipropósito, orientado a objetos y concurrente, pudiendo llegar desde la facilidad de Pascal hasta la flexibilidad de C++. Fue diseñado con la seguridad en mente y con una filosofía orientada a la reducción de errores comunes y difíciles de descubrir. Para ello se basa en un tipado muy fuerte y en chequeos en tiempo de ejecución (desactivables en beneficio del rendimiento). La sincronización de tareas se realiza mediante la primitiva rendezvous. Ada se usa principalmente en entornos en los que se necesita una gran seguridad y confiabilidad como la defensa, la aeronáutica (Boeing o Airbus), la gestión del tráfico aéreo (como Indra en España) y la industria aeroespacial entre otros.

Historia

El lenguaje fue diseñado bajo encargo del Departamento de Defensa de los Estados Unidos (DoD). Durante los años 1970, este departamento tenía proyectos en una infinidad de lenguajes y estaba gastando mucho dinero en software. Para solucionarlo se buscó un lenguaje único que cumpliese unas ciertas normas recogidas en el documento Steelman. Después de un estudio de los lenguajes existentes en la época se decidió que ninguno las cumplía totalmente, por lo que se hizo un concurso público al que se presentaron cuatro equipos, cuyas propuestas se nombraron con un color: Rojo (Intermetrics), Verde (CII Honeywell Bull), Azul (SofTEch) y Amarillo (SRI International). Finalmente en mayo de 1979 se seleccionó la propuesta Verde diseñada por Jean Ichbiah de CII Honeywell Bull, y se le dio el nombre de Ada. Esta propuesta era un sucesor de un lenguaje anterior de este equipo llamado LIS y desarrollado durante los años 1970. El nombre se eligió en conmemoración de lady Ada Augusta Byron (1816-1852)Condesa de Lovelace,hija del poeta Lord George Byron, a quien se considera la primera programadora de la Historia, por su coolaboración y relación con Charles Babbage, creador de la máquina analítica. El lenguaje se convirtió en un estándar de ANSI en 1983 (ANSI/MIL-STD 1815) y un estándar ISO en 1987 (ISO-8652:1987). El Departamento de Defensa de los EE. UU. y los ministerios equivalentes de varios países de la OTAN exigían el uso de este lenguaje en los proyectos que contrataban (el Ada mandate). La obligatoriedad en el caso de Estados Unidos terminó en 1997, cuando el DoD comenzó a usar productos COTS (commercial off the shelf).

Estándar ISO

Hasta la fecha la ISO ha publicado dos ediciones del estándar de Ada: la original Ada 83 y la última Ada 95 (ISO/IEC 8652:1995). A diferencia de otros estándares de ISO, el de Ada es libremente reproducible [http://www.adahome.com/rm95/]. Ada 83 incluía conceptos novedosos como el manejo de excepciones y la programación genérica. Por sus capacidades de encapsulación y polimorfismo paramétrico (genéricos), se podía considerar ya en esa época un lenguaje basado en objetos. La revisión Ada 95 fue diseñada por Tucker Taft de Intermetrics entre 1992 y 1995. Esta edición entre otras cosas añadió la capacidad de herencia y el despachado dinámico (dynamic dispatching) para completar sus características de lenguaje orientado a objetos. De hecho fue el primer lenguaje orientado a objetos estandarizado por ISO. Actualmente se está trabajando en Ada 200Y, la siguiente revisión del lenguaje que seguramente se publicará a finales de 2005 o principios de 2006. Todavía no está decidido si finalmente se denominará Ada 2005 o Ada 2006.

Compiladores

Un compilador de Ada muy usado es GNAT, originalmente desarrollado por la Universidad de Nueva York bajo patrocinio del DoD. Está basado en la tecnología de GCC y es software libre. Actualmente está mantenido por AdaCore (antes llamada Ada Core Technologies), empresa que ofrece soporte y servicios sobre el compilador. Existen otros compiladores comerciales.

Ejemplo de código Ada

El típico ejemplo de Hola mundo en Ada es: with Ada.Text_IO; use Ada.Text_IO; procedure Hola_Mundo is begin Put_Line ("Hola Mundo"); end; Aquí debajo hay un ejemplo más elaborado (función de Ackermann) de código fuente escrito en Ada, para mostrar algunos de sus rasgos sintácticos. with Ada.Command_Line; use Ada.Command_Line; with Ada.Text_IO; use Ada.Text_IO; procedure Ackermann is function Ack (X, Y: Integer) return Integer is begin if X = 0 then return Y + 1; elsif Y = 0 then return Ack(X - 1, 1); else return Ack(X - 1, Ack(X, Y - 1)); end if; end Ack; X, Y, Resultado : Integer; begin if Argument_Count = 2 then X := Integer'Value (Argument(1)); Y := Integer'Value (Argument(2)); elsif Argument_Count = 1 then X := 3; Y := Integer'Value (Argument(1)); else X := 3; Y := 3; end if; Resultado := Ack (X, Y); Put_Line ("Ack (" & Integer'Image (X) & "," & Integer'Image (Y) & ") = " & Integer'Image (Resultado)); end Ackermann; Entre las características que encontramos en este ejemplo se puede destacar:
- La sintaxis, inspirada en Pascal, es bastante legible incluso para personas que no conozcan el lenguaje. Es un lenguaje que no escatima en la longitud de las palabras clave, en la filosofía de que un programa se escribe una vez, se modifica decenas de veces y se lee miles de veces (legibilidad es más importante que rapidez de escritura).
- Identificadores y palabras claves son equivalentes sea cual sea el uso de mayúsculas y minúsculas, es decir es un lenguaje case-insensitive.
- En este caso, todo el programa es un único procedimiento, que puede contener subprogramas (procedimientos o funciones) (en este caso: la función Ack).
- Cada sentencia se cierra con end qué_cerramos. Es un modo de evitar errores y facilitar la lectura. No es necesario hacerlo en el caso de subprogramas, aunque todos los manuales lo aconsejan y casi todos los programadores de Ada lo hacen.
- El operador de asignación es :=, el de igualdad =. A los programadores de C y similares les puede confundir este rasgo inspirado en Pascal.
- La sintaxis de atributos predefinidos es Objeto'Atributo (o Tipo'Atributo) (nota: esto sólo aplica a atributos predefinidos por el lenguaje, ya que no es el concepto de atributo típico de OOP).
- Se distingue entre "procedimientos" (subrutinas que no devuelven ningún valor pero pueden modificar sus parámetros) y "funciones" (subrutinas que devuelven un valor y no modifican los parámetros). Muchos lenguajes de programación no hacen esta distinción. Las funciones de Ada favorecen la seguridad al reducir los posibles efectos colaterales, pues no pueden tener parámetros in out.

Véase también


- Lenguaje de programación SPARK
- Perfil de Ravenscar

Enlaces externos


- En español:
  - [http://iio.ens.uabc.mx/~jmilanez/escolar/sistemas_operativos/expo-1.html Curso básico de Ada 83 en uabc.mx]
  - [http://www.gedlc.ulpgc.es/docencia/NGA/index.html Curso básico de Ada 95 en ulpgc.es]
  - [http://www.adaspain.org Asociación Ada-Spain]
  - [http://dmoz.org/World/Espa%c3%b1ol/Computadoras/Programaci%c3%b3n/Lenguajes/Ada/ Directorio de páginas sobre Ada]
  - [http://www.canalada.org/ canalada.org - Foro sobre Ada]
- En inglés:
  - [http://www.adaworld.com Ada World]
  - [http://www.adapower.com Ada Power]
  - [http://www.ada-europe.com Asociación Ada-Europe]
  - [http://dmoz.org/Computers/Programming/Languages/Ada/ Directorio de páginas sobre Ada]
  - [http://www.iuma.ulpgc.es/users/jmiranda/ Página personal de Javier Miranda sobre Ada] Ada ja:Ada

Programador

Un programador es un individuo que ejerce la programación, es decir, que escribe programas de ordenador. Los programadores también reciben el nombre de desarrolladores de software. En la mayoría de los países, programador es también una categoría profesional reconocida.

Breve reseña histórica

Ada Lovelace es considerada la primera programadora de la historia. Su contribución consistió en un método para calcular los números de Bernoulli en la máquina analítica de Charles Babbage, matemático con el que colaboraba en 1842. 1842

Descripción

El programador se encarga de la implementación de algoritmos mediante un lenguaje de programación que pueda entender la computadora. Inicialmente, la profesión se formalizó desde el enfoque Tayloriano de la especialización de funciones en la empresa. Así, el proceso de producción de software se concibe como un conjunto de tareas altamente especializadas donde está claramente definido el papel de cada categoría profesional:
- El analista tiene como cometido analizar un problema y describirlo con el propósito de ser solucionado mediante un sistema de información.
- El programador cuyo única función consistía en trasladar las especificaciones del analista en código ejecutable por la computadora. Dichas especificaciones se recogen en un documento denominanado cuaderno de carga, medio de comunicación entre ambos. Obsérvese que esto se consideraba un trabajo mecánico y de baja cualificación. Hoy día se reconoce que este enfoque no es válido para organizar tareas de tipo intelectual, como es la producción de software. De manera que la profesión de programador ha ido evolucionando. Las dificultades de comunicación entre analistas y programadores (un mero documento no basta para describir lo que se quiere hacer) dio origen a una categoría profesional intermedia, denominada analista-programador. La concepción original del programador ha desaparecido siendo sustida por esta: la de un profesional mucho más formado y con unas funciones menos "mecánicas". La profesión de analista también ha evolucionado, surgiendo el concepto diseñador (de software). Esto se debe a los avances de la ingeniería del software donde se reconoce que el análisis es una actividad distinta del diseño. El análisis describe el problema (el qué hacer) mientras que el diseño describe la solución (el cómo hacerlo). En algunos países esto ha dado lugar a la categoría profesional del diseñador o modelador de software. Mientras que en otros países, esta actividad ha sido absorbida tanto por analistas como por programadores, dando lugar a una indefinición aún más amplia de la profesión de programador.

Situación de la profesión

Como conclusión de lo anterior, cabe inferir que, hoy por hoy, un programador requiere profundos conocimientos que incluyen: matemáticas, electrónica, algorítmica, ingeniería del software, teoría de la computación, etc. Por tanto, se trata de una profesión de alta cualificación. No obstante, la mayoría de las empresas del siglo XXI aún siguen el enfoque Tayloriano en su gestión, de manera que siguen considerando la profesión de programador como un trabajo de baja cualificación. A este hecho se añade el intrusismo profesional, ya que, bajo este enfoque Tayloriano, el simple conocimiento de un lenguaje de programación habilita para el ejercicio de la programación. Esto atrae fácilmente a profesionales de otros mercados laborales menos favorecidos. Ambos factores contribuyen a que la profesión cuente con bajos salarios, inestabilidad laboral (es "fácil" cambiar un programador por otro) y un alto estrés. Por ejemplo, en Estados Unidos se calcula que aproximadamente la mitad de los programadores abandonan la profesión. Tanto en EEUU como en otros países, se está experimentando un proceso de deslocalización de programadores desde principios de los años 2000. Siendo el trabajo [http://zdnet.search.com/search?cat=279&q=offshoring desplazado a países asiáticos] (por ejemplo, La India) donde los costes laborales son mucho menores. Incluso existen casos de programadores que son [http://www.elmundo.es/navegante/2005/05/13/empresas/1115996916.html llevados a alta mar] para trabajar en aguas internacionales. Para algunos esto conducirá a un mayor impulso de estas tecnologías en los países en desarrollo, y a su incorporación a los circuitos globales de la sociedad de la información.

Especialidades

Estrictamente hablando, la profesión de programador no conoce especialidades. No obstante, existen diversas ramas por las que se decantan los propios profesionales y que se ven reflejadas en la oferta de empleo. Así, es posible mencionar algunas:
- Programadores de mainframe. Aunque se cree extinguida la actividad en los viejos grandes sistemas informáticos, lo cierto es que aún existen muchos en funcionamiento que requieren mantenimiento. La tecnología que manejan estos programadores es radicalmente distinta a la del resto, motivo por el que se puede considerar ésta como la rama más especializada. Entre sus conocimientos se cuenta Cobol, JCL, base de datos jerárquicas, etc.
- Programadores de "Nuevas Tecnologías". Rama que gira en torno a Internet y los negocios por medios electrónicos. Entre sus conocimientos destaca Java, .NET, JSP, PHP, Python, Perl, etc.
- Programadores de videojuegos. Destacan sus conocimientos de hardware y ensamblador.
- Programadores de sistemas abiertos. Rama asociada a la Arquitectura Cliente-Servidor. Requiere conocimientos de C, Pascal, etc.

Véase también


- Programación
- Lenguaje de programación
- Software
- Código fuente
- Ingeniería del software Categoría:Informáticos Categoría:Programación Categoría:Ocupaciones ja:プログラマ ko:프로그래머 th:โปรแกรมเมอร์

Lenguaje de programación

Un lenguaje de programación es una técnica estándar de comunicación que permite expresar las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto de reglas sintácticas y semánticas que definen un programa informático. Aunque, muchas veces se usa lenguaje de programación y lenguaje informático como fuesen sinónimos, no tiene porque ser así, ya los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML. Un lenguaje de programación permite a un programador especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y, qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, es decir, ser traducido al lenguaje de máquina, o ser interpretado para que pueda ser ejecutado por el ordenador.

Véase también


- Programación
- Paradigmas de programación

Enlaces externos


- [http://www.levenez.com/lang/ Árbol cronológico de los lenguajes de programación] (en inglés)
- [http://delta.cs.cinvestav.mx/~gmorales/ta/ta.html Principios de Autómatas Finitos]
- [http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm Lista de lenguajes de programación] (hay unos 2500 pero están en inglés) Categoría:Lenguajes de programación ja:プログラミング言語

Programación dirigida por eventos

La programacion dirigida por eventos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema o que ellos mismos provoquen. Para entender la programación dirigida por eventos, podemos oponerla a lo que no es: mientras en la programación secuencial es el programador el que define cuál va a ser el flujo del programa, en la programación dirigida por eventos será el propio usuario --o lo que sea que esté accionando el programa-- el que dirija el flujo del programa. En la programación dirigida por eventos, al comenzar la ejecución del programa se llevarán a cabo las inicializaciones y demás código inicial y a continuación el programa quedará bloqueado hasta que se produzca algún evento. Cuando alguno de estos eventos tenga lugar, el programa pasará a ejecutar el código del correspondiente manejador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botón de play de un reproductor de películas, se ejecutará el código del manejador de evento, que será el que haga que la película se muestre por pantalla. Un ejemplo claro lo tenemos en los sistemas de programación Lexico y Visual Basic, en los que a cada elemento del programa (objetos, controles, etcétera) se le asignan una serie de eventos que generará dicho elemento, como la pulsación de un botón del ratón sobre él o el redibujado del control. Categoría:Paradigmas de programación

Programación estructurada

Una de las cuestiones más importantes que hay que tener en cuenta al construir un programa en un lenguaje de alto nivel, es el control de su ejecución. Son raros los programas que constan de un conjunto de instrucciones que se ejecutan sucesivamente una tras otra. En la mayor parte de los casos, diversas partes del programa se ejecutan o no, dependiendo de que se cumpla alguna condición. Además, hay instrucciones (los bucles) que deben efectuarse varias veces, ya sea en número fijo o hasta que se cumpla una condición determinada. Los lenguajes más antiguos (como Fortran) se apoyaban en una sola instrucción para definir el control de los programas: la instrucción GOTO (del inglés go to, que significa ir a), que corresponde a la transferencia incondicional de los lenguajes simbólicos, a la que se añade alguna forma condicional, combinada con ella, que permite bifurcar el orden de ejecución de las instrucciones. Tanto en Fortran como en Basic, la instrucción GOTO y sus variantes van acompañadas de una o más etiquetas, que indican el número de la instrucción a la que debe dirigirse la transferencia de control. Pero las etiquetas numéricas y las transferencias arbitrarias hacen los programas muy poco legibles y difíciles de comprender. Como primer intento de resolver el problema, en lenguajes más modernos se recurrió a utilizar etiquetas no numéricas, igual que se hace en los lenguajes simbólicos de segunda generación. Sin embargo, a finales de los años sesenta surgió una nueva forma de programar que reduce a la mínima expresión el uso de la instrucción GOTO y la sustituye por otras más comprensibles. Un famoso teorema, demostrado por Edsger Dijkstra ([http://www.cs.utexas.edu/users/UTCS/notices/dijkstra/ewdobit.html 1930-2002]) en los años sesenta, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes:
- El bloque secuencial de instrucciones, instrucciones ejecutadas sucesivamente.
- La instrucción condicional alternativa, de la forma "IF condición THEN instrucción-1 ELSE instrucción-2".
  - Si la condición se cumple, se ejecutará "instrucción-1".
  - En caso contrario, se ejecuta "instrucción-2".
  - Abreviadamente, esta instrucción se suele llamar IF-THEN-ELSE.
- El bucle condicional "WHILE condición DO instrucción", que ejecuta la instrucción repetidamente mientras la condición se cumpla. En su lugar, se puede utilizar también la forma "UNTIL condición DO instrucción", que ejecuta la instrucción hasta que la condición se cumpla. Los dos bucles se diferencian entre sí porque en la forma WHILE la condición se comprueba al principio, por lo que es posible que la instrucción no se ejecute ni una sola vez. En cambio, en la forma UNTIL la condición se comprueba al final del bucle, por lo que la instrucción se ejecuta siempre al menos una vez. Los programas que utilizan sólo estas tres instrucciones de control básicas o sus variantes (como los bucles bm,bmcondicional CASE), pero no la instrucción GOTO, se llaman estructurados. Ver estructuras de control. La programación estructurada (llamada también "programación sin GOTO") se convirtió durante los años setenta en la forma de programar más extendida. A pesar de todo, la mayoría de los lenguajes conservan la instrucción GOTO y las etiquetas de las instrucciones, para utilizarla en casos muy especiales, aunque normalmente se desaconseja su uso. Entre los lenguajes de alto nivel, Pascal, C y Ada pueden considerarse especializados en programación estructurada, y aunque todos ellos permiten utilizar la instrucción GOTO, se desaconseja su uso (aunque en C es una práctica común utilizarlo para manejo de errores). Diferente que la programación estructurada la programación orientada a objetos se enfoca en reducir la cantidad de estructuras de control y reemplazarlo con el concepto de polimorfismo. Aún así los programadores todavía utilizan las estructuras de control (if, while, for, etc...) para implementar sus algoritmos porque en muchos casos es la forma más natural de hacerlo.

Véase también


- Estructuras de control
- Bucle
- Bucle for
- Bucle while
- Bucle repetir
- Ciclo infinito
- Teorema de Dijkstra
- Lenguaje de programación Categoría:Paradigmas de programación ja:構造化プログラミング ms:Pengaturcaraan Berstruktur

Programación orientada a objetos

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es una metodología de diseño de software y un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos) y comportamiento (esto es, procedimientos o métodos). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que se comunican entre ellos para realizar tareas. Esto difiere de los lenguajes procedurales tradicionales, en los que los datos y los procedimientos están separados y sin relación. Estos métodos están pensados para hacer los programas y módulos más fáciles de escribir, mantener y reutilizar. Otra manera en que esto es expresado a menudo, es que la programación orientada a objetos anima al programador a pensar en los programas principalmente en términos de tipos de datos, y en segundo lugar en las operaciones ("métodos") específicas a esos tipos de datos. Los lenguajes procedurales animan al programador a pensar sobre todo en términos de procedimientos, y en segundo lugar en los datos que esos procedimientos manejan. Los programadores que emplean lenguajes procedurales, escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos. Algunas personas también diferencian la POO sin clases, la cual es llamada a veces programación basada en objetos.

Caracteristicas de la POO

Hay un cierto desacuerdo sobre exactamente que características de un método de programación o lenguaje le califican como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (cada una de las cuales se explica más detalladamente en su respectiva página enlazada):
- Abstracción: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando los están, una variedad de técnicas son requeridas para ampliar una abstracción.
- Encapsulamiento: También llamada "ocultación de la información", esto asegura que los objetos no pueden cambiar el estado interno de otros objetos de maneras inesperadas; solamente los propios métodos internos del objeto pueden acceder a su estado. Cada tipo de objeto expone una interfaz a otros objetos que especifica cómo otros objetos pueden interactuar con él. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción.
- Polimorfismo: Las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del referente. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
- Herencia: Organiza y facilita el polimorfismo y la encapsulación permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y las clases en árboles o enrejados que reflejan un comportamiento común.

Origen

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos. La programación orientada a objetos tomó posición como la metodología de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas d