Programación de computadoras
La programación de computadoras es el proceso de realizar un cómputo particular (o más generalmente, lograr un resultado de cómputo específico), generalmente mediante el diseño y la construcción de un programa de computadora ejecutable. La programación implica tareas como el análisis, la generación de algoritmos, la creación de perfiles de algoritmos&' precisión y consumo de recursos, y la implementación de algoritmos (generalmente en un lenguaje de programación elegido, comúnmente denominado 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 del 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 automaticen el desempeño de una tarea (que puede ser tan compleja como un sistema operativo) en una computadora, a menudo para resolver un problema determinado. Por lo tanto, la programación competente generalmente 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 los programas informáticos. Estos pueden considerarse parte del proceso de programación, pero a menudo se utiliza el término desarrollo de software para este proceso más amplio con los términos programación, implementación, o codificación reservada para la escritura real del 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 un programa existente y volver a implementar su función.
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 automatizado en el Libro de los dispositivos ingeniosos. En 1206, el ingeniero árabe Al-Jazari inventó una caja de ritmos programable en la que se podía hacer que un autómata mecánico musical tocara diferentes ritmos y patrones de batería mediante 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 en ellas.
Los algoritmos de descifrado de 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 el código cifrado en Un manuscrito sobre el descifrado de mensajes criptográficos. 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 generalmente data de 1843, cuando la matemática Ada Lovelace publicó un algoritmo para calcular una secuencia de números de Bernoulli, destinado a ser llevado a cabo por el motor analítico de Charles Babbage.
En la década de 1880, Herman Hollerith inventó el concepto de almacenar datos en formato 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 registro de unidades como el IBM 602 y el IBM 604 se programaron mediante paneles de control de manera similar. manera, como lo 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.
Idioma 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 con diferentes conjuntos de instrucciones también tienen diferentes lenguajes ensambladores.
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 atado 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 tuvo una implementación funcional, apareció 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 que son sintácticamente más ricos y más capaces de abstraer el código, lo que facilita la selección de diferentes conjuntos de instrucciones de máquina a través de declaraciones de compilación y heurística. 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 se ingresaban usando 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 que los programas pudieran crearse escribiendo directamente en las computadoras. También se desarrollaron editores de texto que permitían realizar cambios y correcciones de forma mucho más sencilla que con las tarjetas perforadas.
Programación moderna
Requisitos 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:
- Confiabilidad: con qué frecuencia los resultados de un programa son correctos. Esto depende de la corrección conceptual de algoritmos y minimización de errores de programación, tales como errores en la gestión de recursos (por ejemplo, flujos de amortiguación y condiciones de carrera) y errores lógicos (como división por errores cero o fuera de uno).
- Robustness: lo bien que un programa anticipa problemas debido a errores (no errores). Esto incluye situaciones como datos incorrectos, inapropiados o corruptos, la falta de recursos necesarios como la memoria, los servicios del sistema operativo y las conexiones de red, el error del usuario y los desembolsos de energía inesperados.
- Usabilidad: la ergonomía de un programa: la facilidad con la que una persona puede utilizar el programa para su propósito previsto o en algunos casos incluso propósitos anticipados. Tales cuestiones pueden hacer o romper su éxito incluso independientemente de otras cuestiones. Esto implica una amplia gama de elementos textuales, gráficos y a veces hardware que mejoran la claridad, la intuitividad, la cohesión y la integridad de la interfaz de usuario de un programa.
- Portabilidad: la gama de equipos informáticos y plataformas de sistemas operativos en las que se puede compilar/interpretar y ejecutar el código fuente de un programa. Esto depende de las diferencias en las instalaciones de programación proporcionadas por las diferentes plataformas, incluyendo recursos de hardware y sistema operativo, comportamiento esperado del hardware y sistema operativo, y disponibilidad de compiladores específicos de plataforma (y a veces bibliotecas) para el lenguaje del código fuente.
- Maintainability: la facilidad con la que un programa puede ser modificado por sus desarrolladores presentes o futuros para hacer mejoras o personalizar, corregir errores y agujeros de seguridad, o adaptarlo a nuevos entornos. Las buenas prácticas durante el desarrollo inicial marcan la diferencia a este respecto. Esta calidad puede no ser directamente aparente al usuario final, pero puede afectar significativamente el destino de un programa a largo plazo.
- Eficiencia/rendimiento: Medición de los recursos del sistema un programa consume (tiempo del procesador, espacio de memoria, dispositivos lentos como discos, ancho de banda de red y en cierta medida incluso la interacción del usuario): 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 las fugas de memoria. Esto se discute a menudo bajo la sombra de un lenguaje de programación elegido. Aunque el idioma ciertamente afecta el rendimiento, incluso idiomas 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 programas que embotellan el sistema, pero el uso eficiente del tiempo de 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 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 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, 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 algunas transformaciones simples de legibilidad acortaron el código y redujeron drásticamente el tiempo para entenderlo.
Seguir un estilo de programación consistente 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. Algunos de estos factores incluyen:
- Diferentes estilos de identificación (espacio blanco)
- Comentarios
- Decomposición
- Convenciones de nombres para objetos (como variables, clases, funciones, procedimientos, etc.)
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 integrado (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 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 este propósito, 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 adaptan a las circunstancias.
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 usan formas de desarrollo de software Agile donde 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. Hay muchos enfoques para el proceso de desarrollo de software.
Las técnicas de modelado 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 relación de entidad (modelado ER).
Las técnicas de implementación incluyen lenguajes imperativos (orientados a objetos o procedimentales), lenguajes funcionales y lenguajes lógicos.
Medición del 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 sobreestima la importancia de los lenguajes más nuevos) y estimaciones de la cantidad de líneas de código escritas existentes. en el lenguaje (esto subestima el número de usuarios de lenguajes comerciales como COBOL).
Algunos lenguajes son muy populares para determinados tipos de aplicaciones, mientras que otros se usan regularmente para escribir muchos tipos diferentes de aplicaciones. Por ejemplo, COBOL sigue siendo sólido en los centros de datos corporativos, a menudo en grandes computadoras centrales, Fortran en aplicaciones de ingeniería, lenguajes de secuencias de comandos en desarrollo web y C en software integrado. Muchas aplicaciones utilizan una mezcla 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 para bajo -manipulación de nivel).
Depuración
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, por ejemplo, como 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.
Después de reproducir 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 resulte en 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 verificar si las acciones restantes son suficientes para que aparezcan los errores. Las secuencias de comandos y los puntos de interrupción también forman parte de este proceso.
La depuración a menudo se realiza con IDE. También se usan depuradores independientes como GDB, y estos a menudo proporcionan un entorno menos visual, generalmente usando una línea de comando. Algunos editores de texto como Emacs permiten que se invoque GDB a través de ellos para proporcionar un entorno visual.
Lenguajes de programación
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 la preferencia individual. 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 "nivel bajo" a "alto nivel"; "bajo nivel" los lenguajes suelen estar más orientados a la máquina y son más rápidos de ejecutar, mientras que los lenguajes de "alto nivel" Los lenguajes son más abstractos y fáciles de usar, pero se ejecutan con menos rapidez. Por lo general, es más fácil codificar en "alto nivel" idiomas que en "nivel bajo" unos. 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 científico informático, escribe:
- Los detalles se ven diferentes en diferentes idiomas, pero algunas instrucciones básicas aparecen en casi todos los idiomas:
- Entrada: Reunir datos del teclado, un archivo o algún otro dispositivo.
- Salida: Mostrar datos en la pantalla o enviar datos a un archivo u otro dispositivo.
- Aritmética: Realizar operaciones aritméticas básicas como adición y multiplicación.
- Ejecución condicional: Compruebe ciertas condiciones y ejecutar la secuencia apropiada de declaraciones.
- Repetición: Realizar 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 informáticos son aquellos que escriben software informático. Sus trabajos suelen implicar:
- Prototipado
- Codificación
- Debugging
- Documentación
- Integración
- Mantenimiento
- Análisis de necesidades
- Arquitectura de software
- Pruebas de software
- Especificación
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 sólidas habilidades en los lenguajes humanos naturales y que aprender a codificar es similar a aprender un idioma extranjero.
Contenido relacionado
Solo otro hacker de Perl
Protocolo punto a punto
Búsqueda de Google