{"id":8,"date":"2017-10-17T11:19:29","date_gmt":"2017-10-17T16:19:29","guid":{"rendered":"http:\/\/blogs.gentoo.org\/chrisadr\/?p=8"},"modified":"2019-11-01T03:35:28","modified_gmt":"2019-11-01T08:35:28","slug":"gentoo-por-que-opte-por-compilar-mis-propios-programas","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/chrisadr\/2017\/10\/17\/gentoo-por-que-opte-por-compilar-mis-propios-programas\/","title":{"rendered":"Gentoo: \u00bfPor qu\u00e9 opt\u00e9 por compilar mis propios programas?"},"content":{"rendered":"<p>Bueno, dada la gran acogida de mi anterior post, vengo a contarles un poco m\u00e1s sobre mi distribuci\u00f3n favorita, Gentoo Linux. Prometo que este post tendr\u00e1 informaci\u00f3n entretenida que les ayudar\u00e1 a entender un poco sobre los mitos que surgen frente a la temible <em>compilaci\u00f3n\u00a0<\/em>de software. Tambi\u00e9n prometo que esta informaci\u00f3n ser\u00e1 \u00fatil para la pr\u00f3xima gu\u00eda de instalaci\u00f3n de Gentoo Linux en ~20 pasos (todav\u00eda no los he contado bien, pero creo que son incluso menos). Sin m\u00e1s que aumentar, comencemos:<\/p>\n<h2>\u00bfQu\u00e9 es compilar?<\/h2>\n<p>Es el proceso que realiza un programa (com\u00fanmente llamado compilador) para convertir c\u00f3digo escrito en lenguaje humano (archivos C, C++,etc) en c\u00f3digo entendible para una m\u00e1quina (c\u00f3digo binario). Miremos el siguiente ejemplo:<\/p>\n<figure id=\"attachment_77112\" aria-describedby=\"caption-attachment-77112\" style=\"width: 339px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_001.bmp\"><img loading=\"lazy\" class=\"wp-image-77112 size-full\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_001.bmp\" alt=\"\" width=\"339\" height=\"181\" \/><\/a><figcaption id=\"caption-attachment-77112\" class=\"wp-caption-text\">Dise\u00f1o propio, Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Este es nuestro peque\u00f1o programa en C ( si despu\u00e9s desean otros tutoriales sobre C tambi\u00e9n estar\u00e9 encantado de mostrar lo poco que he aprendido en este tiempo). Ahora veamos c\u00f3mo se ve el resultado despu\u00e9s de compilar.<\/p>\n<figure id=\"attachment_77113\" aria-describedby=\"caption-attachment-77113\" style=\"width: 958px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_002.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77113\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_002.bmp\" alt=\"\" width=\"958\" height=\"704\" \/><\/a><figcaption id=\"caption-attachment-77113\" class=\"wp-caption-text\">Dies\u00f1o propio, Chrirstopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Hermoso, \u00bfno es cierto? :) Esto es lo que nuestra m\u00e1quina entiende para poder escribir ese peque\u00f1o &#8220;Hola&#8221; en nuestra terminal cada vez que se ejecuta el programa.<\/p>\n<h2>El proceso de compilaci\u00f3n:<\/h2>\n<p>Como no sirve de nada tener un programa que imprima un simple &#8220;Hola&#8221; en la pantalla, pues los archivos .c y .h abundan en proyectos (como en todos los lenguajes de programaci\u00f3n). Para poder hacer el proceso de compilaci\u00f3n un poco m\u00e1s sencillo aparecieron nuevas herramientas, la m\u00e1s representativa de todas es el comando\u00a0<em>make<\/em>.<\/p>\n<p><em><code>Make<\/code>\u00a0<\/em>toma un archivo <code>Makefile<\/code> como punto de partida y compila lo necesario para poder crear el ejecutable final, en algunos casos este paso requiere ejecutar un archivo llamado\u00a0<em><code>configure<\/code><\/em> para poder asignar unas cuantas variables necesarias para el compilador para compilar (valga la redundancia) un archivo \u00fatil.<\/p>\n<p>Es por esto que en muchos tutoriales encontraremos los siguientes pasos:<\/p>\n<figure id=\"attachment_77114\" aria-describedby=\"caption-attachment-77114\" style=\"width: 375px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_003.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77114\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_003.bmp\" alt=\"\" width=\"375\" height=\"121\" \/><\/a><figcaption id=\"caption-attachment-77114\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<h2>La magia de .\/configure:<\/h2>\n<p>Para mostrales uno de los secretos m\u00e1s ocultos y entretenidos del c\u00f3digo fuente, iremos al c\u00f3digo fuente de un programa que todos conocemos a la perfecci\u00f3n,\u00a0<em>sudo<\/em>. Primero los pasos de siempre, pero me detendr\u00e9 en <em>.\/configure\u00a0<\/em> para mostrarles algo especial.<\/p>\n<figure id=\"attachment_77116\" aria-describedby=\"caption-attachment-77116\" style=\"width: 287px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_005.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77116\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_005.bmp\" alt=\"\" width=\"287\" height=\"55\" \/><\/a><figcaption id=\"caption-attachment-77116\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Esto nos devolver\u00e1 una larga lista de opciones, entre las cuales les mostrar\u00e9 la que m\u00e1s me llama la atenci\u00f3n.<\/p>\n<figure id=\"attachment_77117\" aria-describedby=\"caption-attachment-77117\" style=\"width: 709px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_006.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77117\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_006.bmp\" alt=\"\" width=\"709\" height=\"417\" \/><\/a><figcaption id=\"caption-attachment-77117\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p><em><code>--with-insults<\/code><\/em>&#8230; como su nombre lo indica, compila sudo con\u00a0<strong>insultos<\/strong> :D es una divertida funcionalidad que permite lanzar un insulto al usuario cada vez que se equivoca en su clave. \u00bfPara qu\u00e9 sirve? pues no hace mucho :P pero deja claro un punto. Existen miles de opciones que no vienen por defento en la mayor\u00eda de distribuciones.<\/p>\n<p>As\u00ed como est\u00e1s, hay muchas otras que tal vez estar\u00e1n activas en distribuciones de c\u00f3digo binario y que nunca utilizar\u00e1s, o habr\u00e1 algunas que necesites, pero no vendr\u00e1n con tu binario distribuido oficial, lo que implica que cada actualizaci\u00f3n ser\u00e1 manual.<\/p>\n<h2>Empieza la diversi\u00f3n en Gentoo:<\/h2>\n<p>Ya hemos visto cu\u00e1ntas opciones podemos estar perdiendo o arrastrando con programas precompilados. Pero ahora vamos a centrarnos un poco en el problema de lo pre-compilado.<\/p>\n<h3>Performance:<\/h3>\n<p>\u00bfAlguno se ha preguntado por qu\u00e9 las m\u00e1quinas nuevas solo se ven un poco m\u00e1s r\u00e1pidas comparadas con otras no tan modernas? Si el procesador es mejor, hay m\u00e1s RAM, todo es mejor, \u00bfpor qu\u00e9 no va m\u00e1s rapido? La respuesta es sencilla&#8230; <em>compilaci\u00f3n.<\/em><\/p>\n<p>Pongamos un ejemplo muy pr\u00e1ctico.<\/p>\n<p>Mis programas son compilados con la opci\u00f3n <em><code>--march=broadwell<\/code>&#8230;\u00a0<\/em>esto es debido a que mi procesador es broadwell (i7 de intel). <strong>\u00bfLa desventaja de esto?<\/strong> ning\u00fan procesador anterior a broadwell es capaz de reconocer este binario<i>. <\/i>En este punto ya deber\u00edas verlo muy claro, si yo compilo con un <em>&#8211;march\u00a0<\/em> espec\u00edfico, todo lo anterior no funcionar\u00e1&#8230; \u00bfentonces c\u00f3mo hacen los paquetes binarios para soportar tantos tipos de hardware? F\u00e1cil, compilan con la menor opci\u00f3n posible :) esto garantiza que todo tipo de hardware va a poder leerlo (al menos por compatibilidad).<\/p>\n<p>El verdadero problema&#8230; si tu usas programas que est\u00e1n compilados para i3&#8230; \u00a1\u00a1Todo el poder de tu i7 ( o sus respectivas analog\u00edas AMD) es desperdiciado!! \u00bf No es eso triste? :(<\/p>\n<h3>Flexibilidad:<\/h3>\n<p>Dado que los desarrolladores de Gentoo son muy inteligentes, todo este proceso de tar, .\/configure, make, etc&#8230; ha sido reemplazado con el poder de <em>Portage<\/em>. Todas estas configuraciones curiosas han pasado a denominarse USE flags, por lo que si tu deseas una configuraci\u00f3n espec\u00edfica, no necesitas entrar al c\u00f3digo fuente, solo configurar la variable. Aqu\u00ed un ejemplo de c\u00f3mo hacerlo con sudo en portage. Primero veremos qu\u00e9 opciones tenemos en nuestra configuraci\u00f3n actual con\u00a0<em>equery<\/em>.<\/p>\n<figure id=\"attachment_77118\" aria-describedby=\"caption-attachment-77118\" style=\"width: 719px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_007.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77118\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_007.bmp\" alt=\"\" width=\"719\" height=\"327\" \/><\/a><figcaption id=\"caption-attachment-77118\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Como podemos ver, las opciones rojas est\u00e1n activadas, las azules no, bueno&#8230; todos pueden leer la leyenda :)<\/p>\n<p>digamos que yo quiero agregar una opci\u00f3n&#8230;<\/p>\n<figure id=\"attachment_77119\" aria-describedby=\"caption-attachment-77119\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_008.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77119\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_008.bmp\" alt=\"\" width=\"800\" height=\"332\" \/><\/a><figcaption id=\"caption-attachment-77119\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Tan sencillo como agregar una l\u00ednea en un archivo llamado\u00a0<em>sudo<\/em>\u00a0(el nombre es referencial) dentro de <em><code>\/etc\/portage\/package.use\/.<\/code> <\/em>Con esto la siguiente vez que instalemos sudo nos dir\u00e1 que se va a recompilar con la opci\u00f3n activada.<\/p>\n<figure id=\"attachment_77120\" aria-describedby=\"caption-attachment-77120\" style=\"width: 822px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_009.bmp\"><img loading=\"lazy\" class=\"size-full wp-image-77120\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2017\/10\/Selection_009.bmp\" alt=\"\" width=\"822\" height=\"220\" \/><\/a><figcaption id=\"caption-attachment-77120\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Si damos, <em>YES<\/em>, todo lo que hay que hacer es esperar un poco y listo :) tan sencillo como esto.<\/p>\n<h2>Consideraciones finales:<\/h2>\n<p>Bueno, ya hemos visto lo sencillo que es manejar funcionalidades extra en Gentoo, lo que nos permite agregar, quitar o modificar opciones dentro de nuestros programas favoritos. Tambi\u00e9n hemos visto c\u00f3mo es que el performance de nuestros programas depende mucho de las variables con las que lo compilemos. Si tienes una m\u00e1quina muy nueva, Gentoo es tu mejor opci\u00f3n. Si tienes una m\u00e1quina muy vieja, Gentoo tambi\u00e9n es tu opci\u00f3n (aunque demore un poco en compilar, los programas finales ser\u00e1n mucho m\u00e1s ligeros).<\/p>\n<p>Dentro de poco estar\u00e9 escribiendo mi gu\u00eda de instalaci\u00f3n de Gentoo, tanto para los amantes de SystemD como para los aventureros por OpenRC (yo uso systemd con GNOME). Por cierto, otra de las grandes ventajas de Gentoo es la posibilidad de\u00a0<strong>elegir<\/strong> todo dentro de tu sistema, y cuando digo todo es\u00a0<strong>TODO<\/strong>.<\/p>\n<p>Saludos,<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bueno, dada la gran acogida de mi anterior post, vengo a contarles un poco m\u00e1s sobre mi distribuci\u00f3n favorita, Gentoo Linux. Prometo que este post tendr\u00e1 informaci\u00f3n entretenida que les ayudar\u00e1 a entender un poco sobre los mitos que surgen frente a la temible compilaci\u00f3n\u00a0de software. Tambi\u00e9n prometo que esta informaci\u00f3n ser\u00e1 \u00fatil para la &hellip; <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2017\/10\/17\/gentoo-por-que-opte-por-compilar-mis-propios-programas\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Gentoo: \u00bfPor qu\u00e9 opt\u00e9 por compilar mis propios programas?<\/span><\/a><\/p>\n","protected":false},"author":169,"featured_media":9,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[3],"jetpack_featured_media_url":"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2017\/10\/wallpaper.png","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/8"}],"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=8"}],"version-history":[{"count":1,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/8\/revisions"}],"predecessor-version":[{"id":10,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/8\/revisions\/10"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media\/9"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media?parent=8"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/categories?post=8"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/tags?post=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}