{"id":20735,"date":"2016-11-02T09:28:30","date_gmt":"2016-11-02T08:28:30","guid":{"rendered":"https:\/\/www.teldat.com\/sin-categorizar\/20735\/como-se-compila-un-compilador\/"},"modified":"2023-02-21T17:36:45","modified_gmt":"2023-02-21T16:36:45","slug":"como-se-compila-un-compilador","status":"publish","type":"post","link":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/blog\/como-se-compila-un-compilador\/","title":{"rendered":"C\u00f3mo se \u00abcompila\u00bb un compilador"},"content":{"rendered":"<p><strong><span style=\"font-family: Times New Roman; font-size: medium;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-4876\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/ccccc-300x153.png\" alt=\"compilador\" width=\"300\" height=\"153\" title=\"\">A pesar de su importancia y omnipresencia, no es extra\u00f1o que a veces surjan dudas acerca de su naturaleza: <em>\u00bf<\/em><\/span><em><span style=\"font-family: Times New Roman; font-size: medium;\">En qu\u00e9 lenguaje est\u00e1 escrito un compilador? \u00bfC\u00f3mo se compila un compilador? \u00bfPuede un compilador de C estar escrito en C?<\/span><\/em><span style=\"font-family: Times New Roman; font-size: medium;\">Estas tres preguntas, que no se pueden responder por separado, pues est\u00e1n relacionadas entre s\u00ed, no forman (a pesar de las apariencias) una versi\u00f3n moderna del dilema del huevo y la gallina. Veamos por <\/span><span style=\"font-family: Times New Roman; font-size: medium;\">qu\u00e9<\/span><span style=\"font-family: Times New Roman; font-size: medium;\">.<\/span><\/strong><\/p>\n<p><!--more--><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">El compilador es una pieza fundamental en el desarrollo de software. Se encarga de transformar las instrucciones dadas en alg\u00fan lenguaje de programaci\u00f3n (m\u00e1s o menos cercano al lenguaje natural) a instrucciones comprensibles por un computador: el lenguaje m\u00e1quina, formado por unos y ceros, que a su vez es otra abstracci\u00f3n para codificar diferentes tensiones de una se\u00f1al el\u00e9ctrica.<\/span><\/p>\n<h2>En qu\u00e9 lenguaje est\u00e1 escrito un compilador?<\/h2>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Para responder a esta pregunta podemos remontarnos a los albores de las ciencias de la computaci\u00f3n. Fue en 1952 cuando Grace Hopper, una de las mujeres que m\u00e1s contribuy\u00f3 a la inform\u00e1tica, escribi\u00f3 el primer compilador: el sistema A-0. Hopper (a la que por cierto, se debe tambi\u00e9n el origen del t\u00e9rmino a partir de la ya conocida an\u00e9cdota con el Mark I) reuni\u00f3 todas las subrutinas en lenguaje m\u00e1quina que hab\u00eda utilizado a lo largo de los a\u00f1os y las puso en una cinta asociadas a un c\u00f3digo num\u00e9rico. El sistema A-0 pod\u00eda traducir c\u00f3digos simb\u00f3licos matem\u00e1ticos a lenguaje m\u00e1quina haciendo uso de estos c\u00f3digos num\u00e9ricos, buscando en la cinta las subrutinas correspondientes.<\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Si bien esto se corresponde m\u00e1s con la noci\u00f3n actual de enlazador, se considera al sistema A-0 como el primer <\/span><i><span style=\"font-family: Times New Roman; font-size: medium;\">compilador<\/span><\/i><span style=\"font-family: Times New Roman; font-size: medium;\">. Por tanto, en el principio de los tiempos de la computaci\u00f3n, fue un humano quien tuvo que convertir aquellas instrucciones dadas en un lenguaje ajeno al computador, una especie de s\u00edmbolos matem\u00e1ticos, en instrucciones binarias.<\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Conforme la computaci\u00f3n fue avanzando y se volvi\u00f3 m\u00e1s compleja, se hizo uso de las instrucciones en ensamblador, que <\/span><span style=\"font-family: Times New Roman; font-size: medium;\">realizaban <\/span><span style=\"font-family: Times New Roman; font-size: medium;\">un mapeo directo a unas instrucciones en lenguaje m\u00e1quina que pod\u00edan ejecutarse directamente por el procesador.<\/span><\/p>\n<h3>C\u00f3mo se compila un compilador? \u00bfPuede un compilador de C estar escrito en C?<\/h3>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Como hemos comprobado, se puede escribir una versi\u00f3n muy simple de compilador a partir de ensamblador y c\u00f3digo m\u00e1quina. Una vez que se tiene un software<\/span><span style=\"font-family: Times New Roman; font-size: medium;\">\u00a0 <\/span><span style=\"font-family: Times New Roman; font-size: medium;\">capaz de traducir <\/span><i><span style=\"font-family: Times New Roman; font-size: medium;\">algo<\/span><\/i><span style=\"font-family: Times New Roman; font-size: medium;\"> a instrucciones binarias, se puede utilizar para escribir un compilador un poco m\u00e1s sofisticado que el anterior y de nuevo, emplear el segundo para construir un tercero. A este proceso iterativo de construcci\u00f3n de una herramienta a partir de una versi\u00f3n anterior m\u00e1s simple lo llamamos <\/span><i><span style=\"color: #0563c1; font-family: Times New Roman; font-size: medium;\">bootstrapping<\/span><\/i><span style=\"font-family: Times New Roman; font-size: medium;\">. Ese \u201c<\/span><span style=\"font-family: Times New Roman; font-size: medium;\">algo\u201d<\/span><span style=\"font-family: Times New Roman; font-size: medium;\"> puede ser instrucciones en el mismo lenguaje de programaci\u00f3n con el que est\u00e1 construido el compilador, creando uno nuevo autocontenido (<\/span><em><span style=\"font-family: Times New Roman; font-size: medium;\">self-hosting<\/span><\/em><span style=\"font-family: Times New Roman; font-size: medium;\">). As\u00ed est\u00e1 construido, por ejemplo, <\/span><i><span style=\"font-family: Times New Roman; font-size: medium;\">gcc,<\/span><\/i><span style=\"font-family: Times New Roman; font-size: medium;\"> uno de los compiladores m\u00e1s populares de C.<\/span><span style=\"font-family: Times New Roman; font-size: medium;\">\u00a0 <\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Sin embargo, hay disponibles gran cantidad de lenguajes con sus respectivos compiladores que permiten omitir el primer paso de usar directamente ensamblador y c\u00f3digo m\u00e1quina.<\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">En la imagen se muestra un ejemplo simplificado de <\/span><em><span style=\"font-family: Times New Roman; font-size: medium;\">bootstrapping<\/span><\/em><span style=\"font-family: Times New Roman; font-size: medium;\">. Supongamos que se crea un nuevo lenguaje llamado T. Para poder compilarlo, se escribe un compilador para T en otro lenguaje, por ejemplo en C (Tcompiler_c.c). Ahora, se usa alg\u00fan compilador existente de C para compilar Tcompiler_c.c, generando un ejecutable Tcompiler_c. Una vez hecho esto, se puede volver a escribir un nuevo compilador de T, pero ahora usando el propio lenguaje (Tcompiler_t.t). Como ya existe un programa capaz de compilarlo, Tcompiler_c, se utiliza para obtener un nuevo compilador que fue compilado a partir de su propio c\u00f3digo fuente. Se puede repetir este \u00faltimo paso generando cada vez una versi\u00f3n m\u00e1s potente que la anterior.<\/span><\/p>\n<div><\/div>\n<div><\/div>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4875\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/bb-300x214.png\" alt=\"compiler\" width=\"300\" height=\"214\" title=\"\"><\/span><\/p>\n<p><span style=\"font-family: Times New Roman; font-size: medium;\">Los compiladores siguen siendo hoy en d\u00eda herramientas<\/span><span style=\"font-family: Times New Roman; font-size: medium;\">\u00a0 <\/span><span style=\"font-family: Times New Roman; font-size: medium;\">en constante evoluci\u00f3n. De ellos depende, en parte, que el c\u00f3digo objeto que se ejecuta en un procesador est\u00e9 mejor optimizado y sea m\u00e1s eficiente. Por eso, los compiladores representan un recurso fundamental en Teldat, desde su uso hasta su comprensi\u00f3n te\u00f3rica, para desarrollar software embebido de calidad.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A pesar de su importancia y omnipresencia, no es extra\u00f1o que a veces surjan dudas acerca de su naturaleza: \u00bfEn qu\u00e9 lenguaje est\u00e1 escrito un compilador? \u00bfC\u00f3mo se compila un compilador? \u00bfPuede un compilador de C estar escrito en C?Estas tres preguntas, que no se pueden responder por separado, pues est\u00e1n relacionadas entre s\u00ed, no [&hellip;]<\/p>\n","protected":false},"author":159,"featured_media":18780,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1154],"tags":[],"class_list":["post-20735","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tic"],"acf":[],"wpml_current_locale":"es_ES","wpml_translations":[{"locale":"en_US","id":18777,"slug":"compiler-key-element-in-developing-software","post_title":"How to \"compile\" a compiler","href":"https:\/\/teldatnwp-dev.azurewebsites.net\/compiler-key-element-in-developing-software\/"}],"_links":{"self":[{"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/posts\/20735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/users\/159"}],"replies":[{"embeddable":true,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/comments?post=20735"}],"version-history":[{"count":0,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/posts\/20735\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/media\/18780"}],"wp:attachment":[{"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/media?parent=20735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/categories?post=20735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/teldatnwp-dev.azurewebsites.net\/es\/wp-json\/wp\/v2\/tags?post=20735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}