En un comienzo, hemos definido el software como las instrucciones necesarias para que una máquina computacional realice un trabajo. Pero para ello, es necesario contar con una forma de expresar dichas instrucciones.
Piense en el software como una receta para cocinar un plato de comida o como un manual de instrucciones para armar un set de LEGO, un mueble o cualquier otra cosa. Normalmente, estos ejemplos tienen como objetivo guiarnos en el proceso, asegurando que, como usuarios del manual, podamos llevar a cabo el proceso con éxito.
Para ello quien desarrolla el manual o receta, normalmente hace uso de un lenguaje y usa este para definir el proceso, a este conjunto es a lo que nos referimos con “Código Fuente”, es en esencia el elemento que trabaja principalmente el desarrollador.
Programación
La Programación es la actividad donde haciendo uso de un lenguaje, el desarrollador define los procedimientos que la maquina va a desempeñar, inicialmente se ha de entender que la maquina entiende su propio lenguaje, lo que se podría comprender como lenguaje binario, esto debido a la propia naturaleza de la maquina. No es necesario comprender a profundidad esto, pero si es importante tener en cuenta que, la maquina, directamente solo usa el lenguaje maquina y existen diversos métodos para lograr que un humano ingrese instrucciones a una.

Un lenguaje de programación es un medio y una herramienta, que existe para la construcción de software, y propone una serie de elementos que le conforman, así como en el español o el ingles, este “lenguaje”, tiene una estructura, normas, y elementos especiales, ademas, este viene acompañado de un ecosistema adyacente, el cual define un contexto aun mas especifico para las soluciones posibles que puedan devenir de este lenguaje, llámese filosofía, propósito, orientación o contexto.
Tenga en cuenta que en en general, en un lenguaje de programación debemos entender:
- Su estructura.
- Instrucciones primitivas.
- Elementos de control.
- Método de ejecución (sea compilado o interpretado)
- Sus mecanismos de gestión de software.
Código Fuente
Anteriormente hemos hablado las generalidades de un lenguaje de programación, sin embargo, al igual que el español por si solo no crea una novela, un lenguaje de programación, por si mismo, no construye un software, acá es fundamental la capacidad de creatividad humana, para traducir una serie de instrucciones en una obra completa.
Un código fuente es el conjunto concreto de instrucciones dadas a una maquina de computo para que estas sean ejecutadas en un proceso, y teniendo en cuenta lo anterior, cada lenguaje tiene la libertad de definir la estructura para el código que se desarrolle, es común que este se divida en tres secciones principales.
- Definiciones
- Funciones e importaciones
- Ejecución Principal
Estructuras
La sección de definiciones, tiene como objetivo proporcionar al programa ciertos datos que sirven a modo de contexto o referencia, similar, como al comienzo de este articulo, partimos de la definición de algunos conceptos. En el software es similar, si se desea realizar procesos que involucren cálculos matemáticos es común definir constantes como, por ejemplo, π (PI), esto no solo facilita la legibilidad del código, igualmente facilita su mantenimiento.
De igual forma, es común que los lenguajes de programación, establezcan sus propios conceptos. Sin embargo, en este contexto, las definiciones en los lenguajes suelen estar relacionados con características intrínsecas a gestión de memoria, o a la gestión de la maquina de destino.
La sección de importaciones, es una característica central, fundamental o crucial, en la mayoría de los lenguajes de programación. Aunque la metodología puede cambiar considerablemente entre lenguajes, en términos generales, esta, permite organizar el propósito principal del código trabajado, facilitando la integración de diversas funcionalidades propuestas por el lenguaje, por terceros o propias. Estas, llamadas librerías, las cuales son un conjunto de funciones de trabajo externo al código en el que se está, que para el contexto de este momento definiremos como una unidad de código que realiza un proceso de computo concreto. (mas adelante definiré con rigor esta unidad.)
Las secciones anteriores proporcionan un contexto que tiene como finalidad brindar de usabilidad a la sección de ejecución, esta sección, ejecuta las definiciones y funcionalidades, en el ejemplo del manual para la construcción de un set de LEGO, primero, el manual nos indica las piezas, paulatinamente indica como construir ciertas secciones independientes, hasta que llega el momento donde esas secciones construidas previamente se integran entre si, para conformar la pieza principal, de esta manera finalizando todo el proceso.
En el software, a esta ultima sección comúnmente se le conoce como punto de entrada al programa, pues es acá donde la maquina comienza a ejecutar el código.
Primitivas
Anteriormente hemos hablado sobre las secciones comunes, y como un lenguaje tiene la libertad de proponer ciertos aspectos, a esto es a lo que nos referimos como Instrucciones Primitivas, normalmente estas, son fundamentales, e intrínsecas al contexto de la maquina, por ejemplo para el lenguaje, es importante gestionar la arquitectura de la unidad de computo (CPU), ya que cada variante tiene aspectos que difieren entre si, de igual manera cuestiones como las estructuras de datos básicas, llámese el numero entero, dependen de como el lenguaje lo gestiona a bajo nivel.
En el desarrollo de software, es común hablar de niveles. De manera general, nos referimos a la proximidad conceptual con la máquina. Un nivel bajo indica que estamos más cerca de la forma en que la máquina entiende o ejecuta las instrucciones. En contraste, un nivel alto implica una mayor abstracción, donde el programador trabaja con conceptos más cercanos a su lógica y menos relacionados directamente con el hardware.
Un ejemplo claro de esto se puede observar en los lenguajes de programación. En los lenguajes de bajo nivel, las definiciones y los procesos están estrechamente vinculados con la máquina, lo que requiere que el desarrollador tenga un conocimiento más profundo del hardware. Por otro lado, en los lenguajes de alto nivel, muchas de estas definiciones ya vienen preestablecidas, permitiendo al programador trabajar con herramientas más complejas y abstraídas.
Un ejemplo de esto lo encontramos al comparar los lenguajes Assembly y Python. En Assembly, un lenguaje de bajo nivel, el programador debe gestionar detalles como la manipulación directa de registros y la gestión explícita de memoria, lo que requiere un conocimiento profundo de la arquitectura de la máquina. Un ejemplo simple de código en Assembly para sumar dos números podría verse así:
MOV AX, 5 ; Carga el valor 5 en el registro AX
MOV BX, 10 ; Carga el valor 10 en el registro BX
ADD AX, BX ; Suma el valor de BX al registro AX (AX = AX + BX)
En cambio, en Python, un lenguaje de alto nivel, estas complejidades son gestionadas automáticamente, y el programador puede centrarse directamente en la lógica del problema sin preocuparse por la interacción con el hardware. El mismo proceso de sumar dos números en Python se vería de la siguiente manera:
a = 5
b = 10
resultado = a + b
Como podemos ver, en Python el código es mucho más cercano al lenguaje humano, ya que la abstracción de los detalles de la máquina está mucho más presente. Esto permite al desarrollador enfocarse en resolver problemas de manera más eficiente y con menor esfuerzo.
Control de flujo
En un código fuente encontramos un flujo de datos, anteriormente he hablado sobre el punto de partida, imagine este flujo como el camino que tiene en un laberinto circular desde la entrada, hasta el centro, este camino puede cambiar por diversas circunstancias, estas están vinculadas a las instrucciones primitivas que el lenguaje brinda, así como las instrucciones complejas que el desarrollador pueda construir.
Condicionales
En el código, podemos evaluar ciertas condiciones que nos permiten definir el flujo del programa. A esto le llamamos condicionales. Estas evaluaciones proporcionan una interfaz lógica que le da al programa la capacidad de tomar decisiones en función de ciertos criterios o circunstancias.
Las estructuras condicionales permiten que el programa ejecute diferentes bloques de código según si una condición específica es verdadera o falsa. Esto es esencial para que el software pueda adaptarse a distintas situaciones y comportamientos.
Por ejemplo, en muchos lenguajes de programación, utilizamos el if (si) para evaluar una condición y decidir si un bloque de código debe ejecutarse.
Ciclos
Así como existen los condicionales, también tenemos los ciclos repetitivos, estos se construyen partiendo del elemento condicional, dada una condición, se realiza un proceso hasta que dicha condición cambie, comúnmente hablamos de los ciclos for y while, sin embargo en lenguajes de alto nivel podemos encontrar otro tipo de ciclos, que en esencia se construyen partiendo de estos principales. En lenguajes de bajo nivel, los ciclos, son representados como saltos, sin embargo en la actualidad no es muy recomendable definir saltos que no sean condicionales, dadas las posibilidades de hacer un código de menor legibilidad y abierto a cometer errores, lo que se le ha llamado código spaghetti.
Control
Los elementos de control son ciertas instrucciones que, permiten cambiar el flujo indistintamente de los controles condicionales, asi como suelen estar directamente relacionados con el lenguaje, no todos tienen los mismos, un ejemplo de esto es el elemento return, el cual es usado como instrucción de salida de una función, algunos lenguajes exigen su uso o requieren de ciertos detalles para su uso, de la misma manera, existen break, continue y algunos mas, estrechamente relacionados con el lenguaje que los implementa.
Métodos de Ejecución
Hemos hablado de las partes que componen un código fuente, de como el lenguaje propone algunas características que dan forma al código, y como este tiene una estrecha relación con la maquina, así como a groso modo he comentado que el lenguaje viene acompañado de un ecosistema el cual propone ciertas características ya no tan profundamente relacionadas a la maquina, sin embargo en el mundo de los lenguajes de programación, encontramos dos grupos que fundamentalmente definen la forma en la que usamos nuestro código, el primero, el grupo de los programas compilados, y el grupo de los programas interpretados siendo este segundo respectivamente.
Normalmente hacemos referencia a un lenguaje compilado, cuando el código construido, pasa por una serie de transformaciones previas, para que pueda ser usado directamente por la maquina, anteriormente comenté que una maquina solo usa y entiende el lenguaje de maquina, sin embargo existen métodos para que un código llegue a ser este lenguaje, esto hablando de los lenguajes tradicionalmente compilados, los cuales se convierten a esta forma binaria y que dicho proceso esta estrechamente relacionado a la maquina, sistema operativo, o ecosistema, sin embargo en la actualidad existen otro tipo de lenguajes compilados, los cuales pasan de un lenguaje a otro que no necesariamente es el lenguaje binario, pero que dichas transformaciones, brindan optimizaciones para cuando sean interpretados.
Cuando hablamos de interpretar, nos referimos a, cuando un programa de la maquina, toma un código no binario y lee las instrucciones dadas en este, este programa, comúnmente de le llama motor, y en su mayoría a estos lenguajes interpretados también llamados lenguajes de Scripting, se benefician de no tener que definir conceptos inherentes al arranque del sistema, permitiendo al desarrollador centrar sus esfuerzos en la manipulación del ecosistema existente.
Ejemplos sobre lo anterior serian los lenguajes C o Assembly, donde estos lenguajes, pasan por una transformación cuyo resultado es el llamado binario, este binario puede ser por ejemplo el sistema operativo de una computadora, o el programa para la gestión de la red de internet en la maquina, un programa para la administración de un dispositivo de hardware, o el navegador web, este ultimo puede entenderse también como el motor, que interpreta otros lenguajes, como lo serian JavaScript, el cual es un lenguaje interpretado al momento de cargar un sitio web.
