Kernel escrito en C

Publicado por Alejandro Escario en

windows-linux

Si sabes programar, y te has planteado alguna vez como funciona un Sistema Operativo por dentro, probablemente sepas que la mayoría, por no decir todos están escritos en C, y es más, si has llegado hasta esa información, puede que también te hayas preguntado porque C y no C++ o ensamblador ¿verdad?.

En el punto 15 del FAQ del kernel de linux encontramos las respuestas concretas para el sistema operativo Linux, que supongo que en cierta medida son extensibles al resto de sistemas operativos.

  • Linus comenzó con la programación del núcleo de su nuevo SO en un ordenador 386 con el SO Minix, el cual era muy básico y tenia fines educativos, y para terminar gcc, el compilador de C.
  • Algunas de las partes del núcleo de un sistema operativo han de estar escritas en ensamblador para controlar correctamente algunos elementos del hardware; pero escribir todo el kernel en ensamblador reduciría la legibilidad del código significativamente. Como se puede incluir ensamblador en C, este lenguaje proporciona una gran ventaja respecto al resto.

  • Se utiliza C en lugar de C++ por múltiples razones:
  1. Cuando se comenzó a programar el núcleo de Linux, no existía un compilador eficiente de C++, de hecho hay gente que incluso a día de hoy dice que no es tan eficiente como el gcc (el compilador de C). De hecho se llegó a compilar el kernel en C++ pero hubo grandes quejas debido a la pérdida de rendimiento que sufría.
  2. Hay muchos más programadores de C que de C++ en el ámbito de los sistemas operativos.
  3. Si a día de hoy se tradujese el núcleo a C++, se perdería una gran cantidad de tiempo, ya que habría que traducirlo todo y no bastaría con empezar a escribirlo en este lenguaje desde un punto dado. Hagamos unos cálculos:

El núcleo de Linux tiene aproximadamente 4.000.000 líneas de código, si aproximadamente un 10% es de comentarios, nos quedamos con 3.600.000, y ahora, si una persona es capaz de analizar una linea cada 5segundos (algo muy optimista) y además trabaja sin descanso, entonces tendríamos:

$latex 3.600.000*frac{5s}{linea}*frac{1h}{3.600s}*frac{1d}{24h}*frac{1semana}{7d}=29.8 semanas$

¿No sería mucho mejor dedicar este tiempo a seguir mejorando cosas?

Categorías: LinuxProgramación