¡Esta es una revisión vieja del documento!
Introducción
¿Qué es la programación de software de sistemas? (fuente: wikipedia)
La alternativa es el software de aplicaciones que busca producir programas que proveen servicios al usuario directamente. Por ejemplo un procesador de texto como word, un navegador para la web como chrome, un editor de fotografías como photoshop, etc. En cambio el software de sistemas busca producir programas o plataformas que:
- Proveen servicios a otro software: un motor para juegos de video, un administrador de bases de datos, un intérprete de Python, etc.
- Poseen requisitos especiales en cuanto a desempeño: el sistema operativo, resolución numérica de ecuaciones diferenciales, sistemas de control de maquinarias, etc.
- Usualmente ambas.
Programa de curso:
http://www.dcc.uchile.cl/docs/2010/CC3301_2009-2-ADD_2010.pdf
¿Por qué estudiar el lenguaje C?
Cuando se requiere alto desempeño el mejor lenguaje es C o su sucesor C++. Por eso hay una enorme cantidad de software escrito en C y es probable que Ud. tenga que hacer mejoras a programa en C cuando se desempeñe como profesional.
¿Cual es la principal desventaja de C?
Al contrario de Python y Java, C no es robusto. Por razones de eficiencia no se verifica que las operaciones que se ejecutan sean válidas. Por ejemplo no se chequea que el índice sea válido al acceder a un arreglo. El resultado es que prácticamente el único mensaje de error que se entrega durante la ejecución es segmentation fault, que significa que se accedió a una dirección de memoria no atribuida al programa. Ud. va a tener pesadillas con este mensaje de error. Esto se traduce también en que es mucho más difícil depurar un programa en C que sus contraparte en Python o Java y por lo tanto la productividad en C es inferior a la de Java, la que ya es inferior a la de Python. Por eso el uso de C se reserva solo a la programación de software de sistemas.
¿Por qué estudiar Unix y/o Linux?
La mayoría de los servidores que entregan las páginas de la web corren Linux, una variante de Unix. Se necesitan expertos que trabajen en Linux para programar el software que hay detrás de esos servidores. Por otra parte MacOs, el sistema operativos de los computadores de Apple, Android e iOS, los sistemas operativos que usan los smartphones son variantes de Unix. Lo que aprenda en este curso también es válido para esas variantes de Unix.
¿Por qué no se enseña C++?
Por restricciones de tiempo. C++ es un lenguaje mucho más complejo que C. Da para un curso completo. Por otra parte los conceptos que aprenderá en este curso le servirán para aprender C++. Si está interesado en C++, estoy seguro que no tendrá problemas para convertirse en un experto en C++ leyendo estos tutoriales.
Historia de los lenguajes de programación más influyentes
- En los 50's nace Fortran, el primer lenguaje de programación “de alto nivel”. El objetivo era bastante modesto, ya que solo se buscaba poder escribir fórmulas algebraicas cómodamente sin tener que programarlas en lenguaje ensamblador. Sin embargo todavía no hay while ni if/else: se usa if … goto. La programación es no estructurada. Por eso su sigla significa Formula Translator.
- En los 60's surge el primer lenguaje para la programación estructurada: Algol. Posee while e if/else. Es un lenguaje demasiado complejo para las máquinas de la época. De este lenguaje se derivan 2 variantes, Pascal y C, que sí son implementables.
- Pascal aparece en los 70's (de Niklaus Wirth). Busca la robustez en la programación. Es un lenguaje minimalista.
- C también aparece en los 70's (de Brian Kernighan). La sintaxis es distinta de Algol y Pascal. C recibe la flexibilidad del manejo de memoria del assembler para así poder programar un sistema operativo (Unix) en un lenguaje de alto nivel (C). Por eso no puede ser robusto, aunque sí es minimalista.
- A fines de los 70's aparece el primer lenguaje orientado a objetos: Smalltalk. Es puro, todo es un objeto. Es minimalista, pero es extremadamente ineficiente porque debe ser interpretado.
- En los 80's Bjarne Stroustrup enriquece C con clases para facilitar la programación orientada a objetos en un lenguaje eficiente, dando así origen al lenguaje C++. Tampoco es robusto y es complejo.
- A fines de los 80 Guido Van Rossum concibe Python como en lenguaje de programación fácil de usar. Favorece la escritura rápida de programas pero sacrificando la eficiencia en tiempo de ejecución: Un programa en Python puede requerir de 10 a 100 veces más tiempo de ejecución que el mismo reescrito en C.
- En los 90's James Gosling concibe Java como una forma de darle robustez a C++. Es menos complejo que C++.