Guía Hardware

¿Cuáles son las partes de un programa informático? (código fuente)

Actualizado a: 19 de enero de 2024

Los programas informáticos, o software, no son más que una lista de instrucciones y de datos que el hardware deberá procesar para que se cumpla el objetivo de ese código. Sin embargo, para crear estos programas, es necesario escribir lo que se conoce como código fuente por parte del programador, en cualquiera de los lenguajes disponibles. Luego, este código se compila o se interpreta según el tipo que sea para transformarlo en un lenguaje que la CPU comprenda. Por eso, vamos a ver más a fondo qué es un código fuente y cuáles son sus partes, para conseguir saber lo que representa los cimientos de la programación informática.

¿Qué es un código fuente?

El código fuente es un archivo donde se escriben las líneas necesarias para describir qué es lo que tiene que hacer el programa. Para ello, se usa un lenguaje de programación como ya sabes. En el código podemos ver una sintaxis y estructura clara, con funciones, descripciones, llamadas, variables, constantes, comentarios, etc.

En el ejemplo de Hola mundo que he puesto en esta imagen se puede apreciar esto. Además, como puedes observar, tiene una estructura clara y legible para los humanos, para que los desarrolladores puedan comprenderlo, actualizarlo o corregir errores, incluso si no lo han escrito ellos.

Este código fuente se puede escribir en un editor de texto simple, no es necesario usar un programa determinado. Luego, se guarda con la extensión adecuada para el lenguaje que se ha usado y estaría listo para compilar (o para usar en el interprete si es un lenguaje interpretado). Por ejemplo, hola.c, hola.cpp, hola.js, etc. No obstante, en muchas ocasiones los desarrolladores usan lo que se conoce como un IDE (Integrated Design Environment).

En ocasiones también se emplean kits de desarrollo de software como el SDK (Software Developer Kit).

Como se puede apreciar en la imagen superior, en muchos editores de texto se incluyen funciones para resaltar el texto y hacerlo más comprensible, con colores según el tipo. Otros incluyen también sugerencias o autocompletado para ayudar a los programadores…

Como también sabrás ya, el código fuente se puede hacer público, se puede licenciar con licencias de código abierto o libres, o se puede ocultar y no hacer público si es propietario.

Más allá de permitir al programador describir el programa, como si fuese una receta de cocina en la que vas explicando los pasos e ingredientes a utilizar, el código fuente también tiene otros propósitos interesantes. Por ejemplo, se podría usar para aprender programación, para modificarlo y crear derivados, para la depuración, etc. Aunque esto son otros temas…

Consideraciones

Hay que destacar que el código fuente se puede escribir de muchas maneras. De hecho, cada programador tiene sus manías o su forma de hacerlo. Varios códigos fuente distinto pueden terminar haciendo exactamente lo mismo cuando se ejecute el programa. Sin embargo, existen una serie de buenas prácticas para hacerlo más comprensible y facilitar su actualización.

Un ejemplo:

/* Programa Hola Mundo */
#include<stdio.h>
main()
{
     printf("Hola Mundo");
     return 0;
}

Cuando se lee el código anterior, incluso una persona sin experiencia en programación, si conoce el lenguaje C, podría comprender perfectamente el propósito del programa. En este caso es un snippet muy sencillo que tan solo imprime en pantalla el mensaje «Hola mundo». Evidentemente, en códigos fuente más largos, de cientos o miles de líneas, la cosa se complica, pero igualmente debe ser entendible.

Sin embargo, un ordenador no podría comprender este código. Para que estas líneas se transformen en instrucciones y datos que puedan se procesados por la CPU, primero hay que compilar dicho código y pasarlo a formato binario, es decir, a código máquina (ceros y unos). En el caso de ser un lenguaje de programación interpretado, entonces será el intérprete el que se encargue de convertir ese código fuente en el código que pueda comprender la CPU para su ejecución.

Algunos lenguajes de programación compilados son C, C++, Rust, Go, COBOL, etc. Mientras que algunos ejemplos de lenguajes de programación interpretados son Python, Ruby, JavaScript, Perl, etc.

El uso de estos lenguajes de alto nivel es permitir una abstracción para el programador, y usar un lenguaje más intuitivo para un humano. Un programador no podría usar unos y ceros directamente, ya que sería realmente complicado y no podría comprenderlo al leer.

Existen lenguajes de alto nivel (C++, Java, Rust,…), lenguajes de medio nivel (C…) y lenguajes de bajo nivel (ASM o ensamblador). La diferencia entre ellos es el nivel de abstracción que tienen. Por ejemplo, los de alto nivel son más comprensibles para el humano. Los de medio nivel como C pueden tener las ventajas del lenguaje de alto nivel, pero también permiten programar a más bajo nivel, es decir, de forma más «íntima» con el hardware. Los lenguajes de bajo nivel, como el ensamblador, es más complicado, ya que usa mnemónicos para representar las instrucciones de la ISA para la que se esté programando, además de tener que comprender los tipos de datos empleados por esa arquitectura, los registros disponibles, etc.

Historia del código fuente

Para finalizar el tema del código fuente, hay que decir que no siempre existió como tal. Antes se usaban las tarjetas perforadas. El primer software como tal que se escribió en código binario data de la década de los 40. En aquel momento los programas eran mucho más simples que los actuales, por lo que escribirlo en binario no era un problema mayúsculo.

El primero en escribir un programa almacenado electrónicamente en una memoria fue fue Tom Kilburn, y lo hizo en 1948. Se puede decir que fue el primero en escribir un código fuente como tal. A partir de ahí, la programación fue evolucionando hasta lo que vemos en nuestros días.

Más tarde, en las décadas de 1950 y 1960, muchas empresas comenzaron a escribir programas y los entregaban junto al código fuente de forma gratuita. Se entendía que el software era un complemento necesario para el hardware. Es decir, te vendían el hardware y te daban el software. Sin embargo, esto cambiaría y sería el inicio de una cruzada contra el código propietario que terminaría en lo que hoy día es el mundo del software libre o de código abierto, pero esto ya es otra historia…

Partes de un programa o código fuente

código fuente en pantalla de portátil

Una vez entendido qué es el código fuente, vamos a ver cuáles serían las partes de un código fuente a nivel fundamental. Y es que, muchos comienzan a aprender a programar sin comprender muy bien esto que serían los cimientos, lo primero que hay que conocer, y luego pueden llevarlos a cometer errores o a no saber muy bien para qué sirve algo que están constantemente usando en sus códigos fuente…

Para el ejemplo voy a utilizar el lenguaje de programación C, que es el que más domino. Además, me parece muy interesante, con 6 partes diferenciadas de forma clara que deberías comprender. No obstante, para otros lenguajes es algo parecido, solo que se usaría otra sintaxis.

Y es que, un lenguaje de programación no es muy diferente al lenguaje humano, ya que también cuenta con una estructura definida, unas palabras que se pueden usar, una sintaxis, etc. Pero veamos en qué consiste este formato:

Estructura Básica del Programa C

SecciónDescripción
DocumentaciónSuele ir al comienzo, aunque no en todos los códigos fuente se hace por malas prácticas. Pero debería describir qué es lo que hace ese código fuente e incluso tener información del programador, fecha de creación, etc. Esto se escribe en forma de comentarios. En el ejemplo anterior de código en C sería lo correspondiente a /* Programa Hola Mundo */
EnlaceEn esta parte, que viene justo tras la documentación, se incluyen los archivos de cabecera o bibliotecas que se necesitan para el código fuente que se está escribiendo. De esta forma, cuando se compila o interpreta, se sabe que hay que agregar una copia de los archivos de encabezado también para que funcione el programa final. Dicho de otro modo, se han usado funciones que están descritas en esos archivos. Por tanto, para que se puedan ejecutar adecuadamente se necesita el código correspondiente. Es como usar bloques de construcción prefabricados, facilitando la labor del programador para que no tenga que escribir desde cero un código. Por ejemplo, prinft es una función que imprime texto en pantalla, pero prinft a su vez está definida y escrita con un código fuente que está presente en stdio.h, en este caso. Por eso verás la línea:
#include<stdio.h>
DefiniciónEn algunos casos, no en todos, se necesita también una directiva de preprocesador, que contiene constantes simbólicas. Por ejemplo: #define nos permite usar constantes en nuestro código. Reemplaza todas las constantes con su valor en el código. En el caso del ejemplo de Hola Mundo no es necesario y no está presente, pero en otros códigos sí que suele estar. Por ejemplo:
#define EDAD 8
#define PI 3.1415
En este caso, cada vez que el programador use EDAD a lo largo del código se interpretará como la constante con valor 8. En el segundo caso se define el valor constante del número PI.
Declaración globalIncluye declaración de variables globales, declaraciones de funciones, variables globales estáticas y funciones. Esto tampoco está presente en el ejemplo de Hola Mundo, pero que también puede aparecer en otros casos. Por ejemplo:
#include <stdio.h>
 
int x = 5; //Variable global
int main() {
 
      int y = 10; //Variable local
    return 0;
}
Como puedes ver, x se define como una variable global, concretamente con el valor entero 5 en este caso.
Función principalPara cada programa en C, la ejecución comienza desde la función main() . Es obligatorio incluir una función main() en cada programa C. A veces la puedes ver como int main() o incluso como void main(), etc.

Esta función principal es como cualquier otra función, también toma argumentos y devuelve un valor. Indicará que ahí es donde el programa comienza a ejecutarse. Y cuando se devuelve algún valor de main(), se entregará al sistema operativo.

void main() indica que la función main() no devolverá ningún valor, pero int main() indica que main() puede devolver datos de tipo entero. Cuando nuestro programa es simple y no va a terminar antes de llegar a la última línea del código, o el código está libre de errores, entonces podemos usar void main(). Pero si queremos terminar el programa usando el método exit(), entonces tenemos que devolver algunos valores enteros (cero o distinto de cero). En esa situación, void main() no funcionará. Por lo tanto, es una buena práctica usar int main().

También habrás visto en algunos casos cosas como int main(int argc, char **argv) o similares. En este caso se agregan argumentos dentro de los paréntesis para pasarlos al momento de ejecución. Es decir, los argumentos que se usarán en la línea de comandos al ejecutar el programa, como los que usas con los comandos habituales. Por ejemplo:

#include <stdio.h> main(argc, argv)
int argc;
char *argv[];
{
if(argc!=2) { printf(«Ha olvidado su nombre.\n»);
exit(1);
}
printf(«Hola %s», argv[1]);
}

Al compilar este código fuente y al ejecutarlo, lo que hará es devolver Hola seguido del nombre que uses tras el comando. Si lo compilamos como «name», en la CLI podemos usar el comando:

name Pepito

Y el resultado será que no sdevuelve el mensaje:

Hola Pepito

Al haberle pasado ese argumento…
SubprogramasIncluye todas las funciones definidas por el usuario. Puedes observar multitud de funciones muy diversas, según el propósito del programa. Y pueden estar desordenadas, sin seguir el orden lógico de ejecución. Además, nos podemos encontrar con uno o más bloques, cada uno con un propósito determinado.
Todo esto es opcional, ya que la única función obligatoria es main() en todo caso, que es la que indicará por dónde comenzar.

Conclusión

Como puedes apreciar, la estructura de un código fuente en C no es nada compleja. Se entiende fácilmente, pero si no aprendes esto antes de ponerte a crear tus primeros programas y te limitas como hacen muchos, simplemente a usar estas partes porque las ves en otros ejemplos sin más, al final no sabrás bien qué es lo que estás haciendo.

Jaime Herrera

Jaime Herrera

Técnico electrónico y experto en el sector de los semiconductores y el hardware. Con una amplia y sólida trayectoria en el campo de la electrónica, he acumulado una extensa experiencia. Mi pasión por la tecnología y la informática me ha impulsado a dedicar décadas de mi vida al estudio y desarrollo de soluciones en este fascinante sector. Como técnico electrónico, he tenido el privilegio de trabajar en una variedad de proyectos y desafíos, lo que me ha permitido adquirir un profundo conocimiento y experiencia en la creación, diseño y mantenimiento de dispositivos electrónicos.

>
Guía Hardware
Logo