Migración a otros lenguajes de programación Arturo y Carlos
Introducción
¡Sean ustedes bienvenidas y bienvenidos a esta última clase del curso de programación básica! Esperamos que este trayecto en el que hemos aprendido de uso de un lenguaje de programación como el C nos haya enseñado algo muy importante, el reto más grande en aprender a programar se encuentra en entrenarnos en desarrollar un pensamiento lógico que nos permita diseñar algoritmos con los que resolveremos tareas y una vez construida esa estructura mental, la tenemos que codificar de tal manera que un objeto inanimado como lo es una computadora, pueda descifrar nuestras instrucción y ejecutarlas. Eso último lo logramos escribiendo las órdenes en un lenguaje de programación, específicamente lo hicimos en el lenguaje C.
Si lo piensan un poco esto sucede de manera semejante en nuestro cerebro al querernos comunicar con alguien para darle una serie de instrucciones. Primero pensamos muy bien la serie de pasos que queremos que haga la otra persona, luego tenemos que elegir el idioma en el que damos las instrucciones, de nada sirve tener las instrucciones más precisas si nuestro interlocutor no sabe el idioma que hemos elegido, ya que tenemos el idioma apropiado, traducimos nuestras instrucciones a dicho lenguaje y se las damos a nuestro interlocutor.
Los lenguajes de programación tienen una equivalencia muy grande a los leguajes de la comunicación humana, la mayoría de nosotros tiene al español como lengua materna porque la casualidad nos hizo nacer en una familia que hablaba ese idioma, pero si hubiéramos nacido en Brasil habríamos tenido al portugués como lengua materna, Lo mismo pasa con la programación, una componente importante de por qué programamos en uno u otro lenguaje es porque a nuestro al rededor (compañeros de escuela, de trabajo, colegas de investigación, etc.) programan en un lenguaje y para compartir código pues usamos el lenguaje que usa la mayoría. Pero algo que hemos aprendido en este siglo XXI, es que las personas nos podemos comunicar mucho más eficientemente que nunca, y eso implica conocer gente que programa en muchos lenguajes, grupos de trabajo que eligen un leguaje distinto a otros y si queremos colaborar no los queda más que aprender de esa leyenda de la Torre de Babel, donde se hablaban todas las lenguas del mundo.
Un programador eficiente debe generar las habilidades para aprender nuevos lenguajes de programación aceleradamente, de todos los lenguajes de programación que se crean solo algunos pocos sobrevivirán al tiempo y se difundirá su uso, pero a lo largo de la vida profesional de ustedes seguramente verán varios lenguajes fuertemente difundidos y tendrán que aprenderlos. La única certeza que se tiene en programación es que seguramente tendrás que aprender un nuevo lenguaje de programación en tu futuro.
Pues bien, no todo son malas noticias con esto de tener que aprender nuevos lenguajes, una buena noticia es que, si lograste aprender C a la profundidad propuesta en este curso, habrás aprendido uno de los lenguajes más retadores que hay, así que los demás lenguajes serán más fáciles.
En esta clase hemos elegido dos de los lenguajes más difundidos tanto en el área académica como en el área laboral:
- Matlab
- Python
Desarrollaremos a lo largo de la clase un muy resumido tutorial de como escribir código en estos dos lenguajes. ¡Manos a la obra!
Desarrollo del tema
Matlab
Matlab ™ (software desarrollado por la compañía Mathworks) significa Matrix Laboratory (Laboratorio de Matrices) y es un sistema completo de cómputo que tiene un lenguaje de programación que se llama M pero además un ambiente gráfico que permite desarrollar código que muestra resultados gráficos de manera muy sencilla, esto, y que existen bibliotecas (formalmente llamadas Toolboxes) que implementan algoritmos muy específicos y avanzados en temas muy variados, hace de Matlab una herramienta fuertemente usada en el ámbito industrial y académico.
Matlab tiene una GRAN desventaja, el costo del software es MUY elevado, una licencia que incluya a la mayoría de los toolboxes, para fines de lucro, puede costar más de los $10,000 USD. Las licencias para su uso en el área de investigación o docencia baja, pero aún es un precio muy elevado, más comparado con lenguajes como Python, que se enmarcan en licencias de software libre. Las licencias para estudiantes tienen un costo más accesible, tener acceso a Matlab con un grupo razonable de toolboxes para la comunidad estudiantil puede estar dentro del orden de los 100 o 200 dólares norteamericanos.
El lenguaje de Matlab se caracteriza por ser un lenguaje intérprete, orientado a objetos, que maneja de manera nativa las estructuras como las matrices. Una de las grandes ventajas respecto a C, es su gran capacidad de paralelización automática de código, dado que las matrices son las estructuras básicas de las variables, un escalar es una matriz de tamaño 1×1, un vector unidimensional de tamaño N será una matriz de tamaño 1xN o de Nx1, el escalar por defecto en Matlab es un número complejo, así que no tenemos por qué preocuparnos que en algún momento de un cálculo el resultado no sea un número real (cosa impensable en C). Por otro lado, el generar gráficas profesionales es realmente sencillo.
La curva de aprendizaje (una gráfica que en el eje de las x´s tiene el tiempo de aprendizaje y en el eje de las y’s la sofisticación en la programación) es de un rápido crecimiento en tiempos de aprendizaje cortos; noten que, en C, esta curva es diferente, hay que aprender muchas cosas en C para comenzar a hacer programas muy sencillos y una vez aprendidas entonces la complejidad en resultados aumenta rápido).
Pues bueno comencemos a ver como se programa en Matlab. El que el lenguaje sea intérprete y no compilado, hace que no sea necesario tener un archivo ejecutable para que se pueda correr un programa, sino que cada línea del archivo del programa se lee e interpreta y después se ejecuta, sin preocuparse por cual es la siguiente línea de código que viene, los archivos de programas se les llama scripts (guiones) y como cuando uno lee algo, lo lee renglón por renglón. Este comportamiento facilita enormemente tener herramientas de depuración. Otra característica importante es que no es necesario declarar variables, simplemente se usan y ya. Para arreglos es recomendable localizarlos en memoria, con el tamaño adecuado antes de usarlos, pero no es obligatorio hacerlo.
Una línea de comando también termina con ;, pero su uso tiene un significado MUY diferente, en C, el ; significa fin de comando, en Matlab el ; significa que queremos ejecutar el comando en forma silente, esto quiere decir que no queremos que aparezca el resultado en la consola, si quisiéramos que el resultado se muestre en la consola basta eliminar el ; del final de la línea (recuerde que en C quitar un ; puede generar un error de sintaxis.
A diferencia de C, la generación de un bloque de comandos no es necesario encerrarlo entre llaves, solo es importante usar la palabra reservada end en el lugar donde podríamos el símbolo } en C.
Una diferencia MUY importante que hay que tener en cuenta cuando se programa en Matlab, es que todo arreglo comienza en la posición 1 en vez de la 0, así que el primer elemento de un vector llamado arreglo es arreglo(1).
Los corchetes [] se usan de manera diferente a C, en Matlab se usan para formar objetos, así, construir una matriz se escribe:
Esta línea forma una matriz de 3×3 , las comas dentro de los corchetes indican cambio de columna y los ; significan cambio de renglón.
Las secuencias de control son MUY parecidas a las de C tanto en sintaxis como en uso. Las secuencias de repetición while y do-while también se usan de la misma manera que el C, Existe un cambio importante en el ciclo for, recordemos la sintaxis de C:
for (exp1;cond;exp2)
la exp1 se ejecuta solo la primera vez en la que se ejecuta el for, el ciclo se repetirá mientras cond sea cierto y exp2 se ejecutará cada vez que termina un ciclo de repetición.
En Matlab el ciclo for se repetirá tantas veces como el tamaño de un vector, por ejemplo:
for i=1:10
El ciclo se repetirá tantas veces como elementos diferentes toma i, en este caso en el primer ciclo i=1, en el segundo ciclo i=2 y así sucesivamente hasta llegar a i=10.
Los programas de ejecución son conformados por listados de comandos a los que se les llama scripts, las funciones suelen estar escritas en un archivo independiente cuyo nombre coincida con el nombre de la función, en ambos casos la extensión de los archivos será el .m. Una diferencia muy importante entre Matlab y C en el tema de funciones es que en Matlab no se tiene la restricción que tiene C sobre el regreso de un solo valor por la izquierda. Matlab puede regresar tantos objetos como se deseen, de esta manera el concepto de apuntador no se usa en este contexto.
Un reto muy importante al programar en Matlab es entender el proceso de paralelización que tiene Matlab, por ejemplo, veamos estas líneas de código:
La primera línea de código genera el objeto que es un arreglo de 2×2 de tipo double, la matriz formada es:
En la segunda línea vean que es un producto escalar, la constante pi no es necesario definirla, Matlab tiene determinadas constantes universales, así que ahora A tiene los valores:
¡Vean lo fácil que es operar con matrices! No necesitamos hacer los dos ciclos for anidados que en C no nos salvamos de hacerlo. Pero lo más sorprendente es lo que pasa en la tercera línea. Noten que estamos invocando a una función trigonométrica como el seno pero el argumento no es un escalar, ¡Es una matriz! Piénsenle bien, ¿Qué podrá significar que en vez de poner un ángulo pongo una matriz? Bueno pues ahí Matlab hace lo siguiente: Matlab asume que lo que queremos es aplicar la función seno a cada uno de los elementos de la matriz de forma independiente, y para no perder la posición del elemento evaluado, Matlab regresa una matriz de la misma forma que tiene la matriz A pero con los valores calculados, uno por uno, vean que la tercera línea no tiene el ; final, entonces en la consola veremos:
Ustedes podrán comprobar que, efectivamente, es la evaluación del seno de cada elemento de la matriz A, pero lo sorprendente no termina ahí, como cada evaluación de cada posición es independiente una de otra, Matlab busca los recursos de cómputo que tiene disponible la computadora y manda procesos en paralelo para calcular estos 4 valores al mismo tiempo, así que lo hace mucho más rápido que ir calculando las cosas de uno a la vez.
Entonces, al programar en Matlab, hay que penar como escribir el código para que Matlab pueda hacer esto de paralelizar código, es todo un entrenamiento, pero como habrán visto los primeros pasos son muy sencillos de llevar a cabo para migrar código.
Para más detalles sobre el leguaje M de Matlab pueden consultar:
Y para un curso completo puedes consultar:
Python Python es un lenguaje de programación de código abierto, propósito general, interpretado y orientado a objetos. Su primera versión liberada se remonta a 1991 y actualmente (2023) es uno de los lenguajes más populares a nivel mundial (puede consultar un top 10 de los lenguajes de programación más populares en la siguiente liga.
Python tiene la ventaja de ser mucho más simple de usar que C, dado que C es un lenguaje de bajo nivel de abstracción y Python de alto nivel. Lo cual significa que con C podemos comunicarnos a niveles más cercanos al hardware y con Python con niveles más cercanos al usuario. A continuación se describe cómo definir variables, las estructuras condicionales, y cíclicas en Python.
Definición de Variables
Para definir variables en Python, no debemos ni necesitamos especificar de antemano su tipo de dato, como hacíamos en C. Esto es porque sólo los lenguajes compilados como C o FORTRAN piden la especificación del tipo de dato para cada variable, mientras que los lenguajes interpretados como Python o PHP asignan un tipo de dato adecuado para el valor que se trata de almacenar. Analice el siguiente ejemplo:
En la figura anterior se puede observar que para definir un comentario de única línea utilizaremos el numeral #, similar a la doble diagonal empleado en C. En la línea 2, se asigna una cadena de caracteres a la variable nombre. En C, deberíamos haber guardado dicha cadena en un arreglo de caracteres, de la forma char nombre[] = “Sofía”;. Observe también lo siguiente:
- Después de la asignación no se requiere el punto y coma para finalizar la sentencia.
- No importamos ninguna biblioteca de funciones. En C necesitamos la biblioteca <stdio.h> para mostrar mensajes en pantalla o recibir datos desde teclado. Sin embargo, en Python la función print(…), la función type(…) y otras como id(…) se encuentran disponibles como parte del lenguaje, es decir, no requieren bibliotecas de funciones.
La línea 5 muestra el contenido de la variable nombre. No se requieren especificadores de formato como %s, %d o %f para mostrar los valores de las variables. Estos son automaticamente reconocidos por la función print(…). La función type(…) muestra la salida <class ‘str’> que señala que la variable nombre es un objeto de la clase string. Python, a diferencia de C, sigue un paradigma orientado a objetos. Dicho paradigma es seguido también en el lenguaje C++ y su explicación sale del ámbito de esta clase, pero por ahora basta con saber que los objetos son tipos de datos compuestos, con lo que se pueden realizar operaciones distintas a los tipos de datos primitivos como int, float, char, etc.
La línea 9 reasigna un valor a la variable nombre, pero observe con cuidado que el nuevo valor ya no es una cadena de caracteres, sino un valor flotante (3.1416). Python cambia automáticamente el tipo de dato de la variable nombre para que pase de ser un tipo str a un tipo float. Al verificar en las líneas 12 y 13 observamos que el valor de la variable puede modificarse con operadores aritméticos, algo que sólo puede ocurrir con variables de tipo numéricas.
Estructuras condicionales.
En python existe la estructura if-else tanto en su forma simple como en los diversos anidamientos. Sin embargo, la sintaxis es un poco distinta a C. Veamos el siguiente ejemplo para ilustrar las diferencias.
La estructura condicional IF-ELSE en Python se emplea siguiendo la sintaxis if( EXPRESIÓN LÓGICA ), donde EXPRESIÓN LÓGICA puede ser una o más condiciones que al evaluarse retornen un valor booleano (verdadero o falso). Estas condiciones generalmente evaluadas con operadores relacionales (<,>,>=,<=,==,!=) y/o con operadores lógicos (and, or y not). Observe la línea 8, allí se está evaluando si la edad registrada es mayor o igual a 18. Los dos puntos “:” que siguen al paréntesis de cierre indican que sigue el bloque de instrucciones a ejecutar si la condición es verdadera. Equivaldría a las llaves “{}” empleadas en C. Las líneas 9 y 10 conforman dicho bloque. Sin embargo, es muy importante notar señalar que éstas deben estar indentadas, es decir, debe haber un tabulador de diferencia entre el if y las instrucciones que estarán dentro de él. Esta en una restricción obligatoria en Python, la indentación o alineamiento con tabuladores es la forma en la que el lenguaje ordena jerárquicamente las instrucciones, estructuras, llamadas a función y demás elementos que se encuentran dentro de otros. Omitir la indentación marcará un error de ejecución.
En la línea 11, vemos que para el caso en el que no se cumpla la condición evaluada en if(…), se podrá ejecutar el bloque de instrucciones compuesto por las líneas 12 y 13. Al ejecutar el código, verá la salida que aparece en la parte baja de la figura. Esto es, dado que la edad registrada es de 16 años, la condición de ser mayor a 18 no se cumple y los mensajes que se enviarán a pantalla son los correspondientes al bloque else. Note que para iniciar el bloque, también else requiere los dos puntos “:”. Es importante mencionar que la estructura switch que conocemos en C, no existe en Python. Para poder hacer algo semejante se ocupa definir un bloque con instrucciones if, elif. Para ver un ejemplo de este caso y complementar lo descrito en la sección, puede consutar el siguiente enlace.
Ciclos
Los ciclos en Python son mucho más versátiles que en C. Es decir, pueden implementarse de formas diferentes. Veamos dos de ellas en los siguientes ejemplos.
En la figura anterior definimos un ciclo de forma similar a como lo haríamos en C para calcular la suma de los primeros N números cuadrados. Observemos la línea 3 con atención. La sintaxis de Python para el ciclo for, es muy diferente a la empleada en C. Primero en Python no se ocupan paréntesis para definir los elementos de inicialización, condición de paro e incremento a los que nos acostumbramos al trabajar con C. Luego, la variable que lleva el control de las iteraciones (en este ejemplo, la variable i) no requiere un tipo de dato. La palabra in es un operador asignará cada uno de los valores devueltos por la función range(…). Dicha función regresa una lista de valores 0,1,2,….10. El 11 señalado como límite superior en el ejemplo no se toma. En general, los rangos en Python se manejan de la forma [a,b), es decir, el límite superior de un rago siempre es abierto, excluyendo al último valor.
La siguiente forma de trabajar con ciclos es a través de un iterador. Veamos la siguiente figura.
Podemos observar que la línea 3 define una lista. Las listas en python permiten almacenar diferentes tipos de datos primitivos (int, float, char), cadenas de caracteres, variables, funciones, otras listas o estructuras. Es decir, podemos guardar prácticamente cualquier cosa como elemento de una lista, ya que se guarda la dirección del objeto que representa a cada uno de los elementos mencionados anteriormente. Sí, incluso los tipos de datos primitivos se manejan como objetos en Python.
Una de las formas de usar ciclos consiste en iterar sobre los elementos de un contenedor (listas, diccionario, tupla, conjunto u otro). La línea 7 define un ciclo que recorrerá todos los elementos de la lista llamada colores_y_mas. La variable elemento tomará cada uno de los valores almacenados en la lista y lo conservará durante una iteración del ciclo. Para la primera iteración, el valor asignado será ‘azul’. En la segunda iteración, la variable elemento tomará el segundo valor (‘rojo’) y así sucesivamente hasta llegar al último elemento de la lista. Entonces, el número de elementos en la lista define el número de iteraciones que realizará el ciclo.
¿Qué pasa si queremos manipular el índice de iteración 0,1,2,…N? como lo hacíamos en C. Pues basta anteponer una variable extra al elemento que se asignará con el operador in. Observemos la línea 15. En esta nueva versión del ciclo FOR colocamos dos variables (indice y elemento) separados con una coma. A esta estrategia de recuperar más de un valor como resultado de una llamada a función u operador se el conoce como empacado y desempacado (zip and unzip). La función enumerate(…) asignará un índice, comenzando de 0, a cada uno de los elementos en la lista colores_y_mas. Dichos índices se pasarán uno por uno en cada iteración a la variable indice. Los elementos de la lista se irán asignando en cada iteración como en el FOR explicado anteriormente de la línea 7. Al observar la salida de ambos ciclos, vemos que el primero arroja los elementos de la lista colore_y_mas, mientras que el segundo ciclo FOR, arroja los mismos elementos, pero precedidos por su correspondiente índice.
Existen muchas otras estructuras, operadores, funciones, y elementos del lenguaje de programación Python que analizar. Sin embargo, esperamos que con esta introducción al lenguaje hayas ganado la motivación suficiente para conocer nuevos paradigmas (formas de pensar) en programación tales como el orientado a objetos, el funcional, el lógico y muchos otros que te esperan por descubrir en este basto mundo de la programación.
Conclusión
Cada lenguaje de programación tiene sintaxis y herramientas que facilitan o dificultan desarrollar algoritmos específicos, la elección del lenguaje “correcto” es muy complicada e intervienen factores que se alejan mucho de la parte técnica, como preferencias de grupos de programadores, trabajo previo que se ha codificado en algún lenguaje y que se ha depurado por mucho tiempo, y la migración a otro lenguaje representa un riesgo, la disposición de herramientas de software, etc. Con esta gran cantidad de variables involucradas, la estrategia de conocer, o al menos aprender a programar en distintos lenguajes de programación es fundamental para una persona que se involucra en ambientes donde existen múltiples programadores.
¿Cuál será el nuevo lenguaje que sustituya a los que actualmente están en las manos de todos? No se sabe, pero lo que es un hecho es que con forme pase el tiempo más probable será que llegue un nuevo lenguaje que tengamos que aprender, así que lo mejor que podemos hacer es tener una técnica para aprender a programar rápidamente en lenguajes desconocidos para nosotros.
Fuentes de información
- Referencia técnica oficial del lenguaje de programación Python
- Aspectos fundamentales del lenguaje https://la.mathworks.com/help/matlab/language-fundamentals.html?s_tid=CRUX_lftnav
- Curso de programación en Python, en inglés. https://www.youtube.com/watch?v=nLRL_NcnK-4