¿Qué es exactamente un objetivo de compilación?

17

Sigo escuchando el término y todas las búsquedas de Google me llevan a artículos sobre compiladores. Solo quiero entender qué significa el término compilar objetivo: |

ACTUALIZACIÓN: para dar un poco de contexto: he oído decir que el ensamblaje web es un objetivo de compilación para otros lenguajes como C, C ++, Rust, etc.

ScionOfBytes
fuente
Te aconsejo que leas los artículos sobre compiladores.
44
Los artículos sobre compiladores suponen que ya lo sabes. Es una pregunta razonable.
Karl Bielefeldt
Estaba pensando más en artículos de estilo wikipedia. Y acepto que la pregunta es razonable. Fue solo una sugerencia, no una crítica.
44
La pregunta es razonable, pero está mal escrita. El término "objetivo" puede tener diferentes significados, por lo que recomendaría dar una referencia o más contexto donde lo escuchó o leyó sobre él.
Doc Brown
@DocBrown Lo he escuchado en muchos contextos, pero más recientemente en el contexto del ensamblaje web como destino de compilación para otros idiomas.
ScionOfBytes

Respuestas:

17

Los compiladores son, en esencia, traductores que toman datos en un idioma y producen resultados en otro. Por ejemplo, el compilador de Eiffel Software toma entradas en lenguaje Eiffel y produce C. GCC para Intel lee entradas en lenguaje C y produce ensamblaje x86. El ensamblador de GAS para Intel toma el ensamblaje x86 y produce código objeto x86. Las tres cosas son técnicamente compiladores.

Independientemente del formato, la entrada leída por un compilador se llama fuente y la salida se llama destino . El último término se toma de una de sus definiciones, "resultado previsto".

La mayoría de los compiladores están diseñados para producir código de ensamblaje u objeto para un procesador o arquitectura en particular. Debido a eso, el objetivo a menudo se usa para referirse a la arquitectura en sí misma en lugar del formato de salida.

El objetivo de un compilador no necesita ser el mismo que la arquitectura donde se ejecuta, y en los casos en que eso sucede, el programa se denomina compilador cruzado . (Por ejemplo, GCC puede construirse para ejecutarse en sistemas x86 para compilar C en un ensamblaje ARM).

Además, hay compiladores únicos capaces de producir resultados para diferentes objetivos dependiendo de la entrada, como interruptores en la línea de comando. Estos se llaman compiladores de múltiples objetivos .

Blrfl
fuente
2
Como nota al margen, vale la pena mencionar que este término también se usa de una forma más generalizada en el contexto de los sistemas de compilación: un objetivo es un resultado de cualquier paso de compilación, que no necesariamente tiene que ser una acción de compilación (p. Ej. creando un instalador).
BartoszKP
2
Los compiladores son traductores, no filtros.
1
@Birfl. obviamente. "tr" significa traducir, no filtrar. los filtros no son traductores, esto es simplemente obvio.
2
@Birfl: no voy por wikipedia. simplemente produciendo un flujo de otro ssys nada. La distinción entre filtros y traductores es muy conocida. un filtro incluye / excluye, basado en un predicado. No se transforma. filtrar una lista de enteros por par? y obtienes números enteros sin transformar. traduce la misma lista usando inc y obtienes una versión transformada de la lista original.
1
su cuenta de compilación está bien, excepto por el término "filtro".
4

En la traducción, ya sea que el idioma sea natural como el inglés o artificial como el C, utilizamos la fuente y el objetivo de la terminología para hablar sobre la entrada y salida de un sistema de traducción. En la traducción del lenguaje natural, el sistema es el cerebro humano competente capaz de traducir entre dos idiomas. En lenguajes de programación, es un compilador.

Por lo tanto, la fuente de un compilador es el lenguaje de programación (C), mientras que el objetivo es el código de bytes (instrucciones a nivel de máquina). A menudo usamos target en la compilación porque diferentes sistemas (arquitecturas de CPU) tienen diferentes conjuntos de instrucciones, por ejemplo, ARM, MIPS, etc. El compilador necesita saber qué conjunto de instrucciones es el objetivo, para que pueda crear la salida correcta (código de bytes).

Chris Cirefice
fuente
0

WebAssemby es algo último y mejor, que convierte el código c / c ++ en formato binario.

  • WebAssembly tiene como objetivo ejecutar a la velocidad nativa aprovechando el hardware común. Diseñado para integrarse con la plataforma web.

Aquí está el enlace donde puede ver una de las aplicaciones, qué tan rápido convierte el programa factorial simple en código de máquina.

Mira esta bestia, https://godbolt.org/

Puede usar este programa de muestra para ejecutar en ese sitio para ver el ensamblaje.

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Defina un formato binario portátil, eficiente en tamaño y tiempo de carga para que sirva como un objetivo de compilación que pueda compilarse para ejecutarse a la velocidad nativa aprovechando las capacidades comunes de hardware disponibles en una amplia gama de plataformas, incluidos dispositivos móviles e IoT.

Alguna información básica sobre el host y el destino, cómo se traduce el lenguaje de programación al 10101010.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. GCC convierte el código C / C ++ en código ensamblador. Una herramienta llamada "ensamblador" convierte el código de ensamblaje en código de máquina y una herramienta llamada "enlazador" conecta múltiples archivos de código de máquina en un solo archivo ejecutable (.EXE en Windows). La mayoría de estos compiladores le permiten escribir el código ensamblador resultante en un archivo para que pueda ver el código ensamblador o modificarlo.

  2. El ensamblador y el enlazador son parte de la cadena de herramientas, lo que significa que generalmente se entregan junto con el compilador.

  3. Sin embargo, algunos compiladores (como Microsoft) convierten directamente el código C / C ++ en lenguaje máquina, por lo que ya no se necesita ensamblador. Muchos de estos compiladores no pueden crear código ensamblador, por lo que no puede escribir el código ensamblador en un archivo.

Por cierto: incluso hay compiladores (no para C / C ++, sino para otros lenguajes de programación) que crean directamente un archivo .EXE, por lo que no se requiere un vinculador.

WebAssembly: https://github.com/WebAssembly/design

puntero
fuente