La programación de sistemas , o programación de sistemas , es la actividad de programar [1] software de sistemas informáticos . La característica distintiva principal de la programación de sistemas en comparación con la programación de aplicaciones es que la programación de aplicaciones tiene como objetivo producir software que proporcione servicios al usuario directamente (por ejemplo, procesador de textos ), mientras que la programación de sistemas tiene como objetivo producir software y plataformas de software que brinden servicios a otro software, estén limitados por el rendimiento o ambos (por ejemplo, sistemas operativos , aplicaciones de ciencias computacionales , motores de juegos , automatización industrial y aplicaciones de software como servicio ). [1]
La programación de sistemas requiere un alto grado de conocimiento del hardware. Su objetivo es lograr un uso eficiente de los recursos disponibles, ya sea porque el software en sí es crítico para el rendimiento o porque incluso pequeñas mejoras de eficiencia se transforman directamente en ahorros significativos de tiempo o dinero.
Los siguientes atributos caracterizan la programación de sistemas:
En la programación de sistemas, las posibilidades de programación suelen ser limitadas. El uso de recolección automática de basura no es común y la depuración a veces es difícil de realizar. La biblioteca de tiempo de ejecución , si está disponible, suele ser mucho menos potente y realiza menos comprobaciones de errores. Debido a esas limitaciones, a menudo se utilizan la monitorización y el registro ; los sistemas operativos pueden tener subsistemas de registro extremadamente elaborados.
La implementación de ciertas partes en sistemas operativos y redes requiere programación de sistemas, por ejemplo, implementar paginación ( memoria virtual ) o un controlador de dispositivo para un sistema operativo.
Originalmente, los programadores de sistemas invariablemente escribían en lenguaje ensamblador . Los experimentos con soporte de hardware en lenguajes de alto nivel a fines de la década de 1960 dieron lugar a lenguajes como PL/S , BLISS , BCPL y ALGOL extendido para sistemas grandes de Burroughs . Forth también tiene aplicaciones como lenguaje de sistemas. En la década de 1970, C se generalizó, ayudado por el crecimiento de Unix . Más recientemente, un subconjunto de C++ llamado Embedded C++ ha tenido algún uso, por ejemplo, se usa en los controladores del kit de E/S de macOS . [2] Los ingenieros que trabajaban en Google crearon Go en 2007 para abordar la productividad del desarrollador en grandes sistemas distribuidos , con características enfocadas en el desarrollador como Concurrencia , Recolección de basura y una compilación de programas más rápida que C y C++. [3] En 2015 salió Rust , un lenguaje de programación de propósito general que se usa a menudo en la programación de sistemas. Rust fue diseñado teniendo en cuenta la seguridad de la memoria y para tener el mismo rendimiento que C y C++.
Por razones históricas, algunas organizaciones utilizan el término programador de sistemas para describir una función laboral que sería más precisa llamarse administrador de sistemas . Esto es particularmente cierto en organizaciones cuyos recursos informáticos han estado históricamente dominados por mainframes , aunque el término incluso se utiliza para describir funciones laborales que no involucran mainframes. Este uso surgió porque la administración de mainframes de IBM a menudo implicaba la escritura de código ensamblador personalizado ( lenguaje ensamblador básico (BAL) de IBM), que se integraba con el sistema operativo como OS/MVS , DOS/VSE o VM/CMS . De hecho, algunos productos de software de IBM tenían contribuciones de código sustanciales del personal de programación del cliente. Este tipo de programación es progresivamente menos común y cada vez más se realiza en C en lugar de Assembly, pero el término programador de sistemas todavía se utiliza como el título de trabajo de facto para el personal que administra mainframes de IBM incluso en casos en los que no participan regularmente en actividades de programación de sistemas.