Software: Conceptos Fundamentales
- Conjunto de programas que el **hardware** puede ejecutar para la realización de las tareas de **computación** a las que se destina.
- Conjunto de **instrucciones** que permite la utilización de la **computadora** (PC, Estación de trabajo, Mainframe, etc.).
- Es la parte **intangible** de la computadora, es decir, **sistemas operativos**, **aplicaciones**, **documentos**, etc.
Tipos de Software: Libre, Propietario y Abierto
Software Libre
- Un **software** será **libre** cuando permita a los usuarios que adquirieron el producto **ejecutarlo**, **copiarlo**, **estudiarlo**, **distribuirlo** e incluso **modificarlo**.
- **Libre** no significa **gratuito**; no es una cuestión de precio, sino de **libertad**.
Un software libre garantiza las siguientes **libertades**:
- La libertad de **usar** el programa, con cualquier propósito.
- La libertad de **estudiar** cómo funciona el programa y adaptarlo a sus necesidades.
- La libertad de **distribuir** copias, con lo que puedes ayudar a otra persona.
- La libertad de **mejorar** el programa y hacer públicas las mejoras a los demás, de modo que toda la comunidad se beneficie.
Para hacer efectivas estas libertades, se debe poder acceder al **código fuente**.
Código Fuente
Conjunto de líneas de texto que son las **instrucciones** que debe seguir la computadora para ejecutar un programa.
En él está **descrito** por completo el aspecto y funcionamiento del programa.
Es el resultado del trabajo mental del **programador** junto con la **sintaxis** del **lenguaje de programación** que esté utilizando.
Luego que el programador lo escribe, debe ser traducido al **lenguaje máquina** (**código binario**). Estas traducciones las realizan los llamados **compiladores**, **ensambladores**, **intérpretes** y otros **sistemas de traducción**.
Analogía del Código Fuente
El **software** es como las **recetas de cocina**: tienes apuntada en un papel una receta, haces el plato (muy bueno) y se lo das a probar a alguien. Para que esa persona pueda hacer el mismo plato, le debes dar la receta; con el sabor del plato no es suficiente.
En el campo del software, existe el **código fuente** (la receta) y el **programa** (el plato cocinado). Para poder modificar el programa (el plato cocinado) o hacerlo con tus propios medios (ingredientes), alguien te ha tenido que dar el código fuente (la receta).
Tipos de Software Libre
- **Software de dominio público**: significa que no está protegido por el **Copyright***; por lo tanto, podrían generarse versiones no libres del mismo.
- **Software libre protegido con Copyleft***: impide a los redistribuidores incluir algún tipo de restricción a las libertades propias del software así concebido, es decir, garantiza que las modificaciones seguirán siendo software libre (**Código Abierto**).
* **Copyright**: Solamente su autor puede utilizar, modificar y distribuir su contenido.
* **Copyleft**: Licencia que permite la libre distribución de copias y versiones modificadas, exigiendo que los mismos derechos sean preservados.
Software Abierto
Diferencias con el Software Libre
- La idea del **código abierto** se centra en la premisa de que, al compartir el código, el programa resultante tiende a ser de **calidad superior** al **software propietario**. Se enfoca en cómo «mejorar» el software, en un sentido meramente práctico.
- El **software libre** no busca ser práctico a nivel de desarrollo (cosa que también consigue), sino que tiene que ver con la **moral** y la **ética**: defiende un derecho fundamental, la **libertad**.
- Ambos movimientos comparten que el software debe ser libremente **modificable** y **distribuible**, con o sin cambios o mejoras. Sin embargo, el **código abierto** marca la diferencia en que, si bien el código debe ser también accesible, pueden existir **restricciones** sobre su uso o modificación.
Software Propietario
- Es el **software no libre**, también llamado **privativo** o **privado**.
- Se refiere a cualquier **programa informático** en el que los usuarios tienen **limitadas** las posibilidades de **usarlo**, **modificarlo** o **redistribuirlo**, o que su **código fuente** no está disponible o el acceso a este se encuentra restringido.
- En el **software no libre**, una persona física o jurídica posee los **derechos de autor** sobre un software, negando o no otorgando los derechos de usar el programa con cualquier propósito. Es decir, se le permite a un **desarrollador** o **empresa** controlar a sus usuarios.
- **Windows** y **Mac OS** son los mejores ejemplos de software propietario.
Sintetizando Diferencias
Clasificación del Software por su Fin
El software también puede clasificarse de acuerdo a su fin:
Software de Sistema (o Base)
- Vienen incorporados o **preinstalados** con la computadora.
- Es **esencial** para la computadora; sin él, no podría funcionar.
- Le otorgan al usuario una **interfaz**.
- Es el software que nos permite tener una **interacción** con nuestro **hardware**.
- Da **soporte** a los demás programas.
Software de Aplicación
- Permiten al usuario realizar una **tarea específica**. Por ejemplo, si quieres dibujar, utilizas un **graficador**; si quieres escribir, utilizas un **procesador de texto**; si quieres realizar unas cuentas numéricas, utilizas una **planilla de cálculo**, etc.
Software de Programación
- Son las **herramientas** que el **programador** utiliza para desarrollar **programas informáticos**. Para ello, se vale de distintos **lenguajes de programación**.
Algunos ejemplos:
- Editores de texto
- Compiladores
- Intérpretes
- Enlazadores
- Depuradores
- Entorno de desarrollo integrado (IDE)
El Proceso de Compilación: Del Código Fuente al Código Máquina
Un programa escrito en un **lenguaje de alto nivel** (**código fuente**) no puede ser ejecutado directamente por la computadora, sino que debe ser traducido a **lenguaje máquina**.
Las etapas por las que debe pasar un programa escrito en un **lenguaje de programación** hasta poder ser ejecutable son:
- **Programa fuente**: Programa escrito en un **lenguaje de alto nivel**.
- **Compilador**: Programa encargado de traducir los **programas fuente** a **lenguaje máquina** y de comprobar que las llamadas a las **funciones de librería** se realizan correctamente.
- **Programa (o código) objeto**: Es el programa fuente traducido (por el compilador) a **código máquina**. Aún no es directamente ejecutable.
- **Programa Ejecutable**: Traducción completa a **código máquina** (realizada por el **enlazador**) del programa fuente y que ya es directamente ejecutable.
**Enlazador**: Programa encargado de insertar al **programa objeto** el **código máquina** de las funciones de las **librerías** (**archivos de biblioteca**) usadas en el programa y realizar el proceso de montaje, que producirá un **programa ejecutable** (.exe).
Las **librerías** son una colección de código (**funciones**) ya programado y traducido a **código máquina**, listo para utilizar en un programa y que facilita la labor del **programador**.
- Como cada **lenguaje de programación** tiene unas reglas especiales (**sintaxis**), debe existir un **compilador específico** para cada lenguaje de programación.
- Si el **programa fuente** es sintácticamente correcto, el **compilador** generará el **código objeto**; en caso contrario, mostrará una lista con los **errores** encontrados, no generándose ningún programa objeto, para que procedamos a su **depuración**.
Un **depurador** es un programa diseñado específicamente para la **detección**, **verificación** y **corrección de errores**.
Los **depuradores** nos permiten **trazar** el programa (ejecutarlo sentencia a sentencia) y **visualizar** el contenido de las **variables** y **direcciones de memoria** durante la ejecución del programa. Además, permiten **alterar el flujo de ejecución** del mismo, **cambiar los valores de las variables** e introducir **puntos de parada**.
Pasos para la Elaboración y Ejecución de un Programa
- Escribir el **código fuente** en el **editor**.
- Compilar el **fichero fuente**.
- Si se producen **errores de sintaxis**, volver al editor y corregirlos.
- Si no hay errores, se obtendrá el **código objeto** y el **enlazador** construirá el **archivo ejecutable**.
- Una vez tengamos el **archivo ejecutable**, será el **sistema operativo** el encargado de colocar el programa en la **memoria central** y ejecutarlo.
- Comprobar el **funcionamiento del programa**.
- Si se detectan **errores** o un **mal funcionamiento** del programa, activar el **depurador** para trazar el programa y ejecutarlo sentencia a sentencia.
- Una vez que hayamos encontrado la causa del **error**, volveremos al editor y lo corregimos.
- El proceso de **compilar**, **enlazar** y **ejecutar** el programa lo repetiremos hasta que no se produzcan errores.
