Ciertamente esta es una de las preguntas que mĆ”s llega a mi bandeja de entrada al momento de hablar de programación. Si vamos a comenzar una serie de artĆculos que les permitan aprender a programar y devolver el conocimiento gratuito en forma de contribuciones a comunidades de software libre/open source en el mundo, es necesario responder a esta bĆ”sica aunque un poco difĆcil pregunta. ĀæQuĆ© lenguaje de programación debo aprender?
Un poco de historia
Para poder empezar a comprender y elegir un lenguaje de programación, primero debemos conocer un poco sobre la historia de los mismos, sus usos y funciones, y cómo resuelven distintas necesidades a lo largo del tiempo.
Lenguajes de mƔquina (bajo nivel)
Conocidos comunmente como Assembly, son lenguajes de programación que podrĆamos definir como dialectos de un idioma mĆ”s general⦠Esto suena un poco complicado pero lo voy a ejemplificar⦠Sabemos que el lenguaje universal de la computación es la electricidad, esto quiere decir que en Ćŗltima instancia lo que una computadora lee sonĀ 0s yĀ 1s, vamos a denominar esto como espaƱol de computadora. En este ejemplo, el espaƱol es la regla bĆ”sica, pero como bien sabemos, no es lo mismo el espaƱol que hablan los latinos al hablado en EspaƱa, e incluso asĆ, no es lo mismo el espaƱol de PerĆŗ con el espaƱol de Argentina. Evidentemente todos tenemos casi las mismas palabras (0s yĀ 1s), mas el uso y significado pueden variar de acuerdo al contexto.
Esto sucede a nivel de procesador. Cuando hablamos de arquitecturas de computación,Ā (amd64, intel, arm,ā¦) nos referimos al dialecto de eseĀ espaƱol de computadora. Esto se debe a que diversas empresas entienden el orden y significado a su manera, por lo que algunos varian en detalles como el flujo de la corriente, o el orden con el que se van a guardar losĀ 0s yĀ 1s.
Estos lenguajes de programación son sumamente veloces, puesto que trabajan al nivel mĆ”s bajo posible de programación, pero son sumamente dependientes de la arquitectura y ciertamente son un poco mĆ”s complicados de aprender que el resto. Estos suelen requerir de una base mĆ”s amplia de conceptos para poder transformar la data y poder ejecutar cosas Ćŗtiles en ellas. Para los amantes de los videojuegos, un ejemplo serĆan las consolas SEGA, las cuales utilizaban Assembly para programar sus juegos. Evidentemente en esa Ć©poca la cantidad de memoria era mĆnima comparada con hoy, y era necesario dominar un lenguaje que pudiera ser veloz y producir programas ligeros.
Lenguajes de alto nivel
Este gran grupo contempla aquellos lenguajes que vinieron después de Assembly. La necesidad de obtener codigo portable hizo que surgiera un grupo de lenguajes denominados compilados. Entre estos el primero en tomar ventaja fue C, el cual ha tenido predominancia en la programación a nivel de sistema operativo desde los 70s.
Lenguajes compilados
Vamos a ver un ejemplo prĆ”ctico de lo que comento. Veamos un programa muy simple en lenguaje C que imprime una lĆnea de código.
DiseƱo propio. Christopher DĆaz Riveros
Tras compilarlo tenemos lo siguiente:
DiseƱo propio.Christopher DĆaz Riveros
Pero ahora veamos lo que tendrĆamos que escribir para replicar el mismo resultado en código Assembly:
DiseƱo propio. Christopher DĆaz Riveros
Esta es la traducción de nuestras 3 lĆneas de código deĀ simple.c, el archivoĀ simple.sĀ es creado mediante el comandoĀ gcc -S simple.cĀ y es lo que entenderĆa nuestro procesador en un dialecto Assembly. Evidentemente para poder crear un ejecutable que conste deĀ 0s yĀ 1s es necesario procesar el archivoĀ simple.sĀ y conectarlo con las bibliotecas compartidas de nuestro sistema. Esto se hace mediante un ensamblador (as)Ā y unĀ conectorĀ (ld).
Los lenguajes compilados brindan una gran ventaja sobre los de bajo nivel, sonĀ portables. La portabilidad entrega código que puede ser ejecutado en distintos procesadores sin la necesidad de generar código especĆfico para cada arquitectura. Otra ventaja evidente es la simplicidad que emplea al momento de leer y escribir código. Dentro de sus principales desventajas tenemos una elevada complejidad, puesto que comparado con el siguiente tipo de lenguajes que veremos, la libertad que brinda C puede ser perjudicial si no se sabe controlar, ciertamente es como entregar una pistola, podrĆa suceder que en la falta de experiencia una persona termine disparando a su propio pie en el intento de limpiar el arma.
Lenguajes interpretados
Dentro de este grupo tenemos una gran variedad de lenguajes, entre los mĆ”s importantes contamos Python, Ruby, Javascript, PHP, etc⦠La idea bĆ”sica de estos lenguajes es brindar una forma rĆ”pida de creación y ejecución de programas, esto se debe a que muchos de los procesos difĆciles son llevados a cabo en el intĆ©rprete, y la programación de la lógica es la que se implementa en el código. Veamos el mismo ejemplo anterior pero esta vez escrito en Python:
DiseƱo propio. Christopher DĆaz Riveros
Dentro de las cosas mĆ”s resaltantes podemos ver que la primer lĆnea se encarga de llamar al intĆ©rprete ( el programa que va a ejecutar nuestra aplicación) y el subsiguiente código es mĆ”s Ā«simpleĀ» que su versión en C, puesto que todo el trabajo pesado se realiza en el intĆ©rprete.
DiseƱo propio. Christopher DĆaz Riveros
Los lenguajes interpretados brindan al desarrollador una capa de seguridad mayor, puestoĀ Ā cuentan con controles de seguridad mĆ”s rigurosos (OJO que no son perfectas, puesto que hasta los mejores pueden cometer errores) y ya no sufrimos el riesgo de disparar un arma sin darnos cuenta, puesto que al primer intento, el intĆ©rprete soltarĆa una alerta y se cancelarĆa la ejecución. La principal desventaja se hace evidente al momento de ejecutar el programa, puesto que este es mĆ”s lento que su contraparte binaria, esto precisamente debido a la mayor cantidad de procesamiento para poder asegurar que el código funciona. Si el programa no requiere de plazos extremadamente cortos, la diferencia puede pasar desapercibida, pero si hablamos de miles o millones de datos por segundo, la diferencia se hace exponencialmente notable en los lenguajes compilados.
Tipado
Esta es una caracterĆscia de los lenguajes de programación, estos pueden serĀ fuertementeĀ oĀ dĆ©bilmente tipados. Este tema lo voy a dejar para otro post, puesto que es necesario y curioso entender cómo se almacena la memoria en un programa, pero por ahora solo necesitamos hacer la distincion: Los lenguajes fuertemente tipados son aquellos que requieren conocer el tipo de dato que va a trabajarse en una variable o constante, mientras que losĀ dĆ©bilmente tipados pueden realizar conversiones de maneraĀ implĆcita y todo dependerĆ” de una jerarquĆa de conversión seguida por el lenguaje. (si no se entiende ahora, no hay problema, lo dejaremos para despuĆ©s)
Paradigmas
Al igual que todo en el mundo GNU/Linux, los lenguajes de programación se basan de acuerdo a paradigmas, y se generan comunidades en torno a estos. Por ejemplo tenemos la Fundación Python o Ruby o PHP o Bash (en cuyo caso es la comunidad GNU). A lo que quiero llegar con esto es que no puedo expresar la gran cantidad de pros y contras que tiene cada uno, pero si puedo decirles que donde existe un lenguaje de programación libre, existe una comunidad donde aprender y participar. Vale la pena mencionar que muchos si es que no son todos los intérpretes de lenguajes estÔn escritos en C, o algún derivado cercano, y el desarrollo de los mismos suele llevarse a cabo por un grupo mÔs reducido de la comunidad, quienes se encargan de tomar decisiones que afectarÔn a todos los usuarios del lenguaje. Pueden incluso formarse instituciones que velen por el desarrollo correcto del lenguaje, como es el caso de C.
¿CuÔl elegir?
Ya hemos hablado bastante sobre los lenguajes y todavĆa no respondo a lo mĆ”s importante ļ . Pero espero que tras haber revisado este pequeƱo artĆculo no sea necesario que sea yo mismo quien te diga quĆ© lenguaje elegir, puesto que con esta información estĆ”s en toda la capacidad de buscar uno que te genere curiosidad. Evidentemente si deseas aprender a programar en un lenguaje AssemblyĀ requerirĆ”s de bastante tiempo antes de poder tener algo funcional, el tiempo se reducirĆ” bastante si optas por un lenguaje compilado, donde ademĆ”s de contar con la portabilidad en sistemas *NIX, podrĆ”s aprender información referente a el funcionamiento del mismo sistema, puesto que estar en contacto con C o derivados te hace de una manera u otra aprender cómo funciona de manera general un sistema operativo. Por Ćŗltimo, si lo que quieres es aprender algo ligero y que te permita hacer mucho sin la necesidad de comprender mucho, los lenguajes interpretados son una manera entretenida de aprender y desarrollar habilidades de programación.
Aprende con algo emocionante
Este es el mejor consejo que puedo darles, si quieren aprender algo, es necesario encontrar algo apasionante primero, sino serĆ” bastante difĆcil sobrepasar la curva de aprendizaje tĆpica de todo lenguaje de programación. Supongamos que administran sistemas, en ese caso tal vez sea necesario aprender un lenguaje ideal paraĀ scriptingĀ (interpretado), dentro de estos contamos con Perl, Python, Bash, etc etc⦠Tal vez lo tuyo son los juegos, existen muchos proyectos en lenguajes como Javascript, Lua, C++, dependiendo del tipo de juego que desees realizar. Tal vez te gustarĆa crear una herramienta a nivel de sistema, pues tenemos C, Python, Perl, como verĆ”s algunos se repiten, y esto es debido a que muchos lenguajes pueden ser utilizados para muchas tareas, por eso la definición deĀ lenguajes multipropósitosĀ en la mayorĆa de estos.
Comienza un proyecto
Con esto no me refiero a que crees el siguiente compilador, o incluso el siguiente lenguaje de programación, un proyecto puede ser arreglar un pequeño bug en tu programa favorito, tal vez incluso ayudar a mejorar la documentación. ¿Por qué la documentación? porque no hay mejor forma de aprender cómo funciona el software que leyendo y ayudando a escribir su documentación, porque luego del código fuente, es la mayor fuente de información que se va a encontrar sobre el programa. En otro momento veremos cómo leer el código de un proyecto y entender las funciones y valores que adquieren.
Muchas gracias por haber llegado hasta aquà y como siempre, sus comentarios me ayudan a generar mejor contenido y saber dónde enfocar la atención, Saludos.