¿Cómo aprender programación en C y las bases de los sistemas operativos de forma práctica?
Hay muchas formas de aprender a programar, existen multitud de páginas webs con tutoriales, ejemplos de código, etc. También podrás encontrar una gran variedad de libros sobre programación, tanto de C como de otros muchos lenguajes. Igualmente hay cursos online o presenciales de programación donde comenzar a comprender estas técnicas para crear tu propio software desde cero hasta un nivel avanzado.
Luego, por otro lado, existen algunos entrenadores físicos con ciertos microprocesadores o microcontroladores que puedes programar para aprender este arte casi jugando y creando proyectos. Un ejemplo muy bueno es la propia Raspberry Pi, las placas de Parallaz, o las nacionales que puedes encontrar en la tienda MKElectrónica, o la placa archiconocida Arduino, Scratch. Sin embargo, si quieres centrarte más en el desarrollo del software, siempre aconsejo lo mismo: lee y modifica código.
En este post no intentaré darte clases de programación, ya que es un tema que daría para muchos artículos como este explicando desde las bases de la programación hasta la programación más avanzada. Solo pretendo darte algunos recursos o formas de comenzar para afianzar tus conocimientos. Y te aseguro que son muy efectivos. Además, sabes que puedes comenzar con cualquier distro GNU/Linux, con los paquetes necesarios para programación como un editor de texto, o un IDE, tambien GCC y GDB, si quieres depurar… O también usar alguna distribución para programadores. También creo que ya conoces o deberías conocer este tipo de herramientas que tienes a tu disposición.
¿Cómo comenzar?
Puedes encontrar snippets de código en la red a millones, es decir, fragmentos de código que se pueden usar o modificar para hacer tareas muy concretas. Estos códigos fuente son la base para el aprendizaje, ya que son funciones muy básicas que te ayudarán a entender cómo funcionan los programas y podrás modificar en algunos parámetros para conseguir que hagan otra cosa diferente. ¡Y así se empieza!
Con forme vayas avanzando podrás lanzarte a leer código fuente, que si está bien comentado será especialmente nutritivo para tus conocimientos. Desgraciadamente no todos los desarrolladores tienen la buena costumbre de comentar las líneas que escriben, y en algunos casos los comentarios son escasos o confusos incluso para gente con experiencia. Pero afortunadamente tenemos una gran parte de la comunidad que comenta bastante bien sus proyectos.
Plataformas donde se cuelga código de software como GitHub, por poner un ejemplo, aunque existen muchas más, son fuentes de sabiduría muy importantes. De hecho, te recomiendo que una vez hayas adquirido cierta soltura con los snippets o tus pequeños programas, vayas a este tipo de plataformas y accedas al código fuente de proyectos sencillos. Puedes usar las funciones de filtros y buscadores para encontrar código específico en un lenguaje de programación, como C y luego seleccionar alguno que sea más simple.
Así poco a poco podrás ir aumentando la complejidad de los programas para conseguir elevar tus conocimientos hasta un nivel bastante avanzado. No comiences por proyectos con gran cantidad de líneas, o te frustrará el hecho de no entender para qué sirve o qué hace esa gran cantidad de código. Comienza con pequeños programas de unas decenas de líneas, luego por algunos de 100 o más y así hasta poco a poco llegar a programas más complejos.
Además, te aconsejo que busques programas que conozcas bastante bien en cuanto a su uso. Por ejemplo, imagina que usas un determinado editor de texto de código abierto o una calculadora. Sabiendo lo que hace dicho programa en la práctica te será más fácil relacionar las líneas de código fuente que verás con las funciones que tiene el programa. En cambio, si eliges un código del que no tienes idea, solo con ayuda de tus conocimientos básicos de programación y de los comentarios que encontrarás en los ficheros de código no será suficiente.
Por ejemplo, fíjate en el segundo ejemplo que muestra en la búsqueda que hice de programas de cálculo en lenguaje C de la siguiente imagen. En la descripción se muestra que es un programa en línea de comandos que implementa una simple calculadora. Esto es un buen código para comenzar, no solo por la simplicidad del código, sino porque al ser basado en texto no tendrás ficheros de código referente a la GUI, etc., todo eso te distrae y te dificulta el aprendizaje bastante:
Si entramos dentro de este proyecto para ver su código, nos vamos a encontrar primero los ficheros que el desarrollador ha subido a esta plataforma. Como los detalles de la licencia LICENSE, el fichero con información por excelencia README, etc. Pero fíjate que hay ficheros de cabeceras (headers) como helpers.h y struct.h, estos dos son importantes, y también los dos .c, que son los que tienen el código fuente en C propiamente dicho para este programa:
Si accedemos a uno de los headers o .h, veremos que se trata de un programa sencillo, sin demasiadas líneas. Este tipo de ficheros los vas a encontrar muchas veces, a no ser que sea un programa bastante simple que no los necesita, pero se trata de un include file donde se incluyen algunos detalles o ficheros adicionales que el compilador debe procesar para formar el binario final del programa.
En un header file encontrarás declaraciones directas de clases, subrutinas, variables definidas, y otros. En ocasiones, estos .h son bibliotecas que puedes usar desde el fichero principal de código (.c) haciendo referencia directa a lo que dentro de estas cabeceras se declara sin tener que volver a repetir toda la estructura cada vez que se necesita:
En el caso del código fuente propiamente dicho, como el fichero calc.c de nuestro ejemplo, encontrarás más líneas. Unas 400 y pico, y en este caso concreto no están comentadas. Lo que dificulta seriamente la comprensión del código. No obstante, al ser un programa tan sencillo como una calculadora, puedes leerlo y modificarlo sin problemas, ya que te resultará intuitivo:
Recuerda, leer código y modificarlo. Esas son las claves para aprender a programar de la mejor forma posible…
Un paso más: el kernel
Ahora bien, cuando ya has adquirido unas competencias básicas de programación en lenguaje C, puedes dar un paso más y adentrarte en el fascinante mundo de los sistemas operativos y de las arquitecturas de computadoras. Para ello debes tener conocimientos algo más elevados de cómo funcionan los ordenadores, pero nuevamente los proyectos de código abierto existentes nos pueden ayudar mucho.
Analizar el código fuente de un kernel nos puede hacer comprender de una forma mejor cómo funciona este mundo de los sistemas operativos, y también serán unas clases magistrales para obtener nuestro “doctorado” en programación C, al ser algo de palabras mayores. Podrías pensar que el mejor proyecto para aprender esto sería el kernel Linux.
En cambio, las dimensiones actuales de las últimas versiones del kernel Linux son demasiado complejas como para ser comprensibles para la mayoría de mortales. Especialmente por la gran cantidad de código para otros subsistemas y controladores que vas a encontrar agregado a lo que es el kernel en sí. Eso puede llevarte a pensar que en kernel.org puedes encontrar versiones más primitivas del kernel, como los “historic” donde hay algunas “old-versions” como por ejemplo la Linux 0.01, la primera en la que el código es mucho más reducido y simple de analizar.
Y aunque el código C que encontrarás en el kernel Linux es exquisito, no te recomiendo el kernel Linux por el hecho de que suele estar escasamente comentado en muchas ocasiones. No quiero decir que los desarrolladores lleven una mala política de comentarios, pero sí que puede resultar confuso para alguien que está empezando en esto. Así que deja el kernel Linux y las LKML para más adelante…
Y es verdad que existen algunos muy buenos libros y cursos para aprender sobre el kernel, módulos y controladores, pero quizás no sea lo mejor para empezar. Algunos ejemplos son (algunos de ellos, como los de Greg, los puedes descargar gratuitamente, ya que han sido liberados):
- Linux Kernel Development 3rd Edition de Robert Love.
- Understanding The Linux Virtual Memory Manager de Mel Goman, aunque éste último se centra solo en la gestión de memoria del kernel.
- Linux Device Drivers 3rd Edition de Greg Kroah-Hartman, aunque es centrado en el kernel 2.6, pero es una gran obra para entender los controladores y módulos del kernel.
- Linux Kernel in a Nutshell es otro del gran Greg Kroah-Hartman que te da una visión mucho más global.
También puedes encontrar algunas webs muy muy interesantes, más allá de la propia información y documentación que puedes encontrar en kernel.org, como:
- https://kernelnewbies.org/: es una comunidad de aspirantes a desarrolladores del kernel donde podrás encontrar una información que vale oro.
- http://matt.might.net/articles/what-cs-majors-should-know/: otra web con bastante buena información sobre informática.
Otro de los grandes proyectos que aún se siguen estudiando y sirviendo como aprendizaje es UNIX 6th, cuyo código se analiza de una forma extraordinaria en libros como Lions’ Commentary on UNIX 6th Edition, de John Lions. Te lo dejo como otra idea alternativa, aunque te sigo recomendando lo siguiente que te voy a comentar…
Pero creo que el mejor recurso que tienes a tu disposición es estudiar y analizar el código fuente de MINIX. Es un sistema mucho más sencillo en el que en un inicio se inspiró Linux pero que ha sido concebido especialmente para el aprendizaje y su estudio. Al estar pensado para que los futuros arquitectos de sistemas operativos aprendan, los comentarios que tiene son extraordinarios para los que comienzan en esto.
Más información – MINIX3
Allí vas a encontrar mucha información y documentación sobre el proyecto. Y podrás descargar el propio sistema operativo, pero también tener a tu disposición una buena Wiki donde también hay textos dirigidos a desarrolladores. Pero, como de lo que se trata es de aprender C y de analizar cómo está constituido un sistema operativo, te remito directamente a descargar la primera versión del código fuente de MINIX 1:
Código fuente – MINIX1
Por ejemplo, si te vas al fichero principal main.c, verás que el código aquí es muy diferente a cómo lo encuentras en Linux o en el programa de calculadora que puse de ejemplo al inicio de este post. En este caso, notarás que la cantidad de comentarios son mucho más abundantes:
Aquí, casi cada línea o cada fragmento está comentado. Haciendo mucho más sencilla su lectura y comprensión. Vuelvo a insistir, no se trata solo de leer y comprender, también de modificar. Haz tus propias modificaciones y pruebas, luego compila y ve el resultado. Eso será el mejor master de programación que podrás encontrar. Te lo aseguro, como siempre les digo a mis alumnos, leer y modificar código es la mejor clase de informática que vais a tener…
No solo podrás analizar el kernel del sistema operativo, también otros elementos auxiliares que componen el sistema operativo completo y también comandos que puedes ejecutar en el shell. Es una magnífica forma de conocer desde “dentro” cómo funcionan esos comandos como ls, cat, cp, grep, echo, etc., que ejecutas a diario, también con código bastante bien comentado…
Código fuente de los comandos – MINIX1
Por último, conozco a un chico que ha creado un kernel hecho desde cero. Se llama Luis y podéis encontrar su proyecto en esta dirección de GitHub, otro buen ejemplo de estudio que os recomendaría. Su sistema se llama IndiaOS, es bastante sencillo y perfecto para adquirir los conocimientos básicos. ¿Quién sabe? Quizás seas tú el siguiente en animarse en crear un kernel…
Si quieres aprender ensamblador o ASM, un lenguaje basante interesante junto a C para programar a bajo nivel y, en especial, para los sistemas operativos…, también existen proyectos muy interesantes como el caso de KolibriOS, un sistema libre escrito en ensamblador. Al estar en ASM, resulta mucho más complicado, pero también da una buena idea de cómo trabajan las máquinas a un nivel más íntimo con respecto al hardware.
Tutorial: Imprimir código fuente para estudiarlo en papel
Si eres de los que no le gusta pasar horas frente a una pantalla y dejarse la vista en ella, quizás prefieras el papel. Te voy a mostrar un pequeño tutorial de cómo puedes imprimir todos estos códigos fuente de los que hemos hablado o los que quieras analizar. Así podrás tener un PDF con la sintaxis resaltada lista para imprimir en tu impresora y leer sobre papel, donde podrás hacer tus anotaciones y demás.
Para ello, lo primero será instalar los paquetes necesarios en nuestra distro:
sudo apt-get install texlive-latex-extra latex-xcolor textlive-latex-recommended
Una vez tenemos estos ficheros, usaremos LATEX para trasnformar el código fuente en un PDF, y para ello debemos guardar este script, darle los permisos de ejecución y ejecutarlo en Bash:
#!/usr/bin/env bash tex_file=$(mktemp) ## Random text file name cat<<EOF >$tex_file ## Print the text file header \documentclass{article} \usepackage{listings} \usepackage[usenames,dvipsnames]{color} %% Allow color names \lstdefinestyle{customasm}{ belowcaptionskip=1\baselineskip, xleftmargin=\parindent, language=C++, %% Change this to whatever you write in breaklines=true, %% Wrap long lines basicstyle=\footnotesize\ttfamily, commentstyle=\itshape\color{Gray}, stringstyle=\color{Black}, keywordstyle=\bfseries\color{OliveGreen}, identifierstyle=\color{blue}, xleftmargin=-8em, } \usepackage[colorlinks=true,linkcolor=blue]{hyperref} \begin{document} \tableofcontents EOF find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'| sed 's/^\..//' | ## Change ./foo/bar.src to foo/bar.src while read i; do ## Loop through each file name=${i//_/\\_} ## escape underscores echo "\newpage" >> $tex_file ## start each section on a new page echo "\section{$i}" >> $tex_file ## Create a section for each filename ## This command will include the file in the PDF echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file done && echo "\end{document}" >> $tex_file && pdflatex $tex_file -output-directory . && pdflatex $tex_file -output-directory . ## This needs to be run twice ## for the TOC to be generated </pre><pre>
Tras guardarlo en un fichero con el nombre pdf.sh, puedes darle permisos y ejecutarlo de una forma fácil:
chmod +x pdf.sh ./pdf.sh
Y el resultado será un PDF con el texto resaltado en color para una mejor lectura de los ficheros de código fuente del directorio actual. El nombre del documento PDF será all.pdf. Ahora estará listo para que lo pongas en tu cola de impresión para tenerlo en papel.
Por cierto, el único problema es que los ficheros de código fuente del directorio donde ejecutes este script que contengan espacios en sus nombres no funcionarán con este script. Así que si hay alguno puedes modificar su nombre o alterar el script para que los admita…
No olvides dejar tus comentarios, estaré encantado de contestar cualquier duda que tengas al respecto, o de escuchar cualquier aprotación que tengas para mejorar el post. Y espero que te haya servido como guía para iniciarte en este mundillo…
El artículo ¿Cómo aprender programación en C y las bases de los sistemas operativos de forma práctica? ha sido originalmente publicado en Linux Adictos.