나는 그 용어를 계속 듣고 모든 Google 검색으로 인해 컴파일러 관련 기사로 연결됩니다. 컴파일 대상이라는 용어의 의미를 이해하고 싶습니다. ||
업데이트 : 일부 컨텍스트를 제공하려면 웹 어셈블리가 C, C ++, Rust 등과 같은 다른 언어의 컴파일 대상이라고 들었습니다.
나는 그 용어를 계속 듣고 모든 Google 검색으로 인해 컴파일러 관련 기사로 연결됩니다. 컴파일 대상이라는 용어의 의미를 이해하고 싶습니다. ||
업데이트 : 일부 컨텍스트를 제공하려면 웹 어셈블리가 C, C ++, Rust 등과 같은 다른 언어의 컴파일 대상이라고 들었습니다.
답변:
본질적으로 컴파일러는 한 언어로 입력하고 다른 언어로 출력을 생성하는 번역기입니다. 예를 들어 Eiffel Software의 컴파일러는 Eiffel 언어 입력을 사용하여 C를 생성합니다. Intel 용 GCC는 C 언어 입력을 읽고 x86 어셈블리를 생성합니다. Intel 용 GAS 어셈블러는 x86 어셈블리를 가져 와서 x86 객체 코드를 생성합니다. 이 세 가지 모두 기술적으로 컴파일러입니다.
형식에 관계없이 컴파일러가 읽은 입력을 소스 라고 하고 출력을 대상 이라고합니다 . 후자의 용어는 "의도 된 결과"라는 정의 중 하나에서 가져온 것입니다.
대부분의 컴파일러는 특정 프로세서 또는 아키텍처에 대한 어셈블리 또는 객체 코드를 생성하도록 설계되었습니다. 따라서 target 은 종종 출력 형식이 아닌 아키텍처 자체를 나타내는 데 사용됩니다.
컴파일러의 타겟은 그것이 실행되는 아키텍처와 같을 필요는 없으며, 그러한 경우가 발생하는 경우 프로그램을 크로스 컴파일러 라고합니다 . 예를 들어, x86 시스템에서 GCC를 빌드하여 C를 ARM 어셈블리로 컴파일 할 수 있습니다.
또한 명령 줄의 스위치와 같은 입력에 따라 다른 대상에 대한 출력을 생성 할 수있는 단일 컴파일러가 있습니다. 이들은이라고 다중 목표 컴파일러를.
번역에서 언어는 영어와 같은 자연 언어이든 C와 같은 인공 언어이든, 용어 소스 및 대상 을 사용하여 번역 시스템 의 입력 및 출력 에 대해 이야기 합니다. 자연어 번역 에서이 시스템 은 두 언어를 번역 할 수있는 유능한 인간 두뇌입니다. 프로그래밍 언어에서는 컴파일러입니다.
따라서 컴파일러 의 소스 는 프로그래밍 언어 (C)이고 대상 은 바이트 코드 (기계 수준 명령어)입니다. 우리는 종종 다른 시스템 (CPU 아키텍처)이 ARM, MIPS 등과 같은 다른 명령어 세트를 가지고 있기 때문에 컴파일에서 타겟 을 사용합니다. 컴파일러는 올바른 명령어 (바이트 코드)를 생성 할 수 있도록 어떤 명령어 세트가 타겟인지 알아야합니다.
WebAssemby는 c / c ++ 코드를 이진 형식으로 변환하는 가장 최신의 것입니다.
다음은 응용 프로그램 중 하나에서 기계 코드의 간단한 계승 프로그램을 얼마나 빨리 변환하는지 볼 수있는 링크입니다.
이 짐승을 확인하십시오, https://godbolt.org/
이 샘플 프로그램을 사용하여 해당 사이트에서 실행하여 어셈블리를 볼 수 있습니다.
# include<stdio.h>
int square(int num) {
return num * num;
}
int main() {
int res = square(4);
printf("%d\n",res);
return 0;
}
호스트 및 대상에 대한 기본 정보, 프로그래밍 언어가 10101010으로 변환되는 방법
host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
GCC는 C / C ++ 코드를 어셈블리 코드로 변환합니다. "어셈블러"라는 도구는 어셈블리 코드를 기계어 코드로 변환하고 "링커"라는 도구는 여러 기계어 코드 파일을 하나의 단일 실행 파일 (Windows에서는 .EXE) 파일로 연결합니다. 이러한 컴파일러의 대부분은 결과 어셈블러 코드를 파일에 작성하여 어셈블러 코드를 보거나 수정할 수 있습니다.
어셈블러와 링커는 툴 체인의 일부이므로 일반적으로 컴파일러와 함께 제공됩니다.
그러나 Microsoft와 같은 일부 컴파일러는 C / C ++ 코드를 기계 언어로 직접 변환하므로 더 이상 어셈블러가 필요하지 않습니다. 이러한 컴파일러 중 다수는 어셈블러 코드를 작성할 수 없으므로 파일에 어셈블러 코드를 작성할 수 없습니다.
그건 그렇고 : .EXE 파일을 직접 생성하는 링커가 필요없는 컴파일러 (C / C ++가 아닌 다른 프로그래밍 언어 용)도 있습니다.