El software es una colección de instrucciones que le dicen a una computadora cómo trabajar. Esto contrasta con el hardware, a partir del cual se construye el sistema y realmente realiza el trabajo.
En el nivel de programación más bajo, el código ejecutable consta de instrucciones en lenguaje de máquina soportadas por un procesador individual , típicamente una unidad central de procesamiento (CPU) o una unidad de procesamiento de gráficos (GPU). El lenguaje de máquina consta de grupos de valores binarios que significan instrucciones del procesador que cambian el estado de la computadora desde su estado anterior. Por ejemplo, una instrucción puede cambiar el valor almacenado en una ubicación de almacenamiento particular en la computadora, un efecto que el usuario no puede observar directamente. Una instrucción también puede invocar una de las muchas operaciones de entrada o salida, por ejemplo, mostrar algún texto en la pantalla de una computadora; provocando cambios de estado que deberían ser visibles para el usuario. El procesador ejecuta las instrucciones en el orden en que se proporcionan, a menos que se le indique "saltar" a una instrucción diferente, o el sistema operativo lo interrumpa. A partir de 2015, la mayoría de las computadoras personales, los dispositivos de teléfonos inteligentes y los servidores tienen procesadores con múltiples unidades de ejecución o múltiples procesadores que realizan cálculos juntos, y la computación se ha convertido en una actividad mucho más concurrente que en el pasado.
La mayoría del software está escrito en lenguajes de programación de alto nivel. Son más fáciles y eficientes para los programadores porque están más cerca de los lenguajes naturales que de los lenguajes de máquina. Los lenguajes de alto nivel se traducen al lenguaje de máquina mediante un compilador o un intérprete o una combinación de ambos. El software también puede estar escrito en un lenguaje ensamblador de bajo nivel, que tiene una fuerte correspondencia con las instrucciones del lenguaje de máquina de la computadora y se traduce al lenguaje de máquina usando un ensamblador.
Ada Lovelace escribió un algoritmo para lo que habría sido la primera pieza de software en el siglo XIX, para el motor analítico planeado. Creó pruebas para mostrar cómo el motor calcularía los números de Bernoulli. Debido a las pruebas y el algoritmo, se la considera la primera programadora de computadoras.
La primera teoría sobre el software, antes de la creación de las computadoras como las conocemos hoy, fue propuesta por Alan Turing en su ensayo de 1935, Sobre números computables, con una aplicación al problema de Entscheidung (problema de decisión). Esto finalmente condujo a la creación de los campos académicos de la informática y la ingeniería de software; ambos campos estudian software y su creación. La informática es el estudio teórico de la informática y el software (el ensayo de Turing es un ejemplo de informática), mientras que la ingeniería de software es la aplicación de principios de ingeniería al desarrollo de software. Antes de 1946, el software aún no eran los programas almacenados en la memoria de las computadoras digitales con programas almacenados, como lo entendemos ahora; en su lugar, los primeros dispositivos informáticos electrónicos fueron recableados para "reprogramarlos".
En 2000, Fred Shapiro, bibliotecario de la Facultad de Derecho de Yale, publicó una carta en la que revelaba que el artículo de 1958 de John Wilder Tukey "The Teaching of Concrete Mathematics" contenía el uso más antiguo conocido del término "software" encontrado en una búsqueda de JSTOR. archivos electrónicos, dos años antes de la citación del OED. Esto llevó a muchos a dar crédito a Tukey por haber acuñado el término, particularmente en los obituarios publicados ese mismo año, aunque Tukey nunca reclamó el crédito por tal acuñación. En 1995, Paul Niquette afirmó que originalmente había acuñado el término en octubre de 1953, aunque no pudo encontrar ningún documento que respalde su afirmación. La primera publicación conocida del término "software" en un contexto de ingeniería fue en agosto de 1953 por Richard R. Carhart, en un Memorando de Investigación de Rand Corporation.
En prácticamente todas las plataformas informáticas, el software se puede agrupar en unas pocas categorías amplias.
Según el objetivo, el software de computadora se puede dividir en:
Las herramientas de programación también son software en forma de programas o aplicaciones que los desarrolladores utilizan para crear, depurar, mantener o dar soporte al software.
El software está escrito en uno o más lenguajes de programación; Existen muchos lenguajes de programación y cada uno tiene al menos una implementación, cada una de las cuales consta de su propio conjunto de herramientas de programación. Estas herramientas pueden ser programas relativamente independientes, como compiladores, depuradores, intérpretes, enlazadores y editores de texto, que se pueden combinar para realizar una tarea; o pueden formar un entorno de desarrollo integrado (IDE), que combina gran parte o la totalidad de la funcionalidad de dichas herramientas autónomas. Los IDE pueden hacer esto invocando las herramientas individuales relevantes o volviendo a implementar su funcionalidad de una manera nueva. Un IDE puede facilitar la realización de tareas específicas, como buscar archivos en un proyecto en particular. Muchas implementaciones de lenguajes de programación ofrecen la opción de utilizar tanto herramientas individuales como un IDE.
Las personas que usan computadoras modernas de propósito general (a diferencia de los sistemas integrados, computadoras analógicas y supercomputadoras ) generalmente ven tres capas de software que realizan una variedad de tareas: plataforma, aplicación y software de usuario.
El software de la computadora debe "cargarse" en el almacenamiento de la computadora (como el disco duro o la memoria ). Una vez que se ha cargado el software, la computadora puede ejecutar el software. Esto implica pasar instrucciones desde el software de la aplicación, a través del software del sistema, al hardware que finalmente recibe la instrucción como código de máquina. Cada instrucción hace que la computadora lleve a cabo una operación: mover datos, realizar un cálculo o alterar el flujo de control de las instrucciones.
El movimiento de datos suele ser de un lugar de la memoria a otro. A veces, implica mover datos entre la memoria y los registros, lo que permite el acceso a datos de alta velocidad en la CPU. Mover datos, especialmente grandes cantidades, puede resultar costoso; en ocasiones, esto se evita utilizando "punteros" a los datos. Los cálculos incluyen operaciones simples como incrementar el valor de un elemento de datos variable. Los cálculos más complejos pueden involucrar muchas operaciones y elementos de datos juntos.
La calidad del software es muy importante, especialmente para el software comercial y de sistemas. Si el software es defectuoso, puede eliminar el trabajo de una persona, bloquear la computadora y hacer otras cosas inesperadas. Las fallas y los errores se denominan " errores " que a menudo se descubren durante las pruebas alfa y beta. El software también es a menudo víctima de lo que se conoce como envejecimiento del software, la degradación progresiva del rendimiento resultante de una combinación de errores invisibles.
Muchos errores se descubren y solucionan mediante pruebas de software. Sin embargo, las pruebas de software rara vez, si es que alguna vez, eliminan todos los errores; algunos programadores dicen que "cada programa tiene al menos un error más" (Ley de Lubarsky). En el método en cascada de desarrollo de software, generalmente se emplean equipos de prueba separados, pero en enfoques más nuevos, denominados colectivamente desarrollo de software ágil, los desarrolladores a menudo hacen todas sus propias pruebas y demuestran el software a los usuarios / clientes con regularidad para obtener comentarios. El software se puede probar mediante pruebas unitarias, pruebas de regresión y otros métodos, que se realizan de forma manual o, más comúnmente, de forma automática, ya que la cantidad de código a probar puede ser grande. Los programas que contienen software de comando permiten que la ingeniería de hardware y las operaciones del sistema funcionen mucho más fácilmente juntas.
La licencia del software otorga al usuario el derecho a utilizar el software en el entorno con licencia y, en el caso de las licencias de software libre, también otorga otros derechos, como el derecho a realizar copias.
El software propietario se puede dividir en dos tipos:
El software de código abierto viene con una licencia de software libre, que otorga al destinatario los derechos para modificar y redistribuir el software.
Teóricamente, se supone que las patentes de software, como otros tipos de patentes, otorgan al inventor una licencia exclusiva y por tiempo limitado para una idea detallada (por ejemplo, un algoritmo) sobre cómo implementar una pieza de software o un componente de una pieza de software. Las ideas de cosas útiles que el software podría hacer y los requisitos del usuario no deben ser patentables, y las implementaciones concretas (es decir, los paquetes de software reales que implementan la patente) tampoco deben ser patentables; estas últimas ya están cubiertas por derechos de autor, en general. automáticamente. Por lo tanto, se supone que las patentes de software cubren el área intermedia, entre los requisitos y la implementación concreta. En algunos países, un requisito para que la invención reivindicada tenga un efecto en el mundo físico también puede ser parte de los requisitos para que una patente de software sea válida, aunque como todo software útil tiene efectos en el mundo físico, este requisito puede ser válido. abierto al debate. Mientras tanto, la ley de derechos de autor estadounidense se aplicó a varios aspectos de la escritura del código de software.
Las patentes de software son controvertidas en la industria del software y muchas personas tienen diferentes puntos de vista sobre ellas. Una de las fuentes de controversia es que la división antes mencionada entre las ideas iniciales y la patente no parece ser respetada en la práctica por los abogados de patentes, por ejemplo, la patente para la programación orientada a aspectos (AOP), que pretendía reclamar derechos sobre cualquier herramienta de programación. implementar la idea de AOP, independientemente de cómo se implemente. Otra fuente de controversia es el efecto sobre la innovación, con muchos expertos y empresas distinguidos que argumentan que el software es un campo en movimiento tan rápido que las patentes de software simplemente crean enormes costos y riesgos adicionales de litigio y, de hecho, retrasan la innovación. En el caso de los debates sobre patentes de software fuera de los Estados Unidos, se ha argumentado que es probable que las grandes corporaciones estadounidenses y los abogados de patentes sean los principales beneficiarios de permitir o seguir permitiendo las patentes de software.
El diseño y la implementación del software varían según la complejidad del software. Por ejemplo, el diseño y la creación de Microsoft Word tomó mucho más tiempo que diseñar y desarrollar Microsoft Notepad porque este último tiene una funcionalidad mucho más básica.
El software generalmente se desarrolla en entornos de desarrollo integrados (IDE) como Eclipse, IntelliJ y Microsoft Visual Studio que pueden simplificar el proceso y compilar el software. Como se indica en una sección diferente, el software generalmente se crea sobre el software existente y la interfaz de programación de aplicaciones (API) que proporciona el software subyacente, como GTK +, JavaBeans o Swing. Las bibliotecas (API) se pueden clasificar según su propósito. Por ejemplo, Spring Framework se usa para implementar aplicaciones empresariales, la biblioteca de Windows Forms se usa para diseñar aplicaciones de interfaz gráfica de usuario (GUI) como Microsoft Word y Windows Communication Foundation se usa para diseñar servicios web. Cuando se diseña un programa, se basa en la API. Por ejemplo, una aplicación de escritorio de Microsoft Windows puede llamar a funciones API en la biblioteca de .NET Windows Forms como Form1.Close () y Form1.Show () para cerrar o abrir la aplicación. Sin estas API, el programador debe escribir estas funcionalidades por sí mismo. Empresas como Oracle y Microsoft proporcionan sus propias API, por lo que muchas aplicaciones se escriben utilizando sus bibliotecas de software que, por lo general, tienen numerosas API.
Las estructuras de datos, como tablas hash, matrices y árboles binarios, y algoritmos como el ordenamiento rápido, pueden resultar útiles para crear software.
Los programas informáticos tienen características económicas especiales que hacen que su diseño, creación y distribución sean diferentes de la mayoría de los demás bienes económicos.
Una persona que crea software se llama programador, ingeniero de software o desarrollador de software, términos que tienen todos un significado similar. También existen términos más informales para programador, como "codificador" y "pirata informático", aunque el uso de esta última palabra puede causar confusión, porque se usa con más frecuencia para referirse a alguien que ingresa ilegalmente a los sistemas informáticos.