tutorial_de_compilacion

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
tutorial_de_compilacion [2022/08/19 19:03] perontutorial_de_compilacion [2024/05/16 16:48] (actual) – [Conclusión] peron
Línea 1: Línea 1:
 ====== Tutorial de compilación ====== ====== Tutorial de compilación ======
  
-Antes de la computación hogareña, los [[pubnix|sistemas multiusuairi@]] constituyeron el principal medio para programar.+Con anterioridad de la [[microcomputadora#microcomputadoras hogareñas|computación hogareña]], los [[pubnix|sistemas multiusuari@]] constituyeron el principal medio para programar.
  
 Por tal motivo, este tutorial te ilustrará con ejemplos básicos cómo se traduce el código fuente de un programa en lenguaje C de alto nivel a un programa ejecutable en este sistema compartido y otros compatibles. Por tal motivo, este tutorial te ilustrará con ejemplos básicos cómo se traduce el código fuente de un programa en lenguaje C de alto nivel a un programa ejecutable en este sistema compartido y otros compatibles.
  
->Este tutorial no es uno de programación, utilizaremos código pre-hecho.+>Este tutorial no es uno de programación, utilizaremos código pre-hecho. Si deseas programar, puedes acceder a [[https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C|Wikilibro de Programación en C]] o [[https://trspos.com/c-programming/|recursos en línea trspos]], entre muchas otras recomendables.
  
 ===== Introducción ===== ===== Introducción =====
Línea 13: Línea 13:
 La diferencia radica en que los lenguajes de alto nivel son //portables//, mientras que los de bajo nivel - además de ser más difíciles de aprender - están imbuidos de las particularidades del microprocesador en donde se ejecutan. Aprender los lenguajes de alto nivel permite escribir programas para múltiples computadoras, que sean -además - más simples de compartir. La diferencia radica en que los lenguajes de alto nivel son //portables//, mientras que los de bajo nivel - además de ser más difíciles de aprender - están imbuidos de las particularidades del microprocesador en donde se ejecutan. Aprender los lenguajes de alto nivel permite escribir programas para múltiples computadoras, que sean -además - más simples de compartir.
  
-El lenguaje C diseñado por Dennis Ritchie (uno de los creadores de Unix) es uno de tales lenguajes de alto nivel, y se revela especialmente útil para la programación portable. Podrás utilizarlo en Texto-plano no sólo para emprender proyectos avanzados, sino también para aprender los pasos fundamentales para opera con lenguajes de alto nivel: su compilación.+El lenguaje C diseñado por Dennis Ritchie (uno de los creadores de Unix) es uno de tales lenguajes de alto nivel, y se revela especialmente útil para la programación portable. Podrás utilizarlo en Texto-plano no sólo para emprender proyectos avanzados, sino también para aprender los pasos fundamentales para operar con lenguajes de alto nivel: lo que llamamos //procesos de la programación//, o - de forma genérica - la //compilación//.
  
 ===Programación === ===Programación ===
Línea 19: Línea 19:
 La programación es un arte. Involucra una serie de procesos mujer/máquina para resolver un problema determinado. La programación es un arte. Involucra una serie de procesos mujer/máquina para resolver un problema determinado.
  
-Consideremos el orden de los procesos de la programación:+Consideremos el orden de los //procesos de la programación//:
  
-**Acción realizada:** **Genera:** |**Opción de CC para detener en este paso:** |+**Acción realizada:** **Genera:** ^**Opción de CC para detener en este paso:** ^
 |//Imaginar// | Percepción de un problema | | |//Imaginar// | Percepción de un problema | |
 |//Considerar un problema __de programación__// |código //in mente// | (esto es Cerebral) | |//Considerar un problema __de programación__// |código //in mente// | (esto es Cerebral) |
Línea 31: Línea 31:
  
  
-Como puede verse, los últimos 4 pasos //maquinales// de la programación con lenguajes de alto nivel son practicados por medio de un **Compilador**, un programa de computadora capaz de traducir el //código fuente// escrito en un lenguaje en otro lenguaje distinto de operación (el //código destino//).+Como puede verse, los últimos 4 pasos //maquinales// de la programación con lenguajes de alto nivel son practicados por medio de un **Compilador**, un programa de computadora capaz de traducir el //código fuente// escrito en un lenguaje en otro lenguaje de operación distinto (el //código destino//).
  
  
-En nuestro sistema compartido utilizaremos el conjunto de compiladores **CC** (puedes también utilizar **GCC**, en [[GNU|GNU/Linux]]). Este super-compilador por línea de comandos es capaz de afrontar en traducir tu código o cualquiera que te hayan compartido.+En nuestro sistema compartido utilizaremos el conjunto de compiladores **CC** (en [[GNU|GNU/Linux]] puedes también utilizar **GCC**). Este super-compilador por línea de comandos es capaz de afrontar en traducir tu código fuente propio bien cualquiera que te hayan compartido.
  
  
 ===== Compilación básica ===== ===== Compilación básica =====
  
-La manera más simple de compilar consiste en llamar a CC es esta manera:+La manera más simple de compilar consiste en llamar a CC, así:
  
 <code bash>cc codigo_fuente.c –o binario_ejecutable</code> <code bash>cc codigo_fuente.c –o binario_ejecutable</code>
  
-De esta manera, CC oficiará de compilador automático, y procesará un fichero de código fuente llamado ''codigo_fuente.c'' para generar como resultado un fichero de destino ejecutable, llamado ''binario_ejecutable''. Si todo va bien, CC será tan parco que no informará nada, simplemente compilará y creará el ejecutable sin más decir.+CC oficiará de compilador automático, y procesará un fichero de código fuente llamado ''codigo_fuente.c'' para generar como resultado un fichero de destino ejecutable, llamado ''binario_ejecutable''. Si todo va bien, CC será tan parco que no informará nada, simplemente compilará y creará el ejecutable sin decir más.
  
 >Incluso es opcional la opción ''-o'' que indica el fichero ejecutable de destino: si no la incluyes , CC almacenará el resultado de la compilación en un fichero ejecutable de nombre llamado genéricamente ''a.out''. >Incluso es opcional la opción ''-o'' que indica el fichero ejecutable de destino: si no la incluyes , CC almacenará el resultado de la compilación en un fichero ejecutable de nombre llamado genéricamente ''a.out''.
Línea 55: Línea 55:
  
 <code bash> <code bash>
-mkdir ~/src/holamundo -p ;+mkdir -p ~/src/holamundo ;
 cd ~/src/holamundo/ cd ~/src/holamundo/
 </code> </code>
Línea 67: Línea 67:
 int main() int main()
 { {
-    printf("Hola Tercer Mundo!");+    printf("Hola Tercer Mundo!\n");
    
     return 0;     return 0;
Línea 92: Línea 92:
 Si bien la compilación automática es sumamente simple y conveniente, ¡no nos muestra los pasos intermedios, y tampoco es tan divertida! Si bien la compilación automática es sumamente simple y conveniente, ¡no nos muestra los pasos intermedios, y tampoco es tan divertida!
  
-¡Aprenderemos, en cambio, los cuatro pasos de la compilación con un juego!+¡Aprendamos, en cambio, los cuatro pasos de la compilación, esta vez compilando un [[juegos|juego]]!
  
 ==== Microtetris ==== ==== Microtetris ====
-Compila manualmente ahora un clon del Tetris.+Compila manualmente ahora un clon del Tetris. 
  
 Crea un directorio de trabajo para el juego: Crea un directorio de trabajo para el juego:
Línea 103: Línea 103:
 ...ya en este directorio, crea el fichero ''[[microtetris.c]]''. El código fuente en lenguaje C requirió un gran trabajo de estudio a un par de programador@s, y ocupa 9,6K. No olvides guardarlo y volver al shell. ...ya en este directorio, crea el fichero ''[[microtetris.c]]''. El código fuente en lenguaje C requirió un gran trabajo de estudio a un par de programador@s, y ocupa 9,6K. No olvides guardarlo y volver al shell.
  
-Ahora compila, pero siguiendo los 4 pasos maquinales de la compilación manual:+Ahora compila siguiendo los 4 pasos maquinales de la compilación manual:
  
 === 1. Preprocesar === === 1. Preprocesar ===
 Primero preprocesa este //código fuente// ''microtetris.c'', analizándolo con el //párser// de CC: Primero preprocesa este //código fuente// ''microtetris.c'', analizándolo con el //párser// de CC:
  
-<code bash>cc microtetris.c -E -o microtetris.p</code>+<code bash>cc microtetris.c -E -o microtetris.i</code>
  
-Obtendrás así un fichero de //código fuente preprocesado// de ''microtetris.p'' (en este caso "se inflará" pensando unos 41K). Si deseas curiosear el código preprocesado (o "parseado"), utiliza **cat microtetris.p**.+Obtendrás así un fichero de //código fuente preprocesado// de ''microtetris.i'' (en este caso "se inflará" pensando unos 41K). Si deseas curiosear el código preprocesado (o "parseado"), utiliza **cat microtetris.i**.
  
 === 2. Compilar === === 2. Compilar ===
Línea 159: Línea 159:
 Elimina los ficheros intermedios del proceso de compilación: Elimina los ficheros intermedios del proceso de compilación:
  
-<code bash>rm ~/src/microtetris.~/src/microtetris.s ~/src/microtetris.o</code>+<code bash>rm ~/src/microtetris.~/src/microtetris.s ~/src/microtetris.o</code>
  
 Si lo deseas, también puedes eliminar el código fuente. Si lo deseas, también puedes eliminar el código fuente.
Línea 189: Línea 189:
 === Librerías === === Librerías ===
  
-Muchos programas de cierta entidad suelen hacer uso de //librerías de funciones// (realmente son “bibliotecas”), que contienen ya elementos pre-programados y nos permiten reutilizarlos. Para poder utilizar estas librerías estándar en el sistema es necesario indicárselo a CC con la opción ''-l''+Muchos programas de cierta entidad suelen hacer uso de //librerías de funciones// (realmente son “bibliotecas”), que contienen funciones pre-programadas. Para poder reutilizar estas librerías estándares del sistema es necesario indicarlo a CC con la opción ''-l''
  
-Por ejemplo, si la de un fichero ''programa.c'' requiere que esté instalada la librería ''curses'' o ''ncurses'' en el sistema (la librería se llamará casi con seguridad ''libncurses''), usaríamos.+Por ejemplo, si nuestro fichero ''programa.c'' requiere que esté instalada la librería ''curses'' o ''ncurses'' en el sistema (la librería se llamará casi con seguridad ''libncurses''), utilizarías:
  
 <code bash>cc –c programa.c –lcurses –o programa.o</code> <code bash>cc –c programa.c –lcurses –o programa.o</code>
  
-Si la librería no es una librería estándar en el sistema, sino que pertenece únicamente a nuestro proyecto, podremos indicar la ruta empleando la opción ''-L'' y especificando su ruta:+Si la librería no es una librería estándar del sistema, sino una que pertenece únicamente a nuestro proyecto, podremos indicar la ruta empleando la opción ''-L'' y especificando su ruta:
  
 <code bash>cc –c programa.c –L./libs/librería-programa –o programa.o</code> <code bash>cc –c programa.c –L./libs/librería-programa –o programa.o</code>
- 
-=== Optimizaciones === 
- 
-CC permite optimizar el código generado. Existen 3 etapas de optimización de código objeto: 
- 
-  * ''-O1'' optimizaciones en bloques repetitivos, operaciones con coma flotante, reducción de saltos, optimización de manejo de parámetros en pila, etc. 
-  * ''-O2'' A las optimizaciones de etapa //-O1// suma las mejoras en el abastecimiento de instrucciones al procesador, optimizaciones con respecto al retardo ocasionado al obtener datos del “heap” o de la memoria, etc. 
-  * ''-O3'' A las optimizaciones de etapa //-O2// suma el desenrollado de bucles y otras prestaciones muy vinculadas con el tipo de procesador. 
- 
- 
 ==== Arkurses ==== ==== Arkurses ====
-Sabiendo todo esto, introduce y compila [[arkurses.c|el código fuente de Arkurses]]. Se trata de un clon del juego Arkanoid que utiliza la funciones de las librerías de gráficas de terminal //ncurses// y //panel//.+Sabiendo todo esto, introduce y compila [[arkurses.c|el código fuente de Arkurses]]. Se trata de un clon del juego Arkanoid que utiliza la funciones de las librerías de gráficas de terminal //ncurses// y //panel//. Aprovecharemos para indicar también el comando **time**, que nos indicará el tiempo de procesador requerido por cada tarea de cómputo.
  
 Para afrontar las dificultades indicadas anteriormente, compílalo automáticamente de esta manera: Para afrontar las dificultades indicadas anteriormente, compílalo automáticamente de esta manera:
  
 <code bash> <code bash>
-cc arkurses.c -lpanel -lncurses -o arkurses -Os -march=native+time cc arkurses.c -lpanel -lncurses -o arkurses -Os -march=native
 </code> </code>
  
Línea 221: Línea 211:
 <code bash> <code bash>
 #preprocesa y muestra el código parseado #preprocesa y muestra el código parseado
-cc arkurses.c -E -o arkurses. -march=native ; cat arkurses.;+time cc arkurses.c -E -o arkurses. -march=native ; cat arkurses.;
  
 #compila arkurses.c con sus librerías y muestra el ensamblador resultante: #compila arkurses.c con sus librerías y muestra el ensamblador resultante:
-cc arkurses.c -lpanel -lncurses -Os -S -march=native ; cat arkurses.s ;+time cc arkurses.c -lpanel -lncurses -Os -S -march=native ; cat arkurses.s ;
  
 #ensambla #ensambla
-cc arkurses.s -lpanel -lncurses -c -Os -march=native -o arkurses.o ;+time cc arkurses.s -lpanel -lncurses -c -Os -march=native -o arkurses.o ;
  
 #enlaza todo y crea el binario de salida #enlaza todo y crea el binario de salida
-cc arkurses.o -lpanel -lncurses -o arkurses.out -Os -march=native ;+time cc arkurses.o -lpanel -lncurses -o arkurses.out -Os -march=native ;
  
 #Renombra el fichero de salida de compilación #Renombra el fichero de salida de compilación
Línea 242: Línea 232:
  
 Luego elimina los sobrantes y deja el ejecutable, con Luego elimina los sobrantes y deja el ejecutable, con
-<code bash>rm arkurses.c arkurses.arkurses.s arkurses.o</code>+<code bash>rm arkurses.c arkurses.arkurses.s arkurses.o</code>
 ==== Conclusión ==== ==== Conclusión ====
 +
 +Felicitaciones ¡Ya compilaste tu primer programa en C en texto-plano.xyz! Comparte tu logro con [[gab]]:
 +
 +<code bash>
 +gab -m "¡Acabo de escribir, compilar y ejecutar mi primer programa en C!"
 +</code>
  
 Preprocesar, base para compilar. Compilar, base para ensamblar. Ensamblar, base para enlazar. Y enlazar, base para Ejecutar. Preprocesar, base para compilar. Compilar, base para ensamblar. Ensamblar, base para enlazar. Y enlazar, base para Ejecutar.
  • tutorial_de_compilacion.1660935806.txt.gz
  • Última modificación: 2022/08/19 19:03
  • por peron