{"id":102,"date":"2018-01-04T18:44:51","date_gmt":"2018-01-04T23:44:51","guid":{"rendered":"http:\/\/blogs.gentoo.org\/chrisadr\/?p=102"},"modified":"2019-11-01T03:35:27","modified_gmt":"2019-11-01T08:35:27","slug":"eligiendo-tu-primer-lenguaje-de-programacion","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/01\/04\/eligiendo-tu-primer-lenguaje-de-programacion\/","title":{"rendered":"Eligiendo tu primer lenguaje de programaci\u00f3n"},"content":{"rendered":"<p>Ciertamente esta es una de las preguntas que m\u00e1s llega a mi bandeja de entrada al momento de hablar de programaci\u00f3n. Si vamos a comenzar una serie de art\u00edculos 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\u00e1sica aunque un poco dif\u00edcil pregunta. <em>\u00bfQu\u00e9 lenguaje de programaci\u00f3n debo aprender?<\/em><\/p>\n<h1>Un poco de historia<\/h1>\n<p>Para poder empezar a comprender y elegir un lenguaje de programaci\u00f3n, primero debemos conocer un poco sobre la historia de los mismos, sus usos y funciones, y c\u00f3mo resuelven distintas necesidades a lo largo del tiempo.<\/p>\n<h2>Lenguajes de m\u00e1quina (bajo nivel)<\/h2>\n<p>Conocidos comunmente como <em>Assembly<\/em>, son lenguajes de programaci\u00f3n que podr\u00edamos definir como dialectos de un idioma m\u00e1s general&#8230; Esto suena un poco complicado pero lo voy a ejemplificar&#8230; Sabemos que el lenguaje universal de la computaci\u00f3n es la <em>electricidad<\/em>, esto quiere decir que en \u00faltima instancia lo que una computadora lee son\u00a0<code>0<\/code>s y\u00a0<code>1<\/code>s, vamos a denominar esto como <em>e<\/em><em>spa\u00f1ol de computadora<\/em>. En este ejemplo, el espa\u00f1ol es la regla b\u00e1sica, pero como bien sabemos, no es lo mismo el espa\u00f1ol que hablan los latinos al hablado en Espa\u00f1a, e incluso as\u00ed, no es lo mismo el espa\u00f1ol de Per\u00fa con el espa\u00f1ol de Argentina. Evidentemente todos tenemos casi las mismas palabras (<code>0<\/code>s y\u00a0<code>1<\/code>s), mas el uso y significado pueden variar de acuerdo al contexto.<\/p>\n<p>Esto sucede a nivel de procesador. Cuando hablamos de <em>arquitecturas de computaci\u00f3n,<\/em>\u00a0(amd64, intel, arm,&#8230;) nos referimos al dialecto de ese\u00a0<em>espa\u00f1ol de computadora<\/em>. 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\u00a0<code>0<\/code>s y\u00a0<code>1<\/code>s.<\/p>\n<p>Estos lenguajes de programaci\u00f3n son sumamente veloces, puesto que trabajan al nivel m\u00e1s bajo posible de programaci\u00f3n, pero son sumamente dependientes de la arquitectura y ciertamente son un poco m\u00e1s complicados de aprender que el resto. Estos suelen requerir de una base m\u00e1s amplia de conceptos para poder transformar la data y poder ejecutar cosas \u00fatiles en ellas. Para los amantes de los videojuegos, un ejemplo ser\u00edan las consolas SEGA, las cuales utilizaban Assembly para programar sus juegos. Evidentemente en esa \u00e9poca la cantidad de memoria era m\u00ednima comparada con hoy, y era necesario dominar un lenguaje que pudiera ser veloz y producir programas ligeros.<\/p>\n<h2>Lenguajes de alto nivel<\/h2>\n<p>Este gran grupo contempla aquellos lenguajes que vinieron despu\u00e9s de\u00a0<em>Assembly<\/em>. La necesidad de obtener codigo portable hizo que surgiera un grupo de lenguajes denominados\u00a0<em>compilados.<\/em> Entre estos el primero en tomar ventaja fue C, el cual ha tenido predominancia en la programaci\u00f3n a nivel de sistema operativo desde los 70s.<\/p>\n<h3>Lenguajes compilados<\/h3>\n<p>Vamos a ver un ejemplo pr\u00e1ctico de lo que comento. Veamos un programa muy simple en lenguaje C que imprime una l\u00ednea de c\u00f3digo.<\/p>\n<figure id=\"attachment_78247\" aria-describedby=\"caption-attachment-78247\" style=\"width: 420px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-medium wp-image-78247\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-04-17-33-09-420x162.png\" alt=\"\" width=\"420\" height=\"162\" \/><figcaption id=\"caption-attachment-78247\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Tras compilarlo tenemos lo siguiente:<\/p>\n<figure id=\"attachment_78248\" aria-describedby=\"caption-attachment-78248\" style=\"width: 296px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-full wp-image-78248\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-04-17-34-34.png\" alt=\"\" width=\"296\" height=\"107\" \/><figcaption id=\"caption-attachment-78248\" class=\"wp-caption-text\">Dise\u00f1o propio.Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Pero ahora veamos lo que tendr\u00edamos que escribir para replicar el mismo resultado en c\u00f3digo Assembly:<\/p>\n<figure id=\"attachment_78249\" aria-describedby=\"caption-attachment-78249\" style=\"width: 392px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-medium wp-image-78249\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-04-17-36-35-392x400.png\" alt=\"\" width=\"392\" height=\"400\" \/><figcaption id=\"caption-attachment-78249\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Esta es la traducci\u00f3n de nuestras 3 l\u00edneas de c\u00f3digo de\u00a0<code>simple.c<\/code>, el archivo\u00a0<code>simple.s<\/code>\u00a0es creado mediante el comando\u00a0<code>gcc -S simple.c<\/code>\u00a0y es lo que entender\u00eda nuestro procesador en un dialecto <em>Assembly<\/em>. Evidentemente para poder crear un ejecutable que conste de\u00a0<code>0<\/code>s y\u00a0<code>1<\/code>s es necesario procesar el archivo\u00a0<code>simple.s<\/code>\u00a0y conectarlo con las bibliotecas compartidas de nuestro sistema. Esto se hace mediante un <em>ensamblador <\/em>(<code>as<\/code>)<em>\u00a0<\/em>y un\u00a0<em>conector<\/em>\u00a0(<code>ld<\/code>).<\/p>\n<p>Los lenguajes compilados brindan una gran ventaja sobre los de bajo nivel, son\u00a0<em>portables.<\/em> La portabilidad entrega c\u00f3digo que puede ser ejecutado en distintos procesadores sin la necesidad de generar c\u00f3digo espec\u00edfico para cada arquitectura. Otra ventaja evidente es la simplicidad que emplea al momento de leer y escribir c\u00f3digo. 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\u00eda suceder que en la falta de experiencia una persona termine disparando a su propio pie en el intento de limpiar el arma.<\/p>\n<h3>Lenguajes interpretados<\/h3>\n<p>Dentro de este grupo tenemos una gran variedad de lenguajes, entre los m\u00e1s importantes contamos Python, Ruby, Javascript, PHP, etc&#8230; La idea b\u00e1sica de estos lenguajes es brindar una forma r\u00e1pida de creaci\u00f3n y ejecuci\u00f3n de programas, esto se debe a que muchos de los procesos dif\u00edciles son llevados a cabo en el int\u00e9rprete, y la programaci\u00f3n de la l\u00f3gica es la que se implementa en el c\u00f3digo. Veamos el mismo ejemplo anterior pero esta vez escrito en Python:<\/p>\n<figure id=\"attachment_78251\" aria-describedby=\"caption-attachment-78251\" style=\"width: 291px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-full wp-image-78251\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-04-17-54-17.png\" alt=\"\" width=\"291\" height=\"78\" \/><figcaption id=\"caption-attachment-78251\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Dentro de las cosas m\u00e1s resaltantes podemos ver que la primer l\u00ednea se encarga de llamar al int\u00e9rprete ( el programa que va a ejecutar nuestra aplicaci\u00f3n) y el subsiguiente c\u00f3digo es m\u00e1s &#8220;simple&#8221; que su versi\u00f3n en C, puesto que todo el trabajo pesado se realiza en el int\u00e9rprete.<\/p>\n<figure id=\"attachment_78250\" aria-describedby=\"caption-attachment-78250\" style=\"width: 326px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-full wp-image-78250\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-04-17-53-30.png\" alt=\"\" width=\"326\" height=\"86\" \/><figcaption id=\"caption-attachment-78250\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Los lenguajes interpretados brindan al desarrollador una capa de seguridad mayor, puesto\u00a0\u00a0cuentan con controles de seguridad m\u00e1s 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\u00e9rprete soltar\u00eda una alerta y se cancelar\u00eda la ejecuci\u00f3n. La principal desventaja se hace evidente al momento de ejecutar el programa, puesto que este es m\u00e1s lento que su contraparte binaria, esto precisamente debido a la mayor cantidad de procesamiento para poder asegurar que el c\u00f3digo 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.<\/p>\n<h2>Tipado<\/h2>\n<p>Esta es una caracter\u00edscia de los lenguajes de programaci\u00f3n, estos pueden ser\u00a0<em>fuertemente\u00a0<\/em>o\u00a0<em>d\u00e9bilmente<\/em> tipados. Este tema lo voy a dejar para otro post, puesto que es necesario y curioso entender c\u00f3mo 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\u00a0<em>d\u00e9bilmente<\/em> tipados pueden realizar conversiones de manera\u00a0<em>impl\u00edcita<\/em> y todo depender\u00e1 de una jerarqu\u00eda de conversi\u00f3n seguida por el lenguaje. (si no se entiende ahora, no hay problema, lo dejaremos para despu\u00e9s)<\/p>\n<h2>Paradigmas<\/h2>\n<p>Al igual que todo en el mundo GNU\/Linux, los lenguajes de programaci\u00f3n se basan de acuerdo a paradigmas, y se generan comunidades en torno a estos. Por ejemplo tenemos la <a href=\"https:\/\/www.python.org\/\">Fundaci\u00f3n Python<\/a>\u00a0o <a href=\"https:\/\/www.ruby-lang.org\/es\/\">Ruby<\/a>\u00a0o <a href=\"http:\/\/php.net\/\">PHP<\/a>\u00a0o 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\u00f3n libre, existe una comunidad donde aprender y participar. Vale la pena mencionar que muchos si es que no son todos los int\u00e9rpretes de lenguajes est\u00e1n escritos en C, o alg\u00fan derivado cercano, y el desarrollo de los mismos suele llevarse a cabo por un grupo m\u00e1s reducido de la comunidad, quienes se encargan de tomar decisiones que afectar\u00e1n a todos los usuarios del lenguaje. Pueden incluso formarse instituciones que velen por el desarrollo correcto del lenguaje, como es el caso de C.<\/p>\n<h2>\u00bfCu\u00e1l elegir?<\/h2>\n<p>Ya hemos hablado bastante sobre los lenguajes y todav\u00eda no respondo a lo m\u00e1s importante :P . Pero espero que tras haber revisado este peque\u00f1o art\u00edculo no sea necesario que sea yo mismo quien te diga qu\u00e9 lenguaje elegir, puesto que con esta informaci\u00f3n est\u00e1s en toda la capacidad de buscar uno que te genere curiosidad. Evidentemente si deseas aprender a programar en un lenguaje <em>Assembly\u00a0<\/em>requerir\u00e1s de bastante tiempo antes de poder tener algo funcional, el tiempo se reducir\u00e1 bastante si optas por un lenguaje compilado, donde adem\u00e1s de contar con la portabilidad en sistemas *NIX, podr\u00e1s aprender informaci\u00f3n 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\u00f3mo funciona de manera general un sistema operativo. Por \u00faltimo, 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\u00f3n.<\/p>\n<h3>Aprende con algo emocionante<\/h3>\n<p>Este es el mejor consejo que puedo darles, si quieren aprender algo, es necesario encontrar algo apasionante primero, sino ser\u00e1 bastante dif\u00edcil sobrepasar la curva de aprendizaje t\u00edpica de todo lenguaje de programaci\u00f3n. Supongamos que administran sistemas, en ese caso tal vez sea necesario aprender un lenguaje ideal para\u00a0<em>scripting<\/em>\u00a0(interpretado), dentro de estos contamos con Perl, Python, Bash, etc etc&#8230; 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\u00eda crear una herramienta a nivel de sistema, pues tenemos C, Python, Perl, como ver\u00e1s algunos se repiten, y esto es debido a que muchos lenguajes pueden ser utilizados para muchas tareas, por eso la definici\u00f3n de\u00a0<em>lenguajes multiprop\u00f3sitos<\/em>\u00a0en la mayor\u00eda de estos.<\/p>\n<h3>Comienza un proyecto<\/h3>\n<p>Con esto no me refiero a que crees el siguiente compilador, o incluso el siguiente lenguaje de programaci\u00f3n, un proyecto puede ser arreglar un peque\u00f1o bug en tu programa favorito, tal vez incluso ayudar a mejorar la documentaci\u00f3n. \u00bfPor qu\u00e9 la documentaci\u00f3n? porque no hay mejor forma de aprender c\u00f3mo funciona el software que leyendo y ayudando a escribir su documentaci\u00f3n, porque luego del c\u00f3digo fuente, es la mayor fuente de informaci\u00f3n que se va a encontrar sobre el programa. En otro momento veremos c\u00f3mo leer el c\u00f3digo de un proyecto y entender las funciones y valores que adquieren.<\/p>\n<p>Muchas gracias por haber llegado hasta aqu\u00ed y como siempre, sus comentarios me ayudan a generar mejor contenido y saber d\u00f3nde enfocar la atenci\u00f3n, Saludos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ciertamente esta es una de las preguntas que m\u00e1s llega a mi bandeja de entrada al momento de hablar de programaci\u00f3n. Si vamos a comenzar una serie de art\u00edculos 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 &hellip; <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/01\/04\/eligiendo-tu-primer-lenguaje-de-programacion\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Eligiendo tu primer lenguaje de programaci\u00f3n<\/span><\/a><\/p>\n","protected":false},"author":169,"featured_media":104,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[20],"tags":[17],"jetpack_featured_media_url":"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/01\/programming-languages.jpg","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/102"}],"collection":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/comments?post=102"}],"version-history":[{"count":1,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/102\/revisions"}],"predecessor-version":[{"id":105,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/102\/revisions\/105"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media\/104"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media?parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/categories?post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/tags?post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}