Programación de computadoras - Computer programming

La programación de computadoras es el proceso de diseñar y construir un programa de computadora ejecutable para lograr un resultado informático específico o para realizar una tarea específica. Programación implica tareas tales como: el análisis, la generación de algoritmos , de perfiles de precisión algoritmos y el consumo de recursos y la implementación de algoritmos en un elegido lenguaje de programación (comúnmente conocida como codificación ). El código fuente de un programa está escrito en uno o más lenguajes que son inteligibles para los programadores , en lugar de código de máquina , que es ejecutado directamente por la unidad central de procesamiento . El propósito de la programación es encontrar una secuencia de instrucciones que automatice el desempeño de una tarea (que puede ser tan compleja como un sistema operativo ) en una computadora , a menudo para resolver un problema dado. La programación competente, por lo tanto, a menudo requiere experiencia en varios temas diferentes, incluido el conocimiento del dominio de la aplicación , algoritmos especializados y lógica formal .

Las tareas que acompañan y están relacionadas con la programación incluyen: pruebas , depuración , mantenimiento del código fuente , implementación de sistemas de compilación y administración de artefactos derivados , como el código de máquina de programas de computadora. Estos pueden considerarse parte del proceso de programación, pero a menudo el término desarrollo de software se usa para este proceso más amplio con el término programación , implementación o codificación reservado para la escritura real de código. La ingeniería de software combina técnicas de ingeniería con prácticas de desarrollo de software. La ingeniería inversa es un proceso relacionado utilizado por diseñadores, analistas y programadores para comprender y recrear / volver a implementar.

Historia

Ada Lovelace , cuyas notas añadidas al final del artículo de Luigi Menabrea incluían el primer algoritmo diseñado para ser procesado por un motor analítico . A menudo se la reconoce como la primera programadora informática de la historia.

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 automático en el Libro de los dispositivos ingeniosos . 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 . En 1801, el telar 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 han existido durante siglos. En el siglo IX, el matemático árabe Al-Kindi describió un algoritmo criptográfico para descifrar código cifrado, en A Manuscript on Deciphering Cryptographic Messages . Dio la primera descripción del criptoanálisis por análisis de frecuencia , el primer algoritmo de descifrado de códigos.

El primer programa de computadora es generalmente fechado en 1843, cuando el matemático Ada Lovelace publicó un algoritmo para calcular una secuencia de números de Bernoulli , destinado a ser llevado a cabo por Charles Babbage 's máquina analítica .

Los datos y las instrucciones alguna vez se almacenaron en tarjetas perforadas externas , que se mantuvieron en orden y se organizaron en cubiertas de programas.

En la década de 1880, Herman Hollerith inventó el concepto de almacenar datos en forma legible por máquina. Más tarde, un panel de control (placa de conexión) agregado a su tabulador Tipo I de 1906 permitió que se programara para diferentes trabajos y, a fines de la década de 1940, los equipos de grabación de unidades , como el IBM 602 e IBM 604 , fueron programados por paneles de control de una manera similar. manera, como fueron las primeras computadoras electrónicas . Sin embargo, con el concepto de computadora con programa almacenado introducido en 1949, tanto los programas como los datos se almacenaron y manipularon de la misma manera en la memoria de la computadora .

Lenguaje de máquina

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 un formato de texto (por ejemplo, ADD 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 cualesquiera con diferentes conjuntos de instrucciones también tienen diferentes lenguajes ensambladores.

Panel de control cableado para una máquina de contabilidad IBM 402 .

Lenguajes del compilador

Los lenguajes de alto nivel hicieron que el proceso de desarrollo de un programa fuera más simple y comprensible, y menos ligado al hardware subyacente. La primera herramienta relacionada con el compilador, el sistema A-0 , fue desarrollada en 1952 por Grace Hopper , quien también acuñó el término "compilador". FORTRAN , el primer lenguaje de alto nivel ampliamente utilizado que tiene una implementación funcional, salió a la luz en 1957 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 conjuntos de instrucciones de máquina variables a través de declaraciones de compilación y heurísticas. Los compiladores aprovecharon el poder de las computadoras para facilitar la programación al permitir a los programadores especificar cálculos ingresando una fórmula usando notación infija .

Entrada de código fuente

La mayoría de los programas todavía se ingresaban utilizando tarjetas perforadas o cinta de papel . A fines 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 crear programas escribiendo directamente en las computadoras. También se desarrollaron editores de texto que permitieron realizar cambios y correcciones mucho más fácilmente que con las tarjetas perforadas.

Programación moderna

Requerimientos de calidad

Cualquiera que sea el enfoque del desarrollo, el programa final debe satisfacer algunas propiedades fundamentales. Las siguientes propiedades se encuentran entre las más importantes:

  • Fiabilidad : la frecuencia con la que los resultados de un programa son correctos. Esto depende de la corrección conceptual de los algoritmos y la minimización de los errores de programación, como errores en la gestión de recursos (p. Ej., Desbordamientos de búfer y condiciones de carrera ) y errores lógicos (como errores de división por cero o errores de uno por uno ).
  • Robustez : qué tan bien un programa anticipa problemas debido a errores (no errores). Esto incluye situaciones como datos incorrectos, inapropiados o corruptos, falta de disponibilidad de los recursos necesarios, como memoria, servicios del sistema operativo y conexiones de red, errores del usuario y cortes de energía inesperados.
  • Usabilidad : la ergonomía de un programa: la facilidad con la que una persona puede usar el programa para su propósito previsto o, en algunos casos, incluso para fines inesperados. Estos problemas pueden hacer o deshacer su éxito incluso independientemente de otros problemas. Esto implica una amplia gama de elementos textuales, gráficos y, a veces, de hardware que mejoran la claridad, la intuición, la cohesión y la integridad de la interfaz de usuario de un programa.
  • Portabilidad : la gama de plataformas de sistema operativo y hardware informático en las que se puede compilar / interpretar y ejecutar el código fuente de un programa . Esto depende de las diferencias en las funciones de programación proporcionadas por las diferentes plataformas, incluidos los recursos de hardware y sistema operativo, el comportamiento esperado del hardware y el sistema operativo, y la disponibilidad de compiladores específicos de la plataforma (y a veces bibliotecas) para el lenguaje del código fuente.
  • Mantenibilidad : la facilidad con la que un programa puede ser modificado por sus desarrolladores actuales o futuros para realizar mejoras o personalizarlo, corregir errores y agujeros de seguridad , o adaptarlo a nuevos entornos. Las buenas prácticas durante el desarrollo inicial marcan la diferencia en este sentido. Esta cualidad puede no ser directamente evidente para el usuario final, pero puede afectar significativamente el destino de un programa a largo plazo.
  • Eficiencia / rendimiento : medida de los recursos del sistema que consume un programa (tiempo de procesador, espacio de memoria, dispositivos lentos como discos, ancho de banda de red y, hasta cierto punto, incluso interacción del usuario): cuanto menos, mejor. Esto también incluye una gestión cuidadosa de los recursos, por ejemplo, la limpieza de archivos temporales y la eliminación de pérdidas de memoria . Esto a menudo se discute bajo la sombra de un lenguaje de programación elegido. Aunque el lenguaje ciertamente afecta el rendimiento, incluso los lenguajes más lentos, como Python , pueden ejecutar programas instantáneamente desde una perspectiva humana. La velocidad, el uso de recursos y el rendimiento son importantes para los programas que atascan el sistema, pero el uso eficiente del tiempo del programador también es importante y está relacionado con el costo: más hardware puede ser más barato.

Legibilidad del código fuente

En la programación de computadoras, 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 anteriores, incluida la portabilidad, la usabilidad y, lo que es más importante, la capacidad de mantenimiento.

La legibilidad es importante porque los programadores pasan la mayor parte de su tiempo leyendo, tratando de comprender y modificar el código fuente existente, en lugar de escribir código fuente nuevo. El código ilegible a menudo conduce a 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.

Seguir un estilo de programación coherente a menudo ayuda a mejorar la legibilidad. Sin embargo, la legibilidad es más que solo 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. 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 son manejados por 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 los 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.

Complejidad algorítmica

El campo académico y la práctica de la ingeniería de la programación de computadoras se preocupan en gran medida por descubrir e implementar los algoritmos más eficientes para una clase determinada de problemas. Para ello, los algoritmos se clasifican en órdenes utilizando la denominada 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.

Algoritmos de ajedrez como ejemplo

"Programación de una computadora para jugar al ajedrez" fue un artículo de 1950 que evaluó un algoritmo "minimax" que es parte de la historia de la complejidad algorítmica; un curso sobre Deep Blue (computadora de ajedrez) de IBM es parte del plan de estudios de ciencias de la computación en la Universidad de Stanford .

Metodologías

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 diversas etapas del desarrollo de software formal están más integradas en ciclos cortos que toman unas pocas semanas en lugar de años. Existen muchos enfoques para el proceso de desarrollo de software.

Las técnicas de modelado más populares incluyen el análisis y diseño orientado a objetos ( OOAD ) y la arquitectura dirigida por modelos ( MDA ). El Lenguaje de modelado unificado ( 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 de relaciones entre entidades ( modelado ER ).

Las técnicas de implementación incluyen lenguajes imperativos ( orientados a objetos o procedimentales ), lenguajes funcionales y lenguajes lógicos .

Medir el uso del lenguaje

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, la cantidad de libros vendidos y cursos que enseñan el idioma (esto sobrestima la importancia de los lenguajes más nuevos) y estimaciones del número de líneas de código escritas existentes. en el idioma (esto subestima el número de usuarios de idiomas comerciales como COBOL).

Algunos lenguajes son muy populares para tipos particulares de aplicaciones, mientras que algunos lenguajes se utilizan regularmente para escribir muchos tipos diferentes de aplicaciones. Por ejemplo, COBOL sigue siendo fuerte en los centros de datos corporativos, a menudo en grandes computadoras mainframe , Fortran en aplicaciones de ingeniería, lenguajes de scripting en 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 en torno a 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 la capacidad de baja -manipulación de nivel).

Depuración

El primer error real conocido que causó un problema en una computadora fue una polilla, atrapada dentro de una computadora central de Harvard, registrada en una entrada del libro de registro con fecha del 9 de septiembre de 1947. "Error" ya era un término común para un defecto de software cuando se encontró este error .

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 algunos 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 de la depuración es intentar reproducir el problema. Esta puede ser una tarea no trivial, por ejemplo, como ocurre con los 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 que se reproduce 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 hacer que se bloquee al analizar un archivo fuente grande, una simplificación del caso de prueba que dé como resultado solo unas pocas líneas del archivo fuente original puede ser suficiente para reproducir el mismo bloqueo. 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 alguna interacción del usuario de la descripción original del problema y comprobar si las acciones restantes son suficientes para que aparezcan errores. La creación de scripts y los puntos de interrupción también forman parte de este proceso.

La depuración se realiza a menudo con IDE . También se utilizan depuradores independientes como GDB , que a menudo proporcionan un entorno menos visual, normalmente mediante una línea de comandos . Algunos editores de texto como Emacs permiten invocar GDB a través de ellos para proporcionar un entorno visual.

Lenguajes de programación

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. Idealmente, se seleccionará el lenguaje de programación más adecuado para la tarea en cuestión. Las compensaciones de este ideal implican encontrar suficientes programadores que conozcan el lenguaje para construir un equipo, la disponibilidad de compiladores para ese lenguaje y la eficiencia con la que se ejecutan los programas escritos en un lenguaje dado. Los idiomas forman un espectro aproximado de "bajo nivel" a "alto nivel"; Los lenguajes de "bajo nivel" suelen estar más orientados a la máquina 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. Suele ser más fácil codificar en lenguajes de "alto nivel" que en lenguajes de "bajo nivel".

Allen Downey , en su libro How To Think Like A Computer Scientist , escribe:

Los detalles se ven diferentes en diferentes idiomas, pero algunas instrucciones básicas aparecen en casi todos los idiomas:
  • Entrada: recopile datos del teclado, un archivo o algún otro dispositivo.
  • Salida: muestra datos en la pantalla o envía datos a un archivo u otro dispositivo.
  • Aritmética: Realiza operaciones aritméticas básicas como suma y multiplicación.
  • Ejecución condicional: verifique ciertas condiciones y ejecute la secuencia apropiada de declaraciones.
  • Repetición: realice alguna acción repetidamente, generalmente con alguna variación.

Muchos lenguajes informáticos proporcionan un mecanismo para llamar a funciones proporcionadas por bibliotecas compartidas . Siempre que las funciones en una biblioteca sigan las convenciones de tiempo de ejecución apropiadas (por ejemplo, el método de pasar argumentos ), estas funciones pueden escribirse en cualquier otro lenguaje.

Programadores

Los programadores de computadoras son aquellos que escriben software de computadora. Sus trabajos suelen incluir:

Aunque la programación se ha presentado en los medios de comunicación 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 .

Ver también

Referencias

Fuentes

Otras lecturas

  • AK Hartmann, Guía práctica de simulaciones por computadora , Singapur: World Scientific (2009)
  • A. Hunt, D. Thomas y W. Cunningham, el programador pragmático. De oficial a maestro , Amsterdam: Addison-Wesley Longman (1999)
  • Brian W. Kernighan, La práctica de la programación , Pearson (1999)
  • Weinberg, Gerald M. , La psicología de la programación informática , Nueva York: Van Nostrand Reinhold (1971)
  • Edsger W. Dijkstra , Una disciplina de programación , Prentice-Hall (1976)
  • O.-J. Dahl, EWDijkstra , CAR Hoare, Programación estructurada , Academic Press (1972)
  • David Gries , La ciencia de la programación , Springer-Verlag (1981)

enlaces externos