La programación o codificación de computadoras es la composición de secuencias de instrucciones, llamadas programas , que las computadoras pueden seguir para realizar tareas. [1] [2] Implica diseñar e implementar algoritmos , especificaciones de procedimientos paso a paso, mediante la escritura de código en uno o más lenguajes de programación . Los programadores suelen utilizar lenguajes de programación de alto nivel que son más fácilmente inteligibles para los humanos que el código de máquina , que es ejecutado directamente por la unidad central de procesamiento . La programación competente generalmente requiere experiencia en varios temas diferentes, incluido el conocimiento del dominio de la aplicación , detalles de los lenguajes de programación y bibliotecas de códigos genéricos , algoritmos especializados y lógica formal .
Las tareas auxiliares que acompañan y están relacionadas con la programación incluyen el análisis de requisitos , pruebas , depuración (investigación y solución de problemas), implementación de sistemas de compilación y gestión de artefactos derivados , como el código de máquina de los programas . Si bien a veces se los considera programación, a menudo el término desarrollo de software se utiliza para este proceso general más amplio, con los términos programación , implementación y codificación reservados para la escritura y edición de código per se. En ocasiones, el desarrollo de software se conoce como ingeniería de software , especialmente cuando emplea métodos formales o sigue un proceso de diseño de ingeniería .
Los dispositivos programables existen desde hace siglos. Ya en el siglo IX, los hermanos persas Banu Musa inventaron un secuenciador de música programable , quienes describieron un flautista mecánico automatizado en el Libro de los dispositivos ingeniosos . [3] [4] En 1206, el ingeniero árabe Al-Jazari inventó una caja de ritmos programable donde se podía hacer que un autómata mecánico musical tocara diferentes ritmos y patrones de batería, a través de clavijas y levas . [5] [6] En 1801, el telar de Jacquard podía producir tejidos completamente diferentes cambiando el "programa": una serie de tarjetas de cartón con agujeros perforados.
Los algoritmos para descifrar códigos también existen desde hace siglos. En el siglo IX, el matemático árabe Al-Kindi describió un algoritmo criptográfico para descifrar códigos cifrados en Un manuscrito sobre el descifrado de mensajes criptográficos . Dio la primera descripción del criptoanálisis mediante análisis de frecuencia , el primer algoritmo de descifrado de códigos. [7]
El primer programa informático se fecha generalmente en 1843, cuando la matemática Ada Lovelace publicó un algoritmo para calcular una secuencia de números de Bernoulli , destinado a ser realizado por la máquina analítica de Charles Babbage . [8] Sin embargo, el propio Charles Babbage escribió su primer programa para la AE en 1837. [9] [10]
En la década de 1880, Herman Hollerith inventó el concepto de almacenar datos en un formato legible por máquina. [11] Más tarde, un panel de control (tablero de enchufes) agregado a su Tabulador Tipo I de 1906 permitió programarlo para diferentes trabajos y, a fines de la década de 1940, los equipos de registro de unidades , como el IBM 602 y el IBM 604 , fueron programados mediante paneles de control. de manera similar, como lo fueron las primeras computadoras electrónicas . Sin embargo, con el concepto de computadora con programas almacenados introducido en 1949, tanto los programas como los datos se almacenaban y manipulaban de la misma manera en la memoria de la computadora . [12]
El código de máquina era el lenguaje de los primeros programas, escrito en el conjunto de instrucciones de la máquina en particular, a menudo en notación binaria . Pronto se desarrollaron lenguajes ensambladores que permitían al programador especificar instrucciones en formato de texto (por ejemplo, SUMAR X, TOTAL), con abreviaturas para cada código de operación y nombres significativos para especificar direcciones. Sin embargo, debido a que un lenguaje ensamblador es poco más que una notación diferente para un lenguaje de máquina, dos máquinas con diferentes conjuntos de instrucciones también tienen diferentes lenguajes ensambladores.
Los lenguajes de alto nivel hicieron que el proceso de desarrollo de un programa fuera más simple y comprensible, y menos vinculado al hardware subyacente . La primera herramienta relacionada con un compilador, el Sistema A-0 , fue desarrollada en 1952 [13] por Grace Hopper , quien también acuñó el término "compilador". [14] [15] FORTRAN , el primer lenguaje de alto nivel ampliamente utilizado que tiene una implementación funcional, apareció en 1957, [16] y pronto se desarrollaron muchos otros lenguajes, en particular, COBOL destinado al procesamiento de datos comerciales y Lisp. para la investigación informática.
Estos lenguajes compilados permiten al programador escribir programas en términos sintácticamente más ricos y más capaces de abstraer el código, lo que facilita la selección de distintos conjuntos de instrucciones de máquina mediante declaraciones de compilación y heurísticas . Los compiladores aprovecharon el poder de las computadoras para facilitar la programación [16] al permitir a los programadores especificar cálculos ingresando una fórmula usando notación infija .
La mayoría de los programas se introducían mediante tarjetas perforadas o cinta de papel . A finales de la década de 1960, los dispositivos de almacenamiento de datos y las terminales de computadora se volvieron lo suficientemente económicos como para que se pudieran crear programas tecleando directamente en las computadoras. También se desarrollaron editores de texto que permitían realizar cambios y correcciones mucho más fácilmente que con tarjetas perforadas .
Cualquiera que sea el enfoque del desarrollo, el programa final debe satisfacer algunas propiedades fundamentales. Entre las más importantes se encuentran las siguientes propiedades: [17] [18]
El uso de pruebas automatizadas y funciones de fitness puede ayudar a mantener algunos de los atributos antes mencionados. [20]
En programación informática, la legibilidad se refiere a la facilidad con la que un lector humano puede comprender el propósito, el flujo de control y el funcionamiento del código fuente . Afecta los aspectos de calidad mencionados anteriormente, incluida la portabilidad, la usabilidad y, lo más importante, la mantenibilidad.
La legibilidad es importante porque los programadores pasan la mayor parte de su tiempo leyendo, tratando de comprender, reutilizando y modificando el código fuente existente, en lugar de escribir código fuente nuevo. El código ilegible a menudo genera errores, ineficiencias y código duplicado . Un estudio encontró que unas pocas transformaciones simples de legibilidad acortaron el código y redujeron drásticamente el tiempo para comprenderlo. [21]
Seguir un estilo de programación coherente a menudo ayuda a la legibilidad. Sin embargo, la legibilidad es más que un simple estilo de programación. Muchos factores, que tienen poco o nada que ver con la capacidad de la computadora para compilar y ejecutar el código de manera eficiente, contribuyen a la legibilidad. [22] Algunos de estos factores incluyen:
Los aspectos de presentación de esto (como sangrías, saltos de línea, resaltado de color, etc.) a menudo los maneja el editor de código fuente , pero los aspectos de contenido reflejan el talento y las habilidades del programador.
También se han desarrollado varios lenguajes de programación visual con la intención de resolver problemas de legibilidad mediante la adopción de enfoques no tradicionales para la estructura y visualización del código. Los entornos de desarrollo integrados (IDE) tienen como objetivo integrar toda esa ayuda. Técnicas como la refactorización de código pueden mejorar la legibilidad.
El campo académico y la práctica de la ingeniería de la programación informática se ocupan en gran medida de descubrir e implementar los algoritmos más eficientes para una determinada clase de problemas. Para ello, los algoritmos se clasifican en órdenes utilizando la llamada notación Big O , que expresa el uso de recursos, como el tiempo de ejecución o el consumo de memoria, en términos del tamaño de una entrada. Los programadores expertos están familiarizados con una variedad de algoritmos bien establecidos y sus respectivas complejidades y utilizan este conocimiento para elegir los algoritmos que mejor se adapten a las circunstancias.
El primer paso en la mayoría de los procesos formales de desarrollo de software es el análisis de requisitos , seguido de pruebas para determinar el modelado de valor, la implementación y la eliminación de fallas (depuración). Existen muchos enfoques diferentes para cada una de esas tareas. Un enfoque popular para el análisis de requisitos es el análisis de casos de uso . Muchos programadores utilizan formas de desarrollo de software ágil en las que las distintas etapas del desarrollo de software formal están más integradas en ciclos cortos que duran unas pocas semanas en lugar de años. Existen muchos enfoques para el proceso de desarrollo de software.
Las técnicas de modelado populares incluyen análisis y diseño orientado a objetos ( OOAD ) y arquitectura basada en modelos ( MDA ). El Lenguaje Unificado de Modelado ( UML ) es una notación utilizada tanto para OOAD como para MDA.
Una técnica similar utilizada para el diseño de bases de datos es el modelado entidad-relación ( modelado ER ).
Las técnicas de implementación incluyen lenguajes imperativos ( orientados a objetos o procedimentales ), lenguajes funcionales y lenguajes lógicos .
Es muy difícil determinar cuáles son los lenguajes de programación modernos más populares. Los métodos para medir la popularidad del lenguaje de programación incluyen: contar la cantidad de anuncios de trabajo que mencionan el idioma, [23] la cantidad de libros vendidos y cursos que enseñan el idioma (esto sobreestima la importancia de los idiomas más nuevos) y estimaciones del número de líneas existentes. de código escrito en el lenguaje (esto subestima el número de usuarios de lenguajes comerciales como COBOL).
Algunos lenguajes son muy populares para tipos particulares de aplicaciones, mientras que otros se usan regularmente para escribir muchos tipos diferentes de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en los centros de datos corporativos [24] , a menudo en grandes computadoras centrales , Fortran en aplicaciones de ingeniería, lenguajes de secuencias de comandos en el desarrollo web y C en software integrado . Muchas aplicaciones utilizan una combinación de varios lenguajes en su construcción y uso. Los nuevos lenguajes generalmente se diseñan alrededor de la sintaxis de un lenguaje anterior con nueva funcionalidad agregada (por ejemplo, C++ agrega orientación a objetos a C, y Java agrega administración de memoria y código de bytes a C++, pero como resultado, pierde eficiencia y capacidad para lenguajes bajos). -manipulación de nivel).
La depuración es una tarea muy importante en el proceso de desarrollo de software ya que tener defectos en un programa puede tener consecuencias importantes para sus usuarios. Algunos lenguajes son más propensos a ciertos tipos de fallas porque su especificación no requiere que los compiladores realicen tantas comprobaciones como otros lenguajes. El uso de una herramienta de análisis de código estático puede ayudar a detectar algunos posibles problemas. Normalmente el primer paso en la depuración es intentar reproducir el problema. Esta puede ser una tarea no trivial, como ocurre, por ejemplo, con procesos paralelos o algunos errores de software inusuales. Además, el entorno de usuario específico y el historial de uso pueden dificultar la reproducción del problema.
Una vez reproducido el error, es posible que sea necesario simplificar la entrada del programa para facilitar la depuración. Por ejemplo, cuando un error en un compilador puede provocar que éste falle al analizar un archivo fuente de gran tamaño, una simplificación del caso de prueba que dé como resultado sólo unas pocas líneas del archivo fuente original puede ser suficiente para reproducir el mismo fallo. Se necesita prueba y error/divide y vencerás: el programador intentará eliminar algunas partes del caso de prueba original y comprobará si el problema persiste. Al depurar el problema en una GUI, el programador puede intentar omitir algunas interacciones del usuario de la descripción original del problema y verificar si las acciones restantes son suficientes para que aparezcan errores. Las secuencias de comandos y los puntos de interrupción también son parte de este proceso.
La depuración a menudo se realiza con IDE . También se utilizan depuradores independientes como GDB , que a menudo proporcionan un entorno menos visual y generalmente utilizan una línea de comando . Algunos editores de texto, como Emacs, permiten invocar GDB a través de ellos para proporcionar un entorno visual.
Los diferentes lenguajes de programación admiten diferentes estilos de programación (llamados paradigmas de programación ). La elección del idioma utilizado está sujeta a muchas consideraciones, como la política de la empresa, la idoneidad para la tarea, la disponibilidad de paquetes de terceros o las preferencias individuales. Lo ideal es seleccionar el lenguaje de programación más adecuado para la tarea en cuestión. Las ventajas y desventajas de este ideal implican encontrar suficientes programadores que conozcan el lenguaje para formar un equipo, la disponibilidad de compiladores para ese lenguaje y la eficiencia con la que se ejecutan los programas escritos en un lenguaje determinado. Los idiomas forman un espectro aproximado desde el "nivel bajo" al "nivel alto"; Los lenguajes de "bajo nivel" suelen estar más orientados a las máquinas y son más rápidos de ejecutar, mientras que los lenguajes de "alto nivel" son más abstractos y fáciles de usar, pero se ejecutan con menor rapidez. Generalmente es más fácil codificar en lenguajes de "alto nivel" que en lenguajes de "bajo nivel". Los lenguajes de programación son esenciales para el desarrollo de software. Son los componentes básicos de todo el software, desde las aplicaciones más simples hasta las más sofisticadas.
Allen Downey , en su libro Cómo pensar como un informático , escribe:
Muchos lenguajes informáticos proporcionan un mecanismo para llamar a funciones proporcionadas por bibliotecas compartidas . Siempre que las funciones de una biblioteca sigan las convenciones de tiempo de ejecución apropiadas (por ejemplo, método de paso de argumentos ), estas funciones pueden escribirse en cualquier otro lenguaje.
Los programadores informáticos son aquellos que escriben software de computadora. Sus trabajos suelen implicar:
Aunque la programación se ha presentado en los medios como un tema algo matemático, algunas investigaciones muestran que los buenos programadores tienen fuertes habilidades en los lenguajes humanos naturales y que aprender a codificar es similar a aprender un idioma extranjero . [26] [27]
Iniciativa informática busca eliminar barreras para la adopción de la nube en materia de seguridad, interoperabilidad, portabilidad y confiabilidad.
¿Se basa en... Fiabilidad Portabilidad? Compatibilidad