Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
net/publication/280035971
CITATIONS READS
0 4,711
5 authors, including:
Reiner Creutzburg
Brandenburg University of Applied Sciences
465 PUBLICATIONS 366 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Reiner Creutzburg on 14 July 2015.
Por Wikipedians
EDITADO
POR:
Reiner
Creutzburg,
Montserrat
Rodríguez,
Dulce
García,
María
Martínez
Fachhochschule
Brandenburg
Fachbereich
Informatik
und
Medien
PF
2132
D-‐14737
Brandenburg
,
Germany
Email:
creutzburg@fh-‐brandenburg.de
Índice general
1 Computadora 1
1.1 Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1 Unidad central de procesamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.2 Memoria primaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.3 Periféricos de Entrada, de Salida o de Entrada/Salida . . . . . . . . . . . . . . . . . . . . 3
1.1.4 Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Otros conceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Etimología de la palabra ordenador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.2 Tipos de computadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.3 Componentes y periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4.4 Otros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Lenguaje de programación 8
3.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.1 Variables y vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2.2 Condicionantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.3 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.4 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.5 Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.6 Semántica estática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.7 Sistema de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4 Técnica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4.1 Paradigmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.5 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
i
ii ÍNDICE GENERAL
4 Algoritmo 16
4.1 Definición formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2 Medios de expresión de un algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.1 Diagrama de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.2 Pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.3 Sistemas formales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.4 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.5 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.6 Estructuras secuenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 Algoritmos como funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.4 Análisis de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5 Ejemplo de algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5.1 Descripción de alto nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5.2 Descripción formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5.3 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.6 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.6.1 Tipos de algoritmos según su función . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.6.2 Técnicas de diseño de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.6.3 Temas relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.6.4 Disciplinas relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.7 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.8 Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.9 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5 Algoritmo determinista 22
5.1 Definición formal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.2 Cuándo un algoritmo puede volverse no determinista . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3 Problemas con los algoritmos deterministas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.4 Notas al pie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.5 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6 Estructura de datos 24
6.1 Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2 Estructuras de datos en programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7 Cola (informática) 25
7.1 Usos concretos de la cola . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.2 Información adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.3 Operaciones Básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.4 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ÍNDICE GENERAL iii
9 Vector (informática) 32
9.1 Índices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9.2 Notación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9.3 Forma de acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9.4 Vectores dinámicos y estáticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9.4.1 Ejemplos en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9.5 Vectores multidimensionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9.6 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
10 Pila (informática) 34
10.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
10.2 Pila como tipo abstracto de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
10.2.1 Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.2.2 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.2.3 Estructuras de datos relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.3 Pilas Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.4 Arquitectura básica de una pila . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.5 Soporte de Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
10.6 Soporte de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
10.7 Expresión de evaluación y análisis sintáctico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
10.7.1 Tiempo de ejecución de la gestión de memoria . . . . . . . . . . . . . . . . . . . . . . . 37
10.7.2 Solucionar problemas de búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
10.8 Seguridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
iv ÍNDICE GENERAL
11 Programa informático 38
11.1 Programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11.1.1 Paradigmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
11.1.2 Compilado o interpretando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
11.1.3 Programas que se auto-modifican . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
11.2 Ejecución y almacenamiento de los programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
11.2.1 Programas empotrados en hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11.2.2 Programas cargados manualmente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11.2.3 Programas generados automáticamente . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11.2.4 Ejecución simultánea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
11.3 Categorías funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
11.4 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
11.5 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
11.6 Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
11.7 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
11.8 Text and image sources, contributors, and licenses . . . . . . . . . . . . . . . . . . . . . . . . . . 43
11.8.1 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
11.8.2 Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
11.8.3 Content license . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Capítulo 1
Computadora
Computadora de Escritorio.
1
2 CAPÍTULO 1. COMPUTADORA
F D
máquinas, y ocupan una pequeña fracción de su espacio.
[7]
ca. Los primeros visionarios vaticinaron que la progra- bre todo a su utilidad dedicada especialmente a labores
mación permitiría jugar al ajedrez, ver películas y otros de cálculo científico, eficiencia contra reloj y accesibili-
usos. dad del usuario bajo programas y software profesional y
La gente que trabajaba para los gobiernos y las grandes especial, permiten desempeñar trabajos de gran cantidad
empresas también usó los computadores para automati- de cálculos y “fuerza” operativa. Una Workstation es, en
zar muchas de las tareas de recolección y procesamiento esencia, un equipo orientado a trabajos personales, con
de datos, que antes eran hechas por humanos; por ejem- capacidad elevada de cálculo y rendimiento superior a los
plo, mantener y actualizar la contabilidad y los inventa- equipos PC convencionales, que aún tienen componentes
de elevado coste, debido a su diseño orientado en cuanto
rios. En el mundo académico, los científicos de todos los
campos empezaron a utilizar los computadores para ha- a la elección y conjunción sinérgica de sus componentes.
En estos casos, el software es el fundamento del diseño
cer sus propios análisis. El descenso continuo de los pre-
cios de los computadores permitió su uso por empresas del equipo, el que reclama, junto con las[cita exigencias del
usuario, el diseño final de la Workstation. requerida]
cada vez más pequeñas. Las empresas, las organizacio-
nes y los gobiernos empezaron a emplear un gran número
de pequeños computadores para realizar tareas que antes
eran hechas por computadores centrales grandes y costo- 1.3 Etimología de la palabra orde-
sos. La reunión de varios pequeños computadores en un
solo lugar se llamaba torre de servidores[cita requerida] .
nador
Con la invención del microprocesador en 1970, fue
posible fabricar computadores muy baratos. Nacen los
computadores personales (PC), los que se hicieron famo-
sos para llevar a cabo diferentes tareas como guardar li-
bros, escribir e imprimir documentos, calcular probabi-
lidades y otras tareas matemáticas repetitivas con hojas
de cálculo, comunicarse mediante correo electrónico e
Internet. Sin embargo, la gran disponibilidad de compu-
tadores y su fácil adaptación a las necesidades de cada
persona, han hecho que se utilicen para varios propósi-
tos.
Al mismo tiempo, los pequeños computadores fueron ca-
si siempre con una programación fija, empezaron a hacer-
se camino entre las aplicaciones del hogar, los coches, los
aviones y la maquinaria industrial. Estos procesadores in-
tegrados controlaban el comportamiento de los aparatos PC con interfaz táctil.
más fácilmente, permitiendo el desarrollo de funciones
de control más complejas como los sistemas de freno an- La palabra española ordenador proviene del término
tibloqueo en los coches. A principios del siglo XXI, la francés ordinateur, en referencia a Dios que pone orden
mayoría de los aparatos eléctricos, casi todos los tipos en el mundo (“Dieu qui met de l'ordre dans le monde”).[8]
de transporte eléctrico y la mayoría de las líneas de pro- En parte por cuestiones de marketing, puesto que la des-
ducción de las fábricas funcionan con un computador. La cripción realizada por IBM para su introducción en Fran-
mayoría de los ingenieros piensa que esta tendencia va a cia en 1954 situaba las capacidades de actuación de la má-
continuar. quina cerca de la omnipotencia, idea equivocada que per-
dura hoy en día al considerar que la máquina universal de
Hacia finales de siglo XX y comienzos del XXI, los
Turing es capaz de computar absolutamente todo.[9] En
computadores personales son usados tanto para la investi-
1984, académicos franceses reconocieron, en el debate
gación como para el entretenimiento (videojuegos), pero
Les jeunes, la technique et nous, que el uso de este sustan-
los grandes computadores aún sirven para cálculos mate-
tivo es incorrecto, porque la función de un computador
máticos complejos y para otros usos de la ciencia, tecno-
es procesar datos, no dar órdenes.[10] Mientras que otros,
logía, astronomía, medicina, etc.
como el catedrático de filología latina Jacques Perret, co-
Tal vez el más interesante “descendiente” del cruce entre nocedores del origen religioso del término, lo consideran
el concepto de la PC o computadora personal y los llama- más correcto que las alternativas.[8]
dos supercomputadores sea la Workstation o estación de
El uso de la palabra ordinateur se ha exportado a los
trabajo. Este término, originalmente utilizado para equi-
idiomas de España: el aragonés, el asturiano, el gallego, el
pos y máquinas de registro, grabación y tratamiento di-
castellano, el catalán y el euskera. El español que se habla
gital de sonido, y ahora utilizado precisamente en refe-
en Iberoamérica, así como los demás idiomas europeos,
rencia a estaciones de trabajo (traducido literalmente del
como el portugués, el alemán y el neerlandés, utilizan tér-
inglés), se usa para dar nombre a equipos que, debido so-
minos derivados de computare.
1.4. VÉASE TAMBIÉN 5
• Minicomputadora • Monitor
• Microcomputadora • Impresora
• Sistema de archivos
• Wikiquote alberga frases célebres de o sobre
• Internet Computadora. Wikiquote
• Virtualización
• Wikilibro de Montaje y Mantenimiento de
• World Wide Web Equipos Informáticos.
[1] «computadora», Diccionario de la lengua española (22.ª • Información sobre qué es una computadora, en mo-
edición), Real Academia Española, 2001, http://lema.rae. nografías.com
es/drae/srv/search?key=computadora, consultado el 8 de
abril de 2015.
[2] «computadora» en Diccionario panhispánico de dudas, 1.ª
ed., Real Academia Española y Asociación de Academias
de la Lengua Española, 2005, consultado el 8 de abril de
2015.
[3] «computador», Diccionario de la lengua española (22.ª
edición), Real Academia Española, 2001, http://lema.rae.
es/drae/srv/search?key=computador, consultado el 8 de
abril de 2015.
[4] «ordenador», Diccionario de la lengua española (22.ª edi-
ción), Real Academia Española, 2001, http://lema.rae.es/
drae/srv/search?key=ordenador, consultado el 8 de abril
de 2015.
[5] «ordenador» en Diccionario panhispánico de dudas, 1.ª
ed., Real Academia Española y Asociación de Academias
de la Lengua Española, 2005, consultado el 8 de abril de
2015.
[6] En 1946, ENIAC requería alrededor de 174 kW. En com-
paración, una laptop moderna consume alrededor de 30
W; cerca de seis mil veces menos. «Approximate Desktop
& Notebook Power Usage». University of Pennsylvania.
Consultado el 29 de julio de 2014.
[7] Las primeras computadoras tales como Colossus y
ENIAC eran capaces de procesar entre 5 y 100 opera-
ciones por segundo. Un moderno microprocesador puede
procesar miles de millones de operaciones por segundo, y
muchas de estas operaciones son bastante más complejas
que en sus predecesoras. «Intel Core I7 Processor: Featu-
res». Intel Corporation. Consultado el 29 de julio de 2014.
[8] Etimología de la palabra ordenador (en francés).
[9] Ben-Amram, Amir M. (2005). «The Church-Turing the-
sis and its look-alikes». SIGACT News 36 (3): 113–114.
doi:10.1145/1086649.1086651. Consultado el 8 de no-
viembre de 2009.
[10] El uso de la palabra ordenador. El Mundo.es.
Capítulo 2
Las ciencias de la información (information science en ciales, incluyendo el estudio del impacto social de las tec-
inglés) es una rama de la ciencia que estudia la práctica nologías de la información.
del procesamiento de información y la ingeniería de los
sistemas de información. Tiene un fuerte vínculo con las
ciencias de la computación.
El campo estudia la estructura, algoritmos, comporta-
miento e interacciones de los sistemas naturales y arti-
ficiales que guardan, procesan, acceden a y comunican
información. También desarrolla sus propios fundamen-
tos conceptuales y teóricos y emplea fundamentos desa-
rrollados en otros campos.
En Ciencias de la Información, constituyen temas clave el
estudio de los conceptos dato, información, conocimiento
y sabiduría, a los cuales se los suele organizar bajo la for-
ma de una pirámide de menor a mayor complejidad, ubi-
cándose la sabiduría en el vértice, y los datos en la base.
Como ejemplo, la altura de una montaña sería un dato,
y cuando se lo combina con otros datos, como por ejem-
plo la temperatura media, la presión atmosférica, hume-
dad, etc., constituye información, en este caso informa-
ción meteorológica sobre el estado de la montaña, que
permite definir si el clima es “favorable” o “desfavorable”
para el ascenso. Cuando continuamos agregando grados
de abstracción, llegamos al “conocimiento”, que permi-
te la toma de decisiones apropiadas para lograr un cierto
fin. Como ejemplo, a pesar de tener una condición me-
teorológica favorable para el ascenso, alguien con cono-
cimiento en el ascenso a montañas, tiene que integrar in-
formación de otras fuentes, como por ejemplo saber si
se cuenta con el equipo y entrenamiento apropiado para
el ascenso, etc. Si a este conocimiento específico agrega-
mos un elemento de buena intención y consideración de
abstracciones más abarcativas o completas, como tener
en cuenta si el realizar este ascenso producirá un efec-
to positivo en la generación venidera de jóvenes, o por
el contrario, los alentará a realizar actividades riesgosas,
etc. podremos hablar de “sabiduria”, que se refleja en la
toma de decisiones acertadas, que producen un beneficio
mayor sobre un potencial perjuicio.
Desde la llegada de los ordenadores, los individuos y las
organizaciones cada vez más procesan la información de
manera digital. Esto ha llevado al estudio de la informa-
ción que tiene aspectos computacionales, cognitivos y so-
7
Capítulo 3
Lenguaje de programación
8
3.2. ELEMENTOS 9
• Variables del tipo Boolean: Solo pueden contener un Todos los lenguajes de programación tienen algunos ele-
0 o un 1. El cero es considerado para muchos len- mentos de formación primitivos para la descripción de
guajes como el literal “False”, mientras que el 1 se los datos y de los procesos o transformaciones aplicadas
considera “True”. a estos datos (tal como la suma de dos números o la selec-
ción de un elemento que forma parte de una colección).
Estos elementos primitivos son definidos por reglas sin-
3.2.2 Condicionantes tácticas y semánticas que describen su estructura y signi-
ficado respectivamente.
Los condicionantes son estructuras de código que indican
que, para que cierta parte del programa se ejecute, deben
cumplirse ciertas premisas; por ejemplo: que dos valores 3.2.5 Sintaxis
sean iguales, que un valor exista, que un valor sea ma-
yor que otro... Estos condicionantes por lo general solo def add5(x):
return x+5
se ejecutan una vez a lo largo del programa. Los condi-
def dotwrite(ast):
cionantes más conocidos y empleados en programación nodename = getNodename()
son: label=symbol.sym_name.get(int(ast[0]),ast[0])
print ' %s [label="%s' % (nodename, label),
if isinstance(ast[1], str):
if ast[1].strip():
• If: Indica una condición para que se ejecute una par- print '= %s"];' % ast[1]
te del programa. else:
print '"]'
else:
• Else if: Siempre va precedido de un “If” e indica una print '"];'
children = []
condición para que se ejecute una parte del progra- for n, child in enumerate(ast[1:]):
ma siempre que no cumpla la condición del if previo children.append(dotwrite(child))
print ' %s -> {' % nodename,
y si se cumpla con la que el “else if” especifique. for name in children:
print '%s' % name,
• Else: Siempre precedido de “If” y en ocasiones de
“Else If”. Indica que debe ejecutarse cuando no se Con frecuencia se resaltan los elementos de la sintaxis con colores
cumplan las condiciones prévias. diferentes para facilitar su lectura. Este ejemplo está escrito en
Python.
• una expresión puede ser un átomo o una lista; lenguajes de programación puede ser especificada utili-
zando una gramática Tipo-2, es decir, son gramáticas li-
• un átomo puede ser un número o un símbolo; bres de contexto. Algunos lenguajes, incluyendo a Perl y
a Lisp, contienen construcciones que permiten la ejecu-
• un número es una secuencia continua de uno o más ción durante la fase de análisis. Los lenguajes que permi-
dígitos decimales, precedido opcionalmente por un ten construcciones que permiten al programador alterar
signo más o un signo menos; el comportamiento de un analizador hacen del análisis de
• un símbolo es una letra seguida de cero o más carac- la sintaxis un problema sin decisión única, y generalmen-
teres (excluyendo espacios); y te oscurecen la separación entre análisis y ejecución. En
contraste con el sistema de macros de Lisp y los bloques
• una lista es un par de paréntesis que abren y cierran, BEGIN de Perl, que pueden tener cálculos generales, las
con cero o más expresiones en medio. macros de C son meros reemplazos de cadenas, y no re-
quieren ejecución de código.
Algunos ejemplos de secuencias bien formadas de acuer-
do a esta gramática: 3.2.6 Semántica estática
'12345', '()', '(a b c232 (1))'
La semántica estática define las restricciones sobre la es-
No todos los programas sintácticamente correctos son se- tructura de los textos válidos que resulta imposible o muy
mánticamente correctos. Muchos programas sintáctica- difícil expresar mediante formalismos sintácticos están-
mente correctos tienen inconsistencias con las reglas del dar. Para los lenguajes compilados, la semántica estáti-
lenguaje; y pueden (dependiendo de la especificación del ca básicamente incluye las reglas semánticas que se pue-
lenguaje y la solidez de la implementación) resultar en un den verificar en el momento de compilar. Por ejemplo el
error de traducción o ejecución. En algunos casos, tales chequeo de que cada identificador sea declarado antes de
programas pueden exhibir un comportamiento indefini- ser usado (en lenguajes que requieren tales declaracio-
do. Además, incluso cuando un programa está bien defi- nes) o que las etiquetas en cada brazo de una estructu-
nido dentro de un lenguaje, todavía puede tener un signi- ra case sean distintas. Muchas restricciones importantes
ficado que no es el que la persona que lo escribió estaba de este tipo, como la validación de que los identificado-
tratando de construir. res sean usados en los contextos apropiados (por ejemplo
Usando el lenguaje natural, por ejemplo, puede no ser po- no sumar un entero al nombre de una función), o que las
sible asignarle significado a una oración gramaticalmente llamadas a subrutinas tengan el número y tipo de pará-
válida o la oración puede ser falsa: metros adecuado, puede ser implementadas definiéndo-
las como reglas en una lógica conocida como sistema de
• “Las ideas verdes y descoloridas duermen furiosa- tipos. Otras formas de análisis estáticos, como los análisis
mente” es una oración bien formada gramaticalmen- de flujo de datos, también pueden ser parte de la semánti-
te pero no tiene significado comúnmente aceptado. ca estática. Otros lenguajes de programación como Java y
C# tienen un análisis definido de asignaciones, una forma
• “Juan es un soltero casado” también está bien for- de análisis de flujo de datos, como parte de su semántica
mada gramaticalmente pero expresa un significado estática.
que no puede ser verdadero.
3.2.7 Sistema de tipos
El siguiente fragmento en el lenguaje C es sintácticamen-
te correcto, pero ejecuta una operación que no está defi- Un sistema de tipos define la manera en la cual un lengua-
nida semánticamente (dado que p es un apuntador nulo, je de programación clasifica los valores y expresiones en
las operaciones p->real y p->im no tienen ningún signifi- tipos, cómo pueden ser manipulados dichos tipos y cómo
cado): interactúan. El objetivo de un sistema de tipos es verificar
complex *p = NULL; complex abs_p = sqrt (p->real * y normalmente poner en vigor un cierto nivel de exactitud
p->real + p->im * p->im); en programas escritos en el lenguaje en cuestión, detec-
tando ciertas operaciones inválidas. Cualquier sistema de
tipos decidible tiene sus ventajas y desventajas: mientras
Si la declaración de tipo de la primera línea fuera omiti- por un lado rechaza muchos programas incorrectos, tam-
da, el programa dispararía un error de compilación, pues bién prohíbe algunos programas correctos aunque poco
la variable “p” no estaría definida. Pero el programa sería comunes. Para poder minimizar esta desventaja, algunos
sintácticamente correcto todavía, dado que las declara- lenguajes incluyen lagunas de tipos, conversiones explíci-
ciones de tipo proveen información semántica solamente. tas no checadas que pueden ser usadas por el programa-
La gramática necesaria para especificar un lenguaje de dor para permitir explícitamente una operación normal-
programación puede ser clasificada por su posición en la mente no permitida entre diferentes tipos. En la mayoría
Jerarquía de Chomsky. La sintaxis de la mayoría de los de los lenguajes con tipos, el sistema de tipos es usado
12 CAPÍTULO 3. LENGUAJE DE PROGRAMACIÓN
solamente para checar los tipos de los programas, pero textuales. En el segundo caso, el compilador infiere los
varios lenguajes, generalmente funcionales, llevan a cabo tipos de las expresiones y las declaraciones de acuerdo al
lo que se conoce como inferencia de tipos, que le quita al contexto. La mayoría de los lenguajes populares con ti-
programador la tarea de especificar los tipos. Al diseño y pos estáticos, tales como C++, C# y Java, manejan tipos
estudio formal de los sistemas de tipos se le conoce como explícitos. Inferencia total de los tipos suele asociarse con
teoría de tipos. lenguajes menos populares, tales como Haskell y ML. Sin
embargo, muchos lenguajes de tipos explícitos permiten
inferencias parciales de tipo; tanto Java y C#, por ejem-
Lenguajes tipados versus lenguajes no tipados plo, infieren tipos en un número limitado de casos.
Los lenguajes con tipos dinámicos determinan la validez
Se dice que un lenguaje tiene tipos si la especificación de
de los tipos involucrados en las operaciones durante la
cada operación define tipos de datos para los cuales la
ejecución del programa. En otras palabras, los tipos están
operación es aplicable, con la implicación de que no es
asociados con valores en ejecución en lugar de expresiones
aplicable a otros tipos. Por ejemplo, “este texto entre co-
textuales. Como en el caso de lenguajes con tipos inferi-
millas” es una cadena. En la mayoría de los lenguajes de
dos, los lenguajes con tipos dinámicos no requieren que
programación, dividir un número por una cadena no tiene
el programador escriba los tipos de las expresiones. En-
ningún significado. Por tanto, la mayoría de los lenguajes
tre otras cosas, esto permite que una misma variable se
de programación modernos rechazaran cualquier intento
pueda asociar con valores de tipos distintos en diferentes
de ejecutar dicha operación por parte de algún programa.
momentos de la ejecución de un programa. Sin embargo,
En algunos lenguajes, estas operaciones sin significado
los errores de tipo no pueden ser detectados automática-
son detectadas cuando el programa es compilado (valida-
mente hasta que se ejecuta el código, dificultando la de-
ción de tipos “estática”) y son rechazadas por el compila-
puración de los programas, no obstante, en lenguajes con
dor, mientras en otros son detectadas cuando el programa
tipos dinámicos se suele dejar de lado la depuración en
es ejecutado (validación de tipos “dinámica”) y se genera
favor de técnicas de desarrollo como por ejemplo BDD y
una excepción en tiempo de ejecución.
TDD. Ruby, Lisp, JavaScript y Python son lenguajes con
Un caso especial de lenguajes de tipo son los lenguajes de tipos dinámicos.
tipo sencillo. Estos son con frecuencia lenguajes de mar-
cado o de scripts, como REXX o SGML, y solamente
cuentan con un tipo de datos; comúnmente cadenas de
caracteres que luego son usadas tanto para datos numéri- Tipos débiles y tipos fuertes
cos como simbólicos.
Los lenguajes débilmente tipados permiten que un valor
En contraste, un lenguaje sin tipos, como la mayoría de los
de un tipo pueda ser tratado como de otro tipo, por ejem-
lenguajes ensambladores, permiten que cualquier opera-
plo una cadena puede ser operada como un número. Esto
ción se aplique a cualquier dato, que por lo general se
puede ser útil a veces, pero también puede permitir cier-
consideran secuencias de bits de varias longitudes. Len-
tos tipos de fallas que no pueden ser detectadas durante
guajes de alto nivel sin datos incluyen BCPL y algunas
la compilación o a veces ni siquiera durante la ejecución.
variedades de Forth.
Los lenguajes fuertemente tipados evitan que pase lo an-
En la práctica, aunque pocos lenguajes son considerados
terior. Cualquier intento de llevar a cabo una operación
con tipo desde el punto de vista de la teoría de tipos (es
sobre el tipo equivocado dispara un error. A los lenguajes
decir, que verifican o rechazan todas las operaciones), la
con tipos fuertes se les suele llamar de tipos seguros.
mayoría de los lenguajes modernos ofrecen algún grado
de manejo de tipos. Si bien muchos lenguajes de produc- Lenguajes con tipos débiles como Perl y JavaScript per-
ción proveen medios para brincarse o subvertir el sistema miten un gran número de conversiones de tipo implícitas.
de tipos. Por ejemplo en JavaScript la expresión 2 * x convierte
implícitamente x a un número, y esta conversión es exi-
tosa inclusive cuando x es null, undefined, un Array o una
Tipos estáticos versus tipos dinámicos cadena de letras. Estas conversiones implícitas son útiles
con frecuencia, pero también pueden ocultar errores de
En lenguajes con tipos estáticos se determina el tipo de programación.
todas las expresiones antes de la ejecución del programa Las características de estáticos y fuertes son ahora ge-
(típicamente al compilar). Por ejemplo, 1 y (2+2) son ex- neralmente consideradas conceptos ortogonales, pero su
presiones enteras; no pueden ser pasadas a una función trato en diferentes textos varia. Algunos utilizan el tér-
que espera una cadena, ni pueden guardarse en una va- mino de tipos fuertes para referirse a tipos fuertemente es-
riable que está definida como fecha. táticos o, para aumentar la confusión, simplemente como
Los lenguajes con tipos estáticos pueden manejar tipos equivalencia de tipos estáticos. De tal manera que C ha si-
explícitos o tipos inferidos. En el primer caso, el progra- do llamado tanto lenguaje de tipos fuertes como lenguaje
mador debe escribir los tipos en determinadas posiciones de tipos estáticos débiles.
3.4. TÉCNICA 13
Se puede también utilizar una alternativa para traducir Para escribir programas que proporcionen los mejores re-
lenguajes de alto nivel. En lugar de traducir el programa sultados, cabe tener en cuenta una serie de detalles.
fuente y grabar en forma permanente el código objeto que
se produce durante la compilación para utilizarlo en una • Corrección. Un programa es correcto si hace lo que
ejecución futura, el programador sólo carga el programa debe hacer tal y como se estableció en las fases pre-
fuente en la computadora junto con los datos que se van vias a su desarrollo. Para determinar si un programa
a procesar. A continuación, un programa intérprete, al- hace lo que debe, es muy importante especificar cla-
macenado en el sistema operativo del disco, o incluido de ramente qué debe hacer el programa antes de desa-
manera permanente dentro de la máquina, convierte cada rrollarlo y, una vez acabado, compararlo con lo que
proposición del programa fuente en lenguaje de máquina realmente hace.
conforme vaya siendo necesario durante el procesamiento
de los datos. El código objeto no se graba para utilizarlo • Claridad. Es muy importante que el programa sea
posteriormente. lo más claro y legible posible, para facilitar así su
14 CAPÍTULO 3. LENGUAJE DE PROGRAMACIÓN
desarrollo y posterior mantenimiento. Al elaborar de asignación sobre una clase de variables llamadas “no
un programa se debe intentar que su estructura sea locales”.[4]
sencilla y coherente, así como cuidar el estilo en Los programas que usan un lenguaje declarativo especifi-
la edición; de esta forma se ve facilitado el traba- can las propiedades que la salida debe conocer y no espe-
jo del programador, tanto en la fase de creación co- cifica cualquier detalle de implementación. Dos amplias
mo en las fases posteriores de corrección de errores, categorías de lenguajes declarativos son los lenguajes
ampliaciones, modificaciones, etc. Fases que pue- funcionales y los lenguajes lógicos. Los lenguajes funcio-
den ser realizadas incluso por otro programador, con nales no permiten asignaciones de variables no locales,
lo cual la claridad es aún más necesaria para que
así, se hacen más fácil, por ejemplo, programas como fun-
otros programadores puedan continuar el trabajo fá- ciones matemáticas.[4] El principio detrás de los lengua-
cilmente. Algunos programadores llegan incluso a
jes lógicos es definir el problema que se quiere resolver (el
utilizar Arte ASCII para delimitar secciones de có- objetivo) y dejar los detalles de la solución al sistema.[5]
digo. Otros, por diversión o para impedir un análisis
El objetivo es definido dando una lista de sub-objetivos.
cómodo a otros programadores, recurren al uso de Cada sub-objetivo también se define dando una lista de
código ofuscado.
sus sub-objetivos, etc. Si al tratar de buscar una solución,
una ruta de sub-objetivos falla, entonces tal sub-objetivo
• Eficiencia. Se trata de que el programa, además de se descarta y sistemáticamente se prueba otra ruta.
realizar aquello para lo que fue creado (es decir, que La forma en la cual se programa puede ser por medio
sea correcto), lo haga gestionando de la mejor for- de texto o de forma visual. En la programación visual los
ma posible los recursos que utiliza. Normalmente, al elementos son manipulados gráficamente en vez de espe-
hablar de eficiencia de un programa, se suele hacer cificarse por medio de texto.
referencia al tiempo que tarda en realizar la tarea pa-
ra la que ha sido creado y a la cantidad de memoria
que necesita, pero hay otros recursos que también
pueden ser de consideración al obtener la eficiencia
3.5 Véase también
de un programa, dependiendo de su naturaleza (es-
pacio en disco que utiliza, tráfico de red que genera, • Anexo:Lenguajes de programación
etc.). • Programación estructurada
• Programación modular
• Portabilidad. Un programa es portable cuando tiene
la capacidad de poder ejecutarse en una plataforma, • Programación orientada a objetos
ya sea hardware o software, diferente a aquella en la
• Programación imperativa
que se elaboró. La portabilidad es una característi-
ca muy deseable para un programa, ya que permite, • Programación declarativa
por ejemplo, a un programa que se ha desarrollado
para sistemas GNU/Linux ejecutarse también en la • paradigma de programación
familia de sistemas operativos Windows. Esto per- • Lenguajes esotéricos
mite que el programa pueda llegar a más usuarios
más fácilmente.
3.6 Referencias
3.4.1 Paradigmas [1] Lutz, Mark (2010). O'Reilly Media, Inc., ed. «Learning
Python, Fourth Edition» (libro). O'Reilly. Consultado el
Los programas se pueden clasificar por el paradigma del 11 de febrero de 2010.
lenguaje que se use para producirlos. Los principales pa-
[2] http://www.softwarepreservation.org/projects/
radigmas son: imperativos, declarativos y orientación a
FORTRAN/index.html#By_FORTRAN_project_
objetos.
members
Los programas que usan un lenguaje imperativo espe-
[3] Wilson, Leslie B. (1993). Comparative Programming Lan-
cifican un algoritmo, usan declaraciones, expresiones y
guages, Second Edition. Addison-Wesley. p. 75. ISBN 0-
sentencias.[3] Una declaración asocia un nombre de va- 201-56885-3. (en inglés).
riable con un tipo de dato, por ejemplo: var x: integer;.
Una expresión contiene un valor, por ejemplo: 2 + 2 con- [4] Wilson, Leslie B. (1993). Comparative Programming Lan-
tiene el valor 4. Finalmente, una sentencia debe asignar guages, Second Edition. Addison-Wesley. p. 213. ISBN 0-
una expresión a una variable o usar el valor de una varia- 201-56885-3. (en inglés).
ble para alterar el flujo de un programa, por ejemplo: x [5] Wilson, Leslie B. (1993). Comparative Programming Lan-
:= 2 + 2; if x == 4 then haz_algo();. Una crítica común guages, Second Edition. Addison-Wesley. p. 244. ISBN 0-
en los lenguajes imperativos es el efecto de las sentencias 201-56885-3. (en inglés).
3.7. ENLACES EXTERNOS 15
Wikilibros
Algoritmo
16
4.2. MEDIOS DE EXPRESIÓN DE UN ALGORITMO 17
que no está regido por ningún estándar. Es utilizado para 2. Mediante un procedimiento de entrada de datos (por
describir algoritmos en libros y publicaciones científicas, ejemplo: 'read').
y como producto intermedio durante el desarrollo de un
algoritmo, como los diagramas de flujo, aunque presentan Ejemplo:
una ventaja importante sobre estos, y es que los algorit-
mos descritos en pseudocódigo requieren menos espacio ... i:=1; read(n); while i < n do begin (* cuerpo del bucle
para representar instrucciones complejas. *) i := i + 1 end; ...
una función f : N → N donde cada número natural es la mero de ceros sea mayor que el de unos) y una negativa
codificación de un problema o de una solución. en caso contrario. Finalmente, la salida de este algoritmo
En ocasiones los algoritmos son susceptibles de nunca ter- se define como la devolución de valores exclusivamente
minar, por ejemplo, cuando entran a un bucle infinito. positivos si hay más ceros que unos en la secuencia y, en
Cuando esto ocurre, el algoritmo nunca devuelve ningún cualquier otro caso, devolverá una mezcla de señales po-
valor de salida, y podemos decir que la función queda sitivas y negativas.
indefinida para ese valor de entrada. Por esta razón se
considera que los algoritmos son funciones parciales, es
decir, no necesariamente definidas en todo su dominio de 4.5 Ejemplo de algoritmo
definición.
Cuando una función puede ser calculada por medios algo- El problema consiste en encontrar el máximo de un con-
rítmicos, sin importar la cantidad de memoria que ocu- junto de números. Para un ejemplo más complejo véase
pe o el tiempo que se tarde, se dice que dicha función Algoritmo de Euclides.
es computable. No todas las funciones entre secuencias
datos son computables. El problema de la parada es un
ejemplo.
4.5.1 Descripción de alto nivel
• Diagrama Nassi-Shneiderman
4.6.2 Técnicas de diseño de algoritmos
• Máquina de Turing
• Algoritmos voraces (greedy): seleccionan los ele-
mentos más prometedores del conjunto de candida-
tos hasta encontrar una solución. En la mayoría de 4.6.4 Disciplinas relacionadas
los casos la solución no es óptima.
• Ciencias de la Computación
• Algoritmos paralelos: permiten la división de un • Análisis de algoritmos
problema en subproblemas de forma que se puedan
ejecutar de forma simultánea en varios procesado- • Complejidad computacional
res.
• Informática
• Algoritmos probabilísticos: algunos de los pasos de
• Inteligencia artificial
este tipo de algoritmos están en función de valores
pseudoaleatorios. • Investigación operativa
4.8 Bibliografía
• Aho, A. The Design and Analysis of Computer Algo-
rithms
• Cormen, T. H., Leiserson, C. E., Rivest, R. L. y
Stein, C. Introduction to Algorithms (2nd ed.)
• Brassard, G. y P. Bratley. Fundamentos de Algorit-
mia, (ISBN 848966000X)
• Knuth, D. E. The Art of Computer Programming,
[quien fue también, el creador del TeX]
• Mamber, U. Introduction to Algorithms. A Creative
Approach
• Sedgewick, R. Algorithms in C (3r ed) (también exis-
ten versiones en C++ y Java)
Algoritmo determinista
En ciencias de la computación, un algoritmo determi- ejemplo: una entrada de un usuario, una variable ob-
nista es un algoritmo que, en términos informales, es jetivo, un valor de un temporizador de hardware, un
completamente predictivo si se conocen sus entradas. Di- valor aleatorio, etc.
cho de otra forma, si se conocen las entradas del algoritmo
• Si al operar se encuentra con concurrencia de es-
siempre producirá la misma salida, y la máquina interna
tados; por ejemplo, si tiene múltiples procesadores
pasará por la misma secuencia de estados. Este tipo de
escribiendo al mismo tiempo en un fichero. En es-
algoritmos ha sido el más estudiado durante la historia y
te caso el orden preciso en el que cada procesador
por lo tanto resulta ser el tipo más familiar de los algorit-
escribe el dato puede afectar a la salida.
mos, así como el más práctico ya que puede ejecutarse en
las máquinas eficientemente. • Si un error (cuyo origen puede deberse al hardware
Un modelo simple de algoritmo determinista es la función o al software) causa un inesperado cambio en la se-
matemática, pues esta extrae siempre la misma salida pa- cuencia de ejecución de estados.
ra una entrada dada. No obstante un algoritmo describe
Aunque los programas reales rara vez son puramente de-
explícitamente cómo la salida se obtiene de la entrada,
terministas, es conveniente considerar que sí lo son ya
mientras que las funciones definen implícitamente su sa-
que es más fácil razonar sobre estos. Por este motivo,
lida.
la mayoría de los lenguajes de programación y especial-
mente aquellos que entran dentro de la categoría de la
programación funcional son lenguajes que hacen un es-
5.1 Definición formal fuerzo en prevenir eventos que se ejecuten sin control.
Este tipo de restricciones fuerzan el carácter determinis-
Formalmente los algoritmos deterministas se pueden de- ta y por ello a los algoritmos deterministas se les suele
finir en términos de una máquina de estado; un «estado» denominar puramente funcionales.
describe qué está haciendo la máquina en un instante par- La prevalencia de los procesadores de varios núcleos ha
ticular de tiempo. Justo cuando se produce la entrada, levantado el interés por el determinismo en la programa-
la máquina comienza en su «estado inicial» y, posterior- ción en paralelo y se han documentado bien los problemas
mente, si la máquina es determinista, comenzará la eje- del no determinismo.[1][2] Numerosas herramientas útiles
cución de la secuencia de estados predeterminados. Una en estos problemas se han propuesto para tratar con los
máquina puede ser determinista y no tener límite tempo- bloqueos mutuos y las condiciones de carrera.[3][4][5][6][7]
ral para la ejecución o quedarse en un bucle de estados
cíclicos eternamente.
Ejemplos de máquinas abstractas deterministas son las 5.3 Problemas con los algoritmos
máquinas de Turing deterministas y los autómatas finitos
deterministas. deterministas
Para algunos problemas es muy difícil implementar un
5.2 Cuándo un algoritmo puede algoritmo determinista. Por ejemplo, existen eficientes y
simples algoritmos probabilistas que pueden determinar
volverse no determinista si un número entero es primo o no, pero tienen una pe-
queña posibilidad de equivocarse. Algunos de ellos son
Por diversos motivos un algoritmo determinista puede muy conocidos desde los 1970 (véase, por ejemplo, el test
comportarse de una forma no determinista: de primalidad de Fermat); sin embargo tuvieron que pa-
sar 30 años para que se desarrollara un algoritmo deter-
• Si emplea en la ejecución de la secuencia de estados minista similar que fuera asintóticamente igual de rápido
otro estado «externo» como entrada del proceso; por (véase AKS).[8]
22
5.5. VÉASE TAMBIÉN 23
[4] Yuan Lin. «Data Race and Deadlock Detection with Sun
Studio Thread Analyzer». Consultado el 29-5-2009.
Estructura de datos
En programación, una estructura de datos es una forma variable de tipo, luego se pueden editar y obtener los datos
particular de organizar datos en una computadora para de los miembros libremente.
que pueda ser utilizado de manera eficiente. Estruc Estructura,Miembro1:Entero,Miembro2:
Diferentes tipos de estructuras de datos son adecuadas Cadena,Miembro3:Byte Var Variable:Estructura
para diferentes tipos de aplicaciones, y algunos son alta- Variable.Miembro1 = 40000 Variable.Miembro2 =
mente especializados para tareas específicas. “Hola Mundo” Variable.Miembro3 = 255 Mensa-
Las estructuras de datos son un medio para manejar gran- je(Variable.Miembro2) ' Muestra “Hola Mundo”
des cantidades de datos de manera eficiente para usos ta-
les como grandes bases de datos y servicios de indización
de internet. Por lo general, las estructuras de datos eficien- 6.3 Véase también
tes son clave para diseñar eficientes algoritmos. Algunos
métodos formales de diseño y lenguajes de programación • Unión de datos
destacan las estructuras de datos, en lugar de los algorit-
mos, como el factor clave de organización en el diseño de • Lenguaje de programación
software. • Tipo de dato
• Algoritmo
6.1 Descripción
Las estructuras de datos se basan generalmente en la ca-
pacidad de un ordenador para recuperar y almacenar da-
tos en cualquier lugar de su memoria.
24
Capítulo 7
Cola (informática)
7.4 Implementaciones
25
26 CAPÍTULO 7. COLA (INFORMÁTICA)
frmPrincipal.Final) { frmPrincipal.Frente = −1; frm- Inicio y Fin que apunten a cada uno de los extremos.
Principal.Final = −1; } else if (frmPrincipal.Frente Hay variantes:
== frmPrincipal.N) { frmPrincipal.Frente = 0; } else
{ frmPrincipal.Frente = frmPrincipal.Frente + 1; } • Bicolas de entrada restringida: Son aquellas donde la
lsEliminado.Items.Add(elemento); } inserción sólo se hace por el final, aunque podemos
eliminar al inicio ó al final.
Otra forma de programar una cola en Java Por Jorge He-
rrera C • Bicolas de salida restringida: Son aquellas donde só-
import java.util.*; public class Cola <Tipo>{ private lo se elimina por el final, aunque se puede insertar
List<Tipo> cola; public Cola(){ cola=new Array- al inicio y al final.
List<Tipo>(); } public boolean colaVacia(){ return
cola.isEmpty(); } public void agregar(Tipo elemen-
to){ cola.add(elemento); } public Tipo sacar(){ 7.6 Véase también
if(colaVacia())return null; Tipo elemento=cola.get(0);
cola.remove(0); return elemento; } }// Fin de la clase • Pila (estructura de datos)
Cola
• Lista (estructura de datos)
A continuación un ejemplo de una clase manejadora de la • Cola de prioridad (estructura de datos)
clase Cola
• Cola circular
public class Manejador { public static void
main(String[] args) { Cola cola=new <Inte- • Bicola
ger>Cola(); System.out.println(cola.sacar());
cola.agregar(23); cola.agregar(24); co-
la.agregar(25); while(!cola.colaVacia()){ Sys- 7.7 Enlaces externos
tem.out.println(cola.sacar()); } Cola nombres=new
<String>Cola(); nombres.agregar(“Jorge”); nom-
bres.agregar(“Raquel”); nombres.agregar(“Mayra
Alejandra”); while(!nombres.colaVacia()){ Sys-
tem.out.println(nombres.sacar()); } } }// Fin de la
clase Manejadora
28
8.5. CARACTERIZACIÓN 29
método Área de una manera separada de la interfaz grá- de la rutina, pero lo suficiente para no depender de nin-
fica presentada al usuario y se estipula ahí la operación a gún aspecto de la implementación. Por ejemplo, un TDA
realizar, devolviendo el valor de la multiplicación. En el puede ser creado usando un script o cualquiera que pueda
método principal solamente se llama a la función Área y ser decompilado (como C).
el programa hace el resto. En la terminología de Lenguaje Orientado a Objeto, un
Al hecho de guardar todas las características y habilida- TDA es una clase; una instancia de un TDA o clase, es
des de un objeto por separado se le llama Encapsulamien- un objeto. Además es utilizado constantemente por pro-
to y es también un concepto importante para entender la gramadores de computadoras.
estructuración de datos. Es frecuente que el Encapsula-
miento sea usado como un sinónimo del Ocultación de
información, aunque algunos creen que no es así . 8.5 Caracterización
Un TDA está caracterizado por un conjunto de operacio-
8.4 Separación de la interfaz e im- nes (funciones) al cual se denomina usualmente como in-
terfaz pública y representa el comportamiento del TDA;
plementación mientras que la implementación como la parte privada del
TDA está oculta al programa cliente que lo usa. Todos los
Cuando se usa en un programa de computación, un TDA lenguajes de alto nivel tienen predefinidos TDA; que son
es representado por su interfaz, la cual sirve como cu- los tipos denominados simples y las estructuras predefi-
bierta a la correspondiente implementación. La idea es nidas, y estos tienen sus interfaces públicas que incluyen
que los usuarios de un TDA tengan que preocuparse só- las operaciones como la +, -, *, etc. no se necesita co-
lo por la interfaz, pero no por la implementación, ya que nocer como actúan tales operadores sobre la representa-
esta puede ir cambiando con el tiempo y, si no existiera ción interna de los tipos definidos, que además, suele ser
encapsulación, afectar a los programas que usan el dato. una implementación bastante dependiente de la máqui-
Esto se basa en el concepto de Ocultación de informa- na sobre la que trabaje el compilador. Lo interesante es
ción, una protección para el programa de decisiones de que los lenguajes actuales nos van a permitir ampliar los
diseño que son objeto de cambio. TDA predefinidos con otros que serán definidos por el
La solidez de un TDA reposa en la idea de que la im- propio programador para adecuar así los tipos de datos a
las necesidades de los programas.
plementación está escondida al usuario. Solo la interfaz
es pública. Esto significa que el TDA puede ser imple- Los TDA que nos van a interesar de ahora en adelante
mentado de diferentes formas, pero mientras se manten- son aquellos que reflejen cierto comportamiento organi-
ga consistente con la interfaz, los programas que lo usan zando cierta variedad de datos estructuradamente. A esta
no se ven afectados. forma estructurada de almacenar los datos será a la que
Hay una diferencia, aunque a veces sutil, entre el Tipo de nos refiramos para caracterizar cada TDA.
Dato Abstracto y la Estructura de Dato usada en su im- Los TDA que tienen informaciones simples pero depen-
plementación. Por ejemplo, un TDA de una lista puede dientes de un comportamiento estructural serán llamados
ser implementado mediante un Arreglo o una Lista Enla- polilíticos y aquellos TDA simples, como son los tipos
zada o hasta un Árbol binario de búsqueda. Una lista es predefinidos donde la información no es relacionada me-
un Tipo de Dato Abstracto con operaciones bien defini- diante ninguna estructura y no admiten más que un valor
das (agregar elemento, agregar al final, agregar al princi- en cada momento serán denominados TDA monolíticos.
pio, recuperar, eliminar, etc) mientras una lista enlazada Nótese que cuando hablemos de un TDA no haremos nin-
es una estructura de datos basada en punteros o referen-
guna alusión al tipo de los elementos sino tan sólo a la for-
cias (dependiendo del lenguaje) que puede ser usada para ma en que están dispuestos estos elementos. Sólo nos in-
crear una representación de una Lista. La Lista Enlazada teresa la estructura que soporta la información y sus ope-
es comúnmente usada para representar una TDA Lista, y raciones. Para determinar el comportamiento estructural
a veces, hasta confundida. Un ejemplo es la clase Linked basta con observar la conducta que seguirán los datos.
List de Java, la cual ofrece una gran cantidad de métodos
que no corresponden a una Lista Enlazada “pura”, sino a Caractericemos entonces los TDA. Un TDA tendrá una
un fuerte TDA. parte que será invisible al usuario la cual hay que prote-
ger y que se puede decir que es irrelevante para el uso del
De forma similar, un TDA Árbol binario de búsqueda usuario y está constituida tanto por la maquinaria algorít-
puede ser representado de muchas maneras: Árbol bina- mica que implemente la semántica de las operaciones co-
rio, Árbol AVL, Árbol rojo-negro, Arreglo, etc. A pesar mo por los datos que sirvan de enlace entre los elementos
de la implementación un Árbol binario siempre tiene las del TDA, es decir, información interna necesaria para la
mismas operaciones (insertar, eliminar, encontrar, etc.) implementación que se esté haciendo para ese comporta-
Separar la interfaz de la implementación no siempre sig- miento del TDA. Resumiendo podemos decir, que tanto
nifica que el usuario ignora totalmente la implementación la implementación de las operaciones como los elemen-
30 CAPÍTULO 8. TIPO DE DATO ABSTRACTO
tos internos del TDA serán privados al acceso externo y 2. Abstracción de datos:
ocultos a cualquier otro nivel.
• Tipo de datos: proporcionado por los leguajes de
Un TDA representa una abstracción:
alto nivel. La representación usada es invisible al
programador, al cual solo se le permite ver las ope-
• Se destacan los detalles (normalmente pocos) de la
raciones predefinidas para cada tipo.
especificación (el qué).
• Se ocultan los detalles (casi siempre numerosos) de • Tipos definidos: por el programador que posibili-
la implementación (el cómo). tan la definición de valores de datos más cercanos al
problema que se pretende resolver.
8.8 Referencias
[1] http://blogdecomputacion.com/blog/2010/08/21/
que-es-la-abstraccion-de-datos-y-modelos-de-datos/
Capítulo 9
Vector (informática)
Matriz unidimensional con 10 elementos. • Indexación base-n (n): este es un modo versátil de
indexación en la que el índice del primer elemen-
En programación, una matriz o vector (llamado en inglés to puede ser elegido libremente, en algunos lengua-
array) es una zona de almacenamiento continuo, que con- jes de programación se permite que los índices pue-
tiene una serie de elementos del mismo tipo, los elemen- dan ser negativos e incluso de cualquier tipo escalar
tos de la matriz. Desde el punto de vista lógico una matriz (también cadenas de caracteres).
se puede ver como un conjunto de elementos ordenados
en fila (o filas y columnas si tuviera dos dimensiones).
En principio, se puede considerar que todas las matrices 9.2 Notación
son de una dimensión, la dimensión principal, pero los
elementos de dicha fila pueden ser a su vez matrices (un La representación de un elemento en un vector se sue-
proceso que puede ser recursivo), lo que nos permite ha- le hacer mediante el identificador del vector seguido del
blar de la existencia de matrices multidimensionales, aun- índice entre corchetes, paréntesis o llaves:
que las más fáciles de imaginar son los de una, dos y tres
dimensiones. Aunque muchas veces en pseudocódigo y en libros de
matemática se representan como letras acompañadas de
Estas estructuras de datos son adecuadas para situacio- un subíndice numérico que indica la posición a la que se
nes en las que el acceso a los datos se realice de forma quiere acceder. Por ejemplo, para un vector "A":
aleatoria e impredecible. Por el contrario, si los elemen-
tos pueden estar ordenados y se va a utilizar acceso se- A0 , A1 , A2 , ... (vector unidimensional)
cuencial sería más adecuado utilizar una lista, ya que esta
estructura puede cambiar de tamaño fácilmente durante
la ejecución de un programa.
9.3 Forma de acceso
La forma de acceder a los elementos de la matriz es di-
9.1 Índices recta; esto significa que el elemento deseado es obtenido
a partir de su índice y no hay que ir buscándolo elemento
Todo vector se compone de un determinado número de por elemento (en contraposición, en el caso de una lis-
elementos. Cada elemento es referenciado por la posición ta, para llegar, por ejemplo, al tercer elemento hay que
que ocupa dentro del vector. Dichas posiciones son llama- acceder a los dos anteriores o almacenar un apuntador o
das índice y siempre son correlativos. Existen tres formas puntero que permita acceder de manera rápida a ese ele-
de indexar los elementos de una matriz: mento).
• Indexación base-cero (0): en este modo el primer Para trabajar con vectores muchas veces es preciso reco-
elemento del vector será la componente cero ('0') rrerlos. Esto se realiza por medio de bucles. El siguiente
del mismo, es decir, tendrá el índice '0'. En conse- pseudocódigo muestra un algoritmo típico para recorrer
cuencia, si el vector tiene 'n' componentes la última un vector y aplicar una función ' f (...) ' a cada una de las
tendrá como índice el valor 'n-1'. El lenguaje C es un componentes del vector:
ejemplo típico que utiliza este modo de indexación.
i = 0 mientras (i < longitud) //Se realiza alguna opera-
ción con el vector en la i-ésima posición f(v[i]) i=i+1
• Indexación base-uno (1): en esta forma de indexa- fin_mientras
32
9.5. VECTORES MULTIDIMENSIONALES 33
9.4 Vectores dinámicos y estáticos las instrucciones malloc y realloc para reservar memoria
de forma dinámica (ver biblioteca stdlib.h), y la función
Lo habitual es que un vector tenga una cantidad fija de free para liberar la memoria utilizada.
memoria asignada, aunque dependiendo del tipo de vec- Resultado:
tor y del lenguaje de programación un vector podría tener
El resultado de los dos ejemplos es el mismo vector.
una cantidad variable de datos. En este caso, se les deno-
mina vectores dinámicos, en oposición, a los vectores
con una cantidad fija de memoria asignada se los deno-
mina vectores estáticos. 9.5 Vectores multidimensionales
El uso de vectores dinámicos requiere realizar una apro-
piada gestión de memoria dinámica. Un uso incorrecto En Basic, Java y otros lenguajes es posible declarar matri-
de los vectores dinámicos, o mejor dicho, una mala ges- ces multidimensionales, entendiéndolas como un vector
tión de la memoria dinámica, puede conducir a una fuga de x dimensión. En dichos casos en número de elementos
de memoria. Al utilizar vectores dinámicos siempre ha- del vector es el producto resultante de cada dimensión.
brá que liberar la memoria utilizada cuando ésta ya no se Por ejemplo el vector v(4,1) tiene 10 elementos se calcula
vaya a seguir utilizando. del siguiente modo: (0-4) * (0-1). Los elementos de la
Lenguajes más modernos y de más alto nivel, cuentan con primera dimensión del vector contiene 5 elementos que
un mecanismo denominado recolector de basura (como es van del '0' al '4' y la 2º dimensión tiene 2 elementos que
el caso de Java) que permiten que el programa decida si van desde '0' a '1'. Los elementos serían accedidos del
debe liberar el espacio basándose en si se va a utilizar en siguiente modo:
el futuro o no un determinado objeto.
elemento 1: (0,0)
elemento 2: (0,1)
9.4.1 Ejemplos en C
elemento 3: (1,0)
• Declaración en C/C++ de un vector estático. ...
elemento 8: (3,1)
int main(void) { int i, v[5]; // v[5] es un vector de 5
elemento 9: (4,0)
componentes for(i=0; i<5; i++) { v[i] = 0; // Asignamos
un valor printf("%d\n”, v[i]); printf("\n”); // Crea una elemento 10: (4,1)
nueva línea } return 0 }
Pila (informática)
• Implementación de recursividad.
10.1 Historia
El método de pila para la evaluación de expresiones fue
propuesto en 1955 y dos años después patentado por Frie-
drich L. Bauer, quién recibió en 1988 el premio “IEEE
Computer Society Pioneer Award” por su trabajo en el
desarrollo de dicha estructura de datos.
34
10.4. ARQUITECTURA BÁSICA DE UNA PILA 35
A medida que la placa superior se elimina de la pila, la 10.4 Arquitectura básica de una pi-
segunda placa se convierte en la parte superior de la pila.
Dos principios importantes son ilustrados por esta metá-
la
fora: En primer lugar la última salida es un principio, la
segunda es que el contenido de la pila está oculto. Sólo la Una pila típica es un área de la memoria de los compu-
placa de la parte superior es visible, por lo que para ver tadores con un origen fijo y un tamaño variable. Al prin-
lo que hay en la tercera placa, el primer y segundo platos cipio, el tamaño de la pila es cero. Un puntero de pila, por
tendrán que ser retirados. lo general en forma de un registro de hardware, apunta a
la más reciente localización en la pila; cuando la pila tie-
ne un tamaño de cero, el puntero de pila de puntos en el
10.2.1 Operaciones origen de la pila.
Las dos operaciones aplicables a todas las pilas son:
Una pila cuenta con 2 operaciones imprescindibles: apilar
y desapilar, a las que en las implementaciones modernas • Una operación apilar, en el que un elemento de datos
de las pilas se suelen añadir más de uso habitual. se coloca en el lugar apuntado por el puntero de pila,
y la dirección en el puntero de pila se ajusta por el
• Crear: se crea la pila vacía. (constructor) tamaño de los datos de partida.
• Tamaño: regresa el número de elementos de la pila. • Una operación desapilar: un elemento de datos en
(size) la ubicación actual apuntado por el puntero de pila
es eliminado, y el puntero de pila se ajusta por el
• Apilar: se añade un elemento a la pila.(push) tamaño de los datos de partida.
• Desapilar: se elimina el elemento frontal de la pi- Hay muchas variaciones en el principio básico de las ope-
la.(pop) raciones de pila. Cada pila tiene un lugar fijo en la me-
moria en la que comienza. Como los datos se añadirán a
• Cima: devuelve el elemento que esta en la cima de
la pila, el puntero de pila es desplazado para indicar el es-
la pila. (top o peek)
tado actual de la pila, que se expande lejos del origen (ya
• Vacía: devuelve cierto si la pila está sin elementos o sea hacia arriba o hacia abajo, dependiendo de la aplica-
falso en caso de que contenga uno. (empty). ción concreta).
Por ejemplo, una pila puede comenzar en una posición
de la memoria de mil, y ampliar por debajo de las direc-
10.2.2 Implementación ciones, en cuyo caso, los nuevos datos se almacenan en
lugares que van por debajo de 1000, y el puntero de pila
Un requisito típico de almacenamiento de una pila de n se decrementa cada vez que un nuevo elemento se agre-
elementos es O(n). El requisito típico de tiempo de O(1) ga. Cuando un tema es eliminado de la pila, el puntero de
las operaciones también son fáciles de satisfacer con un pila se incrementa.
array o con listas enlazadas simples. Los punteros de pila pueden apuntar al origen de una pila
o de un número limitado de direcciones, ya sea por enci-
ma o por debajo del origen (dependiendo de la dirección
10.2.3 Estructuras de datos relacionadas en que crece la pila), sin embargo el puntero de pila no
puede cruzar el origen de la pila. En otras palabras, si el
El tipo base de la estructura FIFO (el primero en entrar origen de la pila está en la dirección 1000 y la pila crece
es el primero en salir)es la cola, y la combinación de las hacia abajo (hacia las direcciones 999, 998, y así sucesi-
operaciones de la pila y la cola es proporcionado por el vamente), el puntero de pila nunca debe ser incrementado
deque. Por ejemplo, el cambio de una pila en una cola más allá de 1000 (para 1001, 1002, etc.) Si un desapilar
en un algoritmo de búsqueda puede cambiar el algoritmo operación en la pila hace que el puntero de pila se deje
de búsqueda en primera profundidad (en inglés, DFS) por atrás el origen de la pila, una pila se produce desborda-
una búsqueda en amplitud (en inglés, BFS). Una pila aco- miento. Si una operación de apilar hace que el puntero de
tada es una pila limitada a un tamaño máximo impuesto pila incremente o decremente más allá del máximo de la
en su especificación. pila, en una pila se produce desbordamiento.
La pila es visualizada ya sea creciente de abajo hacia arri-
ba (como pilas del mundo real), o, con el máximo elemen-
10.3 Pilas Hardware to de la pila en una posición fija, o creciente, de izquierda
a derecha, por lo que el máximo elemento se convierte en
Un uso muy común de las pilas a nivel de arquitectura el máximo a “la derecha”. Esta visualización puede ser in-
hardware es la asignación de memoria. dependiente de la estructura real de la pila en la memoria.
36 CAPÍTULO 10. PILA (INFORMÁTICA)
10.7.1 Tiempo de ejecución de la gestión de jar que el compilador sea recursivo (pero en este caso el
memoria compilador todavía está utilizando una pila interna). El
uso de pilas es frecuente en muchos problemas, que van
Artículo principal: Pila basada en la asignación de memo- desde almacenar la profundidad de los árboles hasta re-
ria y Pila máquina. Una serie de lenguajes de programa- solver crucigramas o jugar al ajedrez por ordenador. Al-
ción están orientadas a la pila, lo que significa que la ma- gunos de estos problemas pueden ser resueltos por otras
yoría definen operaciones básicas (añadir dos números, la estructuras de datos como una cola.
impresión de un carácter) cogiendo sus argumentos de la
pila, y realizando de nuevo los valores de retorno en la pi-
la. Por ejemplo, PostScript tiene una pila de retorno y un 10.8 Seguridad
operando de pila, y también tiene un montón de gráficos
estado y un diccionario de pila. La seguridad a la hora de desarrollar software usando es-
Forth utiliza dos pilas, una para pasar argumentos y una tructuras de datos de tipo pila es un factor a tener en cuen-
subrutina de direcciones de retorno. El uso de una pila ta debido a ciertas vulnerabilidades que un uso incorrecto
de retorno es muy común, pero el uso poco habitual de de éstas puede originar en la seguridad de nuestro soft-
un argumento para una pila legible para humanos es el ware o en la seguridad del propio sistema que lo ejecu-
lenguaje de programación Forth razón que se denomina ta. Por ejemplo, algunos lenguajes de programación usan
una pila basada en el idioma. una misma pila para almacenar los datos para un proce-
dimiento y el enlace que permite retornar a su invocador.
Muchas máquinas virtuales también están orientadas ha-
Esto significa que el programa introduce y extrae los da-
cia la pila, incluida la p-código máquina y la máquina vir-
tos de la misma pila en la que se encuentra la información
tual Java.
crítica con las direcciones de retorno de las llamadas a
Casi todos los entornos de computación de tiempo de eje- procedimiento, supongamos que al introducir datos en la
cución de memoria utilizan una pila especial PILA para pila lo hacemos en una posición errónea de manera que
tener información sobre la llamada de un procedimiento o introducimos datos de mayor tamaño al soportado por la
función y de la anidación con el fin de cambiar al contexto pila corrompiendo así las llamadas a procedimientos, pro-
de la llamada a restaurar cuando la llamada termina. Ellos vocaríamos un fallo en nuestro programa. Ésta técnica
siguen un protocolo de tiempo de ejecución entre el que usada de forma maliciosa (es similar, pero en otro ámbi-
llama y el llamado para guardar los argumentos y el valor to al buffer overflow) permitiría a un atacante modificar
de retorno en la pila. Pila es una forma importante de apo- el funcionamiento normal de nuestro programa y nuestro
yar llamadas anidadas o a funciones recursivas. Este tipo sistema, y es al menos una técnica útil si no lo evitamos
de pila se utiliza implícitamente por el compilador para en lenguajes muy populares como el ejemplo C++.
apoyar CALL y RETURN estados (o sus equivalentes),
y no es manipulada directamente por el programador.
Algunos lenguajes de programación utilizar la pila para 10.9 Véase también
almacenar datos que son locales a un procedimiento. El
espacio para los datos locales se asigna a los temas de la • Listas
pila cuando el procedimiento se introduce, y son borradas
cuando el procedimiento termina. El lenguaje de progra- • Pilas Acotadas
mación C es generalmente aplicado de esta manera. Uti-
• Colas
lizando la misma pila de los datos y llamadas de proce-
dimiento tiene importantes consecuencias para la segu-
ridad (ver más abajo), de los que un programador debe
ser consciente, a fin de evitar la introducción de graves 10.10 Enlaces externos
errores de seguridad en un programa.
• Estructuras de datos/Pilas y colas, en Wikibooks
(inglés)
10.7.2 Solucionar problemas de búsqueda
• Distintas implementaciones del manejo de pilas en
La búsqueda de la solución de un problema, es indepen- RosettaCode.org
dientemente de si el enfoque es exhaustivo u óptimo, ne-
cesita espacio en la pila. Ejemplos de búsqueda exhaus-
tiva métodos son fuerza bruta y backtraking. Ejemplos
de búsqueda óptima a explorar métodos,son branch and
bound y soluciones heurísticas. Todos estos algoritmos
utilizan pilas para recordar la búsqueda de nodos que se
han observado, pero no explorados aún. La única alter-
nativa al uso de una pila es utilizar la recursividad y de-
Capítulo 11
Programa informático
11.1 Programación
La programación de computadoras es el proceso iterati-
vo de escribir o editar código fuente. Dicha edición de
código fuente implica probar, analizar y perfeccionar, y,
a veces, coordinar con otros programadores, en el caso
de un programa desarrollado en conjunto. Una persona
que practica esta técnica se le conoce como programador
de computadoras, desarrollador de software, o codifica-
Un programa informático escrito en un estilo orientado a objetos. dor. El proceso, a veces a largo plazo, de programación de
computadoras normalmente se lo conoce como desarrollo
Un programa informático o programa de compu- de software. El término ingeniería de software se está
tadora es una secuencia de instrucciones, escritas pa- convirtiendo en muy popular, ya que esta actividad es vis-
ra realizar una tarea específica en una computadora.[1] ta como una disciplina de ingeniería.
Este dispositivo requiere programas para funcionar, por
lo general ejecutando las instrucciones del programa en
un procesador central.[2] El programa tiene un forma- 11.1.1 Paradigmas
to ejecutable que la computadora puede utilizar directa-
mente para ejecutar las instrucciones. El mismo progra- Los programas de ordenador se pueden clasificar según
ma en su formato de código fuente legible para huma- el paradigma del lenguaje de programación utilizado pa-
nos, del cual se derivan los programas ejecutables (por ra producirlos. Dos de los principales paradigmas son
ejemplo, compilados), le permite a un programador estu- imperativos y declarativos.
diar y desarrollar sus algoritmos. Una colección de pro- Los programas escritos con un lenguaje imperativo espe-
gramas de computadora y datos relacionados se conoce cifican un algoritmo utilizando declaraciones, expresio-
como software. nes e informes.[4] Una declaración asocia un nombre de
Generalmente el código fuente lo escriben profesionales variable a un tipo de datos. Por ejemplo: var x: integer; .
conocidos como programadores de computadora.[3] Es- Una expresión produce un valor. Por ejemplo: 2 + 2 pro-
te código se escribe en un lenguaje de programación que duce 4. Por último, una declaración puede asignar una
sigue uno de los siguientes dos paradigmas: imperativo expresión a una variable o usar el valor de una variable
o declarativo, y que posteriormente puede ser converti- para alterar las estructuras de control del programa. Por
do en un archivo ejecutable (usualmente llamado un pro- ejemplo: x := 2 + 2; if x = 4 then hacer_algo(); Una crí-
grama ejecutable o un binario) por un compilador y más tica de los lenguajes imperativos es el efecto secundario
tarde ejecutado por una unidad central de procesamien- de una sentencia de asignación en una clase de variables
to. Por otra parte, los programas de computadora se pue- llamadas variables no locales.[5]
38
11.2. EJECUCIÓN Y ALMACENAMIENTO DE LOS PROGRAMAS 39
Los programas escritos en un lenguaje declarativo espe- representación intermedia eficiente para la ejecución fu-
cifican las propiedades que tienen o que deben cumplir- tura. BASIC, Perl y Python son ejemplos de programas de
se para la salida. No especifican detalles expresados en computadora ejecutados inmediatamente. Por otra parte,
términos de flujo de control de la máquina de ejecución los programas de computadora de Java se compilan antes
pero sí de las relaciones matemáticas entre los objetos de tiempo y se almacena como un código independien-
declarados y sus propiedades. Los lenguajes funcionales te de la máquina llamado bytecode. Entonces, dicho by-
y lógicos son dos amplias categorías de lenguajes decla- tecode es ejecutado a petición de un intérprete llamado
rativos. El principio detrás de los lenguajes funcionales máquina virtual.
(como Haskell) es el de no permitir efectos secundarios,
La principal desventaja de los intérpretes es que los pro-
lo que hace que sea más fácil para razonar sobre los pro-gramas de computadora corren más lento que cuando son
gramas como si se tratasen de funciones matemáticas.[5]
compilados. La interpretación de código resulta más lenta
El principio detrás de los lenguajes lógicos (como Prolog)
que la ejecución de la versión compilada porque el intér-
es definir el problema a ser resuelto - la meta - y dejar la
prete debe decodificar cada declaración cada vez que se
solución detallada al propio sistema Prolog.[6] El objetivo
carga y luego realizar la acción deseada. Sin embargo, el
se define proporcionando la lista de sub-objetivos. Luego,desarrollo de software puede ser más rápido usando un in-
cada subobjetivo se define más arriba, proporcionando la térprete porque la prueba es inmediata cuando se omite el
lista de sus sub-objetivos, etc. Si la ruta de sub-objetivos
paso de la compilación. Otra desventaja de los intérpretes
no encuentra una solución, entonces ese subobjetivo se es que debe estar presente al menos uno en la computado-
retrocede y otra vía se intenta sistemáticamente. ra durante la ejecución del programa de computadora. Por
La forma en que se crea el programa puede ser textual o el contrario, los programas de computadora compilados
visual. En un programa de lenguaje visual, los elementos no necesitan compilador presente durante la ejecución.
en vez de ser textualmente especificados son manipulados No se requieren propiedades de un lenguaje de progra-
gráficamente. mación si se está compilado exclusivamente o interpre-
tándose exclusivamente. Por lo general, la clasificación
refleja el método más popular de ejecución del lenguaje.
11.1.2 Compilado o interpretando
Por ejemplo, BASIC se considera un lenguaje interpreta-
do y C un lenguaje compilado, a pesar de la existencia de
Un programa de computadora bajo la forma de lengua-
compiladores de BASIC e intérpretes de C. Algunos sis-
je de programación de computadoras legible por un hu-
temas utilizan compilación en tiempo de ejecución (JIT)
mano, se lo llama código fuente. Dicho código fuen-
mediante la cual las secciones de la fuente se compilan
te se puede convertir en una imagen ejecutable por un
'sobre la marcha' y se almacenan para ejecuciones poste-
compilador o ejecutarse inmediatamente con la ayuda de
riores.
un intérprete.
Cualquiera de los programas compilados o interpretados
pueden ser ejecutados en un proceso por lotes sin inter- 11.1.3 Programas que se auto-modifican
vención humana, pero los programas interpretados le per-
miten al usuario escribir comandos en una sesión interac- Un programa informático en ejecución normalmente es
tiva. En este caso, los programas son los comandos sepa- tratado como algo diferente de los datos con los cuales
rados, cuya ejecución se produce secuencialmente, y por opera. Sin embargo, en algunos casos ésta distinción es
lo tanto simultáneamente. Cuando se utiliza un lenguaje ambigua, especialmente cuando un programa se modi-
para dar órdenes a una aplicación de software (como un fica a sí mismo. El programa modificado es secuencial-
shell de Unix u otra interfaz de línea de comandos), se le mente ejecutado como parte del mismo programa. El có-
llama un lenguaje de scripts. digo que se auto-modifica es posible para programas es-
Los compiladores se utilizan para traducir el código fuen- critos en código máquina, Lenguaje ensamblador, Lisp,
te de un lenguaje de programación, ya sea en código obje- C, COBOL, PL/1 y Prolog y JavaScript (la función eval),
to o código máquina.[7] El código objeto de objeto nece- entre otros.
sita procesamiento adicional para convertirse en código
máquina, y el código máquina es el código nativo de la
unidad central de procesamiento, listo para su ejecución.
Los programas de computadora compilados se conocen
11.2 Ejecución y almacenamiento
comúnmente como ejecutables, imágenes binarias, o sim- de los programas
plemente como binarios — una referencia al formato de
archivo binario utilizado para almacenar el código ejecu- Típicamente, los programas se almacenan en una
table. memoria no volátil (por ejemplo un disco), para que luego
Los programas de computadora — interpretados en un lo- el usuario de la computadora, directa o indirectamente,
te o una sesión interactiva — o bien se descodifican y lue- solicite su ejecución. Al momento de dicha solicitud, el
go ejecutados inmediatamente o se decodifican en alguna programa es cargado en la memoria de acceso aleatorio
40 CAPÍTULO 11. PROGRAMA INFORMÁTICO
Los programas históricamente se cargaron manualmen- Muchos programas pueden correr simultáneamente en
te al procesador central mediante interruptores. Una ins- la misma computadora, a lo cual se le conoce como
trucción era representada por una configuración de es- multitarea y puede lograrse a través de mecanismos de
tado abierto o cerrado de los interruptores. Después de software o de hardware. Los sistemas operativos mo-
establecer la configuración, se ejecutaba un botón de eje- dernos pueden correr varios programas a través del
cución. Este proceso era repetitivo. También, histórica- planificador de procesos — un mecanismo de software
mente los programas se cargaban manualmente median- para conmutar con frecuencia la cantidad de procesos del
te una cinta de papel o tarjetas perforadas. Después de procesador de modo que los usuarios puedan interactuar
que el programa se cargaba, la dirección de inicio se es- con cada programa mientras estos están corriendo.[11]
11.6. BIBLIOGRAFÍA 41
También se puede lograr la multitarea por medio del [4] Wilson, Leslie B. (1993). Comparative Programming Lan-
hardware; las computadoras modernas que usan varios guages, Second Edition (en inglés). Addison-Wesley. p. 75.
procesadores o procesadores con varios núcleos pueden ISBN 0-201-56885-3.
correr muchos programas a la vez.[12]
[5] Wilson, Leslie B. (1993). Comparative Programming Lan-
guages, Second Edition (en inglés). Addison-Wesley. p.
213. ISBN 0-201-56885-3.
11.3 Categorías funcionales
[6] Wilson, Leslie B. (1993). Comparative Programming Lan-
guages, Second Edition (en inglés). Addison-Wesley. p.
Los programas se pueden categorizar según líneas funcio- 244. ISBN 0-201-56885-3.
nales. Estas categorías funcionales son software de sis-
tema y software de aplicación. El software de sistema [7] «What is a Compiler?» (en inglés). Consultado el 10 de
incluye al sistema operativo el cual acopla el hardware enero de 2012.
con el software de aplicación.[13] El propósito del siste-
ma operativo es proveer un ambiente en el cual el soft- [8] Silberschatz, Abraham (1994). Operating System Con-
ware de aplicación se ejecuta de una manera conveniente cepts, Fourth Edition (en inglés). Addison-Wesley. p. 30.
[13] ISBN 0-201-50480-4.
y eficiente. Además del sistema operativo, el softwa-
re de sistema incluye programas utilitarios que ayudan a [9] Tanenbaum, Andrew S. (1990). Structured Computer Or-
manejar y configurar la computadora. Si un programa no ganization, Third Edition. Prentice Hall. p. 11. ISBN 0-
es software de sistema entonces es software de aplicación. 13-854662-2. (en inglés).
El middleware también es un software de aplicación que
acopla el software de sistema con la interfaz de usuario. [10] Silberschatz, Abraham (1994). Operating System Con-
También son software de aplicación los programas utili- cepts, Fourth Edition (en inglés). Addison-Wesley. p. 6.
tarios que ayudan a los usuarios a resolver problemas de ISBN 0-201-50480-4.
aplicaciones, como por ejemplo la necesidad de ordena-
[11] Silberschatz, Abraham (1994). Operating System Con-
miento.
cepts, Fourth Edition (en inglés). Addison-Wesley. p. 100.
ISBN 0-201-50480-4.
11.4 Véase también [12] Akhter, Shameem (2006). Multi-Core Programming. Ri-
chard Bowles (Intel Press). pp. 11–13. ISBN 0-9764832-
4-6. (en inglés).
• Algoritmo para la relación entre los programas in-
formáticos y algoritmos [13] Silberschatz, Abraham (1994). Operating System Con-
cepts, Fourth Edition (en inglés). Addison-Wesley. p. 1.
• Estructura de datos ISBN 0-201-50480-4.
[3] «Algorithms and Computer Programming» (en inglés). • Definición de “Computer Program” en dictio-
Consultado el 8 de setiembre de 2014. nary.com (en inglés)
42 CAPÍTULO 11. PROGRAMA INFORMÁTICO
Arjuno3, Andreasmperu, Luckas-bot, MystBot, Bob A, Roinpa, Jotterbot, Sappler, Akhran, Vic Fede, Barteik, Billinghurst, Vandal Crus-
her, Julio Cardmat, XZeroBot, ArthurBot, Argentinoo, Jefrcast, SuperBraulio13, Ortisa, Manuelt15, Xqbot, Jkbw, SassoBot, Dreitmen,
Ricardogpn, Igna, Torrente, Adryitan, Botarel, MauritsBot, Googolplanck, Hprmedina, TobeBot, Execoot~eswiki, Palita1880, Halfdrag,
Vubo, YSCO, PatruBOT, Ganímedes, Angelito7, Mr.Ajedrez, Jose1080i, Humbefa, Tarawa1943, Jorge c2010, GrouchoBot, Cesarintel,
Miss Manzana, Jose1100000, Edslov, EmausBot, Savh, AVIADOR, Ingenieros instructivos, HRoestBot, Allforrous, Sergio Andres Sego-
via, Chope777, Rubpe19, Eroyuela, ChuispastonBot, MadriCR, Waka Waka, Cordwainer, Lcsrns, Antonorsi, Valthern, Edc.Edc, Ismaell,
Jicapter, Sebrev, MetroBot, Sansgumen, Mascorria, Teclis jma, Gusama Romero, Nernix1, Acratta, Johnbot, Harpagornis, LlamaAl, Helmy
oved, Erandly, Flashlack, Cyrax, Napier, Ralgisbot, Syum90, Fabrizotus, BLACK M0NST3R, Juanitoalcachofados, Addbot, Shinigamisa-
jayin, Balles2601, Killtas, Patoogalvan, Davidpaisa04, DarkBlueZV, Equiz yolo swaw, Jarould, Matiia, Egis57, Geekisthebest1, Ximenacs
y Anónimos: 809
• Algoritmo Fuente: http://es.wikipedia.org/wiki/Algoritmo?oldid=81963760 Colaboradores: Llull~eswiki, Pit~eswiki, Sabbut, Moriel, Sau-
ron, JorgeGG, Lourdes Cardenal, ManuelGR, Julie, Angus, Vivero, Riviera, Rosarino, Dodo, Ejmeza, Crescent Moon, Triku, Sms, Rsg,
Tostadora, Elwikipedista, Tano4595, Jsanchezes, Ríos-Ortega, JAAC, Jecanre, Cinabrium, Schummy, Huhsunqu, Balderai, Ecemaml, Re-
nabot, FAR, Ictlogist, Boticario, Soulreaper, Orgullomoore, AlfonsoERomero, Airunp, JMPerez, Edub, Yrithinnd, Taichi, Emijrp, Rem-
biapo pohyiete (bot), Caiser, Magister Mathematicae, RobotQuistnix, Alhen, Superzerocool, Chobot, Dromero, Sancebau, Yrbot, Amadís,
FlaBot, Vitamine, .Sergio, YurikBot, Mortadelo2005, GermanX, Zam, Willtron, KnightRider, The Photographer, YoaR, Gothmog, No sé
qué nick poner, Carutsu, C-3POrao, Jesuja, Banfield, Maldoror, Er Komandante, Camima, Haitike, KocjoBot~eswiki, Tomatejc, Jarke,
Paintman, Rbonvall, Kn, Aleator, Jstitch, BOTpolicia, Gizmo II, CEM-bot, Jorgeu, Jorgelrm, Laura Fiorucci, Kojie, -jem-, Alexav8, Ignacio
Icke, Efegé, Retama, AlphaWiki~eswiki, Baiji, Bot~eswiki, Antur, Dorieo, Ingenioso Hidalgo, Fsd141, AlbertMA, Thijs!bot, Xxim, Alvaro
qc, Escarbot, Yeza, Zupez zeta, Drake 81, RoyFocker, Ninovolador, MorZilla, Cratón, Isha, Dogor, Gusgus, Obueno, JAnDbot, Jugones55,
JuanRodríguez, Kved, DerHexer, Lecuona, Mansoncc, Muro de Aguas, Xavigivax, TXiKiBoT, S3v3r-1, Elisardojm, Humberto, Netito777,
Sophie kowalsky, AS990, ZrzlKing, Chabbot, Pólux, Bucephala, AchedDamiman, VolkovBot, Snakeyes, Technopat, Queninosta, Rays-
torm, Libertad y Saber, Matdrodes, Elabra sanchez, Synthebot, DJ Nietzsche, BlackBeast, Shooke, AlleborgoBot, Muro Bot, Peregring-lk,
Clarad, Komputisto, MiguelAngel fotografo, SieBot, Aitorzubiaurre, Danielba894, Ctrl Z, Francisco Mochis, Carmin, Rigenea, Drinibot,
CASF, BOTarate, Arlm1, Fide07, STBot~eswiki, Mel 23, Guillervf91, Manwë, Fegc77, Greek, H3r3dia, BuenaGente, Qix~eswiki, Relleu,
PipepBot, Fadesga, Chuchot, Tirithel, Mutari, XalD, robot, Jarisleif, Javierito92, HUB, PeruProfe, Farisori, McMalamute, Estira-
bot, Eduardosalg, Veon, Leonpolanco, Pan con queso, Mar del Sur, Alejandrocaro35, Botito777, Petruss, Alexbot, Darkicebot, Valentin
estevanez navarro, RoyFokker, Raulshc, Açipni-Lovrij, SilvonenBot, Camilo, UA31, Ucevista, AVBOT, David0811, Flakinho, Nocturno-
gatuno, MastiBot, Pedrito suarez, Angel GN, MarcoAurelio, Speedplus, Ezarate, Diegusjaimes, Jjflorescueto, Arjuno3, Andreasmperu,
Luckas-bot, Virgi, Ptbotgourou, Jotterbot, Vic Fede, Dangelin5, Eduman~eswiki, Nixón, DSisyphBot, XZeroBot, ArthurBot, Ruy Pu-
gliesi, Lcpousa, SuperBraulio13, M.heda, Xqbot, Jkbw, GhalyBot, Junior1209, Pedrovicenterosero, Calitb, Albertochoa, Igna, Torrente,
Botarel, BenzolBot, Heynry1, Gusbelluwiki, Jhoelito14, TobeBot, Adrianantoniors, Imperioonepiece, Halfdrag, Aquiel, Mipataentutrasero,
Wikielwikingo, Hantartico, KamikazeBot, , Abel406, TjBot, Alph Bot, Humbefa, Irvinopuma, Carlo el calvo, Shining.Star, Foundling,
GrouchoBot, Xxxmagicmanxxx, Edslov, EmausBot, Savh, HRoestBot, Sergio Andres Segovia, Macrocoliset, Emiduronte, ChuispastonBot,
MadriCR, Waka Waka, Xpress500, Mjbmrbot, Miguel hdez, Ksarasola, Metrónomo, Antonorsi, MerlIwBot, Papaplus, Renly, ClausxD,
Arthur 'Two Sheds’ Jackson, Sebrev, Ginés90, Kotas, MetroBot, Henry bedon, Gusama Romero, Acratta, Metilisopropilisergamida, Vetra-
nio, Elvisor, Sandovaltk10, Helmy oved, Syum90, Legobot, Eyetheunlord, Balles2601, ConnieGB, Angelrafa00, Jarould, Matiia, Egis57,
Crystallizedcarbon, AlexGaitan, Deforetop6, Yholo, Andres477, Sapristi1000, CarlosAR2000, Benito Álvaro Cifuentes, Lalito312000,
Benigno Jimenez Garay, Holaxddddd, Joltenick y Anónimos: 789
• Algoritmo determinista Fuente: http://es.wikipedia.org/wiki/Algoritmo%20determinista?oldid=71508940 Colaboradores: Riviera,
Tano4595, Chobot, Yrbot, BOTijo, R0MAN0, CEM-bot, Nagul, Martínhache, Fsd141, Thijs!bot, Muro Bot, SieBot, DragonBot, DumZi-
BoT, Luckas-bot, MystBot, SassoBot, JViejo, WikitanvirBot, KLBot2, Acratta, Elvisor, JacobRodrigues y Anónimos: 4
• Estructura de datos Fuente: http://es.wikipedia.org/wiki/Estructura%20de%20datos?oldid=81150159 Colaboradores: Edulix, Soniautn,
Sabbut, Moriel, Sauron, Julie, Zwobot, Comae, Dodo, Triku, Fortran~eswiki, Sms, Rsg, Murphy era un optimista, Jsanchezes, LPR, Porao,
Alexan, Emijrp, Rembiapo pohyiete (bot), RobotQuistnix, Platonides, Chobot, Yrbot, BOTijo, YurikBot, Icvav, KnightRider, Jesuja, Txo,
Götz, Maldoror, Chlewbot, Tomatejc, Fercufer, Laura Fiorucci, Alexav8, Fsd141, Thijs!bot, Rasilga, Miguelo on the road, TXiKiBoT, Juan
renombrado, Hidoy kukyo, Danthux, Humberto, Developer, Biasoli, AlnoktaBOT, VolkovBot, Matdrodes, YonaBot, BotMultichill, SieBot,
Loveless, Furti, Alexbot, Açipni-Lovrij, SilvonenBot, Rrupo, AVBOT, David0811, MastiBot, MarcoAurelio, Diegusjaimes, DumZiBoT,
Luckas-bot, Yonidebot, ArthurBot, Alexandravargas, SuperBraulio13, Ortisa, Xqbot, Jkbw, Asfarer, Ricardogpn, Botarel, Aquiel, Patru-
BOT, Dinamik-bot, Crg 85, EmausBot, ZéroBot, WikitanvirBot, Manubot, Xerox 5B, Rezabot, MerlIwBot, Jetjanoli, V.aguado, Seasz,
Addbot, DarkBlueZV y Anónimos: 79
• Cola (informática) Fuente: http://es.wikipedia.org/wiki/Cola%20(inform%C3%A1tica)?oldid=81430190 Colaboradores: Moriel, Jor-
geGG, Robbot, Sms, Emijrp, BOTijo, The Photographer, Jesuja, Eduardo Lima, Jarke, CEM-bot, Thijs!bot, Diosa, Isha, JAnDbot, Pólux,
AlnoktaBOT, Technopat, BotMultichill, SieBot, Ctrl Z, El3ctron, Loveless, BOTarate, Nubecosmica, Ken123BOT, WikiBotas, Tirithel,
Kikobot, Farisori, Eduardosalg, Qwertymith, Jduarte, Poco a poco, Mithy, Alexbot, SilvonenBot, MastiBot, Diegusjaimes, Arjuno3, Jot-
terbot, DSisyphBot, Amadeupons, Alvaromedina, Xqbot, Jkbw, PabloRCR, Josemgm89, Igna, Panderine!, Hprmedina, KamikazeBot,
EmausBot, Africanus, Waka Waka, DOOM17, Syum90, Ocaroline, Addbot, Miguel940829, DarkBlueZV, Moispi y Anónimos: 72
• Tipo de dato abstracto Fuente: http://es.wikipedia.org/wiki/Tipo%20de%20dato%20abstracto?oldid=80031514 Colaboradores: Angus,
Zwobot, Comae, RolanRBD, Ascánder, Sms, Avm, Elwikipedista, Beagle~eswiki, WhisKiTo, Rembiapo pohyiete (bot), RobotQuistnix,
Platonides, Jcgarcianaranjo, YurikBot, Mortadelo2005, GermanX, Equi, KnightRider, Eskimbot, Maldoror, Leonardocaballero, CEM-
bot, RaulFraileBeneyto, Anicholo~eswiki, Karshan, Thijs!bot, Alvaro qc, Javierrami, Bot que revierte, JAnDbot, TXiKiBoT, Netito777,
Rei-bot, Idioma-bot, Fremen, Gomesbascoy, Technopat, Fernando Estel, Mjollnir1984, BOTarate, Tesi1700, Ken123BOT, Tirithel, Mi-
guel, Eduardosalg, Juan Mayordomo, UA31, AVBOT, Santiagobas, DumZiBoT, Diádoco, ArthurBot, RedBot, Dinamik-bot, Ebrambot,
ChuispastonBot, MadriCR, Pablombg, KLBot2, Robotsfuture, Bambadee, Fenixchava, JYBot, Addbot y Anónimos: 45
• Vector (informática) Fuente: http://es.wikipedia.org/wiki/Vector%20(inform%C3%A1tica)?oldid=81151693 Colaboradores: Juancri,
Pino, Moriel, Sauron, Robbot, Dodo, Crescent Moon, Tano4595, Toad32767, Boticario, Taichi, LeCire, RobotQuistnix, Caiserbot, Dro-
mero, Yrbot, BOTijo, YurikBot, GermanX, KnightRider, Jesuja, Götz, Maldoror, Chlewbot, Tomatejc, CEM-bot, Jorgelrm, JMCC1,
Especiales, Baiji, Rosarinagazo, Clokr, IrwinSantos, JAnDbot, Spa karmona, LeinaD natipaC, TXiKiBoT, Kandorf, Netito777, Biasoli,
Cinevoro, VolkovBot, Matdrodes, BlackBeast, Gmarinp, Muro Bot, BotMultichill, SieBot, Cholga~eswiki, Veon, Alejandrocaro35, Poco
a poco, Juan Mayordomo, Darkicebot, SilvonenBot, Rrupo, Albambot, AVBOT, MastiBot, Diegusjaimes, DumZiBoT, CarsracBot, Ja-
vu61, Luckas-bot, XZeroBot, SuperBraulio13, Xqbot, Jkbw, A. Guizar, Hprmedina, CVBOT, Yago AB, Dinamik-bot, Fran89, Pke93,
11.8. TEXT AND IMAGE SOURCES, CONTRIBUTORS, AND LICENSES 45
EmausBot, Savh, HRoestBot, Sergio Andres Segovia, Grillitus, MerlIwBot, Helmy oved, Makecat-bot, 2rombos, Miguel2706, Addbot,
DonRulasRules, Jarould, Benigno Jimenez Garay y Anónimos: 116
• Pila (informática) Fuente: http://es.wikipedia.org/wiki/Pila%20(inform%C3%A1tica)?oldid=81315564 Colaboradores: Robbot, Vivero,
Fortran~eswiki, Sms, Richy, Boticario, Emijrp, RobotQuistnix, FlaBot, BOTijo, YurikBot, GermanX, The Photographer, Jesuja, Banfi-
eld, Fernd, Chlewbot, Rbonvall, Kn, BOTpolicia, CEM-bot, Laura Fiorucci, Rjelves, Thijs!bot, JoaquinFerrero, Isha, TXiKiBoT, Sirpup-
pet, Pólux, Sebado, Biasoli, AchedDamiman, AlnoktaBOT, Cinevoro, Technopat, Matdrodes, Shooke, BotMultichill, SieBot, Loveless,
Greek, Farisori, Botito777, Martaka, Sire, Poco a poco, Juan Mayordomo, BotSottile, Shalbat, AVBOT, Ezarate, Diegusjaimes, DumZi-
BoT, MelancholieBot, Andreasmperu, Luckas-bot, MystBot, Nallimbot, Ptbotgourou, LyingB, GCaracuel, Xqbot, Jkbw, Ealmagro, Botarel,
D'ohBot, Gbduende, KamikazeBot, Angelito7, Foundling, EmausBot, Savh, ZéroBot, HRoestBot, David f.1993, ChuispastonBot, Phaetton,
WikitanvirBot, MerlIwBot, Harpagornis, Creosota, Helmy oved, Makecat-bot, Vengadora, Legobot, Ocaroline, Addbot, JacobRodrigues,
DarkBlueZV, Moispi, David Condrey y Anónimos: 98
• Programa informático Fuente: http://es.wikipedia.org/wiki/Programa%20inform%C3%A1tico?oldid=82060404 Colaboradores: Ejme-
za, Taichi, Magister Mathematicae, Chobot, Vitamine, GermanX, Gaijin, The Photographer, Banfield, CEM-bot, Jorgelrm, Nagul, Baiji,
Jgomo3, Dorieo, Escarbot, RoyFocker, Cratón, Isha, JAnDbot, Jugones55, Gsrdzl, CommonsDelinker, VityUvieu, Gacq, Humberto, Ama-
nuense, Idioma-bot, Pólux, Biasoli, Cinevoro, VolkovBot, Technopat, Queninosta, Matdrodes, Elabra sanchez, Shooke, Lucien leGrey,
Gerakibot, SieBot, PaintBot, Rigenea, Bigsus-bot, BOTarate, Mel 23, Tirithel, Javierito92, HUB, Estirabot, Eduardosalg, Botellín, Leonpo-
lanco, Alejandrocaro35, Botito777, Petruss, Açipni-Lovrij, UA31, SergioN, MARC912374, AVBOT, David0811, Angel GN, SubSeven-
MoRpHeEuS, MarcoAurelio, NjardarBot, Diegusjaimes, Mikiguti, CarsracBot, Arjuno3, Saloca, Luckas-bot, Spirit-Black-Wikipedista,
Roinpa, Dangelin5, Axel.axel, Nixón, ArthurBot, SuperBraulio13, Xqbot, Jkbw, Igna, Botarel, D'ohBot, BOTirithel, AnselmiJuan, Pa-
truBOT, KamikazeBot, Rudol0075, Foundling, EmausBot, Bachi 2805, Savh, ZéroBot, HRoestBot, Grillitus, Rubpe19, Jcaraballo, Ma-
driCR, AStarBot, MerlIwBot, Vagobot, MetroBot, BiTAlejandro, Elvisor, Helmy oved, Makecat-bot, Addbot, Balles2601, Amautita12,
AVIADOR-bot, Jarould, Kevin15jdr, Beromawiki y Anónimos: 169
11.8.2 Images
• Archivo:ALU_symbol.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/8/82/ALU_symbol.svg Licencia: CC-BY-SA-3.0
Colaboradores: Este gráfico vectorial fue creado con Inkscape. Artista original: en:User:Cburnett
• Archivo:AlgoritmoRaiz.png Fuente: http://upload.wikimedia.org/wikipedia/commons/2/26/AlgoritmoRaiz.png Licencia: CC-BY-SA-
3.0 Colaboradores: Trabajo propio, hecho con OpenOffice.org Draw Artista original: Kn
• Archivo:Arquitectura_von_Neumann.png Fuente: http://upload.wikimedia.org/wikipedia/commons/b/bd/Arquitectura_von_
Neumann.png Licencia: CC-BY-SA-3.0 Colaboradores: ? Artista original: ?
• Archivo:Array1.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/3/3f/Array1.svg Licencia: Public domain Colaboradores: ?
Artista original: ?
• Archivo:Check_mark.png Fuente: http://upload.wikimedia.org/wikipedia/commons/f/f0/Check_mark.png Licencia: ? Colaboradores:
Wikipedia Artista original: Wikipedia
• Archivo:Classes_and_Methods.png Fuente: http://upload.wikimedia.org/wikipedia/commons/d/d0/Classes_and_Methods.png Licen-
cia: CC BY-SA 3.0 Colaboradores: Using SublimeText Artista original: Bobbygammill
• Archivo:CodeCmmt002.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/7/75/CodeCmmt002.svg Licencia: CC BY 2.5 Co-
laboradores: Transferido desde en.wikipedia a Commons.28041964 Artista original: The original uploader was Dreftymac de Wikipedia
en inglés
• Archivo:Cola.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/b/bb/Cola.svg Licencia: CC BY-SA 3.0 Colaboradores:
Image:Data_Queue.svg by User:Vegpuff Artista original: User:Vegpuff,User:Ocaroline User:Boivie
• Archivo:ColaProg.JPG Fuente: http://upload.wikimedia.org/wikipedia/commons/5/5c/ColaProg.JPG Licencia: CC-BY-SA-3.0 Colabo-
radores: Trabajo propio Artista original: Jduarte
• Archivo:Commons-emblem-copyedit.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/e/e8/Commons-emblem-copyedit.
svg Licencia: CC BY-SA 3.0 Colaboradores:
• File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido
• Archivo:Commons-emblem-question_book_orange.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/1/1f/
Commons-emblem-question_book_orange.svg Licencia: CC BY-SA 3.0 Colaboradores: <a href='//commons.wikimedia.org/
wiki/File:Commons-emblem-issue.svg' class='image'><img alt='Commons-emblem-issue.svg' src='//upload.wikimedia.org/
wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/25px-Commons-emblem-issue.svg.png' width='25' height='25'
srcset='//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/38px-Commons-emblem-issue.svg.png
1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'
data-file-width='48' data-file-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><img
alt='Question book.svg' src='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/25px-Question_book.svg.png'
width='25' height='20' srcset='//upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/38px-Question_book.svg.
png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/50px-Question_book.svg.png 2x' data-file-
width='252' data-file-height='199' /></a> Artista original: GNOME icon artists, Jorge 2701
• Archivo:Commons-logo.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/4/4a/Commons-logo.svg Licencia: Public domain
Colaboradores: This version created by Pumbaa, using a proper partial circle and SVG geometry features. (Former versions used to be slightly
warped.) Artista original: SVG version was created by User:Grunt and cleaned up by 3247, based on the earlier PNG version, created by
Reidab.
• Archivo:Computer-aj_aj_ashton_01.svg Fuente: http://upload.wikimedia.org/wikipedia/commons/c/c1/Computer-aj_aj_ashton_01.
svg Licencia: CC0 Colaboradores: ? Artista original: ?
• Archivo:Dg-nova3.jpg Fuente: http://upload.wikimedia.org/wikipedia/commons/9/99/Dg-nova3.jpg Licencia: Copyrighted free use Co-
laboradores: Photograph taken by Qu1j0t3. Artista original: User Qu1j0t3 on en.wikipedia
46 CAPÍTULO 11. PROGRAMA INFORMÁTICO