No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
16 Hrs
38 Min
23 Seg

¿Qué es un compilador?

8/11
Recursos

Aportes 18

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Jajaja los lengaujes compilados son los favoritos de los programadores xD:
.

.
Yo aprendí con C++ y sé lo duro que es terminar de escribir el código y darle al botón de compilar. Efectivamente al tener un ejecutable en código máquina éste se puede ejecutar sin tener el compilador, sin embargo, si eres el programador, obviamente tienes que tener el compilador para poder compilar tu código jaja.

Hice el hello world en C, en Rust y en Go
la salida lo guarde en un archivo de texto binaryInstructions.txt, usando el comando:
xxd -b hello > binaryInstructions.txt
Los resultados son:
2783 líneas en el binario de C
340547 líneas en el binario de Go
534250 líneas en el binario de Rust

El dump de un archivo siempre va a sacar su representación numérica, puede ser binaria o hexadecimal.
Puede ser un archivo de cualquier tipo, eso incluye imágenes, videos, etc.

No es tan complicado de leer (aunque si hay que saber ciertas cosas para de entender lo que se lee)
En el ejemplo del xxd, la salida que se muestra es:

  • Primer columna: la dirección en memoria dónde se almacena la instrucción, si se dan cuenta los números van de 6 en 6. Solo que en formato hexadecimal.
  • Columnas 2 a la 7: es la representación binaria del valor.
  • Columna 9: es la representación en texto plano del valor.

Es decir la última columna es la versión humanamente legible de lo mismo que hay en binario.

Al tratarse de un archivo binario, por estandar, los primeros caracteres dicen el formato en que se encuentra el archivo, en este caso es ELF (minuto 9:54 del video), que es el formato de archivo ejecutable estandar.

Wikipedia:
"ELF (Executable and Linkable Format) es un formato de archivo para ejecutables, código objeto, bibliotecas compartidas y volcados de memoria. Fue desarrollado por Unix System Laboratories (USL) como parte de la ABI. En principio fue desarrollado para plataformas de 32 bits, a pesar de que hoy en día se usa en gran variedad de sistemas."
https://es.wikipedia.org/wiki/Executable_and_Linkable_Format

El archivo ELF trae información cómo las literales, las instrucciones del programa, comentarios del compilador (por ejemplo el nombre y la versión del compilador utilizada), e información de debug, entre otras cosas.

También es importante destactar que los compiladores generalmente compilan para ejecutables que corren sobre un sistema operativo, por lo que el programa final suele traer, además del código de las librerías utilizadas, llamadas al sistema operativo, que son cómo instrucciones abstractas que el sistema operativo admite para diferentes cosas, cómo comunicar programas entre sí.

En otras palabras, el sistema operativo mismo es una especie de interprete de las instrucciones del bytecode resultante de la compilación.

En otros casos, cómo en el desarrollo de sistemas operativos o simplemente sistemas embebidos, se puede configurar el compilador para que no utilice llamadas al sistema, y evitar usar librerías que las usen, entre otras cosas como tomar el control manual de la memoria, algo que el compilador y el sistema operativo ayudan a hacer, pero que para estos sistemas es necesario deshabilitar, y programar desde cero. Y es de esta última manera que se crean los sistemas de más bajo nivel.

El archivo a.out ya era ejecutable 🤔 los permisos luego del chmod quedaron igual (y el archivo ya estaba en verde), por lo que ese paso se podría omitir.

Este curso es extremadamente espectacular!

El codigo de mi programa en C++/ el .out del compilador

Hilando bien fino, un .EXE de Windows no puede ejecutarse en forma directa, ya que el sistema operativo debe resolver todas las referencias a la memoria que varian de una ejecucion a otra y de equipo en equipo.

O sea, un compilador nunca podra saber que direccion de memoria tendra asigando un programa. Tema distinto cuando las referencias son relativas, como pasaba el los viejos archivos .COM de Windows

Lo que dice el profesor que son “instrucciones binarias” en el minuto 10:20 no es cierto. Cada una de esas no es una instrucción binaria sino un byte. Las instrucciones dependen de la arquitectura de la máquina pero en ningún caso un byte sirve para representar una instrucción. Ya solo el OPCODE puede ocupar, en el mejor de los casos un byte, y solo con el OPCODE (salvo excepciones) no haces nada, porque la mayoría de las instrucciones necesitan argumentos.

Estupenda clase! se pueden ver los datos binarios que representan las instrucciones, tambien se entiende todo lo que han evolucionado los lenguajes de programación a alto nivel ahorrándonos escribir o crear instrucciones y dejándonos solo libres de crear la lógica de nuestros programas.

increible

JVM Funcionamiento.

Me encanta este curso esta muy interesante.

Una ventaja de usar un compilador es que genera un ejecutable que puede correr directamente en una máquina, lo que permite una ejecución más rápida y eficiente. Además, una vez que el código ha sido compilado, no se requiere tener el entorno de desarrollo o el código fuente disponible en la máquina donde se ejecuta, lo que también proporciona un nivel de seguridad al mantener el código fuente privado.
Un compilador traduce el código fuente escrito en un lenguaje de alto nivel a código máquina, que la computadora puede ejecutar. El proceso incluye: 1. **Análisis Léxico**: Identifica los tokens (palabras clave, operadores, etc.). 2. **Análisis Sintáctico**: Verifica la estructura y gramática del código. 3. **Análisis Semántico**: Comprueba que las instrucciones tengan sentido en su contexto. 4. **Generación de Código**: Crea el código máquina o bytecode. 5. **Optimización**: Mejora el código para que se ejecute más eficientemente. Este proceso permite que programas complejos funcionen en diversas plataformas.

Si alguien quiere ver como se ve el "backend" de un lenguaje de programación, le recomiendo recisar el proyecto LLVM.