Software.

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

Programa es un esquema (Lista o Diagrama de Flujo) que muestra la secuencia que lleva a cabo un proceso.

Los diagramas de flujo representan la forma más tradicional para especificar los detalles algorítmicos de un proceso. Se utilizan principalmente en programación, economía y procesos industriales; estos diagramas utilizan una serie de símbolos con significados especiales. Son la representación gráfica de los pasos de un proceso, que se realiza para entender mejor al mismo. Son Modelos tecnológicos utilizados para comprender los rudimentos de la programación lineal.

Otra definición del diagrama de flujo es la siguiente:

"Es un esquema para representar gráficamente un algoritmo. Se basan en la utilización de diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de operación. Para hacer comprensibles los diagramas a todas las personas, los símbolos se someten a una normalización; es decir, se hicieron símbolos casi universales, ya que, en un principio cada usuario podría tener sus propios símbolos para representar sus procesos en forma de Diagrama de Flujo. Esto trajo como consecuencia que solo aquel que conocía sus símbolos, los podía interpretar. La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a un patrón definido previamente."

Diagrama de flujo en el cual se emplean los símbolos más comunes.

Principales símbolos.

Estandarizados según ISO 5807

No es indispensable usar un tipo especial de símbolos para crear un diagrama de flujo, pero existen algunos ampliamente utilizados por lo que es adecuado conocerlos y utilizarlos, ampliando así las posibilidades de crear un diagrama más claro y comprensible para crear un proceso lógico y con opciones múltiples adecuadas.

·      Flecha. Indica el sentido y trayectoria del proceso de información o tarea.

·      Rectángulo. Se usa para representar un evento o proceso determinado. Éste es controlado dentro del diagrama de flujo en que se encuentra. Es el símbolo más comúnmente utilizado.

·      Rectángulo redondeado. Se usa para representar un evento que ocurre de forma automática y del cuál generalmente se sigue una secuencia determinada.

·      Rombo. Se utiliza para representar una condición. Normalmente el flujo de información entra por arriba y sale por un lado si la condición se cumple o sale por el lado opuesto si la condición no se cumple. Lo anterior hace que a partir de éste el proceso tenga dos caminos posibles.

·      Círculo. Representa un punto de conexión entre procesos, se utiliza cuando es necesario dividir un diagrama de flujo en varias partes, por ejemplo por razones de espacio o simplicidad. Una referencia debe de darse dentro para distinguirlo de otros. La mayoría de las veces se utizan números en los mismos.

Existen además una variedad de formas especiales para denotar las entradas, las salidas, los almacenamientos, etc.

Reglas.

De acuerdo al estándar ISO los símbolos e incluso las flechas deben de tener ciertas características para estar dentro del estándar. En el caso se los círculos de conexión se debe usar sólo cuando se conecta con un proceso contenido dentro de la misma hoja.

Aunque también existen conectores de página los cuales son como una casita y se utilizan para unir actividades que se encuentran en otra hoja.

·      Existe siempre un camino que permite arribar a una solución.

·      Existe un único inicio del proceso.

·      Existe un único punto de fin para el proceso.

·      De cada símbolo solo puede salir una flecha de flujo, salvo del rombo que indica una comparación con dos caminos posibles.

Proceso. Un Programa informático (software) es la unión de una secuencia de instrucciones que una computadora puede interpretar y ejecutar y una (o varias) estructuras de datos que almecena la información independiente de las instrucciones que dicha secuencia de instrucciones maneja. Para ello se usan lenguajes de programación que sirven para programar la secuencia de instrucciones requerida.

Breve reseña histórica.

El término software fue usado por primera vez en 1957 por John W. Turkey, ingeniero en ciencias de la computación. Surge por analogía con la palabra hardware, el sustrato físico donde se ejecuta el software.

Hoy día, el software está presente en casi todo lo que nos rodea, aunque no siempre de manera perceptible.

Definición.

Probablemente la definición más formal de software es la atribuida a la IEEE en su estándar 729: la suma total de los programas de cómputo, procedimientos, reglas, documentación y datos asociados que forman parte de las operaciones de un sistema de cómputo (Ver: IEEE Std 729-1993, IEEE Software Engineering Standard 729-1993: Glossary of Software Engineering Terminology. IEEE Computer Society Press, 1993).

Bajo esta definición el concepto de software va más allá de los programas de cómputo en sus distintas formas: código fuente, binario o código ejecutable, además de su documentación.

Tipología.

El software se clasifica en dos categorías:

·      Software de base o de sistema. Consistente en todo aquel software cuyo propósito es facilitar la ejecución de otro software. Entran en esta categoría:

o  Sistemas operativos.

o  Compiladores.

o  Sistemas gestores de bases de datos, etc.

·      Software de aplicación. Consistente en aquel software que automatiza un sistema de información, es decir, con relevancia para un fin concreto. Entran en esta categoría:

o  Procesadores de texto.

o  Hojas de cálculo, etc.

Formas.

El software adopta varias formas en distintos momentos de su ciclo de vida:

·      Código fuente: escrito por programadores. Contiene el conjunto de instrucciones, inteligibles por el ser humano, destinadas a la computadora.

·      Código objeto: resultado del uso de un compilador sobre el código fuente. Consiste en una traducción de éste último. El código objeto no es directamente inteligible por el ser humano, pero tampoco es directamente entendible por la computadora. Se trata de una representación intermedia del código fuente.

·      Código ejecutable: resultado de enlazar uno o varios fragmentos de código objeto. Constituye un archivo binario con un formato tal que el sistema operativo es capaz de cargarlo en la memoria de un ordenador, y proceder a su ejecución. El código ejecutable es directamente inteligible por la computadora.

Aplicación Informática.

En informática las aplicaciones son los programas con los cuales el usuario final interactúa, es decir, son aquellos programas que permiten la interacción entre el usuario y la computadora. Esta comunicación se lleva acabo cuando el usuario elige entre las diferentes opciones o realiza actividades que le ofrece el programa.

Los programas de aplicación se dividen en muchos tipos, entre los cuales se pueden nombrar:

·      Procesadores de texto (Ejemplo: Microsoft Word, Corel WordPerfect, OpenOffice.org Writer, etc).

·      De diseño (Ejemplo: CorelDraw, GIMP, Photo-Paint, Painter, PhotoShop, Photo Editor, Paint, etc).

·      De edición (Ejemplo: Corel Ventura, Quarkxpress, PageMaker, InDesign, FrameMaker, etc.)

·      De cálculo (Ejemplo: Maple).

·      Compiladores (Visual Basic, C++, Pascal, Visual FoxPro, etc).

·      Hoja de cálculo (Corel Quattro Pro, Lotus, OpenOffice.org Calc, Microsoft Excel).

·      Manejo de base de datos (MySQL, Microsoft Access, Dbase, etc).

·      Comunicación de datos (Safari, Firefox, Internet Explorer, Kazaa, Messengers (Yahoo, MSN, clientes Jabber, ICQ, AOL), etc).

·      Multimedia (XMMS, Mplayer, reproductor de Windows, Winnap, Real One ó Real Player, Quick Time, etc).

·      De presentación (Microsoft Power Point, Persuasion, OpenOffice.org Impress, Corel Presentations, etc).

Todos y cada uno de ellos realizados con una función específica, la de ahorrar tiempo y dinero al usuario al permitirle hacer cosas útiles con la computadora; algunos con mejores prestaciones, otros con mejor diseño, más amigables o fáciles de usar, pero con el mismo principio.

Groupware. (Software colaborativo)

Programa Informático Colaborativo o Groupware (voz inglesa), se refiere a los programas informáticos que integran el trabajo en un sólo proyecto con muchos usuarios concurrentes que se encuentran en diversas estaciones de trabajo, conectadas a través de una red (internet o intranet).

En su forma moderna, el concepto ha sido propuesto por el programa informático de Lotus (Lotus Software) con la aplicación popular "Lotus notas" (Lotus Notes) relacionado con un servidor Lotus Domino (Lotus Domino Server); algunas revisiones históricas argumentan que el concepto fue anticipado antes por sistemas monolíticos como el NLS. El programa informático que utiliza Wikipedia es un ejemplo de un programa informático colaborativo que además de ser de filosofía libre ha sido diseñado sin las limitaciones de los programas informáticos propietarios en cuanto a tratos o sin las limitaciones de jerarquización social.

Tipos de colaboración.

El Groupware se puede dividir en tres categorías: herramientas de colaboración-comunicación, herramientas de conferencia y herramientas de gestión colaborativa o en grupo.

·      Herramientas de comunicación electrónica que envian mensajes, archivos, datos o documentos entre personas y facilitan la compartición de información (colaboración asíncrona), como por ejemplo:

o  correo electrónico

o  correo voz

o  publicación en web

·      Herramientas de conferencia que facilitan el compartir información de forma interactiva (colaboración síncrona), como por ejemplo:

o  conferencia de datos.- PC en red que comparten un espacio de presentación compartido que cada usuario puede modificar.

o  conferencias de voz.- Teléfonos que permiten interactuar a los participantes.

o  conferencias de video (o audio conferencia).- PC en red que comparten señales de audio o video.

o  salas de chat o mensajería instantánea.- Una plataforma de discusión que facilita el intercambio inmediato de mensajes.

o  sistemas para facilitar reuniones.- Un sistema de conferencias integrado en una sala. Estas salas suelen disponer de un avanzado sistema de sonido y presentación que permite una mejor interacción entre partipantes en una misma sala o entre salas separadas. Ejemplos de ello son los Sistemas de soporte a decisiones.

 Herramientas de gestión colaborativa que facilitan las actividades del grupo, como por ejemplo:

o  calendarios electrónicos.- Para acordar fechas de eventos y automáticamente y enviar notificaciones y recordatorios a los participantes.

o  sistemas de gestión de proyectos.- Para organizar y hacer seguimiento de las acciones en un proyecto hasta que se finaliza.

o  sistemas de control de flujo de actividad.- Para gestionar tareas y documentos en un proceso organizado de forma estructurada (burocracia).

o  sistemas de gestión del conocimiento.- Para recoger, organizar, gestionar y compartir varios tipos de información.

o  sistemas de soporte a redes sociales.- Para organizar las relaciones de colectivos.

Programas informáticos colaborativos.

·      phpgroupware (en inglés, aunque cuenta con un demo con libre acceso en el cual pueden cambiarse las preferencias a idioma español).

·      Mediawiki (el programa informático que utiliza Wikipedia).

·      BSCW - (en inglés) Las siglas corresponden a algo como "Soporte básico para trabajo cooperativo".

·      Redianet - Aplicación para aprovechar una sala o aula con PC en red para colaboración y la compartición de medios.

·      Jabber - Sistema de mensajería instantáneo.

·      Isabel - Sistema de videoconferencia distribuido y en grupo.

Software libre.

Este artículo se refiere al término free software, tal y como está definido por la Free Software Foundation. El término inglés free es ambiguo y puede refererirse tanto a la libertad (free speech, libertad de expresión) como a la gratuidad (free beer, cerveza gratis). En español no existe tal ambigüedad, distinguiéndose claramente el software libre (objeto del presente artículo) del software gratis o software gratuito. Para este segundo caso, véase Freeware.

Software libre es el software que, una vez obtenido, puede ser usado, copiado, estudiado, modificado y redistribuido libremente. El software libre suele estar disponible gratuitamente en Internet o a precio del coste de la distribución a través de otros medios; sin embargo no es obligatorio que sea así y aunque conserve su carácter de libre, puede ser vendido comercialmente. Análogamente, el software gratuito (denominado usualmente Freeware) incluye en algunas ocasiones el código fuente; sin embargo, este tipo de software no es libre en el mismo sentido que el software libre, al menos que se garanticen los derechos de modificación y redistribución de dichas versiones modificadas del programa.

Historia.

Entre los años 60´s y 70´s del Siglo XX, el software no era considerado un producto sino un añadido que los vendedores de los grandes computadores de la época (los mainframes) aportaban a sus clientes para que éstos pudieran usarlos. En dicha cultura, era común que los programadores y desarrolladores de software compartieran libremente sus programas unos con otros. Este comportamiento era particularmente habitual en algunos de los mayores grupos de usuarios de la época, como DECUS (grupo de usuarios de computadoras DEC). A finales de los 70´s, las compañías iniciaron el hábito de imponer restricciones a los usuarios, con el uso de acuerdos de licencia.

En 1984, Richard Stallman comenzó a trabajar en el proyecto GNU, y un año más tarde fundó la Free Software Foundation (FSF). Stallman introdujo una definición para free software y el concepto de "copyleft", el cual desarrolló para dar a los usuarios libertad y para restringir las posibilidades de apropiación del software.

Libertades del Software Libre.

De acuerdo con tal definición, el software es "libre" si garantiza las siguientes libertades:

·      "libertad 0", ejecutar el programa con cualquier propósito (privado, educativo, público, comercial, etc.).

·      "libertad 1", estudiar y modificar el programa (para lo cuál es necesario poder acceder al código fuente).

·      "libertad 2", copiar el programa de manera que se pueda ayudar al vecino o a cualquiera.

·      "libertad 3", mejorar el programa y hacer públicas las mejoras, de forma que se beneficie toda la comunidad.

Es importante señalar que las libertades 1 y 3 obligan a que se tenga acceso al código fuente. La "libertad 2" hace referencia a la libertad de modificar y redistribuir el software libremente licenciado bajo algún tipo de licencia de software libre que beneficie a la comunidad.

Ciertos teóricos usan este punto cuarto (libertad 3) para justificar parcialmente las limitaciones impuestas por la licencia GNU GPL frente a otras licencias de software libre, sin embargo el sentido original es más libre, abierto y menos restrictivo que el que le otorga la propia GNU GPL.

La licencia GNU GPL posibilita la modificación, redistribución del software, pero unicamente bajo esa misma licencia. Y añade, que si se reutiliza en un mismo programa código "A" licenciado bajo licencia GNU GPL y código "B" licenciado bajo otro tipo de licencia libre, el código final "C", independientemente de la cantidad y calidad de cada codigo "A" y "B" debe de estar bajo la licencia GNU GPL.

En la práctica esto hace que las licencias de software libre se dividan en dos grandes grupos, aquellas que pueden ser mezcladas con código licenciado bajo GNU GPL (y que inevitablemente desaparecerán en el proceso, al ser el código resultante licenciado bajo GNU GPL) y las que no lo permiten al incluir mayores u otros requisitos que no contempla ni admite la GNU GPL y que por lo tanto no puede ser enlazadas ni mezcladas con código gobernado por la licencia GNU GPL.

Esta situación de incompatibilidad, que podría ser resuelta en la próxima versión 3.0 de la licencia GNU GPL (en desarrollo), causa en estos momentos graves prejuicios a la comunidad de programadores de software libre, que muchas veces no pueden reutilizar o mezclar códigos de dos licencias distintas, pese a que las libertades teóricamente lo deberían permitir.

En el sitio web de la FSF hay una lista de licencias que cumplen las condiciones impuestas por la GNU GPL y otras que no.

En el sitio web de la OSI está la lista completa de las licencias de software libre actualmente aprobadas y tenidas como tales.

El término software no libre se emplea para referirse al software distribuido bajo una licencia de software más restrictiva que no garantiza estas cuatro libertades. Las leyes de la propiedad intelectual reservan la mayoría de los derechos de modificación, duplicación y redistribución para el dueño del copyright; el software dispuesto bajo una licencia de software libre rescinde específicamente la mayoría de estos derechos reservados.

La definición de software libre no contempla el asunto del precio; un eslogan frecuentemente usado es "libre como en libertad de expresión no como en cerveza gratis" (aludiendo a la ambigüedad del término inglés "free"), y es habitual ver a la venta CDs de software libre como distribuciones GNU/Linux. Sin embargo, en esta situación, el comprador del CD tiene el derecho de copiarlo y redistribuirlo. El software gratis pude incluir restricciones que no se adaptan a la definición de software libre —por ejemplo, puede no incluir el código fuente, puede prohibir explícitamente a los distribuidores recibir una compensación a cambio, etc—.

Para evitar la confusión, alguna gente utiliza los términos "libre" (Libre software) y "gratis" (Gratis software) para evitar la ambigüedad de la palabra inglesa "free". Sin embargo, estos términos alternativos son usados únicamente dentro del movimiento del software libre, aunque están extendiendose lentamente hacia el resto del mundo. Otros defienden el uso del término open source software (software de código abierto, también llamado de fuentes abiertas). La principal diferencia entre los términos "open source" y "free software" es que éste último tiene en cuenta los aspectos éticos y filosóficos de la libertad, mientras que el "open source" se basa únicamente en los aspectos técnicos.

Tipos de Licencias.

Existen distintas variantes del concepto de software libre o grupos de licencias, por ejemplo:

·      Las libertades definidas anteriormente están protegidas por licencias de software libre, de las cuales una de las más utilizadas es la Licencia Pública General GNU (GPL). El autor conserva los derechos de autor (copyright), y permite la redistribución y modificación bajo términos diseñados para asegurarse de que todas las versiones modificadas del software permanecen bajo los términos más restrictivos de la propia GNU GPL. Esto hace que no sea imposible crear un producto con partes no licenciadas GPL: el conjunto tiene que ser GPL.

·      Software bajo el dominio público, sobre el cual el autor ha abandonado sus derechos de autor. El software bajo el dominio público, puesto que carece de protección de copyright alguna, puede ser incorporado libremente tanto en software libre como no libre.

·      Licencias estilo BSD, llamadas así porque se utilizan en gran cantidad de software distribuido junto a los sistemas operativos BSD. El autor, bajo tales licencias, mantiene la protección de copyright únicamente para la renuncia de garantía y para requerir la adecuada atribución de la autoría en trabajos derivados, pero permite la libre redistribución y modificación, incluso si dichos trabajos tienen propietario. Son muy permisivas, tanto que son fácilmente absorbidas al ser mezcladas con la licencia GNU GPL con quienes son compatibles.

Puede argumentarse que esta licencia asegura “verdadero” software libre, en el sentido que el usuario tiene libertad ilimitada con respecto al software, y que puede decidir incluso redistribuirlo como no libre. Otras opiniones están orientadas a destacar que este tipo de licencia no contribuye al desarrollo de más software libre.

·      Licencias estilo MPL y derivadas, Esta licencia es de Software Libre y tiene un gran valor porque fue el instrumento que empleó Netscape Communications Corp. para liberar su Netscape Communicator 4.0 y empezar ese proyecto tan importante para el mundo del Software Libre: Mozilla. Se utilizan en gran cantidad de productos de software libre de uso cotidiano en todo tipo de sistemas operativos. La MPL es Software Libre y promueve eficazmente la colaboración evitando el efecto "viral" de la GPL (si usas código licenciado GPL, tu desarrollo final tiene que estar licenciado GPL). Desde un punto de vista del desarrollador la GPL presenta un inconveniente en este punto, y lamentablemente mucha gente se cierra en banda ante el uso de dicho código. No obstante la MPL no es tan excesivamente permisiva como las licencias tipo BSD. Estas licencias son denominadas de copyleft debil. La NPL (luego la MPL) fue la primera licencia nueva después de muchos años, que se encargaba de algunos puntos que no fueron tenidos en cuenta por las licencias BSD y GNU. En el espectro de las licencias de software libre se la puede considerar adyacente a la licencia estilo BSD, pero perfeccionada.

Hay que hacer constar que el titular de los derechos de autor (copyright) de un software bajo licencia copyleft puede también realizar una versión modificada bajo su copyright original y venderla bajo cualquier licencia que desee, además de distribuir la versión original como software libre. Esta técnica ha sido usada como un modelo de negocio por una serie de empresas que realizan software libre (por ejemplo MySQL); esta práctica no restringe ninguno de los derechos otorgados a los usuarios de la versión copyleft. También podría retirar todas las licencias de software libre anteriormente otorgadas, pero esto obligaría a una indemnización a los usuarios de las mismas y en todo caso no está claro que pasaría con los productos derivados.

Ejemplos y evolución.

Existe una gran cantidad de software, cada vez mayor, disponible bajo licencias de software libre. Los observadores (y adeptos) a menudo interpretan este fenómeno como el movimiento del software libre. Algunos proyectos notables de software libre incluyen los kernel de los sistemas operativos GNU-Linux y BSD, los compiladores GCC, el depurador GDB y las bibliotecas de C, el servidor de nombres BIND, el servidor de transporte de correo Sendmail, el Servidor web Apache, los sistemas de base de datos relacional MySQL y PostgreSQL, los lenguajes de programación Perl, Python, Tcl y PHP, el sistema X Window, los entornos de escritorio GNOME y KDE, la suite de ofimática OpenOffice.org, el navegador Mozilla, el servidor de ficheros Samba, y el editor de gráficos GIMP.

Los paquetes de software libre constituyen un ecosistema software donde diferentes piezas de software pueden proporcionar servicios a otras, llevando a la co-evolución de características. Por mostrar un ejemplo sencillo, el lenguaje de programación Python proporciona soporte para el protocolo HTTP y el servidor web Apache que proporciona el protocolo HTTP puede llamar al lenguaje de programación Python para servir contenido dinámico.

El Proyecto Debian, que produce un sistema operativo compuesto enteramente de software libre, ha creado una serie de directrices que se usan para evaluar la compatibilidad de una licencia con el objetivo de libertad de Debian. Las Directrices de Software Libre de Debian se usan para discernir el software libre del no-libre. Para 2003, Debian había recolectado más de siete mil quinientos paquetes de software que cumplían con las citadas directrices.

Los desarrolladores de Debian argumentan que los mismos principios deberían aplicarse no sólo a los programas, sino también a la documentación libre. Muchos documentos escritos por el Proyecto de Documentación de Linux, y muchos documentos licenciados bajo la Licencia de Documentación Libre de GNU (los documentos con secciones invariantes) no se ajustan a todas las directrices citadas arriba.

Comparación con el software Open Source.

Aunque en la práctica el software Open Source y el software libre comparten las mismas licencias, la FSF opina que el movimiento Open Source es filosóficamente diferente del movimiento del software libre. Apareció en 1998 con un grupo de personas, entre los que cabe destacar a Eric S. Raymond y Bruce Perens, que formaron la Open Source Initiative (OSI). Buscaban (1) darle mayor relevancia a los beneficios prácticos del compartir el código fuente, y (2) interesar a las principales casas de software y otras empresas de la industria de la alta tecnología en el concepto. Estos defensores ven que el término open source evita la ambigüedad del termino Inglés free en free software. El término "open source" fue acuñado por Christine Peterson del think tank Foresight Institute y se registró para actuar como marca registrada para los productos de software libre.

Mucha gente reconoce el beneficio cualitativo del proceso de desarrollo de software cuando los desarrolladores pueden usar, modificar y redistribuir el código fuente de un programa. El movimiento del software libre hace especial énfasis en los aspectos morales o éticos del software, viendo la excelencia técnica como un producto secundario deseable de su estándar ético. El movimiento Open Source ve la excelencia técnica como el objetivo prioritario, siendo la compartición del código fuente un medio para dicho fin. Por dicho motivo, la FSF se distancia tanto del movimiento Open Source como del término "Open Source".

Puesto que la OSI sólo aprueba las licencias que se ajustan a la OSD (Open Source Definition), la mayoría de la gente lo interpreta como un esquema de distribución, e intercambia libremente "open source" con "software libre". Aun cuando existen importantes diferencias filosóficas entre ambos términos, especialmente en términos de las motivaciones para el desarrollo y el uso de tal software, raramente suelen tener impacto en el proceso de colaboración.

Aunque el término "Open Source" elimina la ambigüedad de Libertad frente a Precio (en el caso del Inglés), introduce una nueva: entre los programas que se ajustan a la Open Source Definition, que dan a los usuarios la libertad de mejorarlos y los programas que simplemente tiene el código fuente disponible, posiblemente con fuertes restricciones sobre el uso de dicho código fuente. Mucha gente cree que cualquier software que tenga el código fuente disponible es open source, puesto que lo pueden manipular (un ejemplo de este tipo de software sería el popular paquete de software gratuito Graphviz, inicialmente no libre pero que incluía el codigo fuente, aunque luego AT&T le cambió la licencia). Sin embargo, mucho de este software no da a sus usuarios la libertad de distribuir sus modificaciones, restringe el uso comercial, o en general restringe los derechos de los usuarios.

Significación Política.

Una vez que un producto de software libre ha empezado a circular, rápidamente está disponible a un coste muy bajo o sin coste. Al mismo tiempo, su utilidad no decrece. Esto significa que el software libre se puede caracterizar como un bien público en lugar de un bien privado. Aunque realmente no lo es en ningún momento.

Puesto que el software libre permite el libre uso, modificación y redistribución, a menudo encuentra un hogar en los países del tercer mundo para los cuales el coste del software no libre es a veces prohibitivo. También es sencillo modificarlo localmente, lo que permite que sean posibles los esfuerzos de traducción a idiomas que no son necesariamente rentables comercialmente.

La mayoría del software libre se produce por equipos internacionales que cooperan a través de la libre asociación. Los equipos están típicamente compuestos por individuos con una amplia variedad de motivaciones. Existen muchas posturas acerca de la relación entre el software libre y el actual sistema económico capitalista:

·      Algunos consideran el software libre como un competidor del capitalismo, una forma de anarquismo práctico.

·      Algunos consideran el software libre como otra forma de competición en el mercado libre y que el copyright es una restricción gubernamental sobre el mercado.

·      Algunos comparan el software libre a una economía del regalo, donde el valor de una persona está basado en lo que ésta da a los demás.

·      Grupos como Oekonux e Hipatia consideran que todo debería producirse de esta forma y que este modelo de producción no se limita a reemplazar el modelo no libre de desarrollo del software. La cooperación basada en la libre asociación puede usarse y se usa para otros propósitos (tales como escribir enciclopedias, por ejemplo).

Seguridad Relativa.

Existe una cierta controversia sobre la seguridad del software libre frente al software no libre (siendo uno de los mayores asuntos la seguridad mediante obscuridad). Un método usado de forma habitual para determinar la seguridad relativa de los productos es determinar cuántos fallos de seguridad no parcheados existen en cada uno de los productos involucrados. Por lo general los usuarios de este método recomiendan que cuando un producto no proporcione un método de parchear los fallos de seguridad, no se use dicho producto, al menos hasta que no esté disponible un arreglo.

A fecha de Diciembre de 2004 el sitio de seguridad Secunia cuenta cero fallos de seguridad no parcheados (no arreglados aún) para los productos software libre más usados para navegación de internet, productividad de oficina y e-mail -Mozilla Firefox, OpenOffice.org y Mozilla Thunderbird-, en comparación con los varios fallos de seguridad aún no corregidos para cada uno de los tres principales productos no libres equivalentes (hechos por Microsoft) - Internet Explorer, Microsoft Office y Outlook Express.

El proceso Software.

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

Algoritmo.

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

Los Diagramas de flujo se usan habitualmente para representar algoritmos.

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

Concepto.

Sistema por el cual se llega a una solución, teniendo en cuenta que debe de ser: definido, finito y preciso. Por preciso entendemos que cada paso a seguir tiene un orden; finito implica que tiene un determinado número de pasos, o sea que tiene un fin; y definido que si se sigue el mismo proceso más de un vez llegaremos al mismo resultado.

Estructura Basica: 1-inicio 2-datos de entrada (operaciones básicas) 3-procesamiento de los datos 4-datos de salida 5-fin.

Implementación.

Algunas veces en una red neuronal biológica (por ejemplo, el cerebro humano implementa la aritmética básica o incluso, una rata sigue un algoritmo para conseguir comida), también en circuitos eléctricos, en instalaciones industriales o maquinaria pesada.

El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación y en la mayoría de los casos su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces codificar) un algoritmo es escribirlo en pseudocódigo o utilizar un lenguaje muy simple tal como Lexico cuyos códigos pueden estar en el idioma del programador.

Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de éste con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerse dos tipos de señales: una señal positiva (en el caso de que el número de ceros es mayor que el de unos), y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia, y en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.

Ejemplo.

Se presenta el algoritmo para encontrar el máximo de un conjunto de enteros positivos. Se basa en recorrer una vez cada uno de los elementos, comparándolo con un valor concreto (el máximo entero encontrado hasta ahora). En el caso de que el elemento actual sea mayor que el máximo, se le asigna su valor al máximo.

El algoritmo escrito de una manera más formal, esto es, en pseudocódigo tendría el siguiente aspecto:

ALGORITMO Máximo

  ENTRADAS: Un conjunto no vacío de enteros C.

  SALIDAS: El mayor número en el conjunto C.

 

  máximo ← -∞

  PARA CADA elemento EN el conjunto C, HAZ

    SI  item > maximo, HAZ

      máximo  elem

  DEVUELVE máximo

Sobre la anotación:

·      "←" representa la asignación entre dos elementos. Por ejemplo, con máximoelem significa que el número máximo cambia su valor por el de elem.

·      "DEVUELVE" termina el algoritmo y devuelve el valor a su derecha (en este caso máximo).

Como medida de la bondad de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. Por eso, se ha desarrollado el análisis de algoritmos para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada. Por ejemplo, el algoritmo anterior tiene un orden de eficiencia en tiempo de O(n), en la notación O mayúscula n es el tamaño de la entradas; en este caso n es la el número de elementos de C. Además, como el algoritmo necesita recordar un único valor (el máximo) requiere un espacio de O (1) (hay que tener en cuenta que el tamaño de las entradas no se considera como memoria usada por el algoritmo).

Historia.

La palabra algoritmo proviene del nombre del matemático persa llamado Abu Abdullah Muhammad bin Musa al-Khwarizmi que vivió entre los siglos VIII y IX. Su trabajo consistió en preservar y difundir el conocimiento de la antigua Grecia y de la India. Sus libros eran de fácil comprensión, he aquí que su principal valor no fuera el de crear nuevos teoremas o nuevas corrientes de pensamiento, sino el simplificar las matemáticas a un nivel lo suficientemente bajo para que pudiera ser comprendido por un amplio público. Cabe destacar, como él señaló las virtudes del sistema decimal indio, (en contra de los sistemas tradicionales árabes) y como explicó que mediante una especificación clara y concisa de cómo calcular sistemáticamente, se podrían definir algoritmos que fueran usados en dispositivos mecánicos en vez de las manos (por ejemplo, ábacos). También estudió la manera de reducir las operaciones que formaban el cálculo. Es por esto que aun no siendo él, el creador del primer algoritmo, el concepto lleva aunque no su nombre, sí su pseudónimo.

Así, de la palabra algorismo que originalmente hacía referencia a las reglas de uso de la aritmética utilizando dígitos arábigos, se evolucionó a la palabra latina, derivación de al-Khwarizmi, algobarismus, y luego más tarde mutó en algoritmo en el siglo XVIII. La palabra ha cambiado de forma que en su definición se incluyen a todos los procedimientos finitos para resolver problemas.

Ya en el siglo XIX, se produjo el primer algoritmo escrito para un computador. La autora fue Ada Byron en cuyos escritos se detallaban la máquina analítica en 1842. Es por ello que es considerada por muchos como la primera programadora aunque, desde Charles Babbage nadie completó su máquina, por lo que el algoritmo nunca se implementó.

Técnicas de diseño de algoritmos.

·      Algoritmos greedy: Informalmente, podemos decir que este tipo de algoritmos selecciona los elementos del conjunto de candidatos en un determinado orden hasta encontrar una solución; es decir, calcula la solución al problema tomando en cada paso la opción más prometedora. En la mayoría de los casos la solución no es óptima.

·      Algoritmos paralelos.

·      Algoritmos probabilísticos.

·      Divide y vencerás (divide & conquer, en inglés): este tipo de algoritmos dividen el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos para después unirlas, logrando así la solución al problema completo.

·      Heurísticas: algoritmos que encuentran soluciones a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos.

·      Programación dinámica: intenta resolver problemas disminuyendo su coste espacial aumentando el coste computacional.

·      Ramificación y acotación: también conocidos como ramificación y poda, branch and bound. Este método se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones.

·      Vuelta Atrás: al igual que el método ramificación y acotación, vuelta atrás (backtracking, en inglés) se construye el espacio de soluciones del problema en un árbol que se examina completamente, almacenando las soluciones menos costosas.

Programación.

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

Software es el sustantivo que denomina a los programas y datos de computadora.

Programas y algoritmos.

Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) un algoritmo. Puede haber programas que no se ajusten a un algoritmo (pueden no terminar nunca), en cuyo caso se denomina procedimiento a tal programa.

Los programas suelen subdividirse en partes menores (módulos), de modo que la complejidad algorítmica de cada una de las partes es menor que la del programa completo, lo cual ayuda al desarrollo del programa.

Según Niklaus Wirth un programa está formado por algoritmos y estructura de datos.

Se han propuesto diversas técnicas de programación, cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas se pueden mencionar las programaciones lineal, estructurada, modular y orientada a objetos.

Compilación.

El programa escrito en un lenguaje de programación (comprensible por el ser humano, aunque se suelen corresponder con lenguajes formales descritos por gramáticas independientes del contexto) no es inmediatamente ejecutable en un ordenador. La opción más común es compilar el programa, aunque también puede ser ejecutado mediante un intérprete informático.

El código fuente del programa ha de someterse a un proceso de transformación para convertirse en lenguaje máquina, interpretable por el procesador. A este proceso se le llama compilación.

Normalmente la creación de un programa ejecutable (un típico .exe para los usuarios de Windows) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de alto nivel a código objeto (más cercano al lenguaje máquina). El segundo paso se llama enlazado (o a veces mal llamado linkado del inglés link) y traduce el código objeto a código máquina.

Un programa podría tener partes escritas en varios lenguajes, que se podrían compilar de forma independiente y enlazar juntas para formar un único ejecutable, aunque no es una práctica habitual.

Programación e ingeniería del software.

Existe una tendencia a identificar el proceso de creación de un programa informático con la programación, que es cierta cuando se trata de programas pequeños para uso personal y que dista de la realidad cuando se trata de grandes proyectos.

El proceso de creación de software desde el punto de vista de la Ingeniería tiene los siguientes pasos:

1.   Reconocer la necesidad de un programa para solucionar un problema ó identificar la posibilidad de automatización de una tarea.

2.   Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se necesita.

3.   Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase.

4.   Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable.

5.   Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el funcionamiento del programa, tras lo cual la codificación debería resultar inmediata.

6.   Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentes que pueda necesitar (bases de datos, redes de comunicaciones, etc.).

La Ingeniería del Software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente (programación artesanal) la realización de un programa consistía únicamente en escribir el código.

Referencias históricas.

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

Objetivos de la programación.

La programación de ordenadores debe perseguir tres objetivos fundamentales:

·      Corrección: Un programa es correcto si hace lo que debe hacer. Para determinar si un programa hace lo que debe es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y una vez acabado compararlo con lo que realmente hace.

·      Claridad: Es muy importante que el programa sea lo más claro posible y legible posible para mejorar el mantenimiento del software. Cuando se acaba de escribir el código del programa, se deben buscar errores y corregirlos. Más concretamente, cuando el programa está concluido, es necesario hacerle ampliaciones y/o modificaciones, según la demanda de los usuarios, esta labor puede ser llevada acabo por el mismo programador que implementó el programa o por otros.

·      Eficiencia: Debe consumir la menor cantidad de recursos posible. Normalmente al hablar de eficiencia se suele hacer referencia al consumo de tiempo y/o memoria.

La eficiencia y la claridad de un programa pueden ser objetivos contrapuestos: se puede conseguir mayor claridad sacrificando parte de la eficiencia o viceversa. Pero hay que tener en cuenta que el tiempo del programador es caro, y que hoy en día el precio de los ordenadores es razonable y cada vez son más baratos.

Programación paralela.

La programación paralela o programación concurrente es una técnica de programación basada en la ejecución simultánea, bien sea en un mismo ordenador (con uno o varios procesadores) o en un cluster de ordenadores, en cuyo caso se denomina computación distribuida.

Los sistemas multiprocesador o multicomputador consiguen un aumento del rendimiento si se utilizan estas técnicas. En los sistemas monoprocesador el beneficio en rendimiento no es tan evidente ya que la CPU es compartida por múltiples procesos en el tiempo, lo que se denomina multiplexación.

La esencia de la programación concurrente es la división de una tarea en múltiples sub-tareas que puedan ser realizadas relativamente independientemente unas de otras para combinarlas después.

Los padres de la computación paralela fueron Edsger Dijkstra y C. A. R. Hoare.

El mayor problema de la computación paralela radica en la complejidad de sincronizar unas tareas con otras, ya sea mediante secciones críticas, semáforos o paso de mensajes, para garantizar la exclusión mutua en las zonas del código en las que sea necesario.

Lenguaje de programación.

Un lenguajede programación es una técnica estándar de comunicación que permite expresar las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto de reglas sintácticas y semánticas que definen un programa informático.

Aunque, muchas veces se usa lenguaje de programación y lenguaje informático como fuesen sinónimos, no tiene porque ser así, ya los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML.

Un lenguaje de programación permite a un programador especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos almacenados y transmitidos y, qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural tal como sucede con el lenguaje Lexico.

Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, es decir, ser traducido al lenguaje de máquina, o ser interpretado para que pueda ser ejecutado por el ordenador.

Algunos lenguajes de programacion:

·      ABC

·      Ada

·      ActionScript

·      Afnix

·      ALGOL

·      APL

·      ASP

·      ASP.NET

·      AWK

·      B

·      BASIC

·      BCPL

·      Befunge

·      Boo

·      C

·      C++

·      C#

·      Caml

·      Clipper

·      CLIPS

·      CLU

·      COBOL

·      CORAL

·      D

·      Delphi

·      DIV

·      Dylan

·      Eiffel

·      Erlang

·      Extended ML

·      Euphoria

·      Fenix

·      Flow-Matic

·      Forth

·      FORTRAN

·      GRAFCET

·      FP

·      Haskell

·      Icon

·      Inform

·      INTERCAL

·      ISWIM

·      J

·      Java

·      JavaScript

·      LADDER

·      Joy

·      Lexico

·      Lisp

·      Logo

·      Lua MAGIC

·      Mainsail

·      Miranda

·      ML

·      Modula

·      Modula-2

·      Modula-3

·      Natural

·      NetREXX

·      Oberon

·      Object REXX

·      Objective-C

·      Ocaml

·      Occam

·      Pascal

·      Parlog

·      Perl

·      PHP

·      PL/1

·      Plankalkül

·      PostScript

·      Prolog

·      Python

·      Rapid

·      REXX

·      RPN

·      RPG

·      Ruby

·      Sail

·      Sather

·      Scheme

·      Self

·      Sh

·      Simula

·      Smalltalk

·      Snobol

·      SPARK

·      SQL

·      SR

·      Standard ML

·      TI-Basic

·      TCL

·      Visual Basic

·      Visual Foxpro

·      Visual Net

·      ZPL

Paradigma de programación.

Un paradigma es una forma de representar y manipular el conocimiento. Representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro.

Algunos ejemplos de paradigmas de programación:

·      El paradigma imperativo es considerado el más común y está representado, por ejemplo, por el C o por BASIC.

·      El paradigma funcional está representado por la familia de lenguajes LISP, en particular Scheme.

·      El paradigma lógico, un ejemplo es PROLOG.

·      El paradigma orientado a objetos. Un lenguaje completamente orientado a objetos es Smalltalk.

Nota: La representación orientada a objetos mejora la estructura de los datos y por lo tanto se ha aplicado a diferentes paradigmas como Redes de Petri, Imperativo Secuencial, Lógica de Predicados, Funcional, etc., No obstante, la manipulación no queda fundamentalmente afectada y por lo tanto el paradigma inicial tampoco a pesar de ser re-orientado a objetos.

Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la práctica es habitual que se mezclen. Tal es el caso de lenguajes como C++, Delphi o Visual Basic, los cuales combinan el paradigma imperativo con el orientado a objetos.

Otro ejemplo: lenguajes como Scheme o Prolog, paradigma funcional y lógico respectivamente, cuentan con estructuras repetitivas. Estas son más propias del paradigma imperativo que a la forma pura de aquellos.

Modelado del Software.

El modelado de sistemas software es una técnica para tratar con la complejidad inherente a estos sistemas. El uso de modelos ayuda al ingeniero de software a "visualizar" el sistema a construir. Además, los modelos de un nivel de abstracción mayor pueden utilizarse para la comunicación con el cliente. Por último, las herramientas de modelado y las de Ingeniería de Software Automatizada pueden ayudar a verificar la corrección del modelo.

Optimización de software.

La optimización de software es una rama de la Ingeniería de Software que trata de convertir programas existentes en otros programas que realicen las mismas tareas en menos tiempo, con menos requerimientos de memoria, o en general empleando los recursos de forma óptima.

La optimización puede tener sentido a distintos niveles, desde los más bajos (desarrollo de circuitos, escritura de código máquina diseñado especialmente para la arquitectura) hasta los niveles más altos de elaboración de implementación, uso o diseño de algoritmos.

Es generalmente recomendado dejar la optimización hasta el final del proceso de desarrollo, ya que la optimización prematura puede introducir nuevos errores (generalmente más difíciles de detectar por ser de naturaliza algorítmica).

Programación orientada a objetos.

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto difiere de los lenguajes procedurales tradicionales, en los que los datos y los procedimientos están separados y sin relación. Estos métodos están pensados para hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.

Otra manera en que esto es expresado a menudo, es que la programación orientada a objetos anima al programador a pensar en los programas principalmente en términos de tipos de datos, y en segundo lugar en las operaciones ("métodos") específicas a esos tipos de datos. Los lenguajes procedurales animan al programador a pensar sobre todo en términos de procedimientos, y en segundo lugar en los datos que esos procedimientos manejan.

Los programadores que emplean lenguajes procedurales, escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos.

Algunas personas también diferencian la POO sin clases, la cual es llamada a veces programación basada en objetos.

Caracteristicas de la POO.

Hay un cierto desacuerdo sobre exactamente que características de un método de programación o lenguaje le califican como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (cada una de las cuales se explica más detalladamente en su respectiva página enlazada):

·      Abstracción: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando los están, una variedad de técnicas son requeridas para ampliar una abstracción.

·      Encapsulamiento: También llamada "ocultación de la información", esto asegura que los objetos no pueden cambiar el estado interno de otros objetos de maneras inesperadas; solamente los propios métodos internos del objeto pueden acceder a su estado. Cada tipo de objeto expone una interfaz a otros objetos que especifica cómo otros objetos pueden interactuar con él. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción.

·      Polimorfismo: Las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

·      Herencia: Organiza y facilita el polimorfismo y la encapsulación permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en claseso Class y las clases en árboles o enrejados que reflejan un comportamiento común.

Origen.

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

La programación orientada a objetos tomó posición como la metodología de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, y otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características procedurales de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, para la cual Java tiene características especiales.

Diferencias con la programación procedural.

La programación procedural conduce a las mejoras de la técnica, como la programación estructurada y "refinamientos sucesivos", los métodos modernos de diseño de software orientado a objetos incluyen refinamientos entre los que estan el uso de los patrones de diseño, diseño por contrato y lenguajes de modelado (por ejem. UML).

La programación procedimental clásica presenta ciertos problemas, que han ido haciéndose cada vez más graves, a medida que se construían aplicaciones y sistemas informáticos más complejos, entre los que destacan los siguientes:

·      Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos, mientras la programación clásica se basa en el comportamiento, representado usualmente por verbos.

·      Es difícil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos.

·      Es difícil mantener los programas. Casi todos los sistemas informáticos grandes tienen errores ocultos, que no surgen a la luz hasta después de muchas horas de funcionamiento.

·      Es difícil reutilizar los programas. Es prácticamente imposible aprovechar en una aplicación nueva las subrutinas que se diseñaron para otra.

·      Es compleja la coordinación y organización entre programadores para la creación de aplicaciones de media y gran envergadura.

En la programación orientada a objetos pura no deben utilizarse llamadas de subrutinas, únicamente mensajes.

Por ello, a veces recibe el nombre de programación sin CALL, igual que la programación estructurada se llama también programación sin GOTO.

Sin embargo, no todos los lenguajes orientados a objetos prohíben la instrucción CALL (o su equivalente), permitiendo realizar programación híbrida, procedimental y orientada a objetos a la vez.

La Programación orientada a objetos como solución.

La programación orientada a objetos es una nueva forma de programar que proliferó a partir de los años ochenta y trata de encontrar solución a estos problemas utilizando los siguientes conceptos:

·      Objetos: entidades provistas de datos (propiedades, atributos) y comportamiento (funcionalidad, programas, métodos). Corresponden a los objetos reales del mundo que nos rodea.

·      Clases: definiciones de objeto que contienen propiedades y comportamiento. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

·      Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. Si un objeto pertenece a más de una clase, se llama herencia múltiple, y no está soportada por algunos lenguajes como Java.

·      Encapsulamiento: cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados a un objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones.

·      Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando.

Nuevos conceptos.

La programación orientada a objetos introduce nuevos conceptos, que a veces no son más que nombres nuevos aplicados a conceptos antiguos, ya conocidos. Entre ellos destacan los siguientes:

·      Método: es un programa asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena mediante un "mensaje". En analogía con un lenguaje procedural se le llamaría "función".

·      Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros.

·      Propiedad, atributo o variable: datos asociados a un objeto o a una clase de objetos.

Lenguajes orientados a objetos.

Entre los lenguajes orientados a objetos destacan los siguientes:

·      Smalltalk

·      Objective-C

·      C++

·      Ada 95

·      Java

·      Ocaml

·      Python

·      Delphi

·      Lexico (en castellano)

·      C#

·      Eiffel

·      Ruby

·      ActionScript

·      Visual Basic

·      PHP

·      PowerBuilder

·      Clarion

Estos lenguajes de programación son muy avanzados en orientación a objetos.

Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico.

Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo.

Patrón de diseño.

Los Patrones de Diseño (Design Patterns) son el esqueleto de soluciones a problemas comunes en el desarrollo de software.

Los patrones de diseño tuvieron un gran éxito a partir de la publicación del libro Design Patterns escrito por el GoF (Gang of Four) compuesto por Erich Gamma, Richard Helm, Ralph Johnson y John Vlisides, en el que se recogían 23 patrones de diseño comunes.

Los nombres de los patrones suelen citarse en inglés.

Patrones Creacionales.

·      Abstract Factory (Fábrica abstracta)

·      Builder (Constructor virtual)

·      Factory Method (Método de fabricación)

·      Prototype (Prototipado)

·      Singleton (Instancia única): Garantiza la existencia de una única instancia para una clase.

Patrones Estructurales.

·      Adapter (Adaptador): Adapta una interfaz para que pueda ser utilizada por una clase que de otro modo no podría utilizarla.

·      Bridge (Puente): Desacopla una abstracción de su implementación.

·      Composite (Objeto compuesto): Permite tratar objetos compuestos como si de uno simple se tratase.

·      Decorator (Envoltorio): Añade funcionalidad a una clase dinámicamente.

·      Facade (Fachada): Provee de una interfaz unificada simple para acceder a una interfaz o grupo de interfaces de un subsistema.

·      Flyweight (Peso ligero): Reduce la redundancia cuando gran cantidad de objetos poseen idéntica información.

·      Proxy : Mantiene un representante de un objeto.

Patrones de Comportamiento.

·      Chain of Responsibility (Cadena de responsabilidad): Permite establecer la línea que deben llevar los mensajes para que los objetos realicen la tarea indicada.

·      Command (Orden): Permite tratar un método como si de un objeto se tratase.

·      Interpreter (Intérprete).

·      Iterator (Iterador): Permite realizar recorridos sobre objetos compuestos independientemente de la implementación de estos.

·      Mediator (Mediador).

·      Memento (Recuerdo): Permite volver a estados anteriores del sistema.

·      Observer (Observador): Define una dependencia de uno-a-muchos entre objetos, de forma que cuando un objeto cambie de estado se notifique y actualicen automanticamente todos los objetos que dependen de él.

·      State (Estado) : Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno.

·      Strategy (Estrategia): Permite disponer de varios métodos para resolver un problema y elegir cúal utilizar en tiempo de ejecución.

·      Template Method (Método plantilla) : Define en una operación el esqueleto de un algoritmo ,delegando en las subclases algunos de sus pasos, esto permite que las subclases redefinan ciertos pasos de un algoritmo sin cambiar su estructura.

·      Visitor (Visitante).

Reutilización de Software.

Se define la Reutilización de Software (Software Reuse) como el uso de cualquier tipo de artefacto (tambien llamado activo), previamente creado, en un nuevo proyecto, pero considerando que:

Cada artefacto reutilizado en el nuevo proyecto ha sido ligeramente modificado para ajustarse a una definición de problema o a una necesidad de solución en el nuevo proyecto, o bien, cada artefacto reutilizable fue creado para funcionar en un contexto, entorno o aplicación completamente diferente a que se le va a dar en el nuevo proyecto, o bien

Cada artefacto reutilizado ha necesitado ser configurado para adaptarse a las especificaciones o requerimientos del nuevo proyecto.

Sistema operativo.

Un sistema operativo (SO) es un conjunto de programas o software destinado a permitir la comunicación del usuario con un ordenador y gestionar sus recursos de manera eficiente. Comienza a trabajar cuando se enciende el ordenador, y gestiona el hardware de la máquina desde los niveles más básicos, abstrayéndolo.

Hoy en día un sistema operativo se puede encontrar normalmente todos los aparatos electrónicos complejos que podamos utilizar sin necesidad de estar conectados a un ordenador y que utilizen microprocesadores para funcionar, ya que gracias a estos podemos entender la máquina y que ésta cumpla con sus funciones; éste es el caso de: teléfonos móviles, reproductores de DVD, minicadenas, autoradios, y muchos más; incluyendo más visiblemente a los ordenadores.

Otra definición.

Otra definición posible y bastante aceptada define un sistema operativo como una capa compleja entre el hardware y el usuario, concebible también como una máquina virtual, que facilita al usuario o al programador las herramientas e interfaces adecuadas para realizar sus tareas informáticas, abstrayéndole de los complicados procesos necesarios para llevarlas a cabo. Por ejemplo, un usuario normal simplemente abre los ficheros grabados en un disco, sin preocuparse por la disposición de los bits en el medio físico, los tiempos de espera del motor del disco, la posición de un cabezal, el acceso de otros usuarios, etc.

Aunque es un tema propenso a la discusión, algunos expertos están de acuerdo en que un sistema operativo debe constar de, por lo menos, un conjunto de programas similar al siguiente:

·      Un compilador de algún lenguaje de programación, en Unix es de C.

·      Un enlazador.

·      Un ensamblador.

·      Un intérprete de comandos.

·      Una amplia biblioteca del lenguaje de la plataforma.

·      Un kernel o núcleo.

Definición coloquial.

Otra definición, más coloquial, denomina sistema operativo a todo el software que viene con el ordenador antes de que se instale ninguna aplicación. Según esta definición, orientada al usuario final, las herramientas de desarrollo no son necesarias y sin embargo, se consideran elementos imprescindibles un amplio número de programas orientados a diferentes tareas, como editores de texto, administradores de archivos, navegadores, etc.

En industrias como la manufacturera o de servicios, se denomina sistema operativo a la aplicación de software que se usa como principal fuente de datos de entrada de la compañía, es decir, el sistema que se usa en las operaciones internas.

El Sistema operativo es el encargado de brindar al usuario de manera mas fácil, sencilla y amigable la de operar, codificar, interpretar y emitir órdenes al procesador central para que éste realice la tareas necesarias para completar la orden.

Características.

·      Administración de tareas:

o  Monotarea: Si solamente puede ejecutar un programa (aparte de los procesos del propio S.O.) en un momento dado. Una vez que empieza a funcionar un programa, continuará haciéndolo hasta su finalización o interrupción.

o  Multitarea: Si es capaz de ejecutar varios programas al mismo tiempo. Este tipo de S.O. normalmente asigna los recursos disponibles (CPU, memoria, periféricos) de forma alternativa a los programas que los solicitan, de manera que el usuario percibe que todos funcionan a la vez.

·      Administración de usuarios:

o  Monousuario: Si sólo permite ejecutar los programas de un usuario al mismo tiempo.

o  Multiusuario: Si permite que varios usuarios ejecuten simultáneamente sus programas, accediendo a la vez a los recursos del ordenador. Normalmente estos SS.OO. utilizan métodos de protección de datos, de manera que un programa no pueda usar o cambiar los datos de otro usuario.

·      Manejo de recursos:

o  Centralizado: Si permite utilizar los recursos de un solo ordenador.

o  Distribuido: Si permite utilizar los recursos (memoria, CPU, disco, periféricos) de más de un ordenador al mismo tiempo.

·      Organización interna:

o  Kernel monolítico (Linux, BSD, skyOS, Windows, Syllable).

o  Microkernel (BeOS, Mach, Mac OS X, newOS).

o  Nanokernel (AdeOS, Eros, KeyKOS, Brix-OS).

o  VOiD (unununium, TUNES, Vapour).

o  Sasos (Opal, Mungi, BriX).

o  VM (Merlin, Argante).

o  Exokernel (MIT exokernel).

o  Cache kernel (Universidad de Stanford).

o  Orientado a objetos (Choices).

Sistemas operativos

AtheOS/Syllable/Cosmoe

Plan_9

OSBOS

·      BeOS

·      Haiku

·      Zeta

·      BlueEyedOS

·      Cosmoe

·      BeFree

·      Sequel

·      Mockup

SkyOS

ecOS

DROPS

Familia Amiga

·      AmigaOS 1.x

·      AmigaOS 2.x

·      AmigaOS 3.0-3.1

·      AmigaOS 3.5/3.9

·      WarpOS (AmigaOS 3.x + subsistema PowerPC)

·      MorphOS

·      AmigaOS 4.0

·      AROS

·      REXX/OS

Familia Macintosh

·      Mac OS 8

·      Mac OS X

Familia QNX

·      RTOS

·      Neutrino

·      RTP

Familia DOS

·      MS-DOS

·      DR-DOS

·      PC-DOS

·      FreeDOS

·      Novell DOS

Familia Windows

·      Windows 1.0

·      Windows 2.0

·      Windows 3.0

·      Windows 3.1

·      Windows 3.11

·      Windows 95

·      Windows 98

·      Windows ME

·      Windows NT

·      Windows 2000

·      Windows 2000 server

·      Windows XP

·      Windows Server 2003

·      Windows CE

·      Windows Mobile

·      Windows Vista (Longhorn)

Familia UNIX

·      AIX

·      AMIX

·      GNU/Linux

o  Distribuciones Linux

·      GNU / Hurd

·      HP-UX

·      Irix

·      Minix

·      System V

·      Solaris

·      UnixWare

·      LynxOS

·      Xenix

·      Digital UNIX

Familia BSD

·      FreeBSD

·      PC-BSD

·      DragonFlyBSDHYPERLINK "http://www.dragonflybsd.org/" \o "http://www.dragonflybsd.org/" [1]

·      NetBSD

o  VINOHYPERLINK "http://www.eecs.harvard.edu/~vino/vino/" \o "http://www.eecs.harvard.edu/~vino/vino/" [2]

·      OpenBSD

·      PicoBSD

·      Darwin

o  GNU-Darwin

Familia Mach

·      GNU / Hurd

·      BSD lites

·      Mac OS X

·      NEXTSTEP

·      YAMIT

·      MKlinux

Familia IBM

·      OS/2

o  eComStation

·      OS/360

·      OS/370

·      OS/390

·      OS/400

Sistemas operativos académicos o experimentales (betas)

·      Chorus/Jaluna

·      Amoeba

·      MIT Exokernel

·      BriX

·      jNode

Librerías para la creación de sistemas operativos

·      Kernel Toolkit

Historia y evolución de los sistemas operativos.

Actualmente el concepto de sistema operativo esta intrínsecamente ligado al de computador. Hasta tal punto es su unión que no concebimos que los ordenadores puedan existir sin él. Sin embargo no siempre ha sido así.

A finales de los años 40, con la aparición de la primera generación de computadores, se realizaba lo que se llama el proceso en serie. Por aquel entonces no existían los sistemas operativos, y los programadores debían interactuar con el hardware del computador sin ayuda externa. Esto hacía que el tiempo de preparación para realizar una tarea fuera excesivo. Además para poderse utilizar el computador debía hacerse por turnos. Para ello se rellenaba un formulario de reserva en el que se indicaba el tiempo que el programador necesitaba para realizar su trabajo. Hay que tener en cuenta que por aquel entonces los computadores eran máquinas muy costosas y que eran esto hacía que estuvieran muy solicitadas y que sólo pudieran utilizarse en periodos breves de tiempo.

Comparación de sistemas operativos.

Se compara a continuación información general, técnica y ambiente gráfico para algunos sistemas operativos. Para mayor información, ver el artículo sobre el sistema específico.

Sistema operativo:

Windows XP

Windows 2000

Mac OS X

Mac OS

Fedora Core (Linux)

SUSE Linux

FreeBSD

OpenBSD

Solaris

Plan 9

 

Creador

Microsoft

Microsoft

Apple

Apple

Fedora Project

SuSE

Universidad de California

Theo de Raadt

Sun

Bell Labs

 

Año de primera distribución

2001

2000

2001

1984

2003

1994

1993

1996

 ?

1993

 

  Aspectos generales

Versión estable

SP2

SP4

10.3 (Panther)

9.2

4.0

10.0

5.2.1

3.7

10

Fourth Edition

 

 

 

Costo

$184 (Hogar)
$279 (Pro)

 ?

$129 o preinstalado

Gratuito hasta 7.5.5, 9.2 cuesta $20 para dueños de Mac OS X

Gratuito

Gratuito

Gratuito

Gratuito

Existe la version

gratuita

Gratuito

 

 

 

Licencia

No Libre

No Libre

No Libre
Parcialmente software libre

No Libre

Libre: GPL

Libre: GPL

Libre: BSD

Libre: BSD

No Libre
Semilibre

Libre: LPL

 

 

 

Tipo de usuario

Equipos para hogar y negocios

Equipos para negocios

Equipos para Negocios, Servidores( MAC OS X Server),Artistas, Diseñadores, Casa, Creadores de música

Artistas, , Diseñadores, Casa

Hogar,ciencia,servidores,

diseño

Hogar,ciencia,servidores,

diseño

Servidores

Servidores

Servidores, negocios

Estación de trabajo, Servidores, Embebido, HPC

 

 

 

  Aspectos técnicos

Tipo de kernel

Microkernel

Microkernel

Mach (Microkernel)

Ninguno/Microkernel

Monolítico

Monolítico

Monolítico

Monolítico

Monolítico

Monolítico

 

 

 

Sistema de archivos por defecto

NTFS

NTFS/FAT32

HFS+/UFS

HFS/HFS+

ext3

 ?

Berkeley FFS

Berkeley FFS

UFS/ZFS

fossil/venti, 9P2000, kfs, ext2, FAT, ISO 9660

 

 

 

Soporte de sistemas de archivo de 16 bits

No

 ?

 ?

 ?

 ?

 

 

 

Soporte de sistemas de archivo de 32 bits

 

 

 

Soporte de sistemas de archivo de 64 bits

No

No

No

 ?

 ?

 ?

 ?

 

 

 

 

Herramienta de actualización por defecto

Windows Update

Windows Update

Software Update

Software Update

up2date

YasT

Fuentes

Fuentes

pkgadd

replica/pull

 

 

 

  Aspectos gráficos

Entorno gráfico¹

Basado en el kernel

Basado en el kernel

Basado en el kernel (Quartz)

Basado en el kernel

Aplicación: X Window System

Aplicación: X Window System

Aplicación: X Window System

Aplicación: X Window System

Aplicación: X Window System

Aplicación: rio

 

 

 

Sistema de ventanas por defecto

Standard Windows

Standard Windows

OS X Finder

Macintosh Finder

GNOME

KDE

 ?

N/A

CDE o GNOME

rio

 

 

 

Estilo de Interfaz gráfica de usuario

Estilo Luna

Estilo clásico interface

Aqua

Platinum

Metacity con tema Bluecurve

kwin con tema plastik

 ?

fvwm

dtwm (con CDE), Metacity con GNOME

rio

 

 

 

Nota.

El entorno gráfico puede estar basado en el kernel o ser una aplicación ejecutada por el usuario.

 

 

 

 

 

 

 

Planificador.

El planificador es un componente funcional muy importante de los sistemas operativos multitarea y multiproceso y es esencial en los sistemas operativos de tiempo real. Su función consiste en repartir el tiempo disponible de un microprocesador entre todos los procesos que están disponibles para su ejecución.

Motivación.

Todo sistema operativo gestiona los programas mediante el concepto de proceso. En un instante dado, en el ordenador pueden existir diversos procesos listos para ser ejecutados. Sin embargo, solamente uno de ellos puede ser ejecutado (en cada microprocesador). De ahí la necesidad de que una parte del sistema operativo gestione, de una manera equitativa, que proceso debe ejecutarse en cada momento.

Cómo funciona.

Supóngase un ordenador que contiene un único microprocesador. Dicho microprocesador solamente puede ejecutar un programa en cada instante de tiempo. Además, cuando un programa está ejecutandose, nunca dejará de hacerlo por sí mismo. De manera que, en principio, cualquier programa monopoliza el microprocesador impidiendo que otros programas se ejecuten.

Por ello, la primera misión de un planificador es expulsar el programa en ejecución cuando decida que es pertinente. Esto se consigue de dos maneras, siempre con ayuda del propio hardware:

·      Cuando expira un temporizador, que se activa a intervalos regulares de tiempo. En intervalos muy cortos, generalmente cada 250 milisegundos.

·      Cuando el programa solicita una operación de entrada/salida. Dado que el programa no puede continuar hasta que termine dicha operación, es un buen momento para ejecutar otro programa.

En ambos casos, el control del microprocesador pasa a manos del planificador gracias a que el hardware genera una interrupción. En este proceso de expulsión, se salva el estado de ejecución del programa (programa y su estado se denomina proceso).

A continuación, el planificador decide cúal será el siguiente proceso en ejecutarse. Naturalmente, solamente se escogen procesos que estén listos para hacerlo. Si un proceso sigue esperando por una operación de entrada/salida no será candidato a ejecutarse hasta que finalice tal operación.

La selección del proceso sigue alguna política de planificación prestablecida. Una vez seleccionado un proceso, se procede a ejecutarlo. Para ello, el planificador restaura su estado de ejecución (previamente salvado) y abandona el uso del microprocesador cediéndoselo a dicho proceso.

Todo esto apenas dura unos pocos milisegundos.

Gracias a que el tiempo del microprocesador se reparte entre todos los procesos a intervalos muy cortos, el ordenador ofrece la sensación de que todos los procesos están ejecutandose a la vez.

Cuando un ordenador tiene varios microprocesadores (véase arquitecura NUMA y SMP), este esquema se repite para cada microprocesador.

Tiempo real.

Un sistema operativo en tiempo real se caracteriza por garantizar que todo programa se ejecutará en un límite máximo de tiempo. El planificador debe comportarse de manera que esto sea cierto para cualquier proceso.

En estos casos, la finalidad del planificador es balancear o equilibrar la carga del procesador, impidiendo que un proceso monopolice el procesador o que sea privado de los recursos de la máquina. En entornos de tiempo real, como los dispositivos para el control automático en la industria (por ejemplo, robots), el planificador también impide que los procesos se paren o interrumpan a otros que esperan que se realicen ciertas acciones. Su labor resulta imprescindible para mantener el sistema estable y funcionando.

Niveles de planificación.

En los sistemas operativos de propósito general, existen dos tipos de planificador. El planificador a corto plazo es el que se ha descrito aquí, siendo también el más importante. En inglés, se denomina scheduler. Pero también existe un planificador a largo plazo (en inglés, planner) relacionados con aquellos procesos que no se encuentran inmediatamente en memoria principal (véase memoria virtual). Su misión es mover procesos entre memoria principal y disco (lo que se conoce como swapping).

Estos dos planificadores son habituales en sistemas operativos multi-hilo, donde cada proceso puede constar de varios hilos. Se supone que cada hilo debe ejecutarse concurrentemente con los demás hilos de su propio proceso y de otros procesos. Así, el planificador a corto plazo se preocupa de los hilos, mientras que el planificador a largo plazo se preocupa de los procesos.

Políticas de planificación.

A continuación se enumeran diversas políticas de planificación. Lo habitual es utilizar políticas mixtas. Generalmente, el planificador a corto plazo utiliza round-robin, mientras que el planificador a largo plazo utiliza varias colas FIFO. Cada una de estas colas corresponde a una prioridad diferente.

·      Planificación Round-robin.

·      Round-robin con pesos.

·      Prioridades monótonas en frecuencia (RMS (Rate-monotonic scheduling))

·      Menor tiempo de respuesta primero (EDF (Earliest deadline first scheduling))

·      FIFO.

·      LIFO.

Compilador.

Diagrama a bloques de la operación de un buen compilador.

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. Este proceso de traducción se conoce como compilación.

En un compilador hay que distinguir tres lenguajes diferentes tales como:

·      el de los programas de partida (LA).

·      el de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina.

·      el lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a LA. Aumenta la portabilidad del compilador si está escrito en el mismo lenguaje, es decir, se puede compilar a sí mismo.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más flexibles como entornos de programación y depuración.

Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito.

Partes de un compilador.

Normalmente los compiladores están divididos en dos partes:

·      Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar.

·      Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.

Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para la generación de código máquina en varias plataformas distintas.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker).

Tipos de compiladores.

Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:

·      Compiladores cruzados: generan código para un sistema distinto del que están funcionando.

·      Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.

·      Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.

·      Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.

·      Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Pauta de creación de un compilador== En las primeras épocas de la informática, el software de los compiladores era considerado como uno de los más complejos existentes.

Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador.

Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal barata dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.

Software libre.

Este artículo se refiere al término free software, tal y como está definido por la Free Software Foundation. El término inglés free es ambiguo, y puede refererirse tanto a la libertad (free speech, libertad de expresión) como a la gratuidad (free beer, cerveza gratis). En español no existe tal ambigüedad, distinguiéndose claramente el software libre (objeto del presente artículo) del software gratis o software gratuito. Para este segundo caso, véase Freeware.

Software libre es el software que, una vez obtenido, puede ser usado, copiado, estudiado, modificado y redistribuido libremente. El software libre suele estar disponible gratuitamente en Internet, o a precio del coste de la distribución a través de otros medios; sin embargo no es obligatorio que sea así y, aunque conserve su carácter de libre, puede ser vendido comercialmente. Análogamente, el software gratuito (denominado usualmente Freeware) incluye en algunas ocasiones el código fuente; sin embargo, este tipo de software no es libre en el mismo sentido que el software libre, al menos que se garanticen los derechos de modificación y redistribución de dichas versiones modificadas del programa.

Historia.

Entre los años 60´s y 70´s del Siglo XX, el software no era considerado un producto sino un añadido que los vendedores de los grandes computadores de la época (los mainframes) aportaban a sus clientes para que éstos pudieran usarlos. En dicha cultura, era común que los programadores y desarrolladores de software compartieran libremente sus programas unos con otros. Este comportamiento era particularmente habitual en algunos de los mayores grupos de usuarios de la época, como DECUS (grupo de usuarios de computadoras DEC). A finales de los 70, las compañías iniciaron el hábito de imponer restricciones a los usuarios, con el uso de acuerdos de licencia.

En 1984, Richard Stallman comenzó a trabajar en el proyecto GNU, y un año más tarde fundó la Free Software Foundation (FSF). Stallman introdujo una definición para free software y el concepto de "copyleft", el cual desarrolló para dar a los usuarios libertad y para restringir las posibilidades de apropiación del software.

Libertades del Software Libre.

De acuerdo con tal definición, el software es "libre" si garantiza las siguientes libertades:

·      "libertad 0", ejecutar el programa con cualquier propósito (privado, educativo, público, comercial, etc.).

·      "libertad 1", estudiar y modificar el programa (para lo cuál es necesario poder acceder al código fuente).

·      "libertad 2", copiar el programa de manera que se pueda ayudar al vecino o a cualquiera.

·      "libertad 3", mejorar el programa, y hacer públicas las mejoras, de forma que se beneficie toda la comunidad.

Es importante señalar que las libertades 1 y 3 obligan a que se tenga acceso al código fuente. La "libertad 2" hace referencia a la libertad de modificar y redistribuir el software libremente licenciado bajo algún tipo de licencia de software libre que beneficie a la comunidad.

Ciertos teóricos usan este punto cuarto (libertad 3) para justificar parcialmente las limitaciones impuestas por la licencia GNU GPL frente a otras licencias de software libre, sin embargo el sentido original es más libre, abierto y menos restrictivo que el que le otorga la propia GNU GPL.

La licencia GNU GPL posibilita la modificación, redistribución del software, pero unicamente bajo esa misma licencia. Y añade, que si se reutiliza en un mismo programa código "A" licenciado bajo licencia GNU GPL y código "B" licenciado bajo otro tipo de licencia libre, el código final "C", independientemente de la cantidad y calidad de cada codigo "A" y "B" debe de estar bajo la licencia GNU GPL.

En la práctica esto hace que las licencias de software libre se dividan en dos grandes grupos, aquellas que pueden ser mezcladas con código licenciado bajo GNU GPL (y que inevitablemente desaparecerán en el proceso, al ser el código resultante licenciado bajo GNU GPL) y las que no lo permiten al incluir mayores u otros requisitos que no contempla ni admite la GNU GPL y que por lo tanto no puede ser enlazadas ni mezcladas con código gobernado por la licencia GNU GPL.

Esta situación de incompatibilidad, que podría ser resuelta en la próxima versión 3.0 de la licencia GNU GPL (en desarrollo), causa en estos momentos graves prejuicios a la comunidad de programadores de software libre, que muchas veces no pueden reutilizar o mezclar códigos de dos licencias distintas, pese a que las libertades teóricamente lo deberían permitir.

En el sitio web de la FSF hay una lista de licencias que cumplen las condiciones impuestas por la GNU GPL y otras que no.

En el sitio web de la OSI está la lista completa de las licencias de software libre actualmente aprobadas y tenidas como tales.

El término software no libre se emplea para referirse al software distribuido bajo una licencia de software más restrictiva que no garantiza estas cuatro libertades. Las leyes de la propiedad intelectual reservan la mayoría de los derechos de modificación, duplicación y redistribución para el dueño del copyright; el software dispuesto bajo una licencia de software libre rescinde específicamente la mayoría de estos derechos reservados.

La definición de software libre no contempla el asunto del precio; un eslogan frecuentemente usado es "libre como en libertad de expresión no como en cerveza gratis" (aludiendo a la ambigüedad del término inglés "free"), y es habitual ver a la venta CDs de software libre como distribuciones GNU/Linux. Sin embargo, en esta situación, el comprador del CD tiene el derecho de copiarlo y redistribuirlo. El software gratis pude incluir restricciones que no se adaptan a la definición de software libre —por ejemplo, puede no incluir el código fuente, puede prohibir explícitamente a los distribuidores recibir una compensación a cambio, etc.

Para evitar la confusión, alguna gente utiliza los términos "libre" (Libre software) y "gratis" (Gratis software) para evitar la ambigüedad de la palabra inglesa "free". Sin embargo, estos términos alternativos son usados únicamente dentro del movimiento del software libre, aunque están extendiendose lentamente hacia el resto del mundo. Otros defienden el uso del término open source software (software de código abierto, también llamado de fuentes abiertas). La principal diferencia entre los términos "open source" y "free software" es que éste último tiene en cuenta los aspectos éticos y filosóficos de la libertad, mientras que el "open source" se basa únicamente en los aspectos técnicos.

Tipos de Licencias.

Existen distintas variantes del concepto de software libre o grupos de licencias, por ejemplo:

·      Las libertades definidas anteriormente están protegidas por licencias de software libre, de las cuales una de las más utilizadas es la Licencia Pública General GNU (GPL). El autor conserva los derechos de autor (copyright), y permite la redistribución y modificación bajo términos diseñados para asegurarse de que todas las versiones modificadas del software permanecen bajo los términos más restrictivos de la propia GNU GPL. Esto hace que no sea imposible crear un producto con partes no licenciadas GPL: el conjunto tiene que ser GPL.

·      Software bajo el dominio público, sobre el cual el autor ha abandonado sus derechos de autor. El software bajo el dominio público, puesto que carece de protección de copyright alguna, puede ser incorporado libremente tanto en software libre como no libre.

·      Licencias estilo BSD, llamadas así porque se utilizan en gran cantidad de software distribuido junto a los sistemas operativos BSD. El autor, bajo tales licencias, mantiene la protección de copyright únicamente para la renuncia de garantía y para requerir la adecuada atribución de la autoría en trabajos derivados, pero permite la libre redistribución y modificación, incluso si dichos trabajos tienen propietario. Son muy permisivas, tanto que son fácilmente absorbidas al ser mezcladas con la licencia GNU GPL con quienes son compatibles.

Puede argumentarse que esta licencia asegura “verdadero” software libre, en el sentido que el usuario tiene libertad ilimitada con respecto al software, y que puede decidir incluso redistribuirlo como no libre. Otras opiniones están orientadas a destacar que este tipo de licencia no contribuye al desarrollo de más software libre.

·      Licencias estilo MPL y derivadas, Esta licencia es de Software Libre y tiene un gran valor porque fue el instrumento que empleó Netscape Communications Corp. para liberar su Netscape Communicator 4.0 y empezar ese proyecto tan importante para el mundo del Software Libre: Mozilla. Se utilizan en gran cantidad de productos de software libre de uso cotidiano en todo tipo de sistemas operativos. La MPL es Software Libre y promueve eficazmente la colaboración evitando el efecto "viral" de la GPL (si usas código licenciado GPL, tu desarrollo final tiene que estar licenciado GPL). Desde un punto de vista del desarrollador la GPL presenta un inconveniente en este punto, y lamentablemente mucha gente se cierra en banda ante el uso de dicho código. No obstante la MPL no es tan excesivamente permisiva como las licencias tipo BSD. Estas licencias son denominadas de copyleft debil. La NPL (luego la MPL) fue la primera licencia nueva después de muchos años, que se encargaba de algunos puntos que no fueron tenidos en cuenta por las licencias BSD y GNU. En el espectro de las licencias de software libre se la puede considerar adyacente a la licencia estilo BSD, pero perfeccionada.

Hay que hacer constar que el titular de los derechos de autor (copyright) de un software bajo licencia copyleft puede también realizar una versión modificada bajo su copyright original, y venderla bajo cualquier licencia que desee, además de distribuir la versión original como software libre. Esta técnica ha sido usada como un modelo de negocio por una serie de empresas que realizan software libre (por ejemplo MySQL); esta práctica no restringe ninguno de los derechos otorgados a los usuarios de la versión copyleft. También podría retirar todas las licencias de software libre anteriormente otorgadas, pero esto obligaría a una indemnización a los usuarios de las mismas, y en todo caso no está claro que pasaría con los productos derivados.

Ejemplos y evolución.

Existe una gran cantidad de software, cada vez mayor, disponible bajo licencias de software libre. Los observadores (y adeptos) a menudo interpretan este fenómeno como el movimiento del software libre. Algunos proyectos notables de software libre incluyen los kernel de los sistemas operativos GNU-Linux y BSD, los compiladores GCC, el depurador GDB y las bibliotecas de C, el servidor de nombres BIND, el servidor de transporte de correo Sendmail, el Servidor web Apache, los sistemas de base de datos relacional MySQL y PostgreSQL, los lenguajes de programación Perl, Python, Tcl y PHP, el sistema X Window, los entornos de escritorio GNOME y KDE, la suite de ofimática OpenOffice.org, el navegador Mozilla, el servidor de ficheros Samba, y el editor de gráficos GIMP.

Los paquetes de software libre constituyen un ecosistema software donde diferentes piezas de software pueden proporcionar servicios a otras, llevando a la co-evolución de características. Por mostrar un ejemplo sencillo, el lenguaje de programación Python proporciona soporte para el protocolo HTTP, y el servidor web Apache que proporciona el protocolo HTTP puede llamar al lenguaje de programación Python para servir contenido dinámico.

El Proyecto Debian, que produce un sistema operativo compuesto enteramente de software libre, ha creado una serie de directrices que se usan para evaluar la compatibilidad de una licencia con el objetivo de libertad de Debian. Las Directrices de Software Libre de Debian se usan para discernir el software libre del no-libre. Para 2003, Debian había recolectado más de siete mil quinientos paquetes de software que cumplían con las citadas directrices.

Los desarrolladores de Debian argumentan que los mismos principios deberían aplicarse no sólo a los programas, sino también a la documentación libre. Muchos documentos escritos por el Proyecto de Documentación de Linux, y muchos documentos licenciados bajo la Licencia de Documentación Libre de GNU (los documentos con secciones invariantes) no se ajustan a todas las directrices citadas arriba.

Comparación con el software Open Source.

Aunque en la práctica el software Open Source y el software libre comparten las mismas licencias, la FSF opina que el movimiento Open Source es filosóficamente diferente del movimiento del software libre. Apareció en 1998 con un grupo de personas, entre los que cabe destacar a Eric S. Raymond y Bruce Perens, que formaron la Open Source Initiative (OSI). Buscaban (1) darle mayor relevancia a los beneficios prácticos del compartir el código fuente, y (2) interesar a las principales casas de software y otras empresas de la industria de la alta tecnología en el concepto. Estos defensores ven que el término open source evita la ambigüedad del termino Inglés free en free software. El término "open source" fue acuñado por Christine Peterson del think tank Foresight Institute, y se registró para actuar como marca registrada para los productos de software libre.

Mucha gente reconoce el beneficio cualitativo del proceso de desarrollo de software cuando los desarrolladores pueden usar, modificar y redistribuir el código fuente de un programa. El movimiento del software libre hace especial énfasis en los aspectos morales o éticos del software, viendo la excelencia técnica como un producto secundario deseable de su estándar ético. El movimiento Open Source ve la excelencia técnica como el objetivo prioritario, siendo la compartición del código fuente un medio para dicho fin. Por dicho motivo, la FSF se distancia tanto del movimiento Open Source como del término "Open Source".

Puesto que la OSI sólo aprueba las licencias que se ajustan a la OSD (Open Source Definition), la mayoría de la gente lo interpreta como un esquema de distribución, e intercambia libremente "open source" con "software libre". Aun cuando existen importantes diferencias filosóficas entre ambos términos, especialmente en términos de las motivaciones para el desarrollo y el uso de tal software, raramente suelen tener impacto en el proceso de colaboración.

Aunque el término "Open Source" elimina la ambigüedad de Libertad frente a Precio (en el caso del Inglés), introduce una nueva: entre los programas que se ajustan a la Open Source Definition, que dan a los usuarios la libertad de mejorarlos, y los programas que simplemente tiene el código fuente disponible, posiblemente con fuertes restricciones sobre el uso de dicho código fuente. Mucha gente cree que cualquier software que tenga el código fuente disponible es open source, puesto que lo pueden manipular (un ejemplo de este tipo de software sería el popular paquete de software gratuito Graphviz, inicialmente no libre pero que incluía el codigo fuente, aunque luego AT&T le cambió la licencia). Sin embargo, mucho de este software no da a sus usuarios la libertad de distribuir sus modificaciones, restringe el uso comercial, o en general restringe los derechos de los usuarios.

Significación Política.

Una vez que un producto de software libre ha empezado a circular, rápidamente está disponible a un coste muy bajo o sin coste. Al mismo tiempo, su utilidad no decrece. Esto significa que el software libre se puede caracterizar como un bien público en lugar de un bien privado. Aunque realmente no lo es en ningún momento.

Puesto que el software libre permite el libre uso, modificación y redistribución, a menudo encuentra un hogar en los países del tercer mundo para los cuales el coste del software no libre es a veces prohibitivo. También es sencillo modificarlo localmente, lo que permite que sean posibles los esfuerzos de traducción a idiomas que no son necesariamente rentables comercialmente. Veáse también internacionalización.

La mayoría del software libre se produce por equipos internacionales que cooperan a través de la libre asociación. Los equipos están típicamente compuestos por individuos con una amplia variedad de motivaciones. Existen muchas posturas sobre la relación entre el software libre y el actual sistema económico capitalista:

·      Algunos consideran el software libre como un competidor del capitalismo, una forma de anarquismo práctico.

·      Algunos consideran el software libre como otra forma de competición en el mercado libre, y que el copyright es una restricción gubernamental sobre el mercado.

·      Algunos comparan el software libre a una economía del regalo, donde el valor de una persona está basado en lo que ésta da a los demás.

·      Grupos como Oekonux e Hipatia consideran que todo debería producirse de esta forma y que este modelo de producción no se limita a reemplazar el modelo no libre de desarrollo del software. La cooperación basada en la libre asociación puede usarse y se usa para otros propósitos (tales como escribir enciclopedias, por ejemplo).

Seguridad Relativa.

Existe una cierta controversia sobre la seguridad del software libre frente al software no libre (siendo uno de los mayores asuntos la seguridad mediante obscuridad). Un método usado de forma habitual para determinar la seguridad relativa de los productos es determinar cuántos fallos de seguridad no parcheados existen en cada uno de los productos involucrados. Por lo general los usuarios de este método recomiendan que cuando un producto no proporcione un método de parchear los fallos de seguridad, no se use dicho producto, al menos hasta que no esté disponible un arreglo.

A fecha de Diciembre de 2004 el sitio de seguridad Secunia cuenta cero fallos de seguridad no parcheados (no arreglados aún) para los productos software libre más usados para navegación de internet, productividad de oficina y e-mail -Mozilla Firefox, OpenOffice.org y Mozilla Thunderbird-, en comparación con los varios fallos de seguridad aún no corregidos para cada uno de los tres principales productos no libres equivalentes (hechos por Microsoft) - Internet Explorer, Microsoft Office y Outlook Express.

Código abierto.

Código abierto (open source en inglés) es el término por el que se conoce al software distribuido y desarrollado en una determinada forma. Este término empezó a utilizarse en 1998 por algunos usuarios de la comunidad del software libre, tratando de usarlo como reemplazo al ambiguo nombre original, en inglés, del software libre (free software).

"Free software" puede significar diferentes cosas (gratuidad y libertad). Por un lado, permite pensar en "software por el que no hay que pagar", y se adapta al término de forma igualmente válida que el significado que se pretende (software que posee ciertas libertades).

El término no resultó apropiado como reemplazo para el ya tradicional free software, pues eliminaba la idea de libertad (incluso hay quien usa --en inglés-- el término Libre Software para evitar la ambigüedad de free).

En la actualidad open source es utilizado para definir un movimiento nuevo de software (la Open Source Initiative), diferente al movimiento del Software Libre, aunque no completamente incompatible con este, de modo que es posible (como de hecho ocurre) que ambos movimientos trabajen juntos en el desarrollo práctico de proyectos.

El significado obvio del término "código abierto" es "se puede mirar el código fuente", lo cual es un criterio más débil y flexible que el del software libre; un programa de código abierto puede ser software libre, pero también puede serlo un programa semilibre o incluso uno completamente no libre.

El software de código abierto (OSS por sus siglas en inglés) es software para el que su código fuente está disponible públicamente, aunque los términos de licenciamiento específicos varían respecto a lo que se puede hacer con ese código fuente.