Herramientas de usuario

Herramientas del sitio


introduccion2

Introducción

¿Qué es la programación de software de sistemas? (fuente: wikipedia)

La alternativa es la programación de 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, el 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 programas en C cuando se desempeñe como profesional. También podría requerir programar en C si los requisitos de desempeño son elevados, por ejemplo los decodificadores de video se programan en C.

Por esta razón el sitio stackify.com señala a C entre los lenguajes más populares entre los programadores.

¿Cual es la principal desventaja de C?

Ud. ya sabe programar en Python y aprenderá el lenguaje Java en Metodologías de Diseño y Programación. Estos lenguajes son robustos: verifican que cada operación realizada sea válida en tiempo de ejecución. En cambio C no es robusto. Por razones de eficiencia no se verifica la validez de las operaciones. Por ejemplo no se chequea que el índice sea válido al acceder a un arreglo, lo que desencadena frecuentemente una sucesión de errores que lleva al programa a acceder a memoria que no fue atribuida por el sistema operativo, arrojando el mensaje segmentation fault. Prácticamente es el único mensaje de error que se entrega durante la ejecución. 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 su 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 los threads?

Hasta ahora Ud. solo a escrito programas secuenciales: corren en un solo thread y por lo tanto usan un solo core del procesador. Cuando su programa resulta muy lento, en el curso de algoritmos Ud. aprendió a reprogramar usando algoritmos más eficientes, pasando por ejemplo de O(n^2) a O(n log n). Pero a veces el algoritmo que usó es el mejor y no se puede mejorar. Para hacerlo más rápido puede recurrir al paralelismo, es decir usar múltiples threads que ejecutan en paralelo en distintos cores las operaciones requeridas para resolver el problema. Esta paralelización no es automática: Ud. aprenderá en este curso cómo reescribir los programas para usar múltiples threads.

¿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 operativo 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é estudiar los sockets?

Muchos sistemas son del tipo cliente/servidor. En estos una parte del problema se resuelve con un programa que se ejecuta en el computador del usuario (el cliente) y otro programa que corre en un computador lejano (el servidor) que almacena los datos requeridos. Por ejemplo la web funciona de esta forma: el cliente es el navegador (como firefox) y el servidor es el programa que accede a las páginas web (usualmente apache). Los sockets son la herramienta que usan cliente y servidor para comunicarse y constituyen la base de la internet. En este curso aprenderá a usar los sockets para programar aplicaciones cliente/servidor.

También usaremos los sockets como herramienta de paralelización: para lograr que un problema sea resuelto en paralelo usando múltiples computadores conectados a la internet.

¿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++.
introduccion2.txt · Última modificación: 2020/03/09 20:44 por lmateu